[Java] 생성자(Constructor)
Table of Contents
생성자 ?#
생성자는 인스턴스 초기화 메서드 이다. 생성자도 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴 값이 없다.
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
생성자도 오버로딩이 가능하므로, 하나의 클래스 내에 여러 개의 생성자가 존재할 수 있다.
public class Card {
int height; //인스턴스 변수
int width;
Card(int height, int width) { // 생성자
this.height = height;
this.width = width;
}
public void getCardInfo() { // 인스턴스 메서드
System.out.println("height: " + this.height + " width: " + this.width);
}
}
public class CardTest {
public static void main(String[] args) {
Card myCard = new Card(3, 5); //myCard 객체 초기화
myCard.getCardInfo(); // 객체를 통해 인스턴스 메서드 접근
myCard.height = 4; // 객체를 통해 인스턴스 변수 접근
myCard.getCardInfo(); // height : 4, width : 5
}
}
생성자 내에 this.height = height 가 보일 것이다. 변수명이 똑같은 것 같지만, 앞에 height 와 뒤의 height 는 다르다. 앞의 height 는 Card 클래스 내부에 인스턴스 변수인 height 를 나타낸다. 뒤의 height 는 Card 생성자 안에 int height 라고 정의된 것을 받아온 것이다. 이것을 좀 더 명확하게 나타내보자.
아래 처럼 나타낼 수 있지만, 그냥 인스턴스 변수 앞에 this. 를 붙여서 나타내는 것이 더 일반적이다. this 는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스 멤버에 접근할 수 있는 것처럼, this 를 통해 인스턴스 멤버에 접근할 수 있다. this 를 사용할 수 있는 것은 인스턴스 멤버 뿐이다. 왜냐하면, static 메서드는 인스턴스가 생성하지 않고도 호출될 수 있기 때문에, static 메서드가 호출된 시점에 인스턴스가 존재하지 않을 수 있기 때문이다.
public class Card{
int instanceHeight;
int instanceWidth;
Card(int myHeight, int myWidth) { // 생성자
this.instanceHeight = myHeight;
this.instanceWidth = myWidth;
}
public void getCardInfo() { // 인스턴스 메서드
System.out.println("height: " + this.instanceHeight + " width: " + this.instanceWidth);
}
}
생성자라는 이름 때문에 헷갈리지 말아야 할 것이, new 가 새로운 객체를 생성한는 것이지, 생성자가 인스턴스를 생성하는 것이 아니다! 위의 코드에서 Card myCard = new Card(3,5)
을 보자.
- 연산자 new 에 의해서 메모리(heap)에 Card 클래스의 인스턴스가 생성된다.
- 생성자 Card() 가 호출되어 수행된다.
- 연산자 new 의 결과로, 생성된 Card 의 인스턴스 주소가 반환되어 참조변수 myCard 에 저장된다.
기본 생성자(default constructor)
사실 우리는 새로운 인스턴스를 생성하지 않고도, 프로그래밍을 해왔다. 이 이유는 클래스에는 기본 생성자가 있기 때문이다. 기본 생성자가 컴파일러에 의해 추가되는 경우는, 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.
인스턴스를 생성할 때 생각해볼 점
- 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
- 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?