본문 바로가기
안드로이드/Kotlin

[Kotlin] 자료형(기본형, 참조형), Call by Value, Call by Reference

by jinwo_o 2024. 12. 5.

자료형

  • 자바의 자료형은 크게 기본 자료형과 참조 자료형으로 나뉜다. 하지만 코틀린에서는 자바와 달리 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)

 

[CS] JVM 메모리 영역 (Static, Heap, Stack Area)

메서드 영역 (Method Area, Static Area)JVM 이 시작될 때 생성되는 공간으로 바이트 코드(.class)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간JVM 이 동작하고 클래스가 로

dev-baik.tistory.com

 

Call by Value (값에 의한 호출)

  • 인자의 실제 값을 복사하여 함수의 매개변수에 전달하는 방식
  • 함수에 인자를 전달할 때 항상 값을 복사하여 전달하지만, 참조형 변수의 경우 복사되는 값은 변수가 가리키는 객체의 주소(참조)다.
  • C 언어와 달리 Kotlin 에서는 포인터 주소를 사용하지 않기 때문에, 주소 참조(Call by Reference)가 아닌 값을 복사하여 전달하는 Call by Value 가 일반적으로 발생한다.
    • 함수 내에서 참조형 변수를 통해 객체를 수정하면 원본 객체에도 반영이 되기 때문에, Kotlin 의 동작이 Call by Reference 처럼 보일 수 있다.
    • 그러나 실제로 메모리 주소 자체가 전달되는 것이 아니라 참조 값이 복사된 것이다.

 

기본형의 동작 방식

  • 값의 복사 : 함수에 기본형 변수를 인자로 전달할 때, 그 변수의 값을 복사하여 함수의 매개변수에 할당한다.
  • 별도의 메모리 공간 : 복사된 값은 함수를 위한 별도의 스택 메모리 공간에 저장된다.
  • 원본 값의 보존 : 함수 내에서 매개변수의 값을 변경하더라도 원본 변수에는 영향을 미치지 않는다.

 

참조 타입의 동장 방식

  • 참조의 복사 : 참조형 변수를 함수에 전달할 때, 그 변수가 가리키는 객체의 주소가 복사된다.
  • 동일한 객체에 대한 참조 : 복사된 주소를 통해 함수 내부에서 객체에 접근하고 변경할 수 있다. 이때, 객체 자체는 하나이므로, 원본과 함수 내의 참조는 동일한 객체를 가리킨다.
  • 객체 변경의 영향 : 함수 내에서 객체의 상태를 변경하면, 그 변경 사항은 원본 객체에도 반영된다. 그러나 참조 자체를 변경하는 것은 원본에 영향을 주지 않는다.

 

Call by Reference

  • 메모리 주소의 전달 : 함수에 인자를 전달할 때 인자의 실제 메모리 주소를 전달하는 방식
    • 함수에 전달된 인자는 원본 인자를 직접 가리키는 참조이다.
  • 원본 데이터의 직접적 수정 : 함수 내에서 매개변수를 통해 인자의 실제 메모리에 접근하고 수정할 수 있다.
  • 함수 외부에 영향 : 함수 내에서의 변경이 함수를 호출한 영역의 변수에도 영향을 미친다.

 

Call by value vs Call by Reference + 기본형과 참조형

자바에서 이해할 때 함수의 인자를 어떻게 처리하는지 이해해야 한다.Java는 엄밀히 말해 함수 호출 방식은 "Call by Value"만을 지원 = 인자의 실제 값을 복사하여 함수의 매개변수에 전달하는 방식

velog.io

 

[Kotlin] 코틀린 기본 자료형(Primitive type)과 참조 자료형(Reference type)

자바의 자료형은 크게 기본 자료형(primitive type)과 참조 자료형(reference type)으로 나뉜다. 하지만 코틀린에서는 자바와 달리 기본 자료형을 지원하지 않는다. 이는 코틀린 언어의 특성 때문인데 자

sfida.tistory.com

 

[코틀린/Kotlin] 기초 #04_기본형 vs 참조형

환경 : Kotlin Version = 1.5.20, Java version = 14.0.2 JVM, Android Studio 0.참고 자료 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/ kotlin.io - Kotlin Programming Language kotlinlang.org 1. 기본형, 참조형이 무엇인가? 보통 프

ongveloper.tistory.com