[Kotlin] κ°€μ§œ μƒμ„±μžμ™€ νŒ©ν† λ¦¬ ν•¨μˆ˜

πŸ’‘ κ°€μ§œ μƒμ„±μžμ™€ νŒ©ν† λ¦¬ ν•¨μˆ˜μ— λŒ€ν•˜μ—¬ ν•™μŠ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

κ°€μ§œ μƒμ„±μž

  • Fake Constructor
  • νŒ©ν† λ¦¬ λ©”μ„œλ“œ λ˜λŠ” λ™λ°˜ 객체와 κ΄€λ ¨ν•΄μ„œ μ‚¬μš©λ˜λŠ” μš©μ–΄μ΄λ©°, 일반적인 μƒμ„±μž 호좜 λŒ€μ‹  νŠΉμ • μ‘°κ±΄μ΄λ‚˜ λ‘œμ§μ— 따라 객체λ₯Ό μƒμ„±ν•˜λŠ” λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • 객체 생성 λ‘œμ§μ„ μΊ‘μŠν™”ν•˜μ—¬ μ½”λ“œμ˜ 가독성 및 μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ΄λŠ” 데 μœ μš©ν•˜κ²Œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Kotlinκ³Ό Javaμ—μ„œλŠ” μƒμ„±μžλΌλŠ” κ°œλ…μ΄ μžˆμ§€λ§Œ μ‹€μ œλ‘œλŠ” 일반 ν•¨μˆ˜μ™€ 차이점이 μ—†μŠ΅λ‹ˆλ‹€.

λ™λ°˜ 객체λ₯Ό μ΄μš©ν•œ νŒ©ν† λ¦¬ ν•¨μˆ˜

  • companion objectλ₯Ό ν™œμš©ν•΄μ„œ κ°€μ§œ μƒμ„±μžλ₯Ό κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
class User private constructor(val name: String, val age: Int) {
		companion object {
				fun create(name: String, age: Int): User {
						require(age > 0)
						return User(name, age)
				}
		}
}

