김영한의 자바 입문 강의를 통해 자바를 공부하고 있다.
섹션2의 변수를 수강하고 자바는 코틀린과 데이터 타입이 어떻게 다른가 검색해보던 중에 자바에서는 int 와 같은 데이터 타입에 대한 값에서 메서드를 바로 호출할 수 없다는 것을 알았다. 왜 할 수 없는지 찾아보니 코틀린과 달리 기본 타입과 객체 타입이 구분된다고 한다.
대부분의 입문자들이 자바에서 코틀린을 순서로 학습하는 것에 비해 시작이 이상하지만 😂
타입 ( Type ) ?
어떤 값들이 가능한지와 그 타입에 대해 수행할 수 있는 연산의 종류를 결정한다.
자바에서 예를 들어 String 타입의 변수에는 String 값 아니면 null 이 들어갈 수 있다. 변수에 타입이 선언되었지만 null 인지 아닌지를 추가로 검사하기 전에는 그 변수에 어떤 타입에 대한 연산을 수행할 수 있을지 확신할 수 없다.
코틀린은 이 문제를 해결하기 위해 null 이 될 수 있는 타입과 될 수 없는 타입을 구분하여 NPE 에러를 컴파일 시점에 감지할 수 있다.
1 Null 가능성
코틀린
타입에 null 가능성을 명시적으로 포함한다.
컴파일 타임에 null 관련 오류를 방지할 수 있다.
Int? Double?
자바
모든 참조 타입이 기본적으로 null 이 될 수 있다.
자바 8 이상에서는 Optional 클래스를 사용하여 명시적으로 처리한다.
2 기본 타입과 객체 타입
코틀린
모든 것이 객체이다
자바의 기본 타입에 해당되는 값들을 객체처럼 다룰 수 있고 내부적으로는 JVM 이 컴파일 시 타입을 결정해준다.
자바
기본 타입과 참조 타입으로 구분된다.
기본 타입 Primitive types (원시 타입)
- 스택 메모리에 직접 값을 저장하며 객체와는 다르게 참조에 의한 접근이 아닌 값에 의한 접근을 사용한다.
- int / double / float / boolean / byte / short 등
- 메모리 사용량과 성능 최적화를 위해 단순 값만 저장되고 메서드나 속성을 가지지 않는다.
- -> int 데이터 타입에 대한 값에 메서드를 호출하려면 해당하는 레퍼 클래스 객체로 변환해야 한다.
객체 타입 Reference types (참조 타입)
- 실제 데이터가 아닌 메모리 주소를 저장한다. 이 주소는 실제 데이터가 저장된 힙 메모리를 가리킨다.
- 기본 타입을 제외한 모든 타입
- String / Integer / Double / 배열 / 클래스 인스턴스 등
- 메서드와 속성을 가질 수 있다.
- 값이 필요할 때마다 실제 값으로 가야 하는 언박싱 과정을 거쳐야 하니 기본 타입과 비교해서 접근 속도가 느리다.
코틀린은 전부 객체이다. JVM 에서 어떻게 타입을 컴파일 하는 걸까?
성능 최적화를 위해 내부적으로는 JVM 의 기본 타입을 활용한다. 이 과정에서 코틀린 컴파일러는 타입 사용 방식을 지능적으로 분석하여 기본 타입 또는 참조 타입으로 변환한다.
- 기본 타입
코틀린에서의 Int / Double / Float / Long 등은 추가적인 null 가능성 ('?') 이 명시되지 않은 경우 기본 타입으로 취급된다.
- 참조 타입
null 가능성이 추가된 타입 ( `Int?` `Double?` 등 ) 은 기본 타입으로 표현할 수 없고 그에 상응하는 참조 타입 ( `Integer` `Double` 등) 으로 컴파일된다.
모든 컬렉션 타입과 사용자 정의 클래스는 참조타입으로 컴파일된다.
3 타입 추론
코틀린
변수 선언 시 val 이나 var 을 사용하여 타입 추론을 제공한다.
자바
자바 10 이후 var 가 도입되어 제한적인 타입 추론을 제공한다.
'Language > JAVA' 카테고리의 다른 글
배열, for 문에서의 자바와 코틀린 (0) | 2024.04.25 |
---|