Kotlin 51

[Kotlin] data class: toString, equals, hashCode, copy, componentN

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 어떤 클래스가 데이터를 저장하는 역할만을 수행한다면 `toStirng`, `equals`, `hashCode` 를 반드시 오버라이드 해야 한다. 다행히, 여러 IDE 에서는 자동으로 그런 메서드를 정의해주는 기능이 있다. 그런데 코틀린에서는 더 편하다. data class(데이터 클래스) `data` 라는 변경자를 클래스 앞에 붙이면 필요한 메서드를 컴파일러가 자동으로 만들어준다. `data` 변경자가 붙은 클래스를 데이터 클래스라고 한다. `Client` 를 데이터 클래스로 data class Client(val name: String, val postalCode: Int) 이제 `Cli..

Kotlin 2024.01.10

[Kotlin] 모든 클래스가 정의해야 하는 메서드 toString, equals, hashCode

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 자바와 마찬가지로 코틀린 클래스도 `toString`, `equlas`, `hashCode` 등을 오버라이드 할 수 있다. 이런 메서드들을 알아보면서 아래 `Client` 라는 클래스를 만들어서 예제에 사용하자. class Client(val name: String, val postalCode: Int) toString(): 문자열 표현 자바처럼 코틀린의 모든 클래스도 인스턴스의 문자열 표현을 얻을 방법을 제공한다. 주로 디버깅과 로깅 시 이 메서드를 사용한다. 기본 제공되는 객체의 문자열 표현은 `Client@5e9f23b4` 같은 방식이다. 이는 디버깅, 로깅 시 유용하지 않으며, `t..

Kotlin 2024.01.09

[Kotlin] 인터페이스의 프로퍼티 & 접근자에서 backing field 에 접근, 접근자의 가시성

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 인터페이스에 선언된 프로퍼티 코틀린에서는 인터페이스에 추상 프로퍼티 선언을 넣을 수 있다. interface User { val nickname: String } `User` 인터페이스를 구현하는 클래스는 `nickname` 의 값을 얻을 수 있는 방법을 제공해야 한다. 인터페이스에 있는 프로퍼티 선언에는 어떠한 상태를 포함할 수 없다. 즉, backing field 에 대한 정보가 들어있지 않다. 프로퍼티 선언을 가진 인터페이스 구현 인터페이스를 구현하는 방법을 코드로 보자 class PrivateUser(override val nickname: String) : User class Su..

Kotlin 2024.01.09

[Kotlin] 주 생성자 & 부 생성자 & 초기화 블록

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 자바에서는 생성자를 하나 이상 선언할 수 있다.코틀린에서도 비슷하지만 바뀐 점들이 있다. 코틀린에서는 primary constructor(주 생성자), secondary constructor(부 생성자)를 구분하며, initializer block(초기화 블록)을 통해 초기화 로직을 추가할 수 있다. 주 생성자 & 초기화 블록 코틀린에서 가장 일반적으로 사용하는 주 생성자 초기화를 보이기 전에, 가장 복잡한 형태로 초기화하는 방식부터 보자. 프로퍼티 `nickname` 을 가지고 있는 `User` 클래스 class User constructor(_nickname: String) { val ..

Kotlin 2024.01.06

[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