코틀린 54

[Kotlin] sealed 로 클래스 계층 확장을 제한하기 + 태그 클래스 VS 상태 패턴

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 이전 글에서 `Expr` 인터페이스와 `Num`, `Sum` 이라는 하위 클래스를 가지고 덧셈을 구현했었다. (이전 글: [Kotlin] enum & when & smart cast(스마트 캐스트) interface Expr class Num(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun evaluate(e: Expr): Int = when (e) { is Num -> e.value is Sum -> evaluate(e.right) + evaluate(e.left) else -> throw Illeg..

Kotlin 2024.01.06

[Kotlin] inner class & nested class 자바와 비교해서 (feat. 직렬화)

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 이것으로 `helper 클래스`를 캡슐화하거나, 코드 정의를 그 코드를 사용하는 곳 가까이에 두고 싶을 때 유용하다. 클래스 A 안에 다른 클래스 B 를 정의할 때 B 는 두 가지 유형으로 나뉜다. `nested class` 바깥쪽 클래스에 대해 참조를 저장하지 않는다. `inner class` 바깥쪽 클래스에 대한 참조를 저장한다. 자바와 달리 코틀린에서는, 안쪽에 있는 클래스는 디폴트로 바깥쪽 클래스 인스턴스에 대한 접근 권한이 없는 `nested class` 이다. 직렬화를 통해 inner / nested class 테..

Kotlin 2024.01.06

[Kotlin] 가시성 변경자 public, internal, protected, private

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린에서는 기본적으로 public (visibility modifier 가시성 변경자) visibility modifier(가시성 변경자)는 클래스 외부 접근을 제어한다. 코틀린에서도 자바와 같은 가시성 변경자를 가진다. `public`, `protected`, `private` 변경자가 모두 있다. 하지만 코틀린의 기본 가시성은 `public` 이다. 코틀린에서는 최상위 선언에 대해 `private` 을 허용한다. 클래스, 함수, 프로퍼티 등이 최상위 선언으로 가능하다. `private` 최상위 선언은 그 선언이 들어있는 파일 내부에서만 사용 가능하다. 참고로 자바에서는 클래스를 `pr..

Kotlin 2024.01.05

[Kotlin] 코틀린 인터페이스 & 상속 제어 변경자

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 이전에 코틀린 클래스와 프로퍼티 기초를 배웠다. 이제부터 코틀린 클래스, 객체, 인터페이스에 대해 더 깊이 다룰 것이다. 먼저 코틀린의 클래스 계층을 정의하는 방식과 자바의 방식을 비교하자. 코틀린 인터페이스 코틀린 인터페이스는 자바 8 인터페이스와 비슷하다. 코틀린 인터페이스 안에는 추상 메서드 뿐 아니라 구현이 있는 메서드도 정의할 수 있다. (자바 8 의 디폴트 메서드처럼) 하지만 아무런 상태도 들어갈 수는 없다. 간단한 인터페이스 `Clickable` interface Clickable { fun click() } 이 인터페이스를 구현하는 구현 클래스(추상 클래스가 아닌)는 `cli..

Kotlin 2024.01.04

[Kotlin] 로컬 함수 & 확장

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 좋은 코드의 특징 중 하나는 중복이 없는 것이다. 이에 관해서 DRY(Don't Repeat Yourself) 원칙이라는 이름도 있다. 만약 어떤 함수 안에 같은 구조의 코드가 반복된다면 어떻게 이 반복을 줄일 수 있을까? 메서드를 더 작은 단위의 메서드로 나눌 수 있을 것이다. 물론 이것도 좋은 방법이다. 코틀린에서는 다른 방법도 존재한다. 로컬(local) 함수 코틀린에서 로컬 함수는 함수에서 추출한 함수를 원 함수 내부에 중첩시키는 기능이다. 이렇게 하면 문법적인 부가 비용 없이도 깔끔하게 코드를 만들 수 있다. 아래 `User`를 DB 에 저장하는 함수 예제가 있다. class Us..

Kotlin 2024.01.04

[Kotlin] 문자열 & 정규식

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린 문자열은 자바 문자열과 같다. 모든 코틀린 문자열을 자바 메서드에 넘겨도, 자바 문자열을 코틀린 메서드에 넘겨도 괜찮다. 특별한 변환도 필요없고 별도의 `Wrapper`(래퍼)도 필요 없다. 코틀린의 다양한 확장 함수 덕분에 표준 자바 문자열을 더 쉽게 다룰 수 있다. 문자열 나누기 코틀린에서의 문자열을 구분 문자열에 따라 나누는 작업을 알아보자 먼저 자바의 `split` 메서드를 간단히 사용해보자. public void splitString() { String str = "12.345-6.A"; String[] strings = str.split("."); for (String s..

Kotlin 2024.01.04

[Kotlin] 중위 호출 & 구조 분해 선언

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. infix call(중위 호출) 우리는 맵을 만들 때 `mapOf` 함수를 사용해서 아래처럼 만들어 왔다. val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three") 그런데 여기서 `to` 는 코틀린의 특별한 키워드가 아닌 일반 함수라고 했다. 이 코드는 infix call(중위 호출)이라는 특별한 방식으로 to 라는 일반 메서드를 호출한 것이다. 중위 호출 시에는 수신 객체와 유일한 메서드 인자 사이에 메서드 이름을 넣는다. (`[수신 객체] [메서드 이름] [유일한 메서드 인자]`) 이 중위 호출이 가능한 메서드는 일반 호출로도 사용..

Kotlin 2024.01.03

[Kotlin] 컬렉션 처리 API 확장 & 가변 인자(vararg) 함수

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 자바 컬렉션 API 확장 이전에 코틀린 컬렉션은 자바와 같은 클래스를 사용하지만 더 확장된 API 를 제공한다고 했다. @Test fun collectionExtension() { val strings: List = listOf("first", "second", "fourteenth") println(strings.last()) // fourteenth printed val numbers: Collection = setOf(1, 14, 2) println(numbers.max()) // 14 printed } 이런 코드가 어떻게 작동할까? 어떻게 자바 라이브러리의 컬렉션에 대해 코틀린에서 ..

Kotlin 2024.01.03

[Kotlin] 확장 함수 & 확장 프로퍼티

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 확장함수 - 메서드를 다른 클래스에 추가하기 저번 글에서 코틀린 컬렉션은 자바 컬렉션과 똑같은 클래스이지만, 코틀린에서는 아래 코드에서처럼 자바보다 더 많은 기능을 쓸 수 있다고 했다. 우리는 extension function(확장 함수)를 사용하여 기존 JVM 언어 API 를 재작성하지 않고도 코틀린이 제공하는 여러 편리한 기능을 사용할 수 있다. 확장함수는 어떤 클래스의 멤버 메서드인 것처럼 호출할 수 있지만 그 클래스의 밖에 선언된 함수이다. `StringUtil` 이라는 파일을 만들어서 어떤 문자열의 마지막 문자를 돌려주는 메서드를 추가해보자. fun String.lastChar()..

Kotlin 2024.01.01

[Kotlin] 컬렉션에서의 함수 정의와 호출

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린 컬렉션, 문자열, 정규식에서의 함수 정의와 호출 기능을 알아봅니다. 코틀린 컬렉션 만들기 아래와 같이 set 과 리스트, 맵을 만들 수 있다. private val set = hashSetOf(1, 7, 53) private val list = arrayListOf(1, 7, 53) private val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty-three") 여기서 `to` 는 코틀린의 키워드가 아닌 일반 함수이다. (나중에 조금 더 자세히 다룬다.) @Test fun printObjectType() { println(set...

Kotlin 2024.01.01