kotlin 52

[Kotlin] 고차 함수 안에서 흐름 제어

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. filter 와 함께 람다 안에서 return 을 사용하는 등의 예제를 살펴보자. 람다 안의 return 문: 람다를 둘러싼 함수로부터 리턴(non-local return) 일반 루프 안에서 `return` 사용하기 data class Person(val name: String, val age: Int) fun lookForAlice(people: List) { for (person in people) { if (person.name == "Alice") { println("Found!") return } } println("Alice is not found") } val people = ..

Kotlin 2024.01.30

[Kotlin] 고차함수

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 고차함수(high order function): 람다를 인자로 받거나 리턴하는 함수 고차함수로 코드를 더 간단히 하고, 중복을 없애고 더 나은 추상화 구축 가능 함수형 프로그래밍 먼저 함수형 프로그래밍의 정의를 찾아보자. 함수형 프로그래밍(functional programming): 자료 처리를 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 중 하나이다. - 위키백과 부수 효과가 없는 순수 함수를 1급 객체(시민)로 간주하여 패러미터로 넘기거나 리턴값으로 사용할 수 있다. 또 참조 투명성을 지킬 수 있다. 1급 객체는 아래 특징을 가진다. 일급 객체는 ..

Kotlin 2024.01.26

[Kotlin] 프로퍼티 접근자 로직 재활용: 위임 프로퍼티

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 위임 프로퍼티(delegated property)는 코틀린이 제공하는 convention(관례)에 의존하는 독특하면서 강력한 기능이다. 이를 사용하면 값을 backing property 에 단순히 저장하는 것보다 더 복잡한 방식으로 작동하는 프로퍼티를 쉽게 구현할 수 있다. 또 그 과정에서 접근자(getter/setter)로직을 매번 재구현할 필요도 없다. 예를 들어 자신의 값을 필드가 아닌, DB TABLE 이나 브라우저 세션, 맵 등에 저장할 수 있다. 위임은 객체가 직접 작업을 수행하지 않고 다른 도우미 객체가 그 작업을 처리하게 맡기는 디자인 패턴이다. 이 때 도우미 객체를 위임 객..

Kotlin 2024.01.25

[Kotlin] 구조 분해 선언과 component 함수

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 이전에 data class 를 다룬 글에서 간단히 구조 분해 선언(destructuring declaration) 을 살펴보았다 구조 분해를 사용하면 복합적인 값을 분해해서 여러 다른 변수를 한꺼번에 초기화할 수 있다. 구조 분해를 사용하는 방법 val p = Point(10, 20) val (x, y) = p assert(x == 10 && y == 20) 구조 분해 선언은 일반 변수 선언과 비슷하지만 `=` 의 좌변에 여러 변수를 괄호로 묶는다. 구조 분해 선언은 내부적으로 관례를 사용 내부에서 구조 분해 선언은 관례를 사용한다. 구조 분해 선언의 각 변수를 초기화하기 위해 `compo..

Kotlin 2024.01.24

[Kotlin] 컬렉션과 범위에 대해 쓸 수 있는 convention(관례)

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 컬렉션에는 인덱스 연산자(`a[b]`) 를 사용항 인덱스로 원소를 설정하거나 가져올 수 있다. `in` 연산자는 원소가 컬렉션이나 범위에 속하는지 검사하거나 원소를 iteration 할 때 사용한다. 커스텀 클래스에서 이러한 연산들을 추가할 수 있다. 인덱스로 원소에 접근: get & set 코틀린이나 자바에서 맵이나 배열 원소에 접근할 때 모두 `[]` 을 사용한다. 코틀린에서는 인덱스 연산자도 convention 을 따른다. 인덱스 연산자를 사용해 원소를 읽는 연산 -> `get` 연산자 메서드로 변환 인덱스 연산자를 사용해 원소를 쓰는 연산 -> `set` 연산자 메서드로 변환 `Po..

Kotlin 2024.01.24

[Kotlin] 비교 연산자 오버로딩

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린에서는 산술 연산자와 마찬가지로 원시 타입 값뿐 아니라 모든 객체에 대해 비교 연산을 수행할 수 있다. 자바에서는 객체 비교 시 `equals` 나 `compareTo` 를 호출해야 함 코틀린에서는 `==` 비교 연산자를 오버로딩하여 사용 가능 이번에는 비교 연산자를 지원하는 convention(관례) 를 살펴보자. 동등성 연산자: equals 코틀린은 `==` 연산자 호출을 `equals` 메서드 호출로 컴파일한다. 이는 다른 산술 연산자 오버로딩처럼 convention 을 적용한 것이다. `!=` 연산자를 사용하는 식도 `equals` 호출로 컴파일된다. (비교 결과를 뒤집은 값을..

Kotlin 2024.01.24

[Kotlin] 산술 연산자 오버로딩

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린에서는 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법을 convention(관례)라고 한다. 언어 기능을 타입에 의존하는 자바와 달리 코틀린은 함수 이름을 통한 convention 에 의존한다. 자바에서는 원시 타입, `String` 에 대해서만 산술 연산자를 사용할 수 있다. 코틀린에서는 다른 클래스에서도 산술 연산자를 사용할 수 있다. 이항 산술 연산 오버로딩 `plus` 연산자 구현하기 data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { // plus 라는 이름의 연산..

Kotlin 2024.01.23

[Kotlin] 객체 타입의 배열 & 원시 타입의 배열

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린 배열 사용하기 자바 `main` 함수의 표준 시그니처에는 배열 파라미터가 들어있다. 코틀린의 `main` 함수에도 배열 파라미터가 들어갈 수 있다. (kotlin 1.3 이후에는 문자열 배열이 들어가지 않아도 된다.) 코틀린 `main` 함수에서 배열 사용 fun main(args: Array) { for (i in args.indices) { // 배열의 인덱스 값의 범위에 대해 iteration (array.indices 확장 함수 사용) println("Argument $i is: ${args[i]}") // array[index] 로 인덱스를 사용해 배열 원소에 접근 } } ..

Kotlin 2024.01.22

[Kotlin] 코틀린,자바 컬렉션과 nullability, 변경 가능성

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. Nullability 와 Collection 컬렉션에 대해 nullable 을 적용할 때는 조심해야 한다. 리스트 자체가 nullable 인지, 원소가 nullable 인지, 혹은 둘 다 nullable 인지를 잘 고려하자. nullable 값으로 이뤄진 컬렉션 예제 fun readNumbers(reader: BufferedReader): List { val result = ArrayList() // Int? 값으로 이뤄진 리스트 생성 for (line in reader.lineSequence()) { try { val number = line.toInt() result.add(number..

Kotlin 2024.01.22

[Kotlin] 코틀린의 원시 타입

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 원시(Primitive) 타입 자바는 `int` 등의 원시(Primitive) 타입 과 `String` 등의 참조(Reference) 타입을 구분한다. 원시 타입에는 변수에 값이 그대로 들어간다. 참조 타입에는 메모리 상의 객체의 위치가 변수에 들어간다. 자바의 원시 타입은 컬렉션에 넣을 수 없다. 또한 원시 타입의 멤버, 확장 메서드를 호출할 수 없다. 위와 같은 경우에는 `java.lang.Integer` 와 같은 참조 타입이 필요하다. 참조 타입은 원시 타입 값을 감싸서 사용하는 것이다. (`int` 를 감싼 `Integer` 를 컬렉션에 넣기 : `Collection`) 하지만 코틀..

Kotlin 2024.01.18