본문 바로가기

자바의 정석/객체지향1

생성자

728x90

생성자란

 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'라고 볼 수 있다. 구조는 메서드와 비슷하지만 차이점은 리턴값이 없다는 점이며, 이때 void를 사용하진 않고, 아무것도 붙이지 않는다.

생성자의 조건은 아래의 2가지다.

 

1. 생성자의 이름은 클래스의 이름과 같다

2. 생성자는 리턴 값이 없다.

 

우리가 알아야 할 것은 인스턴스를 생성하는 것은 생성자가 아니라 new연산자이며, 생성자는 인스턴스 변수들의 초기화에 사용되는 특별한 메서드일 뿐이다.

 

A a = new A();

 

위의 인스턴스 생성 코드는 3가지의 과정을 거친다.

 

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

다음, 생성자 A()가 호출되어 수행된다.

마지막으로, 생성된 A인스턴스의 주소가 참조변수 a에 저장된다.

 

여기서 알 수 있는 것은 마지막의 저 A()가 바로 생성자에 해당하는 부분이라는 것이다.

 

기본 생성자

 모든 클래스에는 반드시 1개 이상의 생성자가 정의되어 있어야 하지만, 우리가 굳이 생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 기본 생성자를 자동으로 제공하기 때문이다.

 

클래스 이름( ){ }

 

 이때 컴파일러가 자동으로 추가하는 생성자는 위와 같은 매개변수도 없고, 아무것도 없는 클래스 이름만 있는 기본적인 생성자다.

 

 하지만 클래스에 생성자가 하나라도 존재한다면, 컴파일러는 기본 생성자를 추가하지 않는다. 따라서 2개 이상의 생성자가 필요한 경우에는 각각 생성자를 다 만들어 주어야 한다.

 

매개변수가 있는 생성자

 생성자도 메서드같이 매개변수를 선언하여 호출 시 값을 넘겨받아 인스턴스를 초기화 할 수 있다. 인스턴스마다 다른 값으로 초기화되어야 하는 경우가 많기 때문에 생성자의 매개변수를 통한 초기화는 매우 유용하다.

 

 

위의 코드는 기본 생성자를 사용한 경우와, 매개변수가 있는 생성자를 사용한 경우 모두가 같은 결과가 나온다. 하지만 간결함을 보면 매개변수가 있는 생성자가 훨씬 편한 것을 알 수 있다. 기본 생성자를 사용한 경우에는 각 변수별로 별도로 초기화를 다 해주어야 하지만, 매개변수가 있는 생성자를 사용한 경우에는 인스턴스 생성시에 한번에 초기화가 가능하다.

 

생성자에서 다른 생성자 호출 - this(), this

 생성자 간에도 호출이 가능한데 이를 위해서는 아래의 2가지 조건을 만족시켜야 한다.

 

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

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

 

 

위에서 사용된 인스턴스 변수 앞의 this는 참조변수로서 인스턴스 자신을 가리킨다. 

 

this : 인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장

this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용

 

생성자를 이용한 인스턴스의 복사

 현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자 이용 가능하다. 두 인스턴스가 같은 상태를 갖는다는 것은 두 인스턴스의 변수가 동일한 값을 갖고 있다는 것이다.

 한 클래스에서 생성된 모든 인스턴스의 매서드와 클래스 변수는 동일하기 때문에 인스턴스 간의 차이는 인스턴스마다 각기 다른 값을 가질 수 있는 인스턴스 변수 뿐이다.

 

 

 

728x90

'자바의 정석 > 객체지향1' 카테고리의 다른 글

변수의 초기화  (0) 2022.02.21
오버로딩  (0) 2022.02.17
변수와 메서드  (0) 2022.02.17