본문 바로가기

코틀린

(12)
[이펙티브 코틀린] 추상화 설계 이펙티브 코틀린을 읽다가 객체지향을 다룬 부분에서 남기고 싶은 내용들이 있어 조금 발췌하여 가볍게 정리해보았다. 추상화란 컴퓨터 과학에서 추상화는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것이다. 대표적인 예로는 인터페이스가 있다. 클래스라는 복잡한 것에서 메서드와 프로퍼티만 추출해 간단하게 만들었기 때문이다. 프로그래밍에서의 추상화 추상화를 설계한다는 것은 단순히 모듈 또는 라이브러리로 분리한다는 의미가 아니다. 함수를 정의할 때, 그 구현을 함수의 시그니처 뒤에 숨기게 되는데 이가 바로 추상화이다. 만약 코틀린의 maxOf() 함수를 사용하지 않고 다음과 같이 사용한다고 해보자. val biggest = if (z > y) x else y 위 코드는 추상적인 것을..
[Kotlin In Action] 8장. 고차 함수: 파라미터와 반환 값으로 람다 사용 고차 함수 정의 다른 함수를 인자로 받거나 함수를 반환하는 함수 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있음 함수 타입 (Int, String) ‐> Unit (x: Int, y: String) ‐> Unit // 코드의 가독성 위해 파라미터에 이름 지정 가능 함수 파라미터의 타입을 괄호 안에 넣고, 화살표를 넣고, 반환 타입을 지정 반드시 반환 타입을 명시해야 함 Unit : 의미있는 값을 반환하지 않는 함수의 반환 타입 인자로 받은 함수 호출 fun twoAndThree(operation: (Int, Int) ‐> Int) { val result = operation(2, 3) // 함수 호출 println("The result is $result") } fun main(ar..
[Kotlin In Action] 7장. 연산자 오버로딩과 기타 관례 산술 연산자 오버로드 관례란? 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법을 말한다. ex) 산술 연산자 - 어떤 클래스에 plus라는 메서드를 정의할 때 그 클래스의 인스턴스에 대해 + 연산자를 사용할 수 있다. 이항 산술 연산자 data class Point(val x: Int, val y: Int) { operator fun plus(other: Point): Point { return Point(x + other.x, y + other.y) } } >>> val p1 = Point(10, 20) >>> val p2 = Point(30, 40) >>> println(p1 + p2) Point(x=40, y=60) operator 키워드와 지정한 함수 이름을 사용해서 연산자를 오버로딩..
[Kotlin In Action] 6장. 코틀린 타입 시스템 null 가능성 코틀린에서는 기본적으로 NPE를 방지하기 위해 모든 데이터 타입이 Non-Nullable이다. 코틀린은 널이 될 수 있는 타입과 널이 될 수 없는 타입을 명시적으로 지원한다. int strLen(String s) { return s.length(); } 자바에서는 해당 String에 대한 null 체크를 하지 않기 때문에 runtime 시점에 NPE가 터진다. 코틀린은 null과 관련된 문제를 가능한 실행 시점에서 컴파일 시점으로 옮긴다. fun strLen(s: String) = s.length >>> strLen(null) ERROR: Null can not be a value of a non-null type String null이 될 수 있는 타입 타입 이름 뒤에 ?를 붙임 프로퍼..
[Kotlin In Action] 5장. 람다로 프로그래밍 람다 식과 멤버 참조 람다식 함수 타입에 넘길 수 있는 코드 조각. 항상 중괄호로 둘러싸여 있으며, 인자 목록 주변에 괄호가 없다. 람다에서 화살표가 인자 목록과 람다 본문을 구분한다. { x: Int, y: Int ‐> x + y } 람다가 마지막 인자라면 괄호 밖에 위치시킬 수도 있다. 또한 인자가 한개이고 타입 추론이 가능하다면 default 명인 it을 사용할 수 있다. val people = listOf(Person("Alice", 20), Person("Bob", 31)) people.maxBy( { p: Person ‐> p.age } ) people.maxBy { p: Person ‐> p.age } people.maxBy { p ‐> p.age } people.maxBy { it.age ..
[Kotlin In Action] 4장. 클래스, 객체, 인터페이스 Kotlin in Action 책에서 각 챕터의 Summary를 보며 부족한 키워드만 후라닥 정리하는 글. 안드정이 코틀린 인 액션 책 스터디하면서 정리한 자료도 참고할 예정 땡큐땡큐 클래스 계층의 정의 인터페이스 인터페이스나 상위 클래스의 매서드, 프로퍼티 재 정의시 override 수식어를 사용한다. class Button : Clickable { override fun click() = println("I was clicked!") } 메서드 본문을 메서드 시그니처 뒤에 추가함으로 디폴트 메서드를 구현할 수 있다. interface Clickable { fun click() fun showOff() = println("defailt") } open, final, abstract 코틀린의 클래스와 클..
[Kotlin In Action] 3장. 함수 정의와 호출 Kotlin in Action 책에서 각 챕터의 Summary를 보며 부족한 키워드만 후라닥 정리하는 글. 안드정이 코틀린 인 액션 책 스터디하면서 정리한 자료도 참고할 예정 땡큐땡큐 컬렉션 정의 코틀린에서 컬렉션은 두가지로 분리됨 Collection : 불변 MutableCollection : 가변 자체 콜렉션이 아닌 자바 콜렉션 사용: 자바 코드와 상호작용 용이 함수를 호출하기 쉽게 만들기 이름있는 인자 fun joinToString( collection: Collection, separator: String = ", ", prefix: String = "", postfix: String = "" ): String joinToString(collection, separator = " ", prefix..
[Kotlin In Action] 2장. 코틀린 기초 Kotlin in Action 책에서 각 챕터의 Summary를 보며 부족한 키워드만 후라닥 정리하는 글. 안드정이 코틀린 인 액션 책 스터디하면서 정리한 자료도 참고할 예정 땡큐땡큐 함수와 변수 함수를 정의할 때는 fun 키워드를 사용 변수를 정의할 때 val 키워드는 불변(읽기 전용), var 키워드는 가변을 나타냄 val name = "mazzi" // 타입 생략 가능 val name : String= "mazzi" // 타입 명시가능 val answer:Int // 초기화 식을 이용하지 않고 변수 선언시 타입 반드시 명시 answer = 24 초기화 식 없으면 컴파일러가 타입 추론 불가능하기 때문에 반드시 타입 명시 var는 변수 값을 변경할 수 있지만, 그 타입은 바꿀 수 없음 기본적으로 모든 ..