생성자는 main과 마찬가지로 이미 쓰이고 있는 함수다.
예를 들면
class Handle {
String matter;
}
라는 클래스가 있다.
여기에 생성자는 없지만 new Handle()하면 인스턴스를 만들 수 있다. 이는 기본으로 제공을 하고 있기 때문이다. 이를 디폴트 생성자라고 한다.
하지만 matter을 기본값으로 넣고 싶을 땐 불가능하다.
즉, 매번
Handle handle1 = new Handle();
handle1.matter = "나무";
로 넣어줘야한다는 것.
이를 한번에 하기 위해서 생성자를 사용하는 것이다.
class Handle {
String matter;
Handle (String m){
this.matter = m;
}
}
Handle handle1 = new Handle("나무");
이렇게 하면 기본 값으로 matter에 나무가 들어간다.
하지만 디폴트 생성자가 사라진다.
따라서 디폴트 생성자가 필요할경우 Handle(){}를 넣어주어야한다. 즉 생성자가 2개 필요할 수도 있다.
이전 자바클래스 #12의 설명에서 클래스 값을 출력하기 위해서 아래처럼 해주었다.
Handle handle1 = new Handle();
handle1.matter = "나무";
System.out.println(handle1.matter);
handle2, handle3도 출력할 때마다 직접 값을 가져와서 했는데 이는 SOLID원칙과 크게 어긋난다. 자바는 객체지향언어와 SOLID라는 특징을 중요시하는데, 어긋나는 부분은 handle1.matter을 직접 참조한다는 것과 handle2, handle3의 값을 출력하려면 같은 값
System.out.println(handle2.matter);
System.out.println(handle3.matter);
을 써야한다는 것.
이를 줄이기 위해 유용하게 쓰일 메서드가 있다.
Stirng의 format인데 printf와 쓰임새가 같다.
String.format("어제는 [%d]명, %s",3, "고기를 먹었다.")
=> 어제는 [3]명, 고기를 먹었다.
%d에 3이 들어가고, %s에 그 다음인 "고기"가 들어간다.
public class GorokeTest {
public static void main(String[] args) {
/* 1. TOP 3 고로케를 객체로 만드세요. */
Goroke g1 = new Goroke("피자", 1000);
Goroke g2 = new Goroke("야채", 800);
Goroke g3 = new Goroke("팥", 500);
/* 2. 고로케 정보를 출력하세요. */
System.out.printf("%s\n", g1.str());
System.out.printf("%s\n", g2.str());
System.out.printf("%s\n", g3.str());
}
}
class Goroke {
// 필드
String name;
int price;
// 생성자
Goroke(String n, int p) {
name = n;
price = p;
}
// 메소드
String str() {
return String.format("Goroke { name: %s, price: %d원 }", name, price);
}
}