고차 함수는 함수를 매개 변수로 사용하거나 함수를 반환하는 함수입니다. fun main(args: Array) { // 람다 함수를 이용하여 함수 전달 result("고차함수 ", { x, y -> x + y }) } // sum: (Int, Int) -> Int // 함수명 : (매개변수 타입) -> 리턴 타입 fun result(str: String, sum: (Int, Int) -> Int) { println(str + sum(10, 20)) // print 고차함수 30 } 위 코드를 이해하기 위해서는 아래 코틀린 문법이 필수입니다. 2019/05/19 - [Kotlin] - 코틀린 기초 문법) 1. 코틀린 변수 정의하기 2019/05/19 - [Kotlin] - 코틀린 기초 문법) 2. 코틀린 ..
람다 식과 익명 함수는 '함수 리터럴'입니다. 즉, 선언되지 않고 즉시 식으로 전달되는 함수입니다. fun sum(x: Int, y: Int) = println(x + y) // 일반 함수 val lambda = { x: Int, y: Int -> println(x + y) } //람다 함수 fun main(args: Array) { sum(10, 20)// print 30 lambda(10, 20)// print 30 } 람다 표현식은 항상 중괄호로 둘러쌉니다. 전체 구문 형식의 매개 변수 선언은 중괄호 안에 들어가고 선택적 유형 주석을 가집니다. 본문은 -> 부호 뒤에 옵니다. 유추된 람다 반환 형식이 아닌 Unit경우 람다 본문의 마지막 식 (또는 단일 식)이 반환 값으로 처리됩니다. 쉽게 말해 람..
우리가 필요로 할 때마다 수작업으로 구현할 수 있지만 일반적으로 한 번만 구현하고 라이브러리에 넣는 것이 좋을 것입니다. 예 : 게으른 속성 : 첫 번째 액세스시에만 값이 계산됩니다. 관찰 가능한 속성 : 리스너는이 속성에 대한 변경 사항에 대한 알림을받습니다. 각 속성에 대한 별도의 필드 대신지도에 속성을 저장합니다. 이러한 (및 기타) 사례를 다루기 위해 Kotlin은 위임 된 속성을 지원 합니다 . import kotlin.reflect.KProperty fun main(args: Array) { val ex = Example() ex.p = "홍길동" // setValue 호출 println(ex.p) // getValue 호출 } class Example { var p: String by Del..
코틀린에서 위임(Delegation) 패턴은 상속에 좋은 대안용으로 사용합니다. 기본적으로 클래스는 final이며, 상속될 클래스는 open 키워드가 필요합니다. 상속할 수 없는 클래스에 기능을 추가하거나 변경이 필요할 경우 fun main(args: Array) { val b = BaseImpl(10) val d = Derived(b) d.printMessage() d.printMessageLine() } interface Base { fun printMessage() fun printMessageLine() } class BaseImpl(val x: Int) : Base { override fun printMessage() { print(x) } override fun printMessageLine(..
비즈니스 로직이 어떤 유형의 래퍼를 작성해야하는 경우가 있습니다. 그러나 추가 힙 할당으로 인해 런타임 오버 헤드가 발생합니다. 또한 래퍼 된 유형이 프리미티브 인 경우 원시 형식은 일반적으로 런타임에서 크게 최적화되므로 래퍼는 특별한 처리를하지 않기 때문에 성능이 저하됩니다. 이러한 문제를 해결하기 위해 Kotlin은 클래스라는 이름 앞에 한정자를 inline class배치하여 선언되는 특별한 클래스의 클래스를 소개합니다 inline. 인라인 클래스 특징 생성자에 초기화 된 단일 속성이 있어야합니다. 클래스는 실제 인스턴스화가 발생하지 않습니다. init 블록을 가질 수 없습니다. 인라인 클래스 속성에는 배경 필드가 있을 수 없습니다. (계산 가능한 속성만 가질수 있음) 인라인 클래스는 다른 클래스를 ..
때로는 새로운 클래스를 명시 적으로 선언하지 않고 클래스를 약간 수정 한 객체를 만들어야 합니다.Java는 익명의 내부 클래스 로이 경우를 처리합니다. Kotlin은 객체 표현과객체 선언 으로이 개념을 약간 일반화합니다. fun main(args: Array) { foo() } fun foo() { val adHoc = object { var x: Int = 10 var y: Int = 20 } print(adHoc.x + adHoc.y) } 익명 객체는 로컬 및 개인 선언에서만 유형으로 사용할 수 있습니다. 익명 객체를 공용 함수의 반환 유형 또는 공용 속성의 유형으로 사용하는 경우 해당 함수 또는 속성의 실제 유형은 익명 객체의 선언된 상위 유형이거나 Any상위 유형을 선언하지 않은 경우입니다. 익명..
enum Class 를 사용하는 이유 코드가 단순해지며, 가독성 UP 인스 턴스 생성과 상속을 방지, 상수값의 타입 안정성 보장 enum class Direction { NORTH, SOUTH, WEST, EAST } fun main(args: Array) { getDirection(Direction.NORTH) getDirection(Direction.SOUTH) getDirection(Direction.WEST) getDirection(Direction.EAST) } fun getDirection(d : Direction){ when(d){ Direction.NORTH -> println("북쪽") Direction.SOUTH -> println("남쪽") Direction.WEST -> printl..
클래스는 다른 클래스에 중첩 가능 inner 키워드를 사용하면 내부 클래스는 외부 클래스의 멤버 참조 가능 class Outer { private val bar: Int = 1 // 코틀린은 기본적으로 class 안에 class를 넣을 경우 정적 클래스가 됩니다. class Nested1 { fun foo() = bar // 참조 불가 에러발생 } inner class Nested2 { fun foo() = bar // class 앞 inner 키워드를 이용하여 참조 가능 } } 위 코드를 이해하기 위해서는 아래 코틀린 문법이 필수입니다. 2019/05/19 - [Kotlin] - 코틀린 기초 문법) 1. 코틀린 변수 정의하기 2019/05/19 - [Kotlin] - 코틀린 기초 문법) 2. 코틀린 함..
Sealed Class (실드 클래스) ? 값이 제한된 집합의 유형 중 하나를 가질수 있지만 다른 유형을 가질 수 없는 제한된 클래스 계층 구조를 나타내는데 사용 Sealed 클래스는 하위 클래스를 가질수 있지만 동일한 파일에서 선언해야합니다. Sealed 클래스는 추상 클래스이며 직접 인스턴스화 할수 없고 추상 멤버를 가질수 있음 생성자는 기본적으로 private고 다른 접근 제한자를 가질수 없음 Sealed 클래스의 이점은 when문 사용 시 else절이 필요없음 인터페이스 방식 interface CmdInterface {fun execute()} class Add() : CmdInterface {override fun execute() {}} class Delete() : CmdInterface {..
자바에서 추상 클래스 및 추상 메서드 클래스 앞에 abstract 키워드를 이용하여 추상 클래스로 정의한다. 추상 메서드도 리턴 타입 앞에 abstract 키워드를 이용하여 추상 메서드를 정의한다. 추상 클래스에 추상 메서드가 있을 경우 반드시 자식 클래스에서 오버라이딩하여 재정의 해야합니다. 추상 클래스는 extends를 이용하여 상속 받아 사용합니다. 다중 상속 불가 abstract class Game { String str = "홍길동"; public abstract void start(); public void end() { System.out.println("게임 끝"); } } class StarCraft extends Game{ @Override public void start() { // ..