남궁성님의 Java의 정석 3판 "Chapter 06 객체지향 프로그래밍"을 읽고 저의 방식대로 정리한 글입니다! 자바 객체지향에 대한 기본적인 특징을 설명합니다.
인스턴스와 객체는 같은 의미이므로 두 용어의 사용을 엄격히 구분할 필요는 없지만, 문맥에 따라 구별하여 사용하는 것이 좋다. 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 가지고 있다.
응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
메서드 영역 (method area)
: 프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스 변수(class variable)도 이 영역에 함께 생성된다.
힙 (heap)
: 인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스 변수(instance variable)들이 생성되는 공간이다.
호출 스택 (call stack)
: 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.
static 을 붙여서 선언한 변수.public 을 앞에 붙이면 같은 프로그램 내에서 어디에서나 접근할 수 있는 전역변수의 성격을 갖는다.static을 붙인다.static을 붙이는 것을 고려한다.public PrintStream printf(String format, Object... args)생성자는 인스턴스가 생성될 때 호출되는 ‘인스턴트 초기화 메서드’이다. 참고로 연산자 new 가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것은 아니다. 클래스에 정의된 생성자가 하나도 없을 때는 기본 생성자(default constructor)가 컴파일러에 의해 추가된다.
Card c = new Card();
/*
1. 연산자 new에 의해서 메모리(heap)에 Card 클래스의 인스턴스가 생성된다.
2. 생성자 Card()가 호출되어 수행된다.
3. 연산자 new의 결과로, 생성된 Card 인스턴스의 주소거 반환되어 참조변수 c에 저장된다.
*/
class Car {
String color;
String gearType;
int door;
// 생성자에서 다른 생성자를 호출할 때는 this()를 사용한다.
Car() {
this("white", "auto", 4);
}
// 생성자를 이용해 인스턴스를 쉽게 복사할 수 있다.
Car(Car c) {
this(c.color, c.gearType, c.door);
}
// 'this'는 참조변수로 인스턴스 자신을 가리킨다.
// 'this'를 사용할 수 있는 것은 인스턴스 멤버 뿐이다, static멤버는 사용할 수 없다.
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
멤버변수(클래스변수와 인스턴스변수)와 배열은 자동적으로 기본값(default value)로 초기화되지만, 지역변수의 초기화는 필수이다. (기본값: false, 0, null 등등) 멤버 변수의 초기화 방법으로는 1) 명시적 초기화, 2) 생성자, 3) 초기화 블럭 세 가지가 존재한다.
class InitTest {
// 1) 명시적 초기화 (explicit initialization)
static int cv = 1;
int iv = 1;
// 2) 초기화 블럭 (initialization block)
static { // 클래스 초기화 블럭
cv = 2;
}
{ iv = 2; } // 인스턴스 초기화 블럭
// 3) 생성자 (Constructor)
InitTest() {
iv = 3;
}
}
클래스변수의 초기화 순서: 기본값 → 명시적 초기화 → 클래스 초기화 블럭
인스턴스변수의 초기화 순서: 기본값 → 명시적 초기화 → 인스턴스 초기화 블럭 → 생성자