[자바의 신] 참조 자료형 - 생성자
자바에서 기본자료형을 제외한 모든 타입이 참조자료형이다. 참조 자료형은 객체를 초기화할때 new 키워드를 사용한다. (배열과 String은 좀 특이해서 new를 사용하지 않아도 객체를 생성, 초기화 할수 있지만, 이 두 가지를 제외한 모든 참조 자료형은 new를 사용해야한다.) 우리가 앞에서 만든 Bicycle 클래스도 참조자료형이다. 코드를 한번 보자.
public class Bicycle {
// 변수(상태) 시작
public String color; // 색상
public String grip; // 손잡이모양
public int speed; // 속도
public int distance; // 거리
public int weight; // 무게
// 변수(상태) 끝
public Bicycle(){
}
// 매개변수가 하나인 생성자 추가
public Bicycle(String color){
this.color = color;
}
// 매개변수가 두개인 생성자 추가
public Bicycle(String color, String grip){
this.color = color;
this.grip = grip;
}
// 메소드(행위) 시작
public void rideOn(){
// 올라탐
}
public void rideOff(){
// 내림
}
public void speedUp(){
speed = speed+5;
}
public void speedDown(){
speed = speed-10;
}
public void changeGear(){
// 기어 바꿈
}
// 현재 속도 출력
public int getCurrentSpeed(){
return speed;
}
// 메소드(행위) 끝
}
Bicycle 이라는 참조 자료형은 크게 보면, 변수, 생성자, 메소드를 가지고 있다. 이전에 변수는 객체의 상태를, 메소드는 행위를 나타낸다고 했는데, 생성자는 뭘까?
생성자?
생성자는 참조 자료형 객체를 생성하기 위해 사용하며 다음과 같은 특징이 있다.
- 생성자의 형태는 메소드와 비슷함.
- 생성자는 리턴타입이 없음,
- 생성자의 이름은 클래스 이름과 같음.
생성자의 리턴타입이 없는 이유는 생성자의 리턴타입이 클래스 객체이기 때문이다. 그리고 생성자의 이름이 클래스와 같은 것은 컴파일러가 생성자임을 알기 위해서다.
생성자의 위치?
절대적인 기준은 아니지막 되도록 아래의 기준을 지켜줘야 한다. 다른 개발자들이 코드를 볼때도 생성자와 다른 메소드를 구분하기 용이하기 때문이다.
- 인스턴스 변수 아래.
- 클래스의 다른 메소드 위.
생성자의 종류?
생성자는 매개변수의 유무에 따라 두가지로 나뉜다.
- 매개변수가 없는 생성자(기본 생성자)
- 다른 생성자가 없을 때, 개발자가 기본 생성자를 만들지 않아도, 컴파일러가 만들어준다.
- 매개변수가 있는 생성자
- 매개변수가 있는 생성자가 있을때는 컴파일러가 기본 생성자를 만들어주지 않는다. 기본 생성자를 사용해야 할 경우 개발자가 명시적으로 기본생성자를 만들어야 한다.
기본 생성자를 이용해 Bicycle 객체를 생성할때는 아래와 같이 쓴다.
Bicycle bicycle1 = new Bicycle();
미리 알고있는 정보가 있을때, 매개변수가 있는 생성자를 사용할 수 있다.
Bicycle bicycle2 = new Bicycle("blue"); // 색상을 알고 있을때
Bicycle bicycle3 = new Bicycle("blue", "wood"); // 색상과 그립을 알고 있을때
매개변수가 있는 생성자와 없는 생성자로 생성된 객체는 뭐가 다를까?
public class Main {
public static void main(String[] args) {
// 기본 생성자
Bicycle bicycle1 = new Bicycle();
// 매개변수 1개 생성자
Bicycle bicycle2 = new Bicycle("blue");
// 매개변수 2개 생성자
Bicycle bicycle3 = new Bicycle("green", "wood");
System.out.println(bicycle1.color); // null
System.out.println(bicycle1.grip); // null
System.out.println(bicycle2.color); // blue
System.out.println(bicycle2.grip); // null
System.out.println(bicycle3.color); // green
System.out.println(bicycle3.grip); // wood
}
}
기본생성자로 생성한 인스턴스는 색상과 그립 모두 아무 값도 들어있지 않다.
색상을 매개변수로 받아서 생성한 생성자는 색상에 값이 있고, 그립에는 값이 없다.
색상과 그립을 매개변수로 받아서 생성한 생성자는 두개 모두 값이 있다.
// 매개변수가 하나인 생성자 추가
public Bicycle(String color){
this.color = color;
}
// 매개변수가 두개인 생성자 추가
public Bicycle(String color, String grip){
this.color = color;
this.grip = grip;
}
즉, 위 생성자들은 매개변수를 받아서 해당 인스턴스 변수에 값을 넣어준다. 여기서 this는 '이 객체'를 가리킨다.
그런데, 이름이 같은 생성자가 여러개가 생겼다. 자바는 클래스의 객체 생성을 편하게 하기 위해 서로 다른 매개변수를 갖는 '생성자'를 여러개 만들수 있다. 또한 생성자의 '매개변수의 개수'도 제한은 없다. 하지만, 필요에 따라서 적절하게 설정하는 것이 좋다.