생성자constructor
지금까지 사용해왔던 setSpeed 메서드 없이도 특정 값을 전달하는 MotorBike 객체를 생성하고 싶을 때 생성자를 활용하면 된다.
public class MotorBike {
private int speed;
MotorBike(int speed) { //생성자
this.speed = speed;
}
public int getSpeed() { //getter메서드
return speed;
}
public void setSpeed(int speed) { //setter메서드
System.out.println(speed);
System.out.println(this.speed);
this.speed = speed;
}
}
public class MotorBikeRunner {
public static void main(String[] args) {
MotorBike ducati = new MotorBike(100);
MotorBike honda = new MotorBike(200);
}
}
생성자와 메서드의 차이점
반환 타입
일반적으로 메서드는 입력 시 반환 타입을 구체화해야 하지만 생성자는 반환 타입을 필요로 하지 않는다.
명칭
생성자의 메서드명은 클래스명과 완전히 같아야 한다. 대문자 소문자까지도 같아야하며, 단 한 글자만 달라도 생성자가 아니다.
초기값 설정
객체지향 프로그래밍으로 객체를 만들 때 해당 객체의 최초 상태를 설정해야 한다.
최초 상태란 멤버 객체에 지정하고 싶은 값이며, 이는 생성자를 통해 지정할 수 있다.
디폴트 생성자
인스턴스를 생성할 때 쓰는 문법( Cart cart1 = new Cart();
)은 Cart 생성자를 호출 Cart()
하는 것과 거의 유사하다.
class Cart{ // 클래스
}
Cart cart1 = new Cart(); // Cart 클래스의 cart1 인스턴스 생성
그런데 잘 보면 위의 클래스에는 생성자 메서드가 없다.
이 경우 자바 컴파일러가 디폴트 생성자 Cart()
를 제공하게 된다. (Jshell에서 돌려보면 확인할 수 있다.) 이 디폴트 생성자는 아무 기능도 없다.
class Cart{ // 클래스
Cart() { // 생성자
}
}
Cart cart1 = new Cart(); // Cart 클래스의 cart1 인스턴스 생성
즉, 위의 예시처럼 아무 기능도 안 하는 생성자가 있는 경우의 결과와, 아예 생성자가 없는 경우의 결과는 동일하다.
다시 MotorBike 예시로 돌아가보면,
MotorBike(int speed) { //인자를 받는 생성자
this.speed = speed;
}
위와 같이 인자를 받는 생성자를 만들었는데 MotorBike suzuki = new MotorBike();
라고 인스턴스를 만들려고 하면 컴파일 에러가 난다. 인자를 받지 않는 생성자는 없기 때문이다.
우리가 이미 생성자를 만들었기 때문에 자바 컴파일러가 디폴트 생성자를 주지 않는 것이다.
만약 인자를 사용하지 않는 인스턴스를 만들려면 디폴트 생성자를 추가해주면 된다.
생성자의 활용
이러한 생성자의 기능은, 예를 들어 이름이 없는 사람이 만들어지기를 원하지 않는 경우에 유용하다.
생성자(이름)
처럼 인자를 받는 생성자를 만들어두고 디폴트 생성자를 만들지 않는다면, 이름이라는 인자를 넘겨주지 않는 경우 오류가 나기 때문이다.
this로 타 생성자 호출
초기값을 주지 않아도 디폴트 값을 설정할 수 있다.
(물론 직접 값을 5로 설정해도 되지만) 아래와 같이 다른 생성자를 호출할 수 있다.
this 키워드와 매개변수를 이용하면 된다.
MotorBike() { // 인자를 받지 않는 생성자
this(5); // 아래의 MotorBike(int speed) 생성자 호출
}
MotorBike(int speed) { //인자를 받는 생성자
this.speed = speed;
}
클래스
클래스를 설계할 때 고려해야 할 요소들
- 상태가 어떠한지 = 어떤 멤버변수들이 있는가
- 현재 시점에서 어떤 변수값을 가졌는지.
- MotorBike의 예시로 보면
speed
라는 변수.- 속도가 아니라 색깔을 정의하는 변수가 올 수도 있다.
- 그 외에도 다양한 변수들을 통해 MotorBike 클래스의 상태가 정의될 수 있다.
- 어떤 기어를 가졌는지 등등
- 특정 객체의 생성을 어떻게 구성하고 싶은가 = 어떤 생성자를 사용할 것인가
- MotorBike의 예시로 보면
- 해당 클래스가 어떻게 구성되길 바라는가?
- MotorBike 인스턴스를 만들 때 속도의 초기값을 미리 설정해 둘 수도 있고 이후에 속도를 추가할 수도 있는 것이다.
- MotorBike의 예시로 보면
- 어떤 행동을 실행할 건지 = 메소드
- 객체를 통해 실행하고자 하는 메소드가 어떤게 있을지.
- 이름
- 이름을 정할때는 (특히 메소드) 타인의 관점으로 생각하면 좋은 이름을 지을 수 있다.