TIL

[TIL] - 코틀린 인터페이스 위임

😀[TIL] - 코틀린 쿡북 169p

1. 대리자를 사용해서 합성 구현하기 - Before

 SmartPhone에 다양한 기능이 있을 때, phone, camera와 같이 세부적인 기능으로 나누고 싶을 때가 있다. 해당 책을 읽기 전에는 클래스를 생성하는 생성자에 객체를 아래와 같이 참조를 해서, 해당 인터페이스를 참조해서 메소드를 호출하는 방식으로 코드를 작성했다.

 

2. 대리자를 사용해서 합성 구현하기 - After

 아래와 같이 'by'라는 키워드를 사용하면, Dialable 인터페이스가 갖고 있는 public 메소드를 SmartPhone 클래스에서 즉각적으로 dial()을 호출해서 사용하는 것을 볼 수 있다.

 

3. 디컴파일시 결과 확인하기

 디컴파일시에는 아래와 같이 SmartPhone이 Dialable 인터페이스를 클래스파일에서 갖고 있는 것을 확인할 수 있다.

 

😀[TIL] - 코틀린 쿡북 173p

 

1. lazy 대리자 사용하기

 lazy는 흔히 사용하는 키워드인데, 어떤 객체를 호출하기 전까지, 지연시키고, 호출하는 시점에서 해당 lazy안의 람다 구문을 실행하는 용도로 사용한다.

 아래 예제에서는 "Hello"가 먼저 출력되고, smartPhone.phone.dial()이 호출되는 시점에서야 lazy 구문이 갖고 있는 람다식인 "Turn On"이 호출되고, SmartPhone객체를 생성해서 smartPhone 변수에 값을 되돌려주고, smartPhone객체의 phone.dial()을 호출한다.

 

😀[TIL] - 코틀린 쿡북 175p

 

1. Delegates.notNull으로 초기화되지 않는 객체 에러 만들기

 코틀린에서는 Delegates라는 클래스를 제공해준다. 

해당 클래스에는 notNull()과 observable을 제공해준다.

 

 

 

2. Delegates.notNull을 정상적으로 사용하기

 

우선, notNull은 var 타입으로 객체를 선언했을 때, 생성해서 객체를 주입하는 로직이 없다면, 오류를 발생시킨다. 우선 일반적으로는 아래와 같이 SmartPhone 객체를 생성해준 모습이다.

 

3. Delegates.notNull을 비정상적으로 사용하기

 아래와 같이 오류가 발생했다.

 

 

4. lateinit var를 비정상적으로 사용하기

 

 아래와 같은 오류가 발생했다. 그 오류가 그 오류같이 보인다.

 

 

5. lateinit vs Delegates.notNull()

 

 lateinit과 Delegates.notNull()의 사용용도는 많이 비슷해보인다. 인터넷 검색을 통해서 얻어낸 결과로는 크게 차이가 나는 점은 이와 같다. Delegates.notNull()은 원시타입과 같이 구분없이 사용할 수 있는 반면에, lateinit은 원시타입에서는 사용할 수 없다.

 하지만, 그만큼 Delegates.notNull은 lateinit 보다 상대적으로 무겁다고 한다.