본문 바로가기

전체 글60

Late Init DI(의존성 주입)나 외부에서 초기화를 하기 위해서 만든 기능이다 초기화 전에 변수에 있는 값에 접근하려고 시도하더라도 컴파일 타임에 에러가 발생하지 않는다 선언 시 주의점 val로 선언불가 변수 선언 이후 값 초기화가 가능해야 하므로 Nullable 허용 안 됨 '?.' 연산자 허용 안 됨 Null 값을 가진 변수에 접근하려는 코드를 짜도 컴파일 타임에 에러가 발생하지 않음. 런타임에 에러발생 예제코드) class LateInit{ lateinit var text : String fun printText(){ //Null값을 가진 text 변수에 접근시도 println(text) text = "안녕하세요" } } fun main(){ val test = LateInit() test.printText().. 2023. 10. 31.
Lazy Init - Synchronization 옵션 배경 코틀린의 Lazy Init의 경우, 멀티쓰레드 환경에서의 안정성을 위해 Synchronization 옵션을 제공한다 Synchronization 옵션 코틀린에서는 Synchronization 옵션 3가지를 제공한다 Synchronized Publication None 아래 예제와 같이 원하는 Synchronazation 옵션을 설정가능하다 val|var varName : T by lazy({Synchronization 옵션}){ //초기화 구문 } 예) val name : String by lazy(LazyThreadSafetyMode.SYNCHRONIZED){ //초기화 구문 } 코틀린에서는 언어 자체를 뜯어볼 수 있다 lazy Init을 자세히 살펴보면 아래와 같이 옵션에 따라 분기하게 된다 .. 2023. 10. 30.
Lazy Init - 기본 배경 JPA에서 사용했었던 Lazy Init의 개념과 비슷하다 아래코드는 Java로 JPA를 사용할 때 Lazy Init을 사용한 예이다 게시글(Post)의 작성자(user)의 정보를 사용할 때 작성자(user)의 정보를 DB에서 Select 해와서 초기화 해준다 public class Post{ //... @ManyToOne(fetch = FetchType.LAZY) private User user; //... } 변수를 사용할 때 변수의 값을 초기화 해주는 기법을 'Lazy Init'이라고 한다 JPA의 Lazy Init은 Java가 아닌 JPA에서 지원하는 것이지만, 코틀린에서는 Lazy Init을 언어차원에서 지원하고 있다 다만, Kotlin에서는 DB에서 값을 Select해서 가져온다기 보다는 .. 2023. 10. 28.
변성 배경 Integer는 Number를 상속받아 만들어진 객체이다. 그래서 Interger는 Number의 하위 타입이라고 할 수 있어 아래와 같은 코딩이 가능함 public void test() { List list; list.add(Integer.valueOf(1)); } 하지만 List는 List의 하위타입이 될 수 없음 이러한 상황에서 Java나 Kotlin에서는 type parameter에 타입 경계를 명시하여 Sub-Type, Super-Type을 가능하게 해 줌 위와 같이 제네릭을 타입으로 받는 클래스 간의 Sub-Type, Super-Type의 정의를 가능하게 해주는 것이 '변성'이다 주요개념 공변성 T’가 T의 서브타입이면, C는 C의 서브타입이다. 공변성은 타입생성자에게 리스코프 치환 법칙.. 2023. 10. 21.