분류 전체보기

    확장(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변환을 이용하면 코틀린은 시그니처가 인터페이스 단일 메..

    인터페이스

    인터페이스

    코틀린의 인터페이스는 자바 8 인터페이스와 매우 유사하다. 추상 메서드를 선언할 수 있고 또한 메서드 구현을 포함할 수 있다 추상 클래스와 비슷하다고 생각할 수 있지만 선언 시 사용되는 키워드부터 해서 몇 가지 다른 점이 있다. 인터페이스는 상태를 가질 수 없다. 다중 상속이 가능하다 open 키워드를 일일이 붙일 필요 없다. 인터페이스는 interface 키워드를 사용하여 정의할 수 있다. interface MyInterface{ fun bar() fun foo(){ //optional body } } 인터페이스 구현 클래스나 객체는 한 개 이상의 인터페이스를 구현할 수 있다. class Child : MyInterface{ override fun foo(){ // body } } 인터페이스의 속성(P..

    프로퍼티와 필드

    프로퍼티와 필드

    속성(property) 선언 코틀린에서 클래스는 var 키워드를 사용하여 변경가능하거나 val 키워드를 사용하여 읽기전용 프로퍼티를 가질 수 있다. class Address { var name: String = "Holmes, Sherlock" var street: String = "Baker" var city: String = "London" var state: String? = null var zip: String = "123456" } 또한 이름을 통해 프로퍼티를 참조할 수 있다. fun copyAddress(address: Address): Address { val result = Address() //코틀린에선 new 연산자가 필요없다. result.name = address.name // 접근..

    클래스와 상속

    클래스와 상속

    클래스 코틀린에서 클래스는 class 키워드를 사용해서 선언한다. class Persion{/* ... *} 클래스 선언은 클래스 이름, 클래스 해더(유명 매개변수, 기본 생성자 및 기타 항목 지정) 및 중괄호로 묶인 클래스 본문으로 구성된다. 헤더와 본문 모두 선택사항이다. 만약 클래스에 본문이 없으면 중과호를 생략할 수 있다. class Empty 생성자(Constructors) 코틀린의 클래스는 기본(primary) 생성자와 하나 이상의 보조(secondary) 생성자를 가질 수 있다. 기본생성자는 클래스 헤더의 한 부분으로 클래스 이름 뒤에 위치한다 class Person constructor(firstName: String){} 기본생성자 뒤에 어노테이션이나 가시성 수식어(접근제어자)가 없으면 ..

    흐름제어

    흐름제어

    if 코틀린에서 if는 expression으로 값을 리턴한다. 그래서 삼항 연산자(condition? then : else)가 없다. 일반 if로 동일하게 할 수 있기 때문이다. 표현(expression)과 상태(statement)의 차이를 아주 간단하게 설명하면 값의 여부이다. 이 둘의 예시는 자바의 if문과 코틀린의 if문을 생각하면 편하다. 자바의 if문은 상태(statement)로 결과를 리턴하지 않고 끝이 난다. 하지만 코틀린의 if문은 표현(expression)으로 대입 연산자를 통해 리턴 값을 받을 수 있다. //전통 var max = a if( a b) max = a else max = b //expression으로..

    타입 체크와 캐스트(is, as)

    타입 체크와 캐스트(is, as)

    is와! is 연산자 is와! is를 사용하는 것은 런타임에서 객체가 주어진 타입을 준수하는지 여부를 식별한다. if (obj is String) { print(obj.length) } if (obj !is String) { // same as !(obj is String) print("Not a String") } else { print(obj.length) } Smart casts is를 사용하는 대부분의 경우 명시적 캐스트 연산자를 사용할 필요 없다. 코틀린 컴파일러가 불변 값에 대한 is 검사 및 명시적 캐스트를 추적하고 필요한 경우 자동으로 (안전한) 캐스트를 삽입한다. class Ma { fun test(x: Any){ //1번 println(x.length) //Unresolved refer..