코틀린의 데이터 클래스는 특정한 행동, 동작보다는 데이터를 옮기는 데 특화된 클래스이다.

data class Student(val name: String, val age: Int, var grade: String)

이런 식으로 작성할 수 있다.

  • 생성자에는 attribute가 1개 이상 필요하다.
  • val, var가 아닌 파라미터는 사용할 수 없다.
  • equals(), hashCode(), toString(), copy() 메소드들을 기본적으로 제공해준다.
  • 구조분해가 가능하다. 

{} 바디 안에 attribute와 메소드를 추가할 수도 있다.


주의

  • copy()는 새로운 객체를 만들어 복사하지만, 객체 내부의 참조들은 shallow copy(얕은 복사)가 된다.
  • 예를 들어 다음과 같다.
data class School(val name: String,val students: List<Student>)

val school1 = School("Korea", arrayOf(Student(...), ...))
val school2 = school1.copy()
  • 위와 같은 코드에서 school1과 school2는 각각 다른 인스턴스를 참조하지만, students에 대한 참조는 같다.
    • students가 만약 MutableList이라면 주의가 필요하다.

'Programming > 언어' 카테고리의 다른 글

[Kotlin] object, companion object  (0) 2023.02.26
[Kotlin] Generics 공변성, 반공변성(out, in)  (0) 2023.02.26
[Kotlin] Collection의 View  (0) 2023.02.13
[Kotlin] Unit, Any, Nothing 클래스  (0) 2023.02.12
[Kotlin] 타입추론  (0) 2023.02.12

코틀린의 각 컬렉션 클래스들은 Mutable, Immutable 2가지가 존재한다.

최근 버전의 자바는 Immutable 컬렉션을 제공하지만, Mutable 컬렉션과 같은 인터페이스를 구현하고 있기 때문에, add와 같은 메소드들을 호출할 수 있고, 이는 실행시간에 예외를 발생시킨다.

코틀린은 Immutable 컬렉션의 연산이 불가능하다는 것을 실행시간에 알리지 않는다.

그래서 View가 존재한다.

  • List, Set, Map은 각각 뷰를 2개씩 가지고 있다. 
    • Mutable View - 읽기, 쓰기
    • Immutable View - 읽기 전용
  • mutable이든, immutable이든 자바의 기본 컬렉션에 매핑된다.
    • 쓰기, 읽기 제한을 하는 것은 코틀린 컴파일러의 역할이다.
    • 따라서 실행 시간에 오버헤드가 없다.
  • 예를들어, MutableList, List 컬렉션이 있다.
    • 둘 다 코틀린의 ArrayList에 매핑되지만, List를 사용할 때는 add같은 쓰기 연산을 할 수 없다. 

 

  • Immutable View가 스레드 안정성을 보장하지는 않는다.
    • immutable view가 참조하고 있는 컬렉션은 자바의 mutable 컬렉션이다.
      • 실제로 매핑된 컬렉션을 참조하는 다른 뷰가 변경할 수도 있다. 

 

'Programming > 언어' 카테고리의 다른 글

[Kotlin] Generics 공변성, 반공변성(out, in)  (0) 2023.02.26
[Kotlin] Data Class  (0) 2023.02.15
[Kotlin] Unit, Any, Nothing 클래스  (0) 2023.02.12
[Kotlin] 타입추론  (0) 2023.02.12
[Kotlin] 표현식과 명령문  (0) 2023.02.12

Unit

  • Java의 void와 대응되는 개념이다.
  • 코틀린은 함수에 리턴이 없으면 Unit타입으로 추론한다.
    • void가 아니라 Unit객체를 리턴하기 때문에 모든 함수가 표현식이 될 수 있다.
  • Unit 클래스는 toString() 함수를 가지고 있다. 
    • 그렇게 유용하지 않지만, 반환값이 없을 때 생기는 문제점을 처리해준다.
      • ex) 출력하면 kotlin.Unit으로 나온다. 

Any

  • Java의 Object에 대응되는 클래스이다.
  • toString(), equals(), hashCode() 함수를 가지고 있다.
  • 모든 코틀린 클래스의 조상(Superclass)이다. 
  • Any는 확장함수를 통해 특별한 메소드들을 제공한다.
    • Pair를 만들기 위한 to()함수
    • let(), run(), apply(), also() 등

Nothing

  • 함수가 아무것도 리턴하지 않을 경우 리턴하는 타입이다. 
    • Java에는 대응되는 타입이 없다.
  • 코틀린에서는 함수가 리턴하지 않을 때, Unit을 사용한다고 했는데 무슨말인가?
    • 가끔 함수가 진짜로 아무것도 리턴하지 않는 상황이 있다.
    • 리턴이라는 행위 자체를 하지 않는 것이다.
      • 무한 루프
      • 예외 던지기
  • Nothing은 인스턴스가 없고, 값이난 결과가 영원히 존재하지 않는다는 것을 나타낸다.
fun computeSqrt(n: Double): Double {
    if (n >= 0) {
        return Math.sqrt(n)
    } else {
        throw RuntimeException("No negative please")
    }
}

fun throwException(): Nothing {
	throw Exception()
}
  • 예외를 던지는 것은 리턴하는 행위가 아니다. 이런 경우 아무 것도 리턴되지 않는 것이다. 
  • computeSqrt()에서 if 문은 Double을 반환하고, else는 Nothing이다. 
    • 근데 반환값은 왜 Double일까?
      • Nothing은 모든 클래스로 대체될 수 있다. 모든 클래스의 서브(자식)클래스이기 때문이다.

'Programming > 언어' 카테고리의 다른 글

[Kotlin] Data Class  (0) 2023.02.15
[Kotlin] Collection의 View  (0) 2023.02.13
[Kotlin] 타입추론  (0) 2023.02.12
[Kotlin] 표현식과 명령문  (0) 2023.02.12
Java 코드가 실행되는 과정  (0) 2021.12.26

코틀린은 정적 타입 언어이다.

정적 타입이라는 것은 컴파일 시점에 변수의 타입이 결정되어있는 것을 말한다.

코틀린은 정적 타입 언어이지만, 타입추론을 지원하기 때문에 타입을 명시하지 않고도 사용할 수 있다.

val greet = "hello"

println(greet) // hello
println(greet::class) // class kotlin.String
println(greet.javaClass) // class java.lang.String

greet = 0
  • 타입 추론은 컴파일 시간에 변수 초기화 시, 타입을 추론한다.
    • greet은 문자열로 초기화가 되어 String타입으로 추론되었다.
    • 다른 타입을 할당하면, 컴파일 오류가 난다.
      • 애초에 val 이기 때문에 재할당이 불가능한 것도 있다.
  • greet::class, greet.javaClass는 실행시간에 참조된 객체의 타입을 나타낸다.
    • greet::class는 참조되고 있는 객체의 코틀린 클래스를 나타낸다.
    • greet.javaClass는 참조되고 있는 객체의 자바 클래스를 나타낸다.

'Programming > 언어' 카테고리의 다른 글

[Kotlin] Collection의 View  (0) 2023.02.13
[Kotlin] Unit, Any, Nothing 클래스  (0) 2023.02.12
[Kotlin] 표현식과 명령문  (0) 2023.02.12
Java 코드가 실행되는 과정  (0) 2021.12.26
Garbage Collector 찍먹하기  (0) 2021.12.26

+ Recent posts