Skip to content
This repository was archived by the owner on Jan 13, 2021. It is now read-only.

Latest commit

Β 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 

README.md

κ°œμš”

였직 ν•œ 개의 클래슀 μΈμŠ€ν„΄μŠ€λ§Œμ„ 갖도둝 보μž₯ ν•˜κ³ , 이에 λŒ€ν•œ 전역적인 접근점을 제곡 ν•˜λŠ” νŒ¨ν„΄

동기

μ–΄λ–€ ν΄λž˜μŠ€λŠ” μ •ν™•νžˆ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œμ„ 갖도둝 ν•˜λŠ” 것이 쒋을 수 μžˆλ‹€. μ‹œμŠ€ν…œμ— λ§Žμ€ ν”„λ¦°ν„°κ°€ μžˆμ–΄λ„ ν”„λ¦°ν„° μŠ€ν’€μ€ 였직 ν•˜λ‚˜μ—¬μ•Ό ν•˜κ³ , νšŒμ‚¬μ—μ„œλŠ” ν•œ κ°€μ§€μ˜ νšŒκ³„ μ‹œμŠ€ν…œμœΌλ‘œ 운영이 λ˜μ–΄μ•Ό ν•œλ‹€.

κ·Έλ ‡λ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜λ§Œ λ§Œλ“€κ³ , μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆμ„κΉŒ? μ „μ—­λ³€μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ 객체에 μ ‘κ·Όν•˜λ„λ‘ ν•˜λ©΄ κ°€λŠ₯은 ν•˜λ‹€.

κ·ΈλŸ¬λ‚˜ 더 쒋은 방법은 클래슀 자체적으둜 μœ μΌν•œ μΈμŠ€ν„΄μŠ€λ‘œ μ ‘κ·Όν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•˜λŠ”κ²ƒμ΄ μ’‹μŠ΅λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λŠ” 또 λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ§€ μ•Šλ„λ‘ ν•  수 있고(μƒˆλ‘œμš΄ 클래슀 생성에 λŒ€ν•œ μš”μ²­μ„ κ°€λ‘œμ±„λŠ” 방법), 클래슀 μžμ‹ μ΄ κ·Έ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄ μ ‘κ·Ό 방법을 제곡 ν•  수 μžˆλ‹€. 이λ₯Ό κ°€λ₯΄μΌœ λ‹¨μΌμ²΄νŒ¨ν„΄(Singleton Pattern) 이라고 ν•œλ‹€.

ν™œμš©μ„±

  • 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ 였직 ν•˜λ‚˜μ—¬μ•Ό 함을 보μž₯ν•˜κ³ , 잘 μ •μ˜λœ 접근점(Access Point) 으둜 λͺ¨λ“  μ‚¬μš©μžκ°€ μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•΄μ•Ό ν•  λ•Œ
  • μœ μΌν•œ μΈμŠ€ν„΄μŠ€κ°€ μ„œλΈŒν΄λž˜μ‹±μœΌλ‘œ ν™•μž₯λ˜μ–΄μ•Ό ν•˜λ©°, μ‚¬μš©μžλŠ” μ½”λ“œμ˜ μˆ˜μ •μ—†μ΄ ν™•μž₯된 μ„œλΈŒν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•  λ•Œ

κ΅¬ν˜„

  1. μΈμŠ€ν„΄μŠ€κ°€ μœ μΌν•΄μ•Ό 함을 보μž₯ν•©λ‹ˆλ‹€.
  2. Singleton 클래슀λ₯Ό μ„œλΈŒν΄λž˜μ‹±ν•©λ‹ˆλ‹€.
object ObjectPrinter {
    fun printWithAddress(text: String) = println("$text $this")
}

class ClassPrinter private constructor() {
    fun printWithAddress(text: String) = println("$text $this")

    companion object {
        @Volatile
        private var instance: ClassPrinter? = null

        fun getInstance(): ClassPrinter = instance ?: synchronized(this) {
            instance ?: ClassPrinter().also {
                instance = it
            }
        }
    }
}


fun main() {
    ObjectPrinter.printWithAddress("Hello") // Hello ObjectPrinter@29453f44
    ObjectPrinter.printWithAddress("World") // World ObjectPrinter@29453f44

    ClassPrinter.getInstance().printWithAddress("Hello") // Hello ClassPrinter@5cad8086
    ClassPrinter.getInstance().printWithAddress("World") // World ClassPrinter@5cad8086
}

κ²°κ³Ό

  1. μœ μΌν•˜κ²Œ μ‘΄μž¬ν•˜λŠ” μΈμŠ€ν„΄μŠ€λ‘œμ˜ 접근을 ν†΅μ œν•©λ‹ˆλ‹€.
    • Singleton 클래슀 μžμ²΄κ°€ μΈμŠ€ν„΄μŠ€λ₯Ό μΊ‘μŠν™”ν•˜κΈ° λ•Œλ¬Έ
  2. 이름 곡간(name space)을 μ’νž™λ‹ˆλ‹€. μ „μ—­ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜μ—¬ λ°œμƒν•˜λŠ” λ””λ²„κΉ…μ˜ 어렀움 λ“± 문제λ₯Ό λ°©μ§€
  3. μ—°μ‚° 및 ν‘œν˜„μ˜ μ •μ œλ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€.
    • Singleton ν΄λž˜μŠ€λŠ” 상속될 수 있기 λ•Œλ¬Έμ—, 이 μƒμ†λœ μ„œλΈŒν΄λž˜μŠ€λ₯Ό ν†΅ν•΄μ„œ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 이 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄, λŸ°νƒ€μž„μ— ν•„μš”ν•œ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ¨μ„œ μ‘μš©ν”„λ‘œκ·Έλž¨μ„ ꡬ성이 κ°€λŠ₯함.
  4. μΈμŠ€ν„΄μŠ€μ˜ 갯수λ₯Ό λ³€κ²½ν•˜κΈ°κ°€ μžμœ λ‘­μŠ΅λ‹ˆλ‹€.
    • 마음이 λ°”λ€Œμ–΄μ„œ Singleton 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ ν•˜λ‚˜ 이상 μ‘΄μž¬ν•  수 μžˆλ„λ‘ λ³€κ²½ν•΄μ•Ό ν•  λ•Œλ„ μžˆλŠ”λ°, μ—¬λŸ¬κ°œμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ„œ 각각의 μΈμŠ€ν„΄μŠ€λ‘œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ—°μ‚°μ˜ κ΅¬ν˜„μ„ λ°”κΎΈλ©΄ 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
  5. 클래슀 연산을 μ‚¬μš©ν•˜λŠ” 것보닀 훨씬 μœ μ—°ν•œ λ°©λ²•μž…λ‹ˆλ‹€.