코틀린

kotlin 데이터 클래스는 구조 분해 선언(Destructuring Declaration)이라는 특성을 갖고 있다. 구조 분해를 사용하면 복합적인 값을 분해해서 여러 다른 변수를 한꺼번에 초기화할 수 있다. val p = Point(10, 20) val (x, y) = p // x => 10 // y => 20 구조 분해 선언의 각 변수를 초기화하기 위해 componentN이라는 함수를 호출한다. data 클래스의 주 생성자에 들어있는 프로퍼티에 대해서는 컴파일러가 자동으로 componentN함수를 만들어준다. val (x, y) = p // 위 코드 컴파일 후 val x = p.component1() val y = p.component2() // data 타입이 아닌 클래스에서 구현하는 방법 clas..
코틀린은 원시 타입/래퍼 타입을 구분하지 않는다. Int, Boolean 등등 코틀린은 자바와 달리 원시타입과 래퍼타입이 따로 존재하지 않는다. var list: List = listOf(1, 2, 3) 코틀린에서 모든 타입이 참조 타입으로 표현되는 것이 아니라, 실행 시점에 가능한 가장 효율적인 방식으로 타입이 표현된다. 대부분의 경우 코틀린의 Int타입은 자바 int 타입으로 컴파일 된다. 컴파일이 불가능한 경우(제네릭 클래스)만 래퍼 타입(Integer)로 컴파일되게 된다. Int를 컬렉션의 타입 파라미터로 넘길 때, Integer객체가 들어가게 된다. 널이 될 수 있는 타입 Int?, Boolean? 코틀린에서 널이 될 수 있는 원시 타입을 사용하면, 자바의 래퍼 타입으로 컴파일 된다. 자바의 래..
엘비스 연산자(?:) 코틀린은 엘비스 연산자(?:)를 사용하여 디폴트 값을 편하게 지정할 수 있다. fun foo(s: String?) = s ?: "" fun strLenSafe(s: String?): Int = s?.length ?: 0 return이나 throw등의 연산도 식이니, 엘비스 연산자의 우항에 넣을 수도 있다. fun printlnShippingLabel(person: Person){ val address = person.company?.address ?: throw IllegalArgumentException("No address") with(address){ println(streetAddress) println("$zipCode $city, $country") } } 안전한 캐스트:..
널 가능성 코틀린을 비롯한 최신 언어에서 null에 대한 접근 방법은 가능한 한 이 문제를 실행 시점에서 컴파일 시점으로 옮기는 것이다. 널이 될 수 있는지 여부를 타입 시스템에 추가함으로써 컴파일러가 여러 가지 오류를 커파일 시 미리 감지해서 실행 시점에 발생할 수 있는 예외의 가능성을 줄인다. 널이 될 수 있는 타입 코틀린과 자바의 차이점 중 하나는 코틀린 타입 시스템이 널이 될 수 있는 타입을 명시적으로 지원한다는 점이다. 코틀린은 null이 될 수 있는 변수를 메소드 파라미터로 받을 수 있으면 호출을 금지함으로써 많은 오류를 방지한다. int strLen(String s){ return s.length; } 이 함수의 파라미터로 null이 들어오면 NullPointerException이 발생한다...
코틀린 람다의 독특한 기능은 바로 수신 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메소드를 호출할 수 있게 하는 것이다. 그런 람다를 수신 객체 지정 람다(lamda with receiver) 라고 부른다. 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() } 이 예제에서 result에 대해 다른 여러 메..
컬렉션 연산시 지연(lazy), 즉시(eagerly) 계산의 차이는 무엇인가? 즉시(eagerly)연산은 커렉션함수를 연쇄할 때마다 계산 중간 결과를 새로운 컬렉션에 임시로 담는다. 시퀀스(sequence)를 사용하면 중간 임시 컬렉션을 사용하지 않고 컬렉션 연산을 연쇄한다. people .filter { it.lastName != null } .filter { it. age!= null } .find { it.age == 31 } people.asSequence() // 컬렉션을 시퀀스로 변환 .filter { it.lastName != null } // Intermediate operation .filter { it. age!= null } // Intermediate operation .find {..
필수적인 함수: filter 와 map filter함수는 컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다. data class Person(val name: String, val age: Int) fun main() { val list = listOf(1, 2, 3, 4) println(list.filter { it%2 == 0 }) val people = listOf(Person("Alice", 29), Person("Bob", 31)) println(people.filter { it.age > 30 }) } filter 함수는 컬렉션에서 원치 않은 원소를 제거한다. 하지만 filter는 원소를 변환할 수는 없다. 원소를 변환하려면 map 함수를 사용해..
코틀린 람다 맛보기 컬렉션에서 직접 탐색하기 data class Person(val name: String, val age: Int) fun findTheOldest(people: List){ var maxAge = 0 var theOldest: Person? = null for(person in people){ if(person.age > maxAge){ maxAge = person.age theOldest = person } } println(theOldest) } >> val people = listOf(Person("Corn", 31), Person("HB", 27)) >> findTheOldest(people) Person(name=Corn, age=31) 경험이 많은 개발자라면 순식간에 이런 ..
코틀린 컴파일러는 equals, hashCode, toString 등의 메소드를 기계적으로 생성하는 작업을 보이지 않는 곳에서 해준다. 따라서 필수 메소드로 인한 잡음 없이 소스코드를 깔끔하게 유지할 수 있다. 이제 코틀린 컴파일러가 데이터 클래스에 유용한 메소드를 자동으로 만들어주는 예와 클래스 위임 패턴을 아주 간단하게 쓸 수 있게 해주는 예를 살펴보자. 모든 클래스가 정의해야 하는 메소드 자바와 마찬가지로 코틀린 클래스도 toString, equals, hashCode 등을 오버라이드할 수 있다. // 고객 이름과 우편번호를 저장하는 간단한 Client 클래스 class Client(val name: String, val postalCode: Int) 문자열 표현: toString() class C..
인터페이스에 선언된 프로퍼티 구현 코틀린에서는 인터페이스에 추상 프로퍼티를 선언할 수 있다. interface User{ val nickname: String } 이 인터페이스를 구현하는 세 클래스를 만들어보자. 이 세 클래스는 각각 다른 방식으로 추상 프로퍼티 nickname을 구현한다. // 주 생성자에있는 프로퍼티 class PrivateUser(override val nickname: String) : User // 커스텀 게터(nickname은 매번 호출될 때마다 substringBefore를 호출해 계산) class SubscribingUser(val email: String) : User{ override val nickname: String get() = email.substringBefo..
깡냉쓰
'코틀린' 태그의 글 목록