[TIL/Kotlin] 코틀린 고급문법_중첩 클래스와 내부 클래스
·
TIL/Kotlin
1. 중첩 클래스(Nested Class) 클래스 안에 또 다른 클래스를 선언하는 것을 중첩 클래스라고 한다. 중첩 클래스는 타입 이름이 '바깥 클래스.중첩 클래스'로 만들어진다. 생성자 이름도 마찬가지이다. 바깥 클래스와 중첩 클래스의 인스턴스는 서로 어떠한 프로퍼티나 멤버 함수도 공유하지 않는 완전히 별개의 클래스이다. 단순히 식별자만 바깥 클래스에 속해있는 것이다. class Outher { // 바깥 클래스 class Nested { // 중첩 클래스 fun hello() = println("중첩된 클래스") } } fun main() { val instance: Outher.Nested = Outher.Nested() } 다음과 같은 코드는 오류를 일으킨다. class Outer2 { priva..
[TIL/Kotlin] 코틀린 고급문법_추상 클래스, 인터페이스, 다이아몬드문제(상속구현문제)
·
TIL/Kotlin
1. 추상 클래스 여러 클래스를 한 타입으로 묶어주고, 공통되는 멤버를 전파하는 용도로 쓰는 클래스는 추상 클래스로 선언하는 것이 좋다. 코틀린에서 클래스를 추상 클래스로 만드려면 클래스 선언 맨 앞에 abstract 키워드를 붙이면 된다. abstract 키워드는 그 자체로 open을 포함하고 있기 때문에 open 키워드를 따로 적지 않아도 된다. 추상 클래스는 추상 멤버 함수와 추상 프로퍼티도 가질 수 있다. 멤버 함수 또는 추상 프로퍼티 맨 앞에 abstract 키워드를 붙이면 된다. * 추상 멤버 함수란? 내용이 없는 멤버 함수 추상 클래스를 상속하는 서브 클래스에도 abstract를 붙이면 추상 멤버 함수를 반드시 오버라이딩 하지 않아도 된다. 단, 이 클래스를 다시 일반 클래스로 상속할 때는 ..
[TIL/Kotlin] 코틀린 고급문법_Nullable 리시버, 동반자 객체의 확장 함수, 확장 함수의 리시버 타입이 상속 관계에 있을 때 참조 변수를 따른다
·
TIL/Kotlin
1. Nullable 리시버 리시버 타입에 ?가 붙어 있는 것이 Nullable 리시버이다. 확장 함수를 응용하면, 참조 변수에 null이 지정되어 있어도 함수 호출이 가능하게 할 수 있다. (Nullable 타입으로도 멤버 함수를 호출할 수 있다) fun String?.isNumber(){ if(this == null) { println("문자열이 null입니다.") } } fun main() { val empty: String? = null empty.isNumber() } 확장 함수 참고 https://yelin1217.tistory.com/425 [TIL/Kotlin] 코틀린 중급문법_접근지정자, 접근지정자 오버라이딩, 확장 함수, 확장 프로퍼티 1. 접근 지정자 코틀린에서 선언 가능한 요소(함수..
[TIL/Kotlin] 코틀린 고급문법_inline 함수, const, lateinit
·
TIL/Kotlin
1. inline 함수 inline 함수는 실행 흐름을 점프하지 않고 함수 호출문을 함수의 몸체로 대체하는 함수이다. 함수를 호출하면 함수 속으로 실행 흐름이 점프하고, 함수가 끝나면 함수를 호출했던 지점으로 다시 점프하는데 이때 발생하는 실행 흐름의 이동은 프로그램의 성능을 미세하게 저해한다. inline 함수를 사용하면 성능을 조금이나마 개선할 수 있다. inline 함수는 재귀 호출이 불가능하며(몸체가 무한으로 늘어날 수 있음), 함수 속의 문장을 재활용하지 않기 때문에 문장이 많은 함수를 inline 함수로 바꾸면 프로그램의 크기가 기하급수적으로 늘어난다. 따라서 문장이 적고 빈번히 호출되는 함수만 inline 함수로 만들 것을 권장한다. inline fun hello() { println("He..
[TIL/Kotlin] 코틀린 고급문법_객체 선언과 동반자 객체
·
TIL/Kotlin
1. 객체 선언 프로그램 전체에서 공유할 수 있는 하나뿐인 객체를 만드는 방법이다. 코틀린에서는 자바에서 사용하던 싱글톤 패턴 코드를 사용하지 않고도 object 키워드를 사용하면 싱글톤으로 생성할 수 있다. 클래스를 선언하듯이 객체를 선언하면 식별자로 객체에 바로 접근이 가능하다. object Person { var name: String = "" var age: Int = 0 fun print(){ println(name) println(age) } } fun main() { // 식별자 Person으로 객체에 바로 접근 가능 Person.name = "Singleton" Person.age = 45 Person.print() // Person은 타입 이름이기도 하기 때문에 아래와 같은 코드도 가능 ..
[TIL/Kotlin] 코틀린 중급문법_접근지정자, 접근지정자 오버라이딩, 확장 함수, 확장 프로퍼티
·
TIL/Kotlin
1. 접근 지정자 코틀린에서 선언 가능한 요소(함수, 전역변수, 클래스, 프로퍼티, 멤버함수 등) 중, 일부 요소에는 접근 권한이라는 것을 지정할 수 있다. 이를 접근 지정자 또는 가시성 지정자라고 한다. 코틀린에서 접근 지정자는 총 4개가 있다. class Rectangle(private val width: Int, private val height: Int) { val area: Int get() = width * height } fun main() { val rect = Rectangle(5, 7) // println(rect.width) // 에러 발생 println(rect.area) } 다음과 같은 곳에 접근 지정자를 붙일 수 있다. 접근 지정자 class 식별자 접근 지정자 construct..
[TIL/Kotlin] 코틀린 중급문법_스마트 캐스팅, is 연산자, as 연산자와 다운캐스팅
·
TIL/Kotlin
1. 스마트 캐스팅 스마트 캐스팅이란? 특정 조건을 만족하는 경우, 컴파일러는 변수의 타입을 다른 타입으로 자동 캐스팅한다. fun main() { val number: Int?= null val number2 = 1225 checkNull(number) // null이 들어왔습니다. checkNull(number2) // 1225 } fun checkNull(any: Any?) { if(any == null) { println("null이 들어왔습니다") return } // any가 null 값이 아니라고 완벽히 추론이 가능하므로, // any?.toString()이 아닌 any.toString()으로 호출이 가능 println(any.toString()) } 2. is 연산자 is 연산자로 참조 변..
[TIL/Kotlin] 코틀린 중급문법_Nothing타입, Nullable, ?. 연산자, !! 연산자, ?: 연산자
·
TIL/Kotlin
1. Nothing 타입 Nothing 타입은 실행 흐름이 도달할 수 없는 구역을 나타내기 위한 특수 타입이다. fun throwing(): Nothing = throw Exception() fun main() { println("start") // Int 타입의 변수에 Nothing 타입의 표현식을 대입 // Nothing 타입은 어떠한 타입과도 호환되기 때문에 이러한 코드가 가능함 // Int 타입에 Nothing 타입을 대입한다고 해도, throwing 함수가 호출되면 곧바로 예외가 던져져 프로그램이 강제 종료되므로 문제가 되지 않는다. val i: Int = throwing() println(i) validate(-2) /* Exception in thread "main" java.lang.Exc..
[TIL/Kotlin] 코틀린 중급문법_예외 처리, 예외 던지기
·
TIL/Kotlin
1. 예외 처리 예외를 처리하지 않으면 프로그램은 무조건 강제 종료된다. 예외를 처리하여 프로그램이 강제 종료되는 것을 막아야한다. 예외가 발생할 가능성이 있는 부분을 try 블록으로 감싸고 try 블록 바로 아래에 예외가 발생했을 때 대신 실행할 코드를 catch 블록으로 지정한다. e는 예외 객체를 가리키는 참조 변수이고, 아래 예제에 보이는 NumberFormatException은 예외 타입이다. finally 블록은 예외 발생 여부와 상관 없이 무조건 실행되는 블록이다. fun main() { try { val str = "abcd" val num = str.toInt() println(num) // e는 예외 객체를 가리키는 참조 변수이고, NumberFormatException은 예외 타입 }..