반응형

코틀린의 각 컬렉션 클래스들은 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 컬렉션이다.
      • 실제로 매핑된 컬렉션을 참조하는 다른 뷰가 변경할 수도 있다. 

 

728x90

'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은 모든 클래스로 대체될 수 있다. 모든 클래스의 서브(자식)클래스이기 때문이다.
728x90

'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는 참조되고 있는 객체의 자바 클래스를 나타낸다.
728x90

'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
반응형

표현식 vs 명령문

  • 표현식은 값을 반환하고, 어떤 상태도 변화시키지 않는다.
  • 명령문은 아무것도 반환하지 않으며, 상태를 변화시키거나 변수를 변하게 하고, 파일 작성, 데이터베이스 업데이트, 네트워크 요청 등의  작업을 수행한다.

Java, C#, JavaScript 등은 표현식보다는 명령문을 더 많이 가지고 있다. (if, for, try 등)

반면, Ruby, F#, Haskell, Groovy 등은 표현식을 더 많이 가지고 있다.


코틀린의 if와 try-catch 문은 표현식이다.

자바와 같이 명령문 형태로 쓸 수도 있지만, 표현식 형태로 쓰는 것이 더 좋다.

fun canVote(name: String, age: Int): String {
    var status: String
    if (age > 18) {
    	status = "yes, please vote"
	} else {
    	status = "nope, please come back"
    }
    return "$name, $status"
}
  • 먼저 명령문 형태로 쓴 코틀린을 보자.
    • 명령문은 반환값을 주지 않기 때문에 조건에 따른 결과를 얻기 위해 뮤터블 변수가 필요해졌다.

 

val status = if (age > 18) "yes, please vote" else "nope, please come back"
  • 코틀린의 if문은 표현식이기 때문에 아래와 같이 작성할 수 있다. 
    • 변수를 이뮤터블하게 사용할 수 있고, 타입추론도 사용할 수 있다.

 

fun tryExpr(blowup: Boolean): Int {
	return try {
    	if (blowup) {
        	throw RuntimeException("fail")
        }
        2
    } catch (e: Exception) {
    	4
    }
}
  • try-catch 도 표현식으로 사용할 수 있다.
    • try문, catch문의 마지막 부분이 반환값이 된다.

a = b = c // error
  • Java는 할당을 표현식으로 취급하지만, 코틀린은 아니다.
  • 코틀린은 델리게이션(delegation)을 통해 변수를 get하거나 set하기 때문이다.
    • 추후 포스팅 예정
728x90

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

[Kotlin] Unit, Any, Nothing 클래스  (0) 2023.02.12
[Kotlin] 타입추론  (0) 2023.02.12
Java 코드가 실행되는 과정  (0) 2021.12.26
Garbage Collector 찍먹하기  (0) 2021.12.26
객체지향에서 인터페이스란?  (0) 2021.12.26

+ Recent posts