passion and relax

[JAVA] 09. 객체의 삶과 죽음 (생성자와 메모리 관리) 본문

프로그래밍

[JAVA] 09. 객체의 삶과 죽음 (생성자와 메모리 관리)

Grab Java 2024. 5. 23. 11:37

stack 과 heap

stack
. 메소드 호출과 지역변수가 사는 곳
heap
. 모든 객체가 사는 곳
. Garbage collector가 작동하는 곳

 


메소드 호출

. stack frame 에 "실행코드 + 지역변수 값 + 메소드 상태"가 저장된다.
. 또 다른 메소드가 호출되면 계속해서 stack에 쌓이게 된다.
. 맨 위의 stack frame의 메소드가 현재 실행 중인 메소드이다.

 


지역변수

. 메소드용 변수로서 메소드 안에서 선언된 변수 또는 매개변수
. 단지 이 둘만을 말함. 다른 것은 지역변수가 아니다.

 


객체의 저장 (지역변수 선언 시)

객체용 지역변수 선언
. stack에 지역변수가 선언됨.
. CellPhone myPhone
객체 생성
. new를 했을 때, heap에 객체가 생성됨.
. new CellPhone();
stack의 객체용 지역변수에 heap에서 생성한 객체의 레퍼런스를 대입한다.
. CellPhone myPhone = new CellPhone();

 


객체의 저장 (인스턴스 변수 선언 시)

객체용 인스턴스 변수 선언
. heap에 멤벼변수가 선언됨.
. CellPhone myPhone
객체 생성
. new를 했을 때, heap에 객체가 생성됨.
. new CellPhone();
heap의 객체용 인스턴스 변수에 heap에서 생성한 객체의 레퍼런스를 대입한다.
. CellPhone myPhone = new CellPhone();

 


객체의 저장 (상위 클래스가 있는 객체의 저장)

어떤 객체가 만들어지면, 그 객체의 상속트리 전체에 걸쳐 축적된 모든 인스턴스 변수 공간을 잡는다.
자바 최상위 클래스인 Object도 예외는 아니다. Object의 공간도 잡는다.
즉, 모든 상위 객체의 new가 실행되는 것 => Constructor Chaining
어떤 원리로?
. 개발자가 생성자를 전혀 안 만들었다면, 빈 생성자를 자동 생성 및 super(); 자동 삽입.
. 개발자가 오버로드된 생성자를 만들었고, 만든 그 생성자를 직접 호출하게 할 수도 있다.
    super(37); 처럼 직접 호출해줘야 한다. 직접 호출 안하면 무조건 빈 생성자 super();를 호출한다.
부모 클래스가 만들어진 후에, 자식 클래스가 만들어 진다. (사람과 같지..)
부모 클래스가 종료된 후에, 자식 클래스가 종료된다.

 


일단 정리

자바에서 관심 가져야 할 메모리 공간은 stack과 heap 이다.
객체와 그 객체의 인스턴스 변수(멤버변수)는 heap에 저장되며,
    메소드 호출과 그 메소드의 지역변수는 stack에 저장된다.
인스턴스 변수
. 메소드 밖에서 선언된 변수
. 객체의 일부로 보며, heap에 저장된다.
지역 변수
. 메소드 안에서 선언된 변수 (매개변수 포함)
. 객체의 일부로 보지 않고, 메소드 호출 시 stack에 저장된다.

 


생성자

리턴 유형이 없다. 이 말은 즉, 리턴값도 없다는 것.
생성자명은 클래스명과 동일해야 한다.
클래스명과 동일명의 메소드가 있다해도, 리턴이 있다면 생성자가 아니다.
public Duck() { ~~ }
객체를 생성하는 중간에 끼어들어, 필요한 작업(객체의 초기값 설정)을 수행한다.
초기값이 설정되기 전 다른 용도로 사용되는 것을 막으려면, 생성자의 초기값 설정을 이용할 것.
상속되지 않는다.
자동 생성 생성자(아무것도 없는 생성자)는 개발자가 생성자를 하나도 안 만들었을 때만 생성된다.
생성자를 하나라도 만들었다면, 자동 생성 생성자는 만들어 지지 않는다.
접근 유형 : public, private, 쓰지 않음(default)의 3가지 종류가 있음.