no image
[Kotlin] SAM Interface란?
SAM(Single Abstract Method) Interface 란? 하나의 추상 메소드만 있는 인터페이스를 함수형(functional) Interface 또는 SAM(Single Abstract Method) Interface 라고 한다. (An interface with only one abstract method is called a functional interface, or a Single Abstract Method (SAM) interface.) (출처 : https://kotlinlang.org/docs/fun-interfaces.html) 그래서 그걸로 뭘 할 수 있는데? 클래스가 한 번만 사용되고 더 이상 사용되지 않아서 클래스를 따로 정의하기 애매한 상황에 아래와 같이 가독성을 위..
2023.11.02
no image
자바와 달리 코틀린은 멤버 변수 override가 가능한 이유
자바에서는 상속 시에 메소드는 override가 가능하지만, 멤버 변수 override가 안되는데 코틀린에서는 상위 타입의 프로퍼티 override가 가능하다. 그 이유가 궁금해서 찾아서 정리해본다. 자바에서 상위 클래스에 정의된 메소드와 하위 클래스에 정의된 메소드의 이름과 시그니처가 같다면 하위 클래스의 인스턴스로 해당 메소드를 호출했을 때, 하위 클래스에 정의된 메소드가 동작한다. 즉, 메소드 override가 적용된다. 그렇다면, 상위 클래스에 정의된 멤버 변수와 하위 클래스에 정의된 멤버 변수의 이름이 같을 때, 하위 클래스의 인스턴스로 해당 멤버 변수를 수정하거나, 호출하면, 하위 클래스에 정의된 멤버 변수가 수정되고 호출될까? 정답은 아니다. 아래의 코드를 보자. class Parent { ..
2023.11.02
no image
제네릭 변성(Variance)에 관하여
변성(Variance)이란? List 과 List와 같이 기저 타입이 같고 타입 인자가 다른 여러 타입이 서로 어떤 관계가 있는지 설명하는 개념이다. (kotlin in action에 정의된 설명이다.) 위 예시에서 기저타입은 제네릭을 품고 있는 클래스(List) 를 의미하고, 타입 인자란 제네릭 안에 있는 타입 파라미터(String, Any) 를 의미한다. 위 설명이 잘 와닿지 않는다면 아래의 예시들을 보자. Any는 String의 상위 클래스다. 그래서 아래와 같이 Any타입으로 선언된 변수에 String 타입 변수의 데이터를 집어넣을 수 있다. val string = "asd" val any :Any = string println(any) // asd (가능) Any타입으로 선언된 변수에 Strin..
2023.11.02
no image
Lambda 의 변수 포획(캡쳐)에 관하여
람다 내부에 정의된 지역변수가 아닌 람다 외부에 정의된 변수를 람다 내부에서 사용할 때, 람다가 해당 변수를 포획 혹은 캡쳐(Caputure) 했다고 정의한다. 자바에선 람다 외부 변수 중 final로 선언된 변수만 람다안에서 사용이 가능하다. 그에 반해 코틀린은 수정 가능한(fianl이 아닌) 변수도 람다 안에서 사용이 가능하다. 자바 람다에서는 왜 final 변수만 사용 가능하게 제한을 두었는지 알아보고 코틀린과 자바의 어떤 내부적 차이가 있길래, 코틀린 람다에서는 어떻게 수정 가능한 변수를 사용할 수 있는지 알아보자. (코틀린 val은 자바 final 변수와 같음으로, 편의상 코틀린으로 예를 들겠다. ) 자바에서는 왜 람다에서 final 변수만 사용 가능하게 제한을 둔 걸까? 기본적으로, 함수에서 ..
2023.11.02
no image
[Kotlin] reified(실체화 된) 키워드란?
reified(실체화 된) 키워드란? JVM위에서 작동하는 언어의 제네릭은 컴파일 타임에 타입 검증을 마치면, 타입 정보가 지워진 채로 바이트 코드(.class)가 생성된다. 즉, 런타임에 제네릭 클래스는 타입 파라미터에 대한 정보를 가지고 있지 않다. 그래서 제네릭 클래스를 변성(Variance) 규칙을 따르지 않고 함부로 타입 캐스팅하면, 아래와 같이 타입 안정성을 보장 받기 힘들다. (이를 보고 힙 오염(Heap Pollution)이 발생했다고 한다.) private fun main() { val list = mutableListOf(1,2,3,4,5) val any :Any = list val list2 :MutableList = any as MutableList list2.add("asd") /..
2023.11.02
no image
Sealed Class란?
지인분에게 Enum Class와 Sealed Class의 차이점에 대한 질문을 받았었는데 깔끔하게 설명하지 못했었기에 정리하는 글을 남긴다. Sealed Class란? Sealed == 밀봉된, 봉인된 클래스의 상속가능 범위를 동일한 패키지 내로 제한시킨 추상 클래스 그래서 외부 패키지에서 해당 클래스의 서브 클래스를 생성하지 못한다. (서브 클래스의 형태로는 object, data class, class 3가지가 있다.) 객체가 가져야할 프로퍼티가 있다면 data class, class를 사용하고, 딱히 상태를 관리할 프로퍼티가 필요하지 않다면 object를 사용하면된다. Sealed Class를 사용하는 이유 1. Sealed Class의 타입 분기문을 가진 when 문을 사용할 때, 빠트린 분기는 ..
2023.11.02
no image
Enum Class란?
지인분에게 Enum Class와 Sealed Class의 차이점에 대한 질문을 받았었는데 깔끔하게 설명하지 못했었기에 정리하는 글을 남긴다. Enum Class란? 자바에서 상수를 객체지향적으로 객체화해서 관리하기 위해서 생겨난 클래스 Enum 은 Enumeration 의 약자로 열거형을 의미하고 연관되거나 관련이 있는 상수들의 집합을 표현할 때 사용한다. 상수 : 어떤 값인지는 모르겠지만 값이 변하지 않고 항상 일정한 값으로 변수와는 반대되는 단어 기본 형태 enum class Direction { NORTH, SOUTH, WEST, EAST; //공통으로 사용될 때 일반 함수 fun print() = println("${this}..") } enum class State { WAITING { over..
2023.11.02