본문 바로가기

개발/Java & Kotlin

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

1. 변수 / 타입

Java도 10버전 부터 타입 추론 도입했으나 많이 사용되는 문법은 아님.

 

  • Java 변수 선언 형식
// 불변 변수
final String name = "Judy";

// 가변 변수
String name = "Judy";

 

Kotlin 변수 선언 형식

// 불변 변수
val name = "Judy"

// 가변 변수
var name = "Judy"

기본적으로 타입 추론 방식을 사용하지만
타입을 지정하고 싶은 경우 다음과 같이 사용한다.

// 타입 지정
val name:String = "Judy"

 

자바에서는 타입이 2가지로 나뉘었다. int와 같은 원시타입, String처럼 클래스를 기반으로 하는 참조타입

코틀린에서는 똑같은 타입 예를 들어 Int가 문맥에 따라 원시 타입과 참조 타입을 가르키므로 구분이 모호하다.

 

자바는 원시 타입을 감싸는 박싱 타입이 있지만 코틀린은 필요할 때 암시적으로 박싱을 수행한다.

 

코틀린의 타입은 근본적으로 어떤 클래스 정의를 기반으로 만들어 진다. 그래서 원시 타입과 비슷한 타입들도 메서드와 프로퍼티를 제공한다. 예를 들면 1.5.toInt()를 실행하면 Double 타입에 정의된 toInt() 메서드를 호출할 수 있다.

 

타입은 하위 타입이라는 개념으로 계층화가 가능하다.

B타입의 하위 타입이 A라면 B타입의 값이 쓰일 수 있는 모든 문맥에 A값을 넣어도 문제가 없다.

널을 허용하지 않는 모든 코틀린 타입은 Any라는 내장 타입의 직간접적인 하위 타입이다. 

코틀린의 Any는 자바의 Object 타입과 유사하다.

  • Kotlin의 Any는 Java의 Object처럼 모든 클래스의 최상위 타입이다.
  • Java의 Object는 모든 참조 타입의 최상위 타입이다.

그러나 차이점은 Null 허용 여부이다. Any는 기본적으로 Null을 허용하지 않고 허용하려면 Any? 로 선언해야 한다.

Object는 Null을 기본적으로 허용한다.

 

자바와 달리 코틀린은 &, | 연산을 제공하지 않는다. & >  and, | > or로 대신한다.

코틀린은 암시적 박싱을 진행하므로 다른 타입간 동등성 연산을 허용하지 않는다 

(var a = 2, var b=2L 이면 a와 b는 == 이나 != 연산을 할 수 없다)

 

2. 문자열

String 타입은 자바와 마찬가지로 불변이고 한번 String 객체를 생성하면 그 안의 문자를 변경할 수 없고 읽기만 가능하다.

문자를 바꾸고 싶으면 String 객체를 새로 생성해야 한다.

 

코틀린은 문자열 템플릿을 제공한다. 이는 ${}안에 어떤 코틀린의 식을 넣으면 문자열에 넣을 수 있다. $name 처럼 변수 참조인 경우 중괄호를 생략할 수 있다. 문자열 템플릿을 적용하면 자동으로 그 안의 값은 toString()으로 변환된다.

 

fun main() {
    val name = readln();
    println("Hello, my name is $name, and now ${LocalDateTime.now()}")
}

 

결과 출력

Hello, my name is judy, and now 2024-10-11T16:48:38.572699

 

반응형