자료형
- 자바의 자료형은 크게 기본 자료형과 참조 자료형으로 나뉜다. 하지만 코틀린에서는 자바와 달리 null 값을 가질 수 있기 때문에 기본 자료형을 지원하지 않는다.
- 코틀린은 기본 자료형을 지원하지 않고, 대신 *boxed type 을 사용하여 참조한다.
- boxed type : 기본 자료형을 객체로 다루기 위한 개념으로, 기본 자료형의 값을 갖는 객체를 의미한다.
자료형 | 키워드 | 크기 | 기본값(전역변수 한정) | 표현범위 |
논리형 | Boolean | 1bit | false | true, false |
문자형 | Char | 2byte | \u0000 | 0~65535 (유니코드) |
정수형 | Byte | 1byte | 0 | -128 ~ 127 |
Short | 2byte | 0 | -32,768 ~ 32,767 | |
Int | 4byte | 0 | -2,147,483,648 ~ 2,147,483,647 | |
Long | 8byte | 0L | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
실수형 | Float | 4byte | 0.0f | 1.4E-45 ~ 3.4028235E38 |
Double | 8byte | 0.0 | 4.9E-324 ~ 1.7976931348623157E308 |
기본 자료형(기본 타입, Primitive type)
- 값을 저장하는 가장 작은 단위로, 값 자체를 변수에 저장한다.
- 값 자체를 변수에 저장하기 때문에 '값이 없음'을 의미하는 null 은 저장되지 않는다.
- Stack 영역에 생성된다.
- 가공되지 않은 순수한 자료형으로 프로그래밍 언어에 내장되어 있다.
- 사용하기 전 반드시 선언되어야 하며, 초기화하지 않으면 자료형에 맞는 기본 값이 들어간다.
- OS 에 따라 자료의 길이가 변하지 않는다.
- int, byte, short, long, float, double char, boolean 등이 있다.
참조 자료형(참조 타입, Reference type)
- 값이 저장된 메모리 주소를 가리키는 주소값을 저장하는 변수이다.
- 값이 저장된 메모리의 주소값을 저장하기 때문에 null 을 할당하면 어떠한 객체도 가리키지 않는 상태로 설정할 수 있다.
- 기본형을 제외하고선 모두 참조형이라고 부른다.
- Heap 영역에 저장된다.
- Int, Long, Float, Double 등등
- Kotlin 의 Int? 는 Java 의 Integer 에 해당한다.
- Kotlin 의 Int 는 컴파일러에 의해 Java 의 기본 자료형인 int 로 대체된다.
- Kotlin 의 Int 는 null 이 들어갈 수 없고, 기본형으로 대체될 수 있기 때문에 사실상 Java 의 기본 자료형인 int 와 같다.
JVM 메모리 영역 (Static, Heap, Stack Area)
Call by Value (값에 의한 호출)
- 인자의 실제 값을 복사하여 함수의 매개변수에 전달하는 방식
- 함수에 인자를 전달할 때 항상 값을 복사하여 전달하지만, 참조형 변수의 경우 복사되는 값은 변수가 가리키는 객체의 주소(참조)다.
- C 언어와 달리 Kotlin 에서는 포인터 주소를 사용하지 않기 때문에, 주소 참조(Call by Reference)가 아닌 값을 복사하여 전달하는 Call by Value 가 일반적으로 발생한다.
- 함수 내에서 참조형 변수를 통해 객체를 수정하면 원본 객체에도 반영이 되기 때문에, Kotlin 의 동작이 Call by Reference 처럼 보일 수 있다.
- 그러나 실제로 메모리 주소 자체가 전달되는 것이 아니라 참조 값이 복사된 것이다.
기본형의 동작 방식
- 값의 복사 : 함수에 기본형 변수를 인자로 전달할 때, 그 변수의 값을 복사하여 함수의 매개변수에 할당한다.
- 별도의 메모리 공간 : 복사된 값은 함수를 위한 별도의 스택 메모리 공간에 저장된다.
- 원본 값의 보존 : 함수 내에서 매개변수의 값을 변경하더라도 원본 변수에는 영향을 미치지 않는다.
참조 타입의 동장 방식
- 참조의 복사 : 참조형 변수를 함수에 전달할 때, 그 변수가 가리키는 객체의 주소가 복사된다.
- 동일한 객체에 대한 참조 : 복사된 주소를 통해 함수 내부에서 객체에 접근하고 변경할 수 있다. 이때, 객체 자체는 하나이므로, 원본과 함수 내의 참조는 동일한 객체를 가리킨다.
- 객체 변경의 영향 : 함수 내에서 객체의 상태를 변경하면, 그 변경 사항은 원본 객체에도 반영된다.
그러나 참조 자체를 변경하는 것은 원본에 영향을 주지 않는다.
Call by Reference
- 메모리 주소의 전달 : 함수에 인자를 전달할 때 인자의 실제 메모리 주소를 전달하는 방식
- 함수에 전달된 인자는 원본 인자를 직접 가리키는 참조이다.
- 원본 데이터의 직접적 수정 : 함수 내에서 매개변수를 통해 인자의 실제 메모리에 접근하고 수정할 수 있다.
- 함수 외부에 영향 : 함수 내에서의 변경이 함수를 호출한 영역의 변수에도 영향을 미친다.
'안드로이드 > Kotlin' 카테고리의 다른 글
[Java] 읽기 전용 컬렉션(List, Set, Map), ArrayList, LinkedList, Array (0) | 2024.12.05 |
---|---|
[Kotlin] 변수 선언(val, var, const val) (0) | 2024.12.05 |
[Kotlin] 객체 지향 원칙(SRP, OCP, LSP, ISP, DIP) (0) | 2024.08.05 |