스코프 함수 • 객체 생성 시 사용하는 함수 • 하나의 스코프를 만들어 그 안의 코드들을 실행한다. - 이 스코프 안에서는 객체를 이름없이 바로 접근할 수 있다. • 생성한 객체에 대해 어떠한 동작을 해야할 때 간결하게 사용할 수 있다. - 스코프 함수를 쓰지 않으면 간단한 동작을 할 때도 변수를 만들고, 변수의 이름을 반복해서 사용해야하는 번거로움이 있다. // 스코프 함수 사용하지 않았을 때 val alice = Person("Alice", 20, "Amsterdam") println(alice) alice.moveTo("London") alice.incrementAge() println(alice) // 스코프 함수 사용했을 때 Person("Alice", 20, "Amsterdam").let { ..
익명 클래스 • class 키워드를 이용하여 명시적으로 선언한 클래스가 아니다. • 클래스를 한 번만 사용하면 될 때 유용하다. -> 객체를 하나만 만들고, 바로 쓸 경우. • 익명 클래스의 인스턴스를 익명 객체라고 한다. • object 키워드를 사용한다. • 기존의 클래스를 상속하여 사용하여야 한다. 상속을 명시하지 않은 경우 Any를 상속한다. - 익명 클래스는 타입이 없기 때문에, 익명 객체의 타입은 익명 클래스가 상속한 부모 클래스이다. * 클래스 타입은 클래스명으로 만들어지기 때문에 익명 클래스는 타입이 있을 수 없는 듯하다. • 익명 클래스에서 새로 추가한 멤버는 외부에서 접근할 수 없다. - 상속받은 멤버를 오버라이드한 것만 외부에서 접근이 가능하다. - 새로 추가한 멤버는 클래스 내부에서..
인터페이스 • 구현부 없이 틀을 만들어 놓은 것 • 인터페이스를 상속한 클래스는 해당 인터페이스의 틀을 지켜야 한다. - 일종의 규약(프로토콜)이다. - 지켜야 하는 규약이기 때문에, 클래스 내부를 보지 않고 인터페이스만 봐도 어떤 멤버가 들어있는 지 등의 사용법 유추가 가능하다. • 자료형으로 쓸 수 있다. • 다중 상속, 다중 구현이 가능하다. interface Tiger { fun bite() fun hide() } interface Bird { fun fly() } class BackDoSanTiger: Tiger, Bird { override fun bite() { // Tiger 인터페이스의 bite 구체적 구현 println("문다.") } override fun hide() { // Tig..
Null Safety • 코틀린이 가지고 있는 언어적 특징 • Null을 처리하기 위한 코틀린의 문법 1. 자료형 • non-null -> Int • nullable -> Int? 2. !! • null이 아님을 보장 • but 코틀린이 확실하게 null이 아님을 판단하는 것이 아닌, 개발자가 코틀린에게 null이 아니니깐 넘어가~하고 보장하는 느낌. • 실제로 개발자가 예측 못 한 null이 나올 수 있다. • 되도록 사용 X -> 정말 필요할 때, 정말 확실할 때만 사용. 3. ?. (safe call) • 원래 AAA 객체의 BBB라는 메소드를 실행하기 위해서는 AAA.BBB를 해야 한다. - AAA가 null일 경우 null 내부를 접근하려고 하여 오류가 발생한다. - 이런 경우 안전하게 메소드를..
형변환(Casting) 1. 기본 자료형 간의 형변환 ex) 정수형 123 -> 문자열형 "123" ex) 실수형 123.5 -> 정수형 123 • 자료형 간의 형변환을 모두 기억할 수는 없고 그때마다 확인하면 된다. val NUM1_INT: Int = 10 val NUM1_STR: String = NUM1_INT.toString() val NUM1_INT2: Int = NUM1_STR.toInt() println(NUM1_INT + 10) // 20 출력 : NUM1_INT은 정수형 println(NUM1_STR + 10) // 1010 출력 : Int -> String 형변환 성공 println(NUM1_INT2 + 10) // 20 출력 : String -> Int 형변환 성공 val NUM2_FL..
상속(Inheritance) • 상속이 필요한 경우 - 바탕이 되는 클래스에 확장이 되는 클래스를 만들고 싶은 경우 - 이미 존재하는 클래스를 합칠 때 • open 키워드로 설정된 클래스만 상속할 수 있다. ex) open class 클래스명() {} • final 키워드로 설정된 클래스는 상속할 수 없다. - 명시하지 않는다면 기본적으로 final로 선언. ex) final class 클래스명() {} • 상속해준 클래스를 슈퍼 클래스(또는 부모 클래스), 상속받은 클래스를 서브 클래스(또는 자식 클래스)라고 한다. • 서브 클래스는 슈퍼 클래스가 가지고 있는 모든 것을 물려 받는다. // 상속을 사용하지 않을 때 - 같은 코드 반복 및 클래스끼리의 연관성 확인 어려움. class Warrior() {..
범위(Scope) • 변수를 사용할 수 있는 범위, 영역 • 변수, 함수, 클래스, 패키지 등의 범위가 있다. • 보통, 변수가 선언된 그 블록({ }로 둘러쌓인 범위)이 변수의 스코프이다. - 즉, 한 블록 안에서 선언된 변수는 그 안에서만 사용이 가능하다. • 스코프 내부에 또 스코프가 있다면, 상위 스코프, 하위 스코프로 나뉜다. - 하위 스코프에서는 상위 스코프 멤버를 사용 및 (재)할당 할 수 있지만 반대는 안 된다. // 변수 사용 가능 범위 fun func1() { val NUM1 = 1 } println(NUM1) // 오류 발생 : NUM1은 없는 변수 -> NUM1 변수의 사용 가능 범위는 func1 함수의 블럭({ }) 안. // 상위 스코프와 하위 스코프 var outsideNum ..
프로퍼티(Property) • 클래스(객체)가 가지고 있는 변수 1. getter / setter • getter - 클래스의 프로퍼티에 접근 할 때 ex) person.name • setter - 클래스의 프로퍼티 값을 설정할 때 ex) person.name = "홍길동" • 기본적으로 프로퍼티에 값을 저장하는 것이나, 저장되어 있는 값을 불러오는 것은 코틀린에서 제공해주지만, 특별한 기능을 추가하고 싶을 경우 개발자가 직접 작성할 수 있다. • getter와 setter 모두 작성 가능하고, 둘 중 하나만 독립적으로 작성할 수도 있다. • 모든 프로퍼티마다 설정할 수 있다. • 해당 프로퍼티는 field로 받는다. class Book() { var title: String = "타이틀" get() {..