본문 바로가기

개발/Java & Kotlin

내가 보려고 쓰는 Java와 Kotlin 차이 정리 #3

클래스

 

클래스 예시 코드

- 프로퍼티 : 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

 

반응형