내일배움캠프 44일차

김재현·2024년 4월 29일

저번에 못다한 과제 수정 오늘에서야 한다 ㅠㅠ

  1. singleton 구현방식 비교해보기

  2. DetailActivity, MainActivity

  • onCreate 구현부 관련 로직 메서드로 묶기
    ex) initView(), initBinding(), initClickListener()
  1. decimalformat extention or util 패키지로 빼서 관리
  1. singleton 구현 시 companion object와 object로 만드는 차이

1. singleton 구현방식 비교해보기

  • 먼저 싱글톤 패턴이란 클래스의 인스턴스가 하나만 있도록 하면서 이 인스턴스에 대해 Global Access Point를 제공하는 디자인 패턴이다.

  • 싱글톤의 구현 방법은 아래와 같이 여러가지가 존재한다.

    1. Eager Initialization
    2. Lazy Initialization
    3. Thread Safe Lazy Initialization
    4. Double-Checked locking
    5. Initialization on demand holder idiom

1. Eager Initialization (이른 초기화)

class Singleton private constructor() {

    companion object {
        private var INSTANCE: Singleton = Singleton()

        fun getInstance(): Singleton {
            return INSTANCE
        }
    }
}

2. Lazy Initialization

class Singleton private constructor() {

    companion object {
        private var INSTANCE: Singleton? = null

        fun getInstance(): Singleton {

            return INSTANCE ?: Singleton().apply {
                INSTANCE = this
            }
        }
    }
}

3. Thread Safe Lazy Initialization

class Singleton private constructor() {

    companion object {
        private var INSTANCE: Singleton? = null

				@Synchronized
        fun getInstance(): Singleton {
            return INSTANCE ?: Singleton().apply {
                INSTANCE = this
            }
        }
    }
}

4. Double-Checked locking

class Singleton private constructor() {

		companion object {
				@Volatile private var INSTANCE: Singleton? = null

				fun getInstance() = INSTANCE ?: synchronized(this) {
						INSTANCE ?: Singleton().apply { INSTANCE = this }
				}
		}
}
  • 인스턴스 생성 작업만 synchronized로 블럭킹 하는 방법이다.
  • 메소드에 synchronized를 하게되면 호출이 많을 수록 성능이 떨어진다.

5. Initialization on demand holder idiom

class Singleton private constructor() {
    companion object {
        class LazyHolder private constructor() {
            companion object {
                var INSTANCE = Singleton()
            }
        }
        fun getInstance() = LazyHolder.INSTANCE
		}
}

다음과 같은 형태가 있는데 사실 코틀린에서는 싱글톤을 구현할때 object만 사용하면 된다고 한다.

object Singleton {
	fun somthing() {
    }
}

fun main() {
	Singleton.somthing()
}

다음과 같이 메서드를 호출할 수 있다.

출처

https://yoonda.tistory.com/36
https://dev-cho.tistory.com/63

2. DetailActivity, MainActivity

  • onCreate 구현부 관련 로직 메서드로 묶기
    ex) initView(), initBinding(), initClickListener()

MainActivity



DetailActivity



  • 코드가 깔끔해보이고 좋은 것 같다.

3. decimalformat extention or util 패키지로 빼서 관리

  • 다음과 같이 util 패키지로 빼서 메서드 decimal을 만들어 주었다.

  • 다음과 같이 decimal 메서드를 전역에서 사용가능하고 메서드 안에 값만 넣어주면 적용된다.

4. singleton 구현 시 companion object와 object로 만드는 차이

- object

  • 먼저 object는 클래스 외부에서 선언이 됩니다.
  • 사용방법
    • object로 선언된 클래스는 별도의 객체 생성없이 바로 호출할 수 있다.
    • object는 접근 시점에 하나의 객체만 생성되므로 생성자가 없는 클래스만 사용할 수 있다.
    • object를 초기화하기 위해서는 init 블록을 사용하며 처음에만 실행된다.
    • object 내에 선언된 속성과 함수는 클래스명.(함수/필드)로 호출이 가능하다.

- companion object

  • companion object는 클래스 내부에서 선언이 된다.
  • 사용방법
    • companion object로 생성한 파라미터가 있는 싱글톤 클래스는 객체를 생성할 수 있다.
    • 상속 관계에서 companion 멤버는 가려진다.
    • 여러 개의 객체를 생성할 수 있지만 클래스의 메모리 주소 값은 동일하다.
    • companion object 내에 선언된 속성과 함수는 클래스명/객체명.(함수/필드)로 호출이 가능하다.

하루의 마무리

  • 발표도 끝나고 이제 다음 주부터 또 다른 챕터로 들어간다 ㅠㅠ

    그래도 뭔가 좀 속 시원하다. 너무 힘든 한주였다.

0개의 댓글