Constructor, Builder Pattern, Static Factory Method
Javaμμ κ°μ²΄λ₯Ό μμ±νλ μΈκ°μ§ μ£Όμ λ°©λ²μ λν΄ μμλ³΄κ³ μ νλ€.
- μμ±μ(Constructor)
- λΉλ ν¨ν΄(Builder Pattern)
- μ μ ν©ν 리 λ©μλ(Static Factory Method)
μμ±μ(Constructor): κΈ°λ³Έμ μΈ κ°μ²΄ μμ± λ°©λ²
1. @NoArgsConstructor + @Setter
- κΈ°λ³Έ μμ±μλ₯Ό ν΅ν΄ λΉ κ°μ²΄λ₯Ό μμ±ν λ€, Setterλ₯Ό μ¬μ©ν΄ νμν νλκ°μ μ€μ νλ€.
Human emptyHuman = new Human();
emptyHuman.setName("CheonSang")
emptyHuman.setAge(12);
class Human {
private String name;
private int age;
// No args Counstructor
public Human() {}
}
2. Custom Constructor: νμν νλλ§ μ£Όμ νλ μμ±μ
- νΉμ νλλ§ μ΄κΈ°ννλ 컀μ€ν μμ±μλ₯Ό λ§λ€ μ μλ€.
Human customHuman = new Human("CheonSang");
Class Human {
private String name;
private int age;
// Custom Constructor
public Human(String name) {
this.name = name;
}
}
3. DTO(Data Transfor Object) μμ±μ: DTOλ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό μμ±νλ λ°©μλ μλ€.
HumanCreateRequestDto dto = new HumanCreateRequestDto();
Human humanFromDto = new Human(dto);
Class Human {
private String name;
private int age;
// DTOλ₯Ό μ¬μ©ν Custom Constructor
public Human(HumanCreateRequestDto dto) {
this.name = dto.getName();
this.age = dto.getAge();
}
}
4. @AllArgsConstructor
- λͺ¨λ νλλ₯Ό μ΄κΈ°ννλ μμ±μ. κ°μ²΄ μμ± μ νμν λͺ¨λ νλλ₯Ό νκΊΌλ²μ μ€μ ν μ μλ€.
Human fullHuman = new Human("CheonSang", 12);
class Human {
private Stirng name;
private int age;
// All Args Constructor
public Human(String name, int age) {
this.name = name;
this.age = age;
}
}
κ°μ²΄ λΆλ³μ±(Immutability)κ³Ό μμ μ±(Completeness)μ κ΄μ μμμ κ°μ²΄ μ΄κΈ°ν
1. λΆλ³μ±(Immutability)
- λΆλ³μ±μ΄λ, κ°μ²΄κ° μ΄κΈ°νλ μ΄ν κ·Έ λ΄λΆμ νλ κ°μ΄ μ λλ‘ λ³κ²½λμ§ μλ νΉμ±μ μλ―Ένλ€. μ΄λ λ°μ΄ν°μ μμ μ±μ 보μ₯νκ³ , κ°μ²΄κ° μΈλΆμ μν΄ μκΈ°μΉ μκ² λ³κ²½λ μνμ λ°©μ§νλ€.
- Immutable κ°μ²΄λ λ©ν°μ€λ λ νκ²½μμλ μμ νκ² μ¬μ©ν μ μμΌλ©°, μμΈ‘ κ°λ₯ν μνλ₯Ό μ μ§νλ€.
2. μμ μ±(Completeness)
- μμ μ±μ΄λ, κ°μ²΄κ° μμ±λ λ νμν λͺ¨λ νλ κ°μ΄ λ°λμ μ΄κΈ°νλμ΄, μμ±λ κ°μ²΄κ° μμ ν μνλ₯Ό μ΄λ£¨λλ‘ νλ νΉμ±μ΄λ€. κ°μ²΄κ° μμ νκ² μμ±λμ΄μΌ μ΄ν νΈμΆλλ λͺ¨λ λ©μλκ° μλν λλ‘ λμν μ μλ€.
λΆλ³μ±κ³Ό μμ μ±μ μ‘°ν©
- λΆλ³μ±κ³Ό μμ μ±μ μ‘°ν©νλ©΄ κ°μ²΄λ ν λ²μ μμ±μ νΈμΆλ‘ μμ νκ³ , λΆλ³ν μνκ° λλ€. μ΄ λ§μ κ°μ²΄κ° μμ±λ νμλ κ·Έ μνκ° μ λ λ³κ²½λμ§ μμΌλ©°, κ°μ²΄μ λͺ¨λ λ©μλλ μ΄κΈ° μνμ κ°μ κΈ°λ°ν΄ μμ μ μΌλ‘ λμν μ μλ€λ μλ―Έμ΄λ€.
- μ΄λ¬ν κ°μ²΄λ λ³κ²½ λΆκ°λ₯ν λ°μ΄ν° ꡬ쑰λ‘, μ μ§λ³΄μμ±, κ°λ μ±, μμ μ±μ΄ λμμ§λ€.
3. λΆλ³μ±κ³Ό μμ μ±μ 보μ₯νκΈ° μν λ¬Έλ²
- `fianl`ν€μλ: νλμ `final`μ λΆμ΄λ©΄ κ·Έ νλλ ν λ² κ°μ΄ μ€μ λλ©΄ λ μ΄μ κ°μ λ³κ²½ν μ μλ€. μ΄λ νλκ° λΆλ³μ±μ μ μ§ν μ μλλ‘ κ°μ νλ€.
- `@RequiredArgsConstructor`: μ΄ μ΄λ Έν μ΄μ μ `final`μ΄λ `@NonNull` νλμ λν΄ νμμ μΈ μ΄κΈ°νκ° νμν¨μ 보μ₯νλ μμ±μλ₯Ό μλμΌλ‘ μμ±ν΄μ€λ€. μ΄λ₯Ό ν΅ν΄ κ°μ²΄μ μμ μ±μ 보μ₯ν μ μλ€.
λΉλ ν¨ν΄(Builder Pattern)
λΉλ ν¨ν΄μ κ°μ²΄ μμ± μ μ μ°μ±μ μ 곡νμ¬ μμ±μλ³΄λ€ λ λͺ μμ μ΄κ³ κ°λ μ±μ΄ μ’λ€.
1. λΉλ ν¨ν΄μ μ₯μ
- κ°μ²΄ μμ± μ νλ μμμ μκ΄μμ΄ μνλ νλλ§ μ΄κΈ°νν μ μλ€.
- 볡μ‘ν κ°μ²΄ μμ± λ‘μ§μ κ°κ²°νκ² ννν μ μλ€.
RequestDto dto = RequestDto.builder()
.hello("A")
.world("B")
.build();
RequestDto dto = RequestDto.builder()
.world("B")
.hello("A")
.build();
2. λΉλ ν¨ν΄ μ¬μ© μ νλ μ€μ μ μμ λ‘κ² λΆλ¦¬ κ°λ₯
RequestDto.RequestDtoBuilder isBuildingSetHello = RequestDto.builder()
.hello("A");
RequestDto.RequestDtoBuilder isBuildingSetWorld = isBuildingSetHello
.world("B");
RequestDto initialized = isBuildingSetWorld.build();
3. λΉλμ μ μ½μ μΆκ°
- `@Builder.Default`λ‘ κΈ°λ³Έκ°μ μ€μ ν μ μμΌλ©°, `@Singular`λ 컬λ μ νλμ λν΄ κ°λ³ μμ΄ν μ μΆκ°νλ κΈ°λ₯μ μ 곡νλ€.
4. Custom Builderμ Validation
λΉλ ν¨ν΄μ μ ν¨μ± κ²μ¬λ₯Ό μΆκ°νμ¬ νΉμ νλμ λν μ μ½μ μ€μ ν μ μλ€.
@Getter
@Builder
public class RequestDto {
private String hello;
private String world;
public static class RequestDtoBuilder {
public RequestDtoBuilder hello(String value) {
if (value.equals("BYE")) {
throw new RuntimeException("Unacceptable Word");
}
this.hello = value;
return this;
}
}
}
μ΄ν΄λ₯Ό λκΈ°μν μμ
https://www.youtube.com/watch?v=s-xY1QPCjF8
μ μ ν©ν 리 λ©μλ(Static Factory Method): κ°μ²΄ μμ± λ°©μμ μ μνλ ν¨ν΄
μ μ ν©ν 리 λ©μλλ κ°μ²΄ μμ±μ μν μ νν μ μ΄λ₯Ό μ 곡νλ©°, μμ±μ λμ μ μ λ©μλλ‘ κ°μ²΄λ₯Ό μμ±νλ€.
μ μ ν©ν 리 λ©μλμ μ₯μ :
- λ©μλ μ΄λ¦μ κ°μ§ μ μλ€: λ©μλ μ΄λ¦μ ν΅ν΄ κ°μ²΄ μμ± λ°©μμ μλ―Έλ₯Ό λͺ νν μ λ¬ν μ μλ€.
- νΈμΆν λλ§λ€ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν νμκ° μλ€: μ±κΈν΄ ν¨ν΄μ²λΌ κ°μ²΄ μλ₯Ό μ νν μ μλ€.
- νμ μλ£ν κ°μ²΄λ₯Ό λ°νν μ μλ€: μμ κ΄κ³μμ νμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ°νν μ μλ€.
- κ°μ²΄ μμ±μ μΊ‘μνν μ μλ€: κ°μ²΄ μμ± λ‘μ§μ μ¨κΈΈ μ μμ΄ μ½λμ μ μ°μ±κ³Ό μ μ§ λ³΄μμ±μ΄ λμμ§λ€.
μμ μ½λ:
ParsedRequestDto newlycreated = ParsedRequestDto.of(dto);
@Getter
class ParsedRequestDto {
private final String hello;
private final String world;
// Private μμ±μ
private ParsedRequestDto(String hello, String world) {
this.hello = hello;
this.world = world;
}
// μ μ ν©ν 리 λ©μλ
public static ParsedRequestDto of(RequestDto requestDto) {
return new ParsedRequestDto(
requestDto.getHello(),
requestDto.getWorld()
);
}
}
κ°μ²΄ μμ± λ°©λ² λΉκ΅
1. μμ±μ(Constructor):
- μ₯μ : λͺ νν κ°μ²΄ μ΄κΈ°ν, νλ κ°μ μΌκ΄μ± μ μ§ κ°λ₯.
- λ¨μ : νλκ° λ§μμ§λ©΄ μμ±μ μ€λ²λ‘λ©μΌλ‘ μΈν΄ 볡μ‘ν΄μ§ μ μμ.
2. λΉλ ν¨ν΄(Builder Pattern):
- μ₯μ : μ μ°ν νλ μ€μ , κ°λ μ± ν₯μ, νλ μ£Όμ μμμ ꡬμ λ°μ§ μμ.
- λ¨μ : κ°μ²΄ μμ± μ μ‘° κΈ λ λ§μ μ½λκ° νμν μ μμ.
3. μ μ ν©ν 리 λ©μλ(Static Factory Method):
- μ₯μ : κ°μ²΄ μμ± λ°©μμ μμ ν μΊ‘μννκ³ μ μ΄ν μ μμ. λ©μλ μ΄λ¦μ κ°μ§ μ μμ΄ κ°λ μ± ν₯μ
- λ¨μ : μμ±μκ° μλ λ©μλλ‘ κ°μ²΄λ₯Ό μμ±νκΈ° λλ¬Έμ 볡μ‘ν μμμ.
βΉοΈμ°Έκ³
[ASAC 6κΈ° κ°μμλ£]
https://www.youtube.com/watch?v=s-xY1QPCjF8
'π»DEV-STUDY > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] Finalκ³Ό Static (2) | 2024.09.30 |
---|---|
[Java] Collection (0) | 2024.09.28 |
[Java] JVM (Java Virtual Machine) (3) | 2024.09.25 |
[Java] Exception μμΈμ²λ¦¬ (0) | 2024.09.25 |
[Java] Java λμ μ리 (0) | 2024.09.25 |