분류 전체보기 154

[Kotlin] object 객체: 객체 선언, 동반 객체, 객체 식

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린에서는 `object` 키워드를 다양한 상황에서 사용할 수 있다. 객체 선언(object declaration): 싱글턴을 정의하는 방법 동반 객체(companion object): 주로 어떤 클래스와 관련있는 메서드와 팩토리 메서드를 담을 때 사용 객체 식: 자바의 익명 내부 클래스(anonymous inner class) 대신 사용 모든 경우 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다. 객체 선언(object declarationi) 인스턴스가 하나만 필요할 때 Singleton(싱글턴) 패턴을 사용하여 이를 구현한다. 자바에서는 보통 클래스의 생성자를 private 으..

Kotlin 2024.01.11

[Kotlin] 클래스 위임과 by, Decorator(데코레이터) 패턴

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 보통 객체지향 시스템을 설계할 때 시스템을 취약하게 만드는 것은 구현 상속(implementation inheritance)에 의해 발생한다. 이와 관련해서는 이 글과 이 글에서 설명한다. 그래서 코틀린은 기본적으로 클래스를 `final` 로 하여 기본적으로 상속을 금지하고 있다.(not `open`) Decorator(데코레이터) 패턴 하지만 종종 상속을 허용하지 않는 클래스에 새로운 동작을 추가해야 할 때가 있다. 이럴 때 사용하는 일반적인 방법이 Decorator(데코레이터) 패턴이다. 이 패턴의 핵심은 상속을 허용하지 않는 클래스(기존 클래스) 대신 사용할 수 있는 새로운 클래스(데..

Kotlin 2024.01.10

[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