전통적으로 인스턴스를 얻는 수단은 Public 생성자다.
간단히 이야기하면 좀 어려울 수 있는데, Method 를 Static 으로 설정해 둔것이라고 간단히 이해하고 글을 읽으면서, 아래의 옵션들에 맞게 구성하면 된다.
예시로는 String.valueOf(10) 이라하면 우리는 String 클래스에 valueOf 가 아래와 같이 선언되어 있음을 알 수 있다.
우리는 String class 를 새롭게 선언하지 않고도 아래 함수를 이용할 수 있다.
아마 Overload 로 여러 형태들로 valueOf 가 존재할텐데 일단 정수로 예시를 들겠다.
public static String valueof(int n){
Integer.toString(n);
}
오늘 우리가 배울 생성자와 별도로 정적 팩토리 메소드에 대해서 알아보자
이름을 가질 수 있다.
호출될 때 마다 인스턴스를 새로 생성하지는 않아도 된다.
반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다.
입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.
정적 팩토리 메소드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.
만약 우리가 구매 누적 가격에 따라 각기 다른 할인율을 제공해야 한다고 생각해보자.
그럼 우리는 discount 메소드가 Overriding 이 되어야 한다는 사실을 깨달을 것이다.
자 그럼 가격에 따른 등급을 아래에 설계해 보자
가격 등급
100000 Silver
200000 Gold
300000 Platinum
400000 Diamond
package ExampleCode;
public class Grade {
private int amount;
private String username;
private String grade;
public Grade(int amount, String username, String grade) {
this.amount = amount;
this.username = username;
this.grade = grade;
}
public int getAmount() {
return amount;
}
public String getUsername() {
return username;
}
public String getGrade() {
return grade;
}
}
각 클래스들은 Grade 를 할당받아 아래처럼 설계되었다.
public class Platinum extends Grade{
public Platinum(String username, int amount) {
super(amount, username, Level.PLATINUM.name());
};
}
public class Gold extends Grade {
public Gold(String username, int amount) {
super(amount, username, Level.GOLD.name());
};
}
이제 팩토리 메소드 부분을 알아보자. 우리는 회원을 등록할때 그 가격에 따른 등급을 일단 부여하고 싶다.
물론 등급이 정적으로 박히는건 안좋을 수도 있을것 같은데, 예시를 잘못잡은것 같기도하고..
일단은 실무예시라 생각하지 말고, 단순히 정적팩토리 메소드설명을 위한 메소드라 생각해주면 좋겠다.
package ExampleCode;
public class GradeFactory {
private static Silver silver;
private static Gold gold;
private static Platinum platinum;
private static Diamond diamond;
private GradeFactory() {
}
public static Grade getGradeInstance(String username, int amount) {
if (amount < 200000) {
silver = new Silver(username, amount);
return silver;
} else if (amount < 300000) {
gold = new Gold(username, amount);
return gold;
} else if (amount < 400000){
platinum = new Platinum(username, amount);
return platinum;
} else {
diamond = new Diamond(username, amount);
return diamond;
}
}
}
public static void main(String[] args) {
Grade JSH = GradeFactory.getGradeInstance("jsh",300000);
Grade KIM = GradeFactory.getGradeInstance("kim", 180000);
Grade DOD = GradeFactory.getGradeInstance("dod", 500000);
System.out.println(JSH.getGrade());
System.out.println(KIM.getGrade());
System.out.println(DOD.getGrade());
}
아래와 같이 구매 가격에 따라, 다른 객체 인스턴스를 반환하는걸 알 수 있다.
PLATINUM
SILVER
DIAMOND
아직은 자바 초보개발자입니다. 공부해나가는 과정 중 작성한 자료로, 다소 이상한 방식으로 기술되었을 수도 있습니다. 피드백 주시면 감사하겠습니다!!