코틀린

코틀린

    Enum(열거형) 클래스

    Enum(열거형) 클래스

    Enum클래스 type-Safe(타입을 판벼할 수 있어서 Runtime 오류가 일어나지 않고 compile 시 문제를 잡을 수 있다.)한 열거 값을 구현하는 데 사용한다. enum class Direction{ NORTH, SOUTH, WEST, EAST } 각 Enum 상수는 객체이다. 그리고 Enum 상수는 콤마(,)를 통해 나눠진다. 초기화 각 enum값은 enum클래스의 인스턴스로 초기화할 수 있다. enum class Color(val rgb: Int){ RED(0XFF0000), GREEN(0X00FF00), BLUE(0x0000FF) } 익명 클래스 enum상수는 자신만의 익명 클래스를 사용할 수 있다. fun main() { println(ProtocolState.WAITING.signal..

    중첩 클래스와 내부 클래스

    중첩 클래스와 내부 클래스

    중첩 클래스 다른 클래스에 클래스 중첩할 수 있다. class Outer{ private val bar = 1 class Nested{ fun foo() = 2 } } Outer.Nested.foo() 또한 인터페이스도 중첩할 수 있다. 클래스와 인터페이스로 만들 수 있는 모든 조합이 가능하다. interface OuterInterface{ class InnserClass interface InnerInterface } class OuterClass{ class InnerClass interface InnerInterface } 내부 클래스 중첩 클래스와 같지만 외부 클래스 멤버에 접근할 수 있다. 내부 클래스는 외부 클래스 객체에 대한 레퍼런스를 갖는다. class Outer{ private val b..

    제네릭 ( in & out)

    제네릭 ( in & out)

    타입을 변수처럼 받을 수 있도록 하는 방법 자바와 마찬가지로 코틀린 클래스는 타입 패러미터를 가질 수 있다. class Box(t: T){ val value = t } 일반적으로 제네릭 클래스의 인스턴스를 생성할 때 타입을 전달해야 한다. 하지만 파라미터의 타입을 추론할 수 있다면 생략할 수 있다. val box: Box = Box(1) val vox = Box(1) 변성(Variance) in & out 코틀린의 리스트와 배열은 자기 자신의 타입만 허용하는 무공변입니다. 변성이란 배열과 리스트 등 에서 무공변인 제네릭을 공변, 반공변으로 바꾸는 법입니다. 즉,배열과 리스트 등 에서 상위 또는 하위 타입의 원소를 받는 방법입니다. 코틀린에서 변성을 선언하는 시점은 2가지이다. 선언 위치 변성 : 클래스나..

    봉인된 클래스 및 인터페이스(Seald Class & Interface)

    봉인된 클래스 및 인터페이스(Seald Class & Interface)

    봉인된 클래스(Seald Class) 코틀린에서 enum과 함께 두 번째로 잘 사용하지 않는 기능을 한 번 정리해보려고 합니다. 비록 장점과 정의 부분에 있어서 미숙한 부분이 있지만 이해해 주길 바랍니다. 들어가기 전 항상 이런 개념적인 내용을 볼 때 드는 생각은 왜 써야 하는가?이다. 왜? 어디에? 언제? SealedClass의 장점은 when절을 쓸 때 else구문을 사용할 필요가 없다. when절이 값을 반환해야 한다면 else문이 없을 경우 컴파일 에러가 날 수 있다. 하지만 조건분기들을 SealedClass에 넣어놓는다면 컴파일이 가능하다. 이게 장점?이라고 반문할 수 있지만 생각보다 큰 장점이다. 조건 분기에서 else문을 지운다는 의미는 내가 원한 조건 이외의 것을 고려할 필요가 없다는 뜻이..

    데이터 클래스(Data Class)

    데이터 클래스(Data Class)

    데이터 클래스(Data Class) 우리는 데이터를 보관하는 것이 주된 목적인 클래스를 만드는 것은 흔한 일이다. 이러한 클래스에서 일부 표준 기능과 일부 유틸리티 기능을 매번 기계적으로 만드는 경우가 있다. 코틀린에선 이를 지원하기 위해 데이터 크래스를 제공한다. data class User(val name: String, val age: Int) val jack = User("Jack", 1) 컴파일러는 기본 생성자에 선언한 모든 프로퍼티로부터 다음 멤버를 생성한다. equals() / hashCode() 쌍 "User(name=John, age=42)"형식의 toString() 선언 순서대로 프로퍼티에 대응하는 componentN() 함수 copy() 함수 데이터 클래스가 일관성 + 의미 있는 기능..

    확장(Extensions)

    확장(Extensions)

    정의 코틀린은 클래스 상속이나 데코레이터 같은 설계 패턴 없이, 새로운 기능으로 클래스와 인터페이스를 확장할 수 있는 기능을 제공한다. 이는 확장(extensions)이라는 특수 선언을 통해 이루어진다. 확장의 장점은 수정할 수 없는 타사의 라이브러리 클래스 또는 인터페이스에 대한 새 함수를 작성할 때 빛을 본다. 이렇게 만들어진 함수는 원래 클래스의 메서드 인것 처럼 일반적인 방식으로 호출할 수 있다. 확장 기능을 2가지이다. 확장 함수 : 위에서 설명한 것 처럼 새 함수를 작성하는 메커니즘 확장 속성 : 기존 클래스에 대한 정의한 새 속성 확장 함수 확장 함수를 선언하려면 확장되는 유형을 참조하는 리시버 타입(수신자 유형)을 해당 이름 앞에 붙인다. (리시버 타입 == 확장할 타입(ex 클래스)의 이..

    가시성 수식어(Visibility modifiers)

    가시성 수식어(Visibility modifiers)

    가시성 수식어는 보이는 범위를 명시해주는 수식어이다. 이름만 다를 뿐 자바의 접근제어자와 같다. 클래스, 오브젝트, 인터페이스, 생성자, 함수, 프로퍼티 및 프로퍼티와 setter는 가시성 수식어를 가질 수 있다. 종류 코틀린은 자바와 마찬가지로 4개의 가시성 수식어가 있다. private protected internal public 클래스와 인터페이스를 기준으로 자바와 비교할 수 있다. 패키지 함수(Function), 속성(Property), 클래스(Classes), 객체(Object) 및 인터페이스(Interface)는 패키지 내부의 "최상위 수준"에서 직접 선언할 수 있다. private : private선언이 포함된 파일 안에서만 접근 가능 internal : 같은 모듈에서 접근 가능 publi..

    Functional (Single Abstract Method) Interface

    Functional (Single Abstract Method) Interface

    추상 메서드가 하나만 있는 인터페이스를 함수형 인터페이스(Functional Interface) 또는 단일 추상 메서드(Single Abstract Method) 인터페이스 라고 한다. 함수형(Functional) 인터페이스는 여러 비추상 멤버를 가질 수 있지만 추상 멤버는 하나만 가질 수 있다. 함수형 인터페이스를 선언하려면 fun 한정자를 사용하면 된다. fun interface KRunnable { fun invoke() } SAM 변환 SAM 변환을 쓰면 함수형 인터페이스를 람다 식을 이용하여 코드를 더 간결하고 읽기 쉽게 바꿀 수 있다. 매번 함수형 인터페이스를 상속하는 클래스를 생성하는 것 대신, 람다 식으로 간결하게 줄일 수 있다. SAM변환을 이용하면 코틀린은 시그니처가 인터페이스 단일 메..