fun main() {
		try {
				val user = User.create("jin",20)
		catch( e: Exception) { }
		
  • μœ„ μ½”λ“œμ—μ„œλŠ” User.create λ©”μ„œλ“œκ°€ κ°€μ§œ μƒμ„±μž 역할을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • μƒμ„±μž 호좜 전에 μœ νš¨μ„± 검사와 같은 좔가적인 λ‘œμ§μ„ ꡬ성할 λ•Œ ν•„μš”ν•©λ‹ˆλ‹€.
  • private constructorλ₯Ό μ„ μ–Έν•˜μ—¬ μ™ΈλΆ€μ—μ„œ 직접 User 클래슀λ₯Ό ν˜ΈμΆœν•  수 μ—†κ²Œ μ œν•œν•˜μ˜€μŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό ν†΅ν•΄μ„œ 객체 생성을 μ œν•œν•˜κ³ , νŠΉμ • λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œλ§Œ 객체λ₯Ό 생성할 수 있게 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŒ©ν† λ¦¬ ν•¨μˆ˜μ˜ μ‚¬μš©μ€ μ•„λž˜μ™€ 같은 이점을 κ°€μ§‘λ‹ˆλ‹€.
    • μƒμ„±μžμ— 이름을 λΆ€μ—¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ›ν•˜λŠ” ν˜•νƒœμ˜ νƒ€μž…μ„ λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ‹€μ œ 객체의 κ΅¬ν˜„μ„ 숨길 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μƒμ„±μžλ‘œ κ΅¬ν˜„ν•˜κΈ° νž˜λ“  λ³΅μž‘ν•œ λ‘œμ§μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

fake constructor

  • μ‹€μ œ μ»¬λ ‰μ…˜μΈ LIstλ₯Ό μƒμ„±μžλ‘œ ν™œμš©ν•˜λ©΄, μ•„λž˜μ™€ 같이 λ‚΄λΆ€μ μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • ListλŠ” μ»¬λ ‰μ…˜ μΈν„°νŽ˜μ΄μŠ€λ‘œ μƒμ„±μžλ₯Ό κ°€μ§ˆ 수 μ—†κΈ° λ•Œλ¬Έμ—, fake constructorλ₯Ό ν™œμš©ν•œ 예라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
public inline fun <T> List(
		size : Int,
		init: (index: Int) -> T
): List<T> = MutableList(size, init)
  • λ˜λ‹€λ₯Έ μ˜ˆλ‘œλŠ” μ½”λ£¨ν‹΄μ—μ„œ μ‚¬μš©ν•˜λŠ” Job()κ³Ό CoroutineScope()κ°€ μžˆμŠ΅λ‹ˆλ‹€.
fun Job(parent: Job? = null): CompletableJob = JobImpl(parent)

fun CoroutineScope(context: CoroutineContext): CoroutineScope=
   ContextScope(
       if (context[Job] != null) context else context + Job()
   )
  • 이듀 λ˜ν•œ μΈν„°νŽ˜μ΄μŠ€μ΄λ©°, μƒˆλ‘œμš΄ 객체λ₯Ό 생성할 λ•Œ κ°€μ§œ μƒμ„±μžλ₯Ό 톡해 μƒμ„±ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

κ°€μ§œ μƒμ„±μžμ˜ ν•„μš”μ„±

  • 제일 μ€‘μš”ν•œ 점은 가독성 ν–₯상과 μΆ”μƒν™”μž…λ‹ˆλ‹€.
  • μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  객체λ₯Ό μƒμ„±ν•˜λŠ” λ°©λ²•μ—λŠ” μœ„μ—μ„œ μ‚¬μš©ν•œ νŒ©ν† λ¦¬ ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • μžλ°”μ—μ„œ μ •μ  νŒ©ν† λ¦¬ ν•¨μˆ˜λΌλŠ” μ΄λ¦„μœΌλ‘œ μ‚¬μš© λ˜μ–΄μ§„ νŒ¨ν„΄μ΄λ©°, μ½”ν‹€λ¦°μ—μ„œλŠ” Companion Objectλ₯Ό ν™œμš©ν•΄μ„œ κ΅¬ν˜„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • κ°€μ§œ μƒμ„±μžλ₯Ό ν™œμš©ν•˜λŠ” 것이 νŒ©ν† λ¦¬ ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜λŠ” κ²ƒκ³Όμ˜ κ°€μž₯ 큰 차이점은 μΆ”μƒν™”μž…λ‹ˆλ‹€.
  • fake constructorλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  νŒ©ν† λ¦¬ ν•¨μˆ˜λ₯Ό ν™œμš©ν•œλ‹€λ©΄ , 개발자 μž…μž₯μ—μ„œ μƒμ„±ν•˜κ³ μžν•˜λŠ” 객체가 μΈν„°νŽ˜μ΄μŠ€λ‘œ κ΅¬ν˜„λ˜μ—ˆλ‹€λŠ” 것을 μ•Œκ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λŠ” μ˜μ‘΄μ„± μ—­μ „ 원칙을 지킀지 λͺ»ν•œλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    • λ˜ν•œ μ™ΈλΆ€μ—μ„œ μƒμ†λ°›κ±°λ‚˜, ν™•μž₯ν•˜λŠ” 데 μ œμ•½μ΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°λ‘ 

  • Fake ConstructorλŠ” 객체 생성 λ‘œμ§μ„ μΊ‘μŠν™”ν•˜κ³ , λ‹€μ–‘ν•œ 생성 방법을 μ œκ³΅ν•˜λŠ” 데 μœ λ¦¬ν•©λ‹ˆλ‹€.
    • ν•˜μ§€λ§Œ νƒ€μž… μ•ˆμ „μ„±μ„ 보μž₯ν•˜κΈ° μ–΄λ ΅λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.
    • μ΄λŠ” λ™μ μœΌλ‘œ νƒ€μž…μ„ κ²°μ •ν•˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ μ‹œμ μ— 였λ₯˜ κ°€λŠ₯성이 μžˆμŒμ„ λœ»ν•©λ‹ˆλ‹€.
    • λ˜ν•œ 일관성 μ—†λŠ” λ°˜ν™˜ νƒ€μž…μ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • νŒ©ν† λ¦¬ ν•¨μˆ˜λŠ” 정적 멀버와 싱글톀 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λŠ” 데 μ ν•©ν•˜λ©°, νƒ€μž… μ•ˆμ „μ„±μ„ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•˜μ§€λ§Œ 클래슀 ꡬ쑰λ₯Ό λ³΅μž‘ν•˜κ²Œ λ§Œλ“€ 수 있으며, 상속과 ν™•μž₯에 μ œμ•½μ΄ 생길 수 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ 

https://jaeyeong951.medium.com/fake-contructor-7aef39f98a25