백_곰 2021. 1. 7. 17:01

 1. 하나의 클래스의 인스턴스가 생성되는 코드의 단계

(1) 연산자 new에 의해서 메모리(heap)에 클래스의 인스턴스가 생성된다.

 

(2) 생성자가 호출되어 수행된다.

 

(3) 연산자 new의 결과로, 생성된 클래스의 인스턴스의 주소가 반환되어 참조변수에 저장된다.

 

( 주의할 점은 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다. )

 

 

 

 

2. 생성자에서 다른 생성자 호출하기 - this(), this

- this는 참조변수로 인스턴스 자신을 가리킨다.

 

- 사실 생성자를 포함한 모든 인스턴스 메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 'this'

지역변수로 숨겨진 채로 존재한다.

 

- 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다.

( 단, 아래의 두 조건을 만족해야 한다. )

 

(1) 생성자의 이름으로 클래스 이름 대신 this를 사용한다.

( 즉, 클래스이름()으로 호출하는 것이 아닌 this()로 호출해야 한다. )

 

 

(2) 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

( 생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업 도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다. )

 

( 그러므로, 만약 두 번째 줄 이상에서 호출하면 컴파일 에러가 발생한다. )

 

 

 

 

3. 오해하기 쉬운 개념 정리

(1) 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.

 

(2) this를 사용할 수 있는 것은 오직 인스턴스 맴버뿐이다. 클래스 메서드와 사용하면 에러가 나오기에 유의하자.

 

(3) this와 this()는 비슷하게 생겼을 뿐, 완전히 다른 개념이다. this는 '참조 변수'이고, this()는 '생성자'이다.

 

 

 

 

4. 잘못된 예제

( x = x를 하게 되면 지역변수로 간주되어 초기화 작업이 무의미해진다. )

( 그래서 this.x = x를 꼭 써주어야 한다 .)

 

 

 

 

5. 예제 - 생성자를 이용한 인스턴스의 복사

 

( 주의할 점은 a2는 a1을 복사하여 생성된 것이므로 서로 같은 상태를 갖지만, 서로 독립적으로

메모리 공간에 존재하는 별도의 인스턴스이므로 a1의 값들이 변경되어도 a2는 영향을 받지 않는다. )

 

( 또한 as(as a) 생성자를 중복해서 사용하므로 아래의 코드처럼 간결하게 만들어 본다. )