자바를 사용하는 사람이라면 아래 형식의 코드를 마나 봤을 거당.
속성명 앞에 with를 붙여서 withName, withAge등으로 쓰이는 것도 봤을 가능성이 높당.
이미 꽤 많이 사용되고, Lombok에서도 @Builder 어노테이션으로 자주 사용되고 있는
build(빌드) 디자인 패턴이 당신에게 낯설다면 잠깐 인연을 맺는 시간을 가져보장.
역시 항상 그렇진 않지만 한번 보면 그냥 쉽당
프로그램 스타일이다 보니, 빌더 패턴도 모양이 쪼메씩 다를 수 있고,
다른 패턴과 믹스 된 방식으로 사용 될 수도 있당.
이야기가 길어지면 지루해 지고, 당연히 졸리게 되닝.
여기선 lombok에서 사용되고 있는 형태로 뽀인또만 확인토록 하장.
아래 빌더패턴을 적용한 소스를 builder static 메소드, static 내부 빌더클래스, 이름에
set을 붙이지 않고 속성명과 똑같이 한 세터 메소드에 집중해서 눈이 따라간다면
아마 대략 흐름이 눈에 들어 온 시각정보를 합쳐서 뇌가 받아 들일거시당.
Idol.java
package builder;
import java.util.List;
public class Idol {
private String name;
private int age;
private List<String> songs;
Idol(String name, int age, List<String> songs) {
this.name = name;
this.age = age;
this.songs = songs;
}
@Override
public String toString() {
return "Idol [name=" + name + ", age=" + age + ", songs=" + songs + "]";
}
// 요걸 자주 부르지용
public static IdolBuilder builder() {
return new IdolBuilder();
}
//내부 static 클래스가 핵심, 보통 클래스명뒤에 Builder 붙여서
public static class IdolBuilder {
private String name;
private int age;
private List<String> songs;
// setter지만 set빼공 속성명 그대로 메소드명으로
// return this에 주목, 보통 메소드 체인닝 구조에 사용됨
public IdolBuilder name(String name) {
this.name = name;
return this;
}
public IdolBuilder age(int age) {
this.age = age;
return this;
}
public IdolBuilder songs(List<String> songs) {
this.songs = songs;
return this;
}
// 마지막에 불려서 실제로 Idol타입 객체 생성
public Idol build() {
return new Idol(name, age, songs);
}
}
}
Idol 클래스의 getter는 한번 본인이 딕덥 맹글어 넣어보장!
이해가 되었다면 사용하는 모습도 누네 보여주어야 뇌가 아~ 요따고로 사용 한다공!
하고 경험치를 누적 시켜 잘 연결시키게 된당. (확인하도록 하장!)
Application.java
import java.util.Arrays;
import builder.Idol;
public class Application {
public static void main(String[] args) throws Exception {
Idol roze = Idol.builder()
.name("로제")
.age(26)
.songs(Arrays.asList("On The Ground","Gone","나만 바라봐")) // java 8
// .songs(List.of("On The Ground","Gone","나만 바라봐")) // java 9 이상
.build();
Idol jenni = Idol.builder()
.name("제니")
.age(27)
.songs(Arrays.asList("Solo","You & I","One Of The Girls"))
// .songs(List.of("Solo","You & I","One Of The Girls"))
.build();
System.out.println("체킁 roze:" + roze);
System.out.println("체킁 jenni:" + jenni);
}
}
결과는 당근 아래와 같당.
잠깐 요기서 메소드 체인닝을 이해하고 있는 사람이라면 아래꺼를 위에 꺼와 비교해 보고
떠오른 생각을 각각 정리해 보장. 요런 뽀인또들이 당신을 생각외로 옴팡 성장시킨당.
본능적으로 차이에 집중!!, 요런저런 생각들이 몽골 몽골 생길 거시당.
Idol2.java
package builder;
import java.util.List;
public class Idol2 {
private String name;
private int age;
private List<String> songs;
public Idol2 setName(String name) {
this.name = name;
return this;
}
public Idol2 setAge(int age) {
this.age = age;
return this;
}
public Idol2 setSongs(List<String> songs) {
this.songs = songs;
return this;
}
Idol2(){}
Idol2(String name, int age, List<String> songs) {
this.name = name;
this.age = age;
this.songs = songs;
}
@Override
public String toString() {
return "Idol [name=" + name + ", age=" + age + ", songs=" + songs + "]";
}
public static Idol2 builder() {
return new Idol2();
}
}
Applicaion2.java
import java.util.Arrays;
import builder.Idol2;
public class Application2 {
public static void main(String[] args) throws Exception {
Idol2 roze = Idol2.builder()
.setName("로제")
.setAge(26)
.setSongs(Arrays.asList("On The Ground","Gone","나만 바라봐"));
Idol2 jenni = Idol2.builder()
.setName("제니")
.setAge(27)
.setSongs(Arrays.asList("Solo","You & I","One Of The Girls"));
System.out.println("체킁 roze:" + roze);
System.out.println("체킁 jenni:" + jenni);
}
}
느낌? 심플? 굳?
사실 초보일 땐 규모의 문제를 상황상 경험부족 등으로 자동으로 외면하게 되는 뎅,
당연히 이거슨 확장성과 유지보수 문제등도 뇌에서 배제시킨당.
꼭 나쁜 것만은 아니당.
규모가 작으면 집중력이 높아서 부품 완성도는 높아질거시당.
조급함은 조숙증을 유발하고, 과정의 즐거움(특히 디버깅 재미)을 감추공
결과에 대한 자랑질이나, 부러움에 찌든 유치함만 남겨, 숙성이 덜 된
당신을 교양없는 개발자나 엔지니어, 매니저로 만들 가능성이 자꾸 노파심이당
Peace Of Mind(평정심) 훈련(명상, 운동, 산책등..) 시간을 주기적으로 가져야만 한당!
악순환은 대부분은 조급하고 성급한 욕심이 원인이당.
메소드 체인닝 패턴이 헤어스타일로 쳐서 그냥 단발머리라 치면
빌더 패턴은 단발머리 끝 부분을 바람머리 처리한 초 살랑살랑 몽골 몽골
상쾌한 바람을 머금은 단발머리 뉘앙스당.
금수저는 웬만하면 단발 머리당!!~~
https://www.youtube.com/watch?v=dm8uynwxU8U