μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[λ””μžμΈνŒ¨ν„΄] λΉŒλ”νŒ¨ν„΄μ΄λž€?

DAHLIA CHOI 2024. 2. 18. 16:49

λΉŒλ”νŒ¨ν„΄


λΉŒλ”νŒ¨ν„΄μ€ λ³΅μž‘ν•œ 객체 생성 κ³Όμ •κ³Ό ν‘œν˜„ 방법을 λΆ„λ¦¬ν•΄μ„œ λ‹€μ–‘ν•œ κ΅¬μ„±μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“œλŠ” 생성 νŒ¨ν„΄μ΄λ‹€.

객체λ₯Ό λ§Œλ“œλŠ” 방법은 3가지가 μžˆλŠ”λ° 1. μƒμ„±μž 생성 2. setter μ£Όμž… 3. λΉŒλ” νŒ¨ν„΄μ΄λ‹€.


점측적 μƒμ„±μž νŒ¨ν„΄


λ§€κ°œλ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  싢을 λ•Œ μƒμ„±μžλ₯Ό μ˜€λ²„λ‘œλ”© ν•˜λŠ” 방법

class Member {
	
	private String name;
	private int age;

	public Member(String name, int age){
		this.name = name;
		this.age = age;
	}

	public Member(String name){
		this.name = name;
	}
}


이런 νŒ¨ν„΄μ€ 클래슀 μΈμŠ€ν„΄μŠ€ ν•„λ“œκ°€ λ§Žμ„ 수둝 μƒμ„±μžμ— λ“€μ–΄κ°ˆ 인자의 μˆ˜κ°€ λŠ˜μ–΄λ‚˜ λͺ‡ 번째 μΈμžκ°€ μ–΄λ–€ ν•„λ“œμ˜€λŠ”μ§€ ν—·κ°ˆλ¦΄ μˆ˜λ„ 있게 λœλ‹€.

λ˜ν•œ, λ§€κ°œλ³€μˆ˜ νŠΉμ„±μƒ μˆœμ„œλ₯Ό 따라야 ν•˜κΈ° λ•Œλ¬Έμ— μ›ν•˜μ§€ μ•ŠλŠ” κ°’μ—λŠ” 0을 νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬ν•΄μ•Όλ˜κΈ° λ•Œλ¬Έμ— μ„ νƒμ μœΌλ‘œ ν•„λ“œλ₯Ό 선택할 수 μ—†λ‹€.


μžλ°” 빈 νŒ¨ν„΄


μœ„ 단점을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ setter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ 방법이 생겼닀.

λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μžλ‘œ 객체λ₯Ό μƒμ„±ν•œ ν›„ setterλ₯Ό 톡해 클래슀 ν•„λ“œμ˜ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•˜λŠ” 방법이닀.

class Member {
	
	private String name;
	private int age;

	public Member(){}

	public void setName(String name){
		this.name = name;
	}

	public void setAge(int age){
		this.age = age;
	}
}


κΈ°μ‘΄ μƒμ„±μž μ˜€λ²„λ‘œλ”©μ—μ„œ λ‚˜νƒ€λ‚¬λ˜ 기독성 λ¬Έμ œκ°€ 사라지고 선택적인 νŒŒλΌλ―Έν„°μ— λŒ€ν•΄ ν•΄λ‹Ήλ˜λŠ” setter λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ λΌμ„œ μœ μ—°ν•˜κ²Œ 객체λ₯Ό 생성할 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 객체 생성 μ‹œμ μ— λͺ¨λ“  값듀을 μ£Όμž…ν•˜μ§€ μ•Šμ•„ 일관성 λ¬Έμ œμ™€ λΆˆλ³€μ„± λ¬Έμ œκ°€ λ‚˜νƒ€λ‚œλ‹€.

일관성 문제? ν•„μˆ˜ λ§€κ°œλ³€μˆ˜λž€ 객체가 μ΄ˆκΈ°ν™”λ  λ•Œ λ°˜λ“œμ‹œ μ„€μ •λ˜μ–΄μ•Όν•˜λŠ” 값인데 κ°œλ°œμžκ°€ κΉœλΉ‘ν•˜κ³  setName() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ 객체의 일관성이 λ¬΄λ„ˆμ§„ μƒνƒœκ°€ λœλ‹€. 객체가 μœ νš¨ν•˜μ§€ μ•Šμ€ μƒνƒœκ°€ 되기 λŒ€λ¬Έμ— λ‹€λ₯Έ κ³³μ—μ„œ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ λŸ°νƒ€μž„ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλ‹€.
λΆˆλ³€μ„± 문제? 객체λ₯Ό μƒμ„±ν–ˆμŒμ—λ„ μ™ΈλΆ€μ μœΌλ‘œ setterλ©”μ„œλ“œλ₯Ό λ…ΈμΆœν•˜κ³  있기 λ•Œλ¬Έμ— μ–Έμ œ μ–΄λ””μ„œ λˆ„κ΅°κ°€ setterλ©”μ„œλ“œλ₯Ό 톡해 객체λ₯Ό ν•¨λΆ€λ‘œ μ‘°μž‘ν•  수 μžˆλ‹€. 이 λ¬Έμ œκ°€ λΆˆλ³€ν•¨μ„ 보μž₯ν•  수 μ—†λŠ” λ‚΄μš©μ΄λ‹€.


λΉŒλ”νŒ¨ν„΄


μœ„ 두 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ λ³„λ„μ˜ bulider 클래슀λ₯Ό λ§Œλ“€μ–΄ λ©”μ„œλ“œλ₯Ό 톡해 값을 μž…λ ₯받을 수 μ΅œμ’…μ μœΌλ‘œ build() λ©”μ„œλ“œλ‘œ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ λ¦¬ν„΄ν•˜λŠ” νŒ¨ν„΄μ΄λ‹€.

λΉŒλ”νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ 더이상 μƒμ„±μž μ˜€λ²„λ‘œλ”© μ—΄κ±°λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ 되고, λ°μ΄ν„°μ˜ μˆœμ„œμ— 상관없이 객체λ₯Ό λ§Œλ“€μ–΄λ‚΄κΈ° λ•Œλ¬Έμ— μƒμ„±μž νŒŒλΌλ―Έν„° μˆœμ„œλ₯Ό νŒŒμ•…ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. λ˜ν•œ, 잘λͺ»λœ 값을 넣을 μ‹€μˆ˜λ„ μ€„μ–΄λ“€κ²Œ λœλ‹€.

λΉŒλ” 클래슀
Member ν΄λž˜μŠ€μ™€ 같은 μΈμžλ“€λ‘œ κ΅¬μ •ν•˜κ³  setter λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€.

class MemberBuilder {
	private String name;
	private int age;

	public MemberBuilder name(String name) {
		this.name = name;
		return this;
	}

	public MemberBuilder age(int age) {
		this.age = age;
		return this;
	}

	public Member build() {
		return new Member(name, age);
	}
}


return this뢀뢄을 보면 MemberBuilder 객체 μžμ‹ μ„ λ¦¬ν„΄ν•˜λŠ” 것을 λ³Ό 수 μžˆλ‹€. 객체 μžμ‹ μ„ λ¦¬ν„΄ν•¨μœΌλ‘œμ¨ λ©”μ„œλ“œ 호좜 ν›„ μ—°μ†μ μœΌλ‘œ λΉŒλ” λ©”μ„œλ“œλ₯Ό μ²΄μ΄λ‹ν•˜μ—¬ 호좜 ν•  수 μžˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ buildλ©”μ„œλ“œλ₯Ό κ΅¬μ„±ν•΄μ€ŒμœΌλ‘œμ¨ λΉŒλ” 클래슀의 ν•„λ“œλ₯Ό Member μƒμ„±μžμ˜ μΈμžμ— λ„£μ–΄μ€˜ Member μΈμŠ€ν„΄μŠ€λ₯Ό μ–»κ²Œ λœλ‹€.

μž₯점

  • 가독성이 쒋아진닀.
  • μœ μ—°μ„±μ„ 확보할 수 μžˆλ‹€.
  • λΆˆλ³€μ„±μ„ 확보할 수 μžˆλ‹€.
  • ν•„μš”ν•œ λ°μ΄ν„°λ§Œ μ„€μ •ν•  수 μžˆλ‹€.


단점

  • μ½”λ“œμ˜ λ³΅μž‘μ„±μ΄ μ¦κ°€ν•œλ‹€.
  • μƒμ„±μžλ³΄λ‹€λŠ” μ„±λŠ₯이 떨어진닀.
  • μ§€λ‚˜μΉœ λΉŒλ” λ‚¨μš©μ€ κΈˆμ§€! 클래슀 ν•„λ“œμ˜ κ°œμˆ˜κ°€ 4κ°œλ³΄λ‹€ 적고 ν•„λ“œμ˜ λ³€κ²½ κ°€λŠ₯성이 μ—†λŠ” 경우라면 정적 νŒ©ν† λ¦¬ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 쒋을 μˆ˜κ°€ μžˆλ‹€.




정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œ κ°„λ‹¨νžˆ μ„€λͺ…ν•˜μžλ©΄

λ³„λ„μ˜ 객체 μƒμ„±μ˜ 역할을 ν•˜λŠ” 클래슀 λ©”μ„œλ“œλ₯Ό 톡해 κ°„μ ‘μ μœΌλ‘œ 객체 생성을 μœ λ„ν•˜λŠ” 것!

class Member {
	private String name;

	private Member(String name) {
		this.name = name;
	}

	public static Member nameOf(String name) {
		return new Member(name);
	}
}