본문 바로가기

Java/객체지향프로그래밍

[Java] 생성자(Constructor) - 코딩밥상

생성자란?

 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드' 이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.

생성자의 조건은 다음과 같다.

1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.

 

 인스턴스를 생성할 때의 과정을 보면

클래스명 참조변수 = new 클래스명();
  1. 연산자 new에 의해서 메모리(Heap)에 인스턴스가 생성된다.
  2. 생성자가 호출되어 수행된다.
  3. 연산자 new의 결과로 생성된 인스턴스의 주소가 반환되어 참조변수에 저장된다. 

즉 연산자 new가 인스턴스를 생성하는 것이지, 생성자가 인스턴스를 생성하는 것이 아니다. 생성자라는 용어 때문에 오해하기 쉬운데, 생성자는 단순히 인스턴스변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다.

 

기본 생성자(default constructor)

컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 기본 생성자를 컴파일 한다.

클래스명() {//생략}

컴파일러가 자동적으로 추가해주는 기본 생성자는 이와 같이 매개변수도 없고 아무런 내용도 없다. 

특별히 인스턴스 초기화 작업이 요구되어지지 않는다면 생성자를 정의하지 않고 이를 사용하면 된다.

 

매개변수가 있는 생성자

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

 

생성자의 매개변수로 인스턴스변수들의 초기값을 제공받는 경우가 많기 때문에 매개변수와 인스턴스변수의 이름이 일치하는 경우가 자주 있다. 이 때 매개변수의 이름을 다르게 하는 것 보다 'this'를 사용해서 구별되도록 하는 것이 의미가 더 명확하고 이해하기 쉽다.

이 때 'this'는 참조변수로 인스턴스 자신을 가리킨다.' 이를 이용해 자기 자신의 인스턴스 변수에 접근할 수 있는 것이다.

static메서드에서는 당연하게도 인스턴스 멤버들을 사용할 수 없는 것처럼, 같은 이유로 'this' 역시 사용할 수 없다.

 

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

같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능한데 단, 다음 두 조건을 만족시켜야 한다.

1. 생성자의 이름으로 클래스 이름 대신 this( )를 사용
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에만 호출이 가능

 

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

 현재 사용하고 있는 인스턴스와 같은 상태를 갖는 인스턴스를 하나 더 만들고자 할 때 생성자를 이용할 수 있다.

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

따라서 매개변수로 이미 생성된 인스턴스의 주소(참조변수)를 받고 새로운 인스턴스에 복사해 같은 값을 갖는 인스턴스를 복사 할 수 있는것이다.

단, 여기서 두 인스턴스는 서로 같은 상태를 갖지만, 독립적인 메모리 공간에 존재한다는 것을 잊지 말자.


위 내용을 이해했다면, 인스턴스를 생성할 때 다음의 2가지 사항을 결정하자.

  1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?