프로그래밍 언어/kotlin
-
[kotlin in action] 제네릭스와 변성프로그래밍 언어/kotlin 2021. 8. 25. 04:11
9.3 변성: 제네릭과 하위 타입 변성이 있는 이유: 인자를 함수에 넘기기 리스트의 내용을 출력만 하는 함수는 잘 작동한다. fun printContents(list: List) { println(list.joinToString()) } fun main(args: Array) { printContents(listOf("abc", "bac")) } 만약 리스트의 내용을 변경하는 함수라면? fun addAnswer(list: MutableList) { list.add(42) } fun main(args: Array) { val strings = mutableListOf("abc") addAnswer(strings) // 컴파일 안됨. } MutableList 가 필요한 곳에 MutableList을 넘기면 안..
-
[kotlin in action] 제네릭스프로그래밍 언어/kotlin 2021. 8. 25. 02:17
타입 파라미터 간에는 상/하위 관계가 없고 raw-type 간에만 상/하위 관계가 존재한다. Integer -> Number (O) List -> List List -> ArrayList (O) 실체화한 타입 파라미터 실체화한 타입 파라미터를 사용하면 인라인 함수 호출에서 타입 인자로 쓰인 구체적인 타입을 실행 시점에 알 수 있다. 선언 지점 변성 기저 타입(=제네릭 타입에서 타입 파라미터를 제외한 부분)은 같지만 타입 인자가 다른 두 제네릭타입 Type 와 Type가 있을 때 타입 인자 A와 타입 인자 B의 상위/하위 타입 관계에 따라 두 제네릭 타입의 상위/하위 타입 관계가 어떻게 되는지 지정할 수 있다. 사용 지점 변성 제네릭 타입 값 사이의 상위/하위 타입 관계 지정을 제네릭 타입 값을 사용하는 ..
-
[kotlin in action] 연산자 오버로딩과 기타 관례프로그래밍 언어/kotlin 2021. 8. 13. 19:37
상호작용하는 클래스가 둘 이상이면, 다른 클래스에게 API를 제공하는 클래스가 적어도 하나 이상 있기 마련..! 7장 이후로는, 자신만의 API를 코틀린답게 만드는 방법을 배운다. 어떤 언어 기능이, 정해진 사용자 작성 함수와 연결되는 경우 (타입에 의존) ex) for ... in 루프에 java.lang.Iterable을 구현한 객체를 사용 try문에 java.lang.AutoCloseable 구현한 객체 사용 코틀린에서는 어떤 언어 기능이 어떤 타입(클래스)과 연관되기보다는, 특정 함수 이름과 연관된다. (관례에 의존) *관례 : 어떤 언어 기능과, 미리 정해진 이름의 함수를 연결해주는 기법 연산자 오버로딩 산술 연산자 오버로딩 이항 산술 연산 오버로딩 연산자를 오버로딩하는 함수 앞에는 꼭 oper..
-
[Kotlin In Action] 코틀린 타입 시스템프로그래밍 언어/kotlin 2021. 8. 6. 13:53
코틀린 원시 타입 소개와 자바 타입과 코틀린 원시 타입의 관계 코틀린 컬렉션 소개와 자바 컬렉션과 코틀린 컬렉션의 관계 타입 시스템 - 널이 될 수 있는 타입 - 읽기 전용 컬렉션 6.1 널 가능성 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 여러 가지 오류를 컴파일 시 미리 감지해서 실행 시점에 발생할 수 있는 예외의 가능성을 줄일 수 있다. 널이 될 수 있는 타입 널이 될 수 있는 타입을 명시적으로 지원한다. 어떤 변수가 null이 될 수 있다면, 그 변수에 대해 메소드를 호출하면 NullPointerException이 발생할 수 있으므로 안전하지 않다. 어떤 타입 이름 뒤에 물음표를 붙이면 그 타입의 변수나 프로퍼티에 null 참조를 저장할 수 있다는 뜻. 널이 될 수 있는 타입..
-
[Kotlin in Action] 람다로 프로그래밍프로그래밍 언어/kotlin 2021. 7. 26. 16:20
* 람다 : 다른 함수로 넘길 수 있는 작은 코드조각 공통 코드구조를 라이브러리 함수로 뽑아낼 수 있다. 5.1 람다 식과 멤버 참조 람다 : 코드블록을 함수의 인자로 넘기기 함수를 값처럼 사용. 함수를 직접 다른 함수에 전달. button.setOnClickListener(new OnClickListener() { // 무명 내부 클래스 선언 @Override public void onClick(View view) { } }) 람다는 메소드가 하나뿐인 무명 객체를 대신할 수 있다. 람다와 컬렉션 람다를 사용해서 컬렉션 검색 people.maxBy{ it.age } it.age -> 비교에 사용할 값을 돌려주는 함수 it 은 컬렉션의 원소를 가리킨다. 멤버 참조를 사용해 컬렉션 검색 people.maxB..
-
[Kotlin in action] 클래스, 객체, 인터페이스프로그래밍 언어/kotlin 2021. 7. 25. 16:03
인터페이스 [자바와 다른 점] 코틀린은 인터페이스에 프로퍼티를 선언할 수 있다. 코틀린 인터페이스 선언은 기본적으로 final, public 이다. 코틀린 중첩 클래스는 내부클래스가 아니어서 외부클래스에 대한 참조가 없다. 4.1 클래스 계층의 정의 자바는 final로 명시적으로 상속을 금지하는 클래스 외에, 모든 클래스는 다른 클래스가 상속할 수 있다. 그래서 문제가 발생할 여지가 있다. 취약 기반 클래스: 하위 클래스가 기반 클래스에 대해 가졌던 가정이 기반 클래스를 변경함으로써 깨져버린 경우. 기반 클래스를 변경하는 경우 하위 클래스의 동작이 예기치 않게 바뀔 수 있다. 따라서, 코틀린에서는 기본적으로 클래스와 메소드는 final 이다. 어떤 클래스에 대해 상속을 허용하려면 앞에 open 변경자를 ..
-
[Kotlin in Action] 함수의 정의와 호출프로그래밍 언어/kotlin 2021. 7. 13. 21:21
컬렉션 컬렉션 만들기 // 코틀린은 자체 컬렉션을 제공하지 않고 표준 자바 컬렉션을 활용하여 자바 코드와의 상호작용 쉽게 한다. val set = hashSetOf(1, 7, 53) // java.util.HashSet 의 객체 val list = arrayListOf(1, 7, 53) // java.util.ArrayList 의 객체 val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty-three") // java.util.HashMap 의 객체 이름 붙인 인자 // 코틀린으로 작성한 함수를 호출할 때는 함수에 전달하는 인자 중 일부 또는 전부의 이름을 명시할 수 있다 println(joinToString(list, separator = "; ", p..
-
[코틀린 인 액션] 코틀린 기초프로그래밍 언어/kotlin 2021. 7. 6. 14:35
2.1 코틀린 맛보기 함수 자바와 달리 함수를 최상위 수준에 정의할 수 있다. 배열도 일반적인 클래스와 마찬가지로 사용 가능하다. println 과 같이 자바 표준 라이브러리 함수를 간결하게 사용할 수 있게 감싼 래퍼를 제공한다. 함수 기본 구조 블록이 본문인 함수 블록이 본문인 함수가 값을 반환할 때는, 반드시 변환 타입을 지정하고 return문을 사용해 반환 값을 명시해야 한다. fun max(a: Int, b: Int): Int { return if (a > b) a else b } 식이 본문인 함수 fun max(a: Int, b: Int): Int = if (a > b) a else b 반환 타입 생략 가능하다. 식이 본문인 함수의 경우, 굳이 사용자가 반환 타입을 적지 않아도 컴파일러가 함수 ..