자바, 클래스 정리
* 자바에서의 자료 구조는 클래스로 표현된다. 실세계를 표현하기 위해 서로 다른 자료형을 묶어 놓은 추상화 기법을 사용한다.
* main() 메소드를 가지고 있는 클래스만 실행할 수 있다.
* 캡슐화(Encapsulation) : 객체에게 넘겨주는 정보와 메소드를 실행한 결과를 알 수 있지만 내부 구조에 대해서는 알 수 없다.
* 정보 은닉(Information Hiding)
객체 사용자가 사용하길 원하는 정보를 선택하고 그 정보는 구현한 부분의 비밀을 유지할 수 있다.
따라서 일부 메소드는 공개하지만 공개된 메소드에서 접근하는 내부메소드에 대해서는 숨긴다.
* Get/Set 메소드 : 직접 속성에 접근하는 방법과 달리 자료의 유효성을 검사할 수 있으며, 어떤 값을 읽기 전용으로 사용할 수 있다.
* 생성자(Constructor) : 클래스 이름과 동일한 메소드.
* 클래스 생성시 수행단계
1. 클래스를 위한 메모리 할당
2. 클래스 변수의 생성과 초기화
3. 추가적인 초기화를 위한 적당한 생성자의 호출
4. 1에서 할당된 메모리의 주소 반환
* 접근 수정자(Access Modifier)
public : 클래스 외부에서 접근할 수 있다.
private : 클래스 내부에서 접근할 수 있다.
protected : 상속하는 클래스에게는 public으로 그 외 다른 클래스에게는 private으로 사용된다
* 상수 : 클래스 레벨의 상수는 final 키워드를 사용해 정의한다.
ex) public static final in COUPE =1;
public 이므로 외부에서 접근할 수 있으며, static이므로 값을 변경할 수 없다.
* 정적 클래스 멤버 : 정적 클래스 멤버는 모든 인스턴스에서 전역적으로 사용한다. 또한 인스턴스를 생성하지 않아도 정적 멤버를 사용할 수 있다. ex) System.out.println(); System클래스에서 static으로 정의 되어 있기 때문에 out변수를 사용할 수 있다.
* Garbage Collection
자바에서 메모리 관리를 자동으로 하기 위해 백그라운드에서 실행되는 프로세스
메모리가 고갈되었을 때 Garbage Collection이 작동된다. 충분한 메모리를 가지고 있다면 응용 프로그램이 종료될 때 회수한다.
System.gc() : System 클래스의 정적 메소드인 gc()를 호출하면 쓰레기 수집을 요청할 수 있으나 JVM에게 영향주지 않는다.
* 쓰레기 수집에 적격일 경우
더 이상 변수가 필요하지 않아 그것에 null값을 대입할 때, 또는 변수가 유효 범위를 벗어날 때
* Finalize() 클래스는 객체가 메모리에서 제거될 때 호출된다. System.runFinalization()을 호출해 명시적으로 사용할 수 있다.
*객체의 Lifesycle
1. 객체를 위해 메모리가 할당된다
2. 속성이 초기화된다.
3.적당한 생성자가 호출된다.
4. 프로그램에서 객체가 사용된다.
5. 객체에 대한 참조는 메모리에서 객체와 분리된다.
6. 객체가 더이상 사용되지 않으면 쓰레기 수집을 실행한다
7. 쓰레기 수집기는 임의로 객체의 finalize()메소드를 호출한다.
8. 쓰레기 수집기는 메모리를 해체한다.
* 객체참조 : 어떤 클래스로부터 2개의 인스턴스를 생성한 뒤 한개의 인스턴스를 다른 인스턴스에 대입하면 두개의 변수는 같은 객체를 참조하게 된다.two = one; two와 one은 같은 메모리르 가리키는 것이다.
Su one = new Su();
Su two = null;
two = one;
4바이트의 참조변수가 두개 존재할뿐 메모리상의 객체 Su는 하나만 존재한다. 참조변수가 같은 객체에 대한 해시코드값을 가지고 있다.
메모리 복사는 clone()
* Final Class : 서브 클래스를 만들 수 없다. 즉 상속될 수 없다. 매우 필요한 모든 기능을 캡슐화 하거나 의도한 것과 다르게 사용되길 원하지 않을 때 사용된다.
* Abstract Class : 한개 이상의 추상 메소드를 포함한다. 선언부에서 정의되며 구현되지는 않는다.
public abstract void accelerate();
* 슈퍼 클래스의 소멸자는 서브 클래스의 소멸자에 의해 마지막으로 명시적으로 호출되어야 한다.
* 서브 클래스는 상속된 메소드를 Overriding할 수 있다. 단 메소드의 시그니처(메소드이름, 매개변수 리스트)와 반환 자료형은 일치해야 한다. 접근 수정자는 슈퍼 클래스보다 제한이 적어야 한다. 슈펴 클래스의 추상 메소드는 반드시 재정의 되어야 한다.
* 업캐스팅 & 다운캐스팅
같은 상위클래스를 상속하는 다른 객체를 공통으로 다루기 위해서 사용한다.
업캐스팅되는 객체는 그 형을 잃기 때문에 값을 얻기 위해 반드시 다운캐스팅 해주어야한다.
상위클래스의 메소드가 호출되면 가상메소드의 원리에 의해 하위클래스에 오버라이딩 되었는지 확인한다.
Father fa = new Son(); //자동업캐스팅
Son so = (Son) fa; //강제다운캐스팅
ex) public void addElement(Oject obj) // 매개변수에 들어갈 데이터타입을 모두 오버로딩해주지 않아도 된다.
* new 키워드를 사용하여 객체를 생성하였을 때 비로소 메모리 생성 과정이 이뤄진다. 힢에.. (기본데이터타입은 선언시 생성)
* this 객체가 생성된 후 객체의 참조변수 값을 갖는다. this() //생성자 호출
* super 오버라이딩 된 상위 메소드를 호출한다.
* static 멤버변수 : 객체가 생성되지 이전에 선언 시 이미 스택메모리에 생성된다. 때문에 클래스 이름으로 접근 가능하며, 스태틱 멤버 메소드는 멤버 변수를 사용할 수 없으며, 스태틱 멤버는 모든 객체가 공유한다.