클래스
클래스 예시 코드
- 프로퍼티 : firstName, familyName, age
- 함수 : getFullName, showMe
class Person {
var firstName: String = ""
var familyName: String = ""
var age: Int = 0
fun getFullName(): String {
return "$firstName $familyName"
}
fun showMe() {
println("I am $firstName $familyName, $age years old")
}
}
자바는 명시적으로 public 와 같은 변경자를 적어야하는데 코틀린은 기본적으로 public class이다.
만약 제한하고 싶다면 private나 internal로 설정할 수 잇다.
코틀린에서는 소스 파일의 이름을 클래스 이름과 동일하게 할 필요가 없고 한 파일 안에 여러 공개 클래스를 넣을 수 있다.
하지만 파일 안에 클래스가 하나면 보통은 클래스 이름과 파일 이름을 같게 하는 편이다.
생성자
클래스 인스턴스를 초기화해주고 인스턴스 생성 시 호출되는 특별한 함수
코틀린은 생성자 를 호출할 때 new 키워드를 사용하지 않는다.
초기화 블록 : init 키워드가 붙은 블록으로 클래스 초기화 시 필요한 로직을 수행할 수 있다.
한 클래스 안에 여러개 생성 가능하고 각 블록은 순서대로 실행된다.
return 문이 들어가지 못한다.
class Person {
var firstName: String = ""
var familyName: String = ""
var age: Int = 0
init{
println("Created new Person : $firstName $familyName")
}
}
부생성자는 안에 return을 사용할 수 있다.
주생성자를 선언하지 않은 경우 모든 부생성자는 실행하기 전에 프로퍼티 초기화와 init 블록을 실행한다. 그래서 어떤 부생성자를 호출하든지 공통적인 초기화 코드가 정확히 한 번만 실행되게 보장할 수 있다.
널 가능성
코틀린은 널 값이 될 수 있는 참조 타입과 널 값이 될 수 없는 참조 타입을 확실히 구분해주는 장점이 있다.
이 기능을 사용하면 컴파일 시점에서 NPE를 상당 부분 막을 수 있다.
널이 될 수 있는 타입
자바에서는 모든 참조 타입은 널이 될 수 있는 타입으로 간주된다.
하지만 코틀린은 기본적으로 모든 참조 타입은 널이 될 수 없는 타입이다. 그래서 String 타입에 null 값을 대입할 수 없다.
널이 될 수도 있는 값을 받는 함수를 작성하려면 파라미터 타입 뒤에 물음표를 붙여서 지정해야 한다.
런타임에 널이 될 수 없는 값은 실제로 널이 될 수 잇는 값과 차이가 없다. 두 사이의 구분은 컴파일 수준에서만 존재하고 코틀린 컴파일러는 자바 8의 Optional처럼 어떤 래퍼 클래스를 사용하지 않는다. 즉 런타임에는 어떤 부가 비용도 들지 않는다.
그러나 Int나 Boolean 같은 원시 타입의 널이 될 수 있는 타입은 항상 박싱한 값만 표현한다는 걸 명심하자!
Nothing?은 가장 작은 널이 될 수 있는 타입이다. 이 타입은 널 상수 외에 어떤 값도 포함하지 않는다.
널 복합 연산자는 엘비스 프레슬리를 닮았기 때문에 엘비스 연산자라고 부른다. 이걸 사용하면 널을 대신할 디폴트 값을 지정할 수 있다.
fun main() {
sayHello(null)
}
fun sayHello(name:String?){
println("Hello, " + (name ?:"Unkonwn"))
}
출력
Hello, Unkonwn
'개발 > Java & Kotlin' 카테고리의 다른 글
내가 보려고 쓰는 Java와 Kotlin 차이 정리 #2 (1) | 2024.10.16 |
---|---|
내가 보려고 쓰는 Java와 Kotlin 차이 정리 #1 (0) | 2024.10.10 |
JAVA에서 volatile란 무엇인가!? (0) | 2021.03.31 |
OPEN JDK 1.8 윈도우 설치 방법 (0) | 2020.06.16 |
web.xml에 welcome-file 설정하는 방법 (0) | 2019.04.08 |