Lazy와 lateinit을 알아보자

woga·2022년 8월 28일
1

Android 공부

목록 보기
35/49

Lazy는 lazy initalization 기능을 제공한다
즉, 선언 즉시 생성이 아니라 접근(access by Value 프로퍼티)하려하면 그때 생성시켜 준다.
어떤 경우에 더 유용할까?

  • 생성에 시간이 오래 걸리는 큰 오브젝트를 필요로 할 때만 생성 → 프로그램 구동 속도 저하 방지
  • 자원 집약적인, 즉 리소스를 많이 사용하는 실행을 필요로 할 때
  • 자원 생성을 멀티 쓰레드 환경에서 안전하게 해야할때 → 멀티쓰레드 싱글톤 경우에 해당

코틀린 lateinit vs lazy

lateinit

  • var 키워드와 함께
  • null 불가능 타입
  • java primitive type은 사용할 수 없다
  • custom getter setter 정의할 수 없음

lazy

  • by 키워드를 사용해 대리자(delegate)를 지정
  • val 키워드와 함께 (컴퍼일될때 final 키워드가 적용)
  • thread에 안전 (synchroinzed)
  • 초기화 할 때 한 번만 접근한다. (lateinit과 큰 차이)

그럼 늦은 초기화를 할때 같이 쓰였던 의존성 주입 애너테이션에 대해 자세히 알아보자!

@Inject
이를 써서 얻은 장점이 여러가지가 있겠지만, @Test 가 붙은 메서드를 작성하기 쉽게 한다는 점에서 둘은 밀접한 관계가 있다.

단위 테스트의 중요성이 강조되는 분위기가 의존 관계 주입의 인기에 촉매가 되기도 했다는데..

Dependency Injection의 이점

의존 관계 주입을 활용한 프로그래밍에서는 객체가 자신이 사용할 객체를 스스로 선택하지 않고, 제 3의 객체가 사용할 객체를 주입한다.
의존 관계 역전이라고 불리는 이 과정에서 반드시 프레임워크가 필요하지는 않다. 객체의 관계를 조립하는 팩토리 클래스를 만들어서 사용할 수도 있다. 다만 DI 프레임워크는 객체 조립 과정을 더 편리하게 한다.

3가지 이점

  • 객체의 생성 주기를 제어한다.

    • DI 스타일이 유행하기 전까지 재활용할 객체의 싱글톤 패턴을 직접 구현함
    • 생성 지점 통제를 위해 생성자를 prvate으로 바꾸고 getInstance() 메서드를 추가하는 등 각 클래스마다 코드 추가해야 함
    • DI 프레임워크에서는 ApplicationContext, Injector, ObjectGraph 등으로 불리는 통합 객체 저장소에 일반적인 객체를 등록하고, 이를 사용하는 쪽에서 @Inject 같은 애노테이션으로 표시하여 객체 주입
  • 객체에 부가 기능을 추가한다.

    • AOP(Aspect Oriented Programming)를 이용하면, 의존하는 객체에 같은 규약을 유지한 채로 로깅, 보안, 트잭 처리, 예외 처리 등의 부가 기능을 추가할 수 있어서, 반복되는 코드를 줄이고 유연하게 각종 운영 젇책을 변경할 수 있다.
  • 실행 환경에 따라 구현 객체를 바꿔치기도 한다.

    • WAS에 따라 다른 구현 객체 바꾸기
    • 로컬에서 call by value로 호출되는 비즈니스 객체를 원격 호출 객체로 바꾸기
    • 테스트 코드에서 테스트 대상이 아닌 객체를 테스트 전용 객체로 바꾸기 (test double, mock)

AOP?

관점 지향 프로그래밍, 횡단 관심사의 분리를 허용해 모듈성을 증가시키기 위한 목적인 프로그래밍 패러다임
→ 애플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원한다

Android에서도 @Inject가 의미 있을까?

여러 장벽이 있긴 하다.

  • 용량에 부담이 된다
    • 모바일 기기는 한정된 자원
  • 성능에 부담된다
    • 의존 관계를 해석하기 위해 애플리케이션 초기 로딩에 더 많은 일을 해야할 가능성도 크다. → 지금 같은 고사양 핸드폰에서는 신경안써도 될 문제인 거 같다
  • Android 애플리케이션 실행 환경인 Dalvik에서는 cglib과 같은 런타임 바이트 코드 생성 라이브러리를 사용할 수 없다. 기능이 한정됨 (지금 런타임은 모르겠다)
  • 대체로 애플리케이션 규모가 작아서 DI의 유연성으로 얻는 이득이 크지 않다.
  • Android 기본 프레임워크와 DI 프레임워크의 조화를 고려해야한다.

여러 프레임워크가 있지만, Dagger는 안드로이드 전용이 아니여도 경량이라 android에서 문제 없이 실행된다.
dagger는 android를 염두에 두고 개발했다고 밝혔다.

아래는 안드로이드 대거 문서 중 일부다. 자세한건 링크를 타고 가서 살펴보자

https://www.notion.so/woga1999/Lazy-e384d2b61b4545d29d32baac9c51ee04#83360b85c8d046a4bef17e346060565d

종속 항목 삽입은 앱에 다음과 같은 이점을 제공합니다.

  • 클래스 재사용 가능 및 종속 항목 분리: 종속 항목 구현을 쉽게 교체할 수 있습니다. 컨트롤 반전으로 인해 코드 재사용이 개선되었으며 클래스가 더 이상 종속 항목 생성 방법을 제어하지 않지만 대신 모든 구성에서 작동합니다.
  • 리팩터링 편의성: 종속 항목은 API 노출 영역의 검증 가능한 요소가 되므로 구현 세부정보로 숨겨지지 않고 객체 생성 타임 또는 컴파일 타임에 확인할 수 있습니다.
  • 테스트 편의성: 클래스는 종속 항목을 관리하지 않으므로 테스트 시 다양한 구현을 전달하여 다양한 모든 사례를 테스트할 수 있습니다.
profile
와니와니와니와니 당근당근

0개의 댓글