Book
-
Kotlin in Action: ch 9. 제네릭스Book/Kotlin in Action 2023. 1. 11. 23:21
Generics(제네릭스) Generics를 사용하면 타입 파라미터(type parameter)를 받는 타입을 정의할 수 있다. 제네릭 타입의 인스턴스를 만들려면 타입 파라미터를 구체적인 타입 인자(type argument)로 치환해야 한다. 예를 들어 List라는 타입이 있다면 그 안에 들어가는 원소의 타입을 안다면 쓸모가 있을 것이다. 타입 파라미터를 사용하면 “이 변수는 리스트다”라고 말하는 대신 정확하게 “이 변수는 문자열을 담는 리스트다”라고 말할 수 있다. 자바와 달리 코틀린에서는 제네릭 타입의 타입 인자(type argument)를 프로그래머가 명시하거나 컴파일러가 추론할 수 있어야 한다. 자바는 맨 처음에 제네릭 지원이 없었고 자바 1.5에 뒤늦게 제네릭을 도입했기 때문에 이전 버전과 호환..
-
Kotlin in Action: ch 8. 고차 함수: 파라미터 반환 값으로 람다 사용(2)Book/Kotlin in Action 2023. 1. 11. 08:43
8.2 인라인 함수: 람다의 부가 비용 없애기 inline 변경자를 어떤 함수에 붙이면 컴파일러는 그 함수를 호출하는 모든 문장을 함수 본문에 해당하는 바이트코드로 바꿔준다. 무의미한 객체 생성 예방 인라인 함수를 사용하면 람다식을 사용했을 때 무의미하게 객체가 생성되는 것을 막을 수 있다. fun nonInlined(block: () -> Unit) { block() } fun doSomething() { nonInlined { println("do something") } } nonInlined라는 함수는 고차 함수로 함수 타입을 인자로 받고 있다. 그리고 doSomething()은 noInlined 함수를 호출하는 함수이다. 이러한 코드를 자바로 표현한다면 아래와 같다. public void non..
-
Koltin in Action: ch 8. 고차 함수 : 파라미터와 반환 값으로 람다 사용 (1)Book/Kotlin in Action 2023. 1. 8. 23:59
8.1 고차 함수 정의 고차 함수란? 고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수이다. 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있다. 따라서 고차 함수는 람다나 함수 참조를 인자로 넘길 수 있거나 람다나 함수 참조를 반환하는 함수이다. 함수 타입 함수 타입을 정의하려면 함수 파라미터의 타입을 괄호 안에 넣고, 그 뒤에 화살표(->)를 추가한 다음, 함수의 반환 타입을 지정하면 된다. Unit 타입은 의미 있는 값을 반환하지 않는 함수 반환 타입에 쓰는 특별한 타입이다. 그냥 함수를 정의한다면 함수의 파라미터 목록 뒤에 오는 Unit 변환 타입 지정을 생략해도 되지만 함수 타입을 선언할 때는 반환 타입을 반드시 명시해야하므로 Unit을 빼먹어서는 안된다. 예를 들기..
-
Kotlin in Action: 7.4-7.5 구조 분해 선언과 component 함수, 프로퍼티 접근자 로직 재활용: 위임 프로퍼티Book/Kotlin in Action 2023. 1. 6. 14:05
7.4 구조 분해 선언과 component 함수 구조 분해를 사용하면 복합적인 값을 분해해서 여러 다른 변수를 한꺼번에 초기화 할 수 있다. data class Point(val x: Int, val y: Int) fun main(args: Array) { val p = Point(10, 20) val (x, y) = p println(x) println(y) } 구조 분해 선언은 = 의 좌변에 여러 변수를 괄호로 묶어 사용한다. 내부에서 구조 분해 선언은 다시 관례를 사용한다. 각 변수를 초기화하기 위해 componentsN 이라는 함수를 호출한다. 여기서 N 은 구조 분해 선언에 있는 변수 위치에 따라 붙는 번호다. data 클래스의 주 생성자에 들어있는 프로퍼티에 대해서는 컴파일러가 자동으로 com..
-
Kotlin in Action: 7.2-7.3 비교 연산자 오버로딩, 컬랙션과 범위에 대해 쓸 수 있는 관례Book/Kotlin in Action 2023. 1. 6. 13:40
7. 2 비교 연산자 오버로딩 동등성 연산자 : equals 코틀린에서는 모든 객체에 대해 비교 연산을 수행하는 경우 equals나 compareTo를 호출해야하는 자바와 달리 "==" 비교 연산자를 직접 사용할 수 있어서 비교하는 코드가 더 간결하며 이해하기 쉽다. 코틀린은 "=="연산자 호출을 equals()로 컴파일하며, "!="역시 equals()를 사용하여 결과 값을 not 처리하는 식으로 동작한다. a==b라는 코드는 실제로 내부에서 인자의 null 체크를 하므로 다른 연산자와 달리 null이 될 수 있는 값(nullable)에도 적용할 수 있다. 동등성 검사 ==는 equals 호출과 null 체크로 컴파일된다. 실제 내부 코드는 아래와 같이 구현되어 있다. 이 경우 a가 null인지 판단해..
-
Kotlin in Action: 7.1 산술 연산자 오버로딩Book/Kotlin in Action 2023. 1. 6. 12:59
7. 1 산술 연산자 오버로딩 오버로딩 : 한 클래스내에 같은 이름의 메서드를 여러개 정의 하는 것 코틀린에서는 특정 연산자의 역할을 함수로 정의할 수 있다. 이를 Convention(관례)이라고 한다. 가장 기본적인 예로는 산술 연산자가 있다. 자바에서는 원시 타입(primitive)에 대해서만 산술 연산자를 사용할 수 있고, 추가로 String에 대해 "+" 연산자를 사용할 수 있다. 이항 산술 연산 오버로딩 코틀린에서는 +, - 같은 산술 연산자를 오버로딩해서 사용할 수 있다. 객체끼리 더하거나 뺄 때, 원하는 동작을 함수 안에 구현하면 연산자를 통해 이를 표현할 수 있다. data class Point(val x: Int, val y: Int) { operator fun plus(other: Po..
-
Kotlin in Action: 6.3 컬렉션과 배열Book/Kotlin in Action 2022. 11. 25. 00:54
6.3 컬렉션과 배열 6.3.1 널 가능성과 컬렉션 컬렉션을 선언할 때 변수 타입 뒤에 ?를 붙이면 그 변수에 널을 저장할 수 있다는 뜻으로 사용할 수 있다. 널이 될 수 있는 객체를 만들 때 전체를 널이 될 수 있게 만드는지, 아니면 원소만 널이 될 수 있게 만드는지 조심해야 한다. fun addValidNumbers(numbers: List) { var sumOfValidNumbers = 0 var invalidNumbers = 0 for (number in numbers) { if (number != null) { sumOfValidNumbers += number } else { invalidNumbers++ } } println("Sum of valid numbers: $sumOfValidNumb..
-
Kotlin in Action: 6.2 코틀린의 원시 타입Book/Kotlin in Action 2022. 11. 25. 00:25
6.2 코틀린의 원시 타입 코틀린은 원시 타입과 래퍼 타입을 구분하지 않는다. 6.2.1 원시 타입: Int, Boolean 등 자바는 원시 타입과 참조 타입을 구분한다. 원시타입의 변수에는 그 값이 직접 들어가지만, 참조 타입의 변수에는 메모리상의 객체 위치가 들어간다. 이 방법으로 원시 타입의 값을 더 효율적으로 저장하고 여기저기 전달할 수 있지만, 그런 값에 대해 메소드를 호출하거나 컬렉션에 원시 타입 값을 담을 수는 없다. 만일 참조 타입이 필요한 경우 특별한 래퍼 타입등으로 원시 타입 값을 감싸서 사용한다. 정수의 컬렉션을 정의하려면 Collection가 아니라 Collection를 사용하는 것처럼 말이다. 코틀린은 원시 타입과 래퍼 타입을 구분하지 않으므로 항상 같은 타입을 사용한다. 다음 예..