Kotlin
-
6장. 코틀린 타입 시스템 - (3) 컬렉션과 배열Kotlin 2022. 4. 4. 13:18
널 가능성과 컬렉션 컬렉션 안에 널 값을 넣을 수 있는지 여부는 어떤 변수의 값이 널이 될 수 있는지 여부와 마찬가지로 중요하다. 변수 타입? : 변수에 널을 저장할 수 있다는 뜻 타입 인자? : 타입 인자에 널을 저장할 수 있다는 뜻 //널이 될 수 있는 값으로 이뤄진 컬렉션 만들기 fun readNumbers(reader: BufferedReader):List{ val result = ArrayList() // 널이 될 수 있는 Int 값으로 이뤄진 리스트를 만든다 for(line in reader.lineSequence()){ try{ val number = line.toInt() result.add(number)//정수(널이 아닌 값)을 리스트에 추가한다. }catch (e:NumberFormat..
-
6장. 코틀린 타입 시스템 - (2) 코틀린의 원시 타입Kotlin 2022. 3. 25. 13:09
원시 타입 : Int, Boolean 등 자바는 원시 타입과 참조 타입을 구분한다. 원시타입(primitive type) : int 등, 변수에는 그 값이 직접 들어간다. 참조타입(reference type) : String 등, 변수에는 메모리상의 객체 위치가 들어간다. 코틀린은 원시 타입과 래퍼 타입을 구분하지 않으므로 항상 같은 타입을 사용한다. 실행 시점에 숫자 타입은 가능한 한 가장 효율적인 방식으로 표현된다. 대부분의 경우(변수, 프로퍼티, 파라미터, 반환 타입 등) 코틀린의 Int 타입은 자바 int 타입으로 컴파일된다. 이런 컴파일이 불가능한 경우는 컬렉션과 같은 제네릭 클래스를 사용하는 경우뿐이다. Int와 같은 코틀린 타입에는 널 참조가 들어갈 수 없기 때문에 쉽게 그에 상응하는 자바 ..
-
6장. 코틀린 타입 시스템 - (1) 널 가능성Kotlin 2022. 3. 25. 12:01
널 가능성(nullability) NullPointerException 오류를 피할 수 있게 돕기 위한 코틀린 타입 시스템의 특성이다. null에 대한 접근 방법은 가능한 한 이 문제를 실행 시점에서 컴파일 시점으로 옮기는 것이다. 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 여러 가지 오류를 컴파일 시 미리 감지해서 실행 시점에 발생할 수 있는 예외의 가능성을 줄일 수 있다. 널이 될 수 있는 타입 자바와 달리 코틀린 타입 시스템이 널이 될 수 있는 타입을 명시적으로 지원한다는 점이다. 널이 될 수 있는 타입은 프로그램 안의 프로퍼티나 변수에 null을 허용하게 만드는 방법이다. 어떤 변수가 널이 될 수 있다면 그 변수에 대해(그 변수를 수신 객체로) 메소드를 호출하면 NullPoi..
-
5장. 람다로 프로그래밍 - (5) 수신 객체 지정 람다 : with와 applyKotlin 2022. 3. 17. 09:11
수신 객체 지정 람다 수신 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메소드를 호출할 수 있게 되는 것 with 함수 알파벳 만들기 fun alphabet() : String { val result = StringBuilder() for(letter in 'A'..'Z') { result.append(letter) } result.append("\nNow I know the alphabet!") return result.toString() } println(alphabet()) /* ABCDEFGHIJKLMNOPQRSTUVWXYZ Now I know the alphabet! */ with을 사용해 알파벳 만들기 with문은 파라미터가 2개 있는 함수다. 여기서 첫 번째 파라미터는 stringB..
-
5장. 람다로 프로그래밍 - (4) 자바 함수형 인터페이스 활용Kotlin 2022. 3. 17. 08:29
함수형 인터페이스 (or SAM 인터페이스) 추상 메소드가 단 하나만 있는 인터페이스 코틀린은 함수형 인터페이스를 인자로 취하는 자바 메소드를 호출할 때 람다를 넘길 수 있게 해 준다. 코틀린에는 제대로 된 함수 타입이 있기 때문에 함수형 인터페이스가 아니라 함수 타입을 인자 타입으로 사용해야 한다. 자바 메소드에 람다를 인자로 전달 컴파일러는 자동으로 람다를 Runnable 인스턴스로 변환해준다. 'Runnable 인스턴스' : Runnable을 구현한 무명 클래스의 인스턴스라는 뜻이다. 컴파일러는 자동으로 그런 무명 클래스와 인스턴스를 만들어준다. /* 자바 */ void postponeComputation(int delay, Runnable computation); postponeComputatio..
-
5장. 람다로 프로그래밍 - (3) 지연 계산(lazy) 컬렉션 연산Kotlin 2022. 3. 11. 12:07
컬렉션 함수는 결과 컬렉션을 즉시(eagerly) 생성한다. 이는 컬렉션 함수를 연쇄하면 매 단계마다 계산 중간 결과를 새로운 컬렉션에 임시로 담는다는 말이다. 시퀀스(sequence)를 사용하면 중간 임시 컬렉션을 사용하지 않고도 컬렉션 연산을 연쇄할 수 있다. val people = listOf(Person("Alice", 27), Person("Bob", 31)) println(people.map(Person::name).filter{it.startsWith("A")})//[Alice] filter와 map이 리스트를 반환한다. 이는 이 연쇄 호출이 리스트를 2개 만든다는 뜻이다. 한 리스트 filter의 결과를 담고, 다른 하나는 map의 결과를 담는다. 각 연산이 컬렉션을 직접 사용하는 대신 시..
-
5장. 람다로 프로그래밍 - (2) 컬렉션 함수형 APIKotlin 2022. 3. 11. 11:09
필수적인 함수 : filter와 map filter와 map은 컬렉션을 활용할 때 기반이 되는 함수다. 대부분의 컬렉션 연산을 이 두 함수를 통해 표현할 수 있다. filter filter 함수(필터 함수 또는 걸러내는 함수라고 부름)는 컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다. 결과는 입력 컬렉션의 원소중에서 주어진 술어(참/거짓을 반환하는 함수를 줄여서 술어라고 한다)를 만족하는 원소만으로 이뤄진 새로운 컬렉션이다. filter함수는 컬렉션에서 원치 않는 원소를 제거한다. 하지만 filter는 원소를 변환할 수 없다. data class Person(val name : String, val age : Int) val list = listOf(1..
-
5장. 람다로 프로그래밍 - (1) 람다 식과 멤버 참조Kotlin 2022. 3. 9. 11:34
람다 소개 : 코드 블록을 함수 인자로 넘기기 람다식 또는 람다 기본적으로 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻한다. 함수형 프로그래밍에서는 함수를 값처럼 다루는 접근 방법을 택한다. 람다 식을 사용하면 함수를 선언할 필요가 없고 코드 블록을 직접 함수의 인자로 전달할 수 있다. 람다를 메소드가 하나뿐인 무명 객체 대신 사용할 수 있다. 람다와 컬렉션 컬렉션은 일반적인 패턴에 속하고 그런 패턴은 라이브러리 안에 있어야 한다. 라이브러리 함수를 사용한다. [람다를 사용해 컬렉션 검색하기] 모든 컬렉션에 대해 maxBy 함수를 호출할 수 있다. maxBy는 가장 큰 원소를 찾기 위해 비교에 사용할 값을 돌려주는 함수를 인자로 받는다. 중괄호로 둘러싸인 코드 { it.age } 는 바로 비교에 사용..