기본 데이터 타입(Primitive Type)과 참조 타입(Reference Type)

서버란·2024년 8월 31일

자바 궁금증

목록 보기
4/35

자바에서 기본 데이터 타입(Primitive Type)참조 타입(Reference Type)은 데이터를 다루는 두 가지 주요 유형입니다. 이 두 타입은 메모리 관리, 동작 방식, 그리고 사용 방법에서 많은 차이가 있습니다. 공부하기 쉽도록 각각의 개념과 차이점을 정확하게 정리해보겠습니다.

1. 기본 데이터 타입(Primitive Type)

특징

  • 값 자체를 저장합니다. 즉, 변수에 저장된 값이 실제 데이터입니다.
  • 객체가 아니며, 자바에서 제공하는 가장 기본적인 데이터 타입입니다.
  • 자바에서 8가지의 기본 데이터 타입을 제공합니다.
  • 기본 데이터 타입의 값은 메모리의 스택(Stack) 영역에 저장됩니다.
  • 크기가 고정되어 있어, 메모리 할당 시 예측 가능합니다.

기본 데이터 타입 목록

정수형

  • byte (1바이트): -128 ~ 127
  • short (2바이트): -32,768 ~ 32,767
  • int (4바이트): -2^31 ~ 2^31-1
  • long (8바이트): -2^63 ~ 2^63-1 (큰 수를 다룰 때 long 사용)

실수형

  • float (4바이트): 32비트 부동 소수점 (소수점 이하 자릿수를 적게 사용할 때)
  • double (8바이트): 64비트 부동 소수점 (정밀한 실수를 다룰 때)

문자형

  • char (2바이트): 단일 16비트 유니코드 문자 (0 ~ 65,535)

논리형

  • boolean (1비트): true 또는 false 값만 가질 수 있습니다.

기본 데이터 타입 예시

int x = 10;
float y = 20.5f;
boolean isJavaFun = true;

2. 참조 타입(Reference Type)

특징

  • 데이터의 참조(메모리 주소)를 저장합니다. 즉, 변수가 직접 데이터를 저장하는 것이 아니라, 데이터가 저장된 메모리 주소를 가리킵니다.
  • 자바의 기본 데이터 타입을 제외한 모든 데이터 타입은 참조 타입입니다. 예를 들어, 클래스, 배열, 인터페이스, 열거형 등이 있습니다.
  • 객체는 힙(Heap) 영역에 저장되며, 참조 변수는 스택(Stack) 영역에 저장됩니다.
  • 참조 타입 변수는 객체의 메모리 주소를 참조하므로, 해당 변수를 통해 객체에 접근할 수 있습니다.

참조 타입 목록

  • 클래스(Class): 예를 들어 String, Scanner, CustomClass 등이 있습니다. (참고로, String은 특별한 클래스이며 불변 객체입니다.)
  • 배열(Array): 예를 들어 int[], String[] 등. 배열도 참조 타입으로 처리됩니다.
  • 인터페이스(Interface): 예를 들어 Runnable, Serializable 등.
  • 열거형(Enum): 예를 들어 enum Day { MONDAY, TUESDAY, ... }.

참조 타입 예시

String greeting = "Hello, World!";
int[] numbers = {1, 2, 3, 4, 5};
CustomClass obj = new CustomClass();

3. 기본 데이터 타입과 참조 타입의 차이점

기본 데이터 타입(Primitive Type)

저장 방식: 값 자체를 저장
메모리 할당 :스택(Stack) 영역에 할당
초기값 :각 타입별로 고유의 기본값 (예: int는 0, boolean은 false)
값 비교: 값 자체를 비교
크기 :크기가 고정됨 (예: int는 4바이트)
사용 목적 :간단한 데이터 저장 및 계산 (예: 숫자, 논리값)

참조 타입(Reference Type)

저장 방식: 데이터의 메모리 주소(참조)를 저장
메모리 할당 :스택에 참조 변수와 힙(Heap)에 객체 할당
초기값 :기본값이 null
값 비교 :메모리 주소를 비교 (==는 주소 비교, equals()는 내용 비교)
크기 :참조 타입의 크기는 객체의 크기에 따라 다름
사용 목적 :복잡한 데이터 구조나 객체를 다루는 데 사용

4. 차이점 설명

저장 방식:

  • 기본 데이터 타입: 값 자체가 변수에 저장되므로, 그 값은 직접 사용됩니다.
  • 참조 타입: 변수는 객체가 저장된 메모리의 주소를 저장하며, 이 주소를 통해 객체에 접근합니다.

메모리 할당:

  • 기본 데이터 타입: 스택(Stack) 메모리에 값이 직접 저장되므로 메모리 관리가 간단하고 빠릅니다.
  • 참조 타입: 참조 변수는 스택에 저장되지만, 실제 객체는 힙(Heap) 메모리에 저장되어 더 복잡한 메모리 관리가 필요합니다.

초기값:

  • 기본 데이터 타입: 선언되었으나 값이 할당되지 않은 경우, 각 데이터 타입의 기본값이 설정됩니다. (예: int는 0, boolean은 false)
  • 참조 타입: 객체가 생성되지 않은 상태에서는 null 값이 기본으로 설정됩니다.

값 비교:

  • 기본 데이터 타입: 변수에 저장된 값을 직접 비교합니다. (예: 5 == 5는 true)
  • 참조 타입: == 연산자는 참조하는 메모리 주소를 비교하고, equals() 메서드를 사용하면 객체의 내용을 비교합니다.
  1. 정리
  • 기본 데이터 타입은 값 자체를 저장하고 처리하며, 간단한 연산을 수행할 때 사용됩니다. 메모리 할당이 고정되어 있고 비교가 단순합니다.
  • 참조 타입은 객체와 같은 복잡한 데이터 구조를 저장하고 관리하며, 힙 메모리를 사용하여 동적으로 데이터를 다룹니다. 참조 변수는 메모리 주소를 저장하므로, 같은 객체를 가리킬 수도 있고 다른 객체를 가리킬 수도 있습니다.

기본 데이터 타입과 참조 타입의 차이를 명확히 이해하면, 자바에서 데이터를 더 효율적으로 다루고 적절한 방식으로 메모리를 관리할 수 있습니다.


Q1: 자바에서 기본 데이터 타입의 크기가 고정된 이유는 무엇인가요?

답변:
자바에서 기본 데이터 타입의 크기가 고정된 이유는 효율적인 메모리 관리와 프로그램의 이식성을 보장하기 위해서입니다. 기본 데이터 타입의 크기가 고정되어 있으면, 자바 프로그램이 어느 환경에서 실행되든 메모리 할당 방식이 동일하게 유지됩니다. 즉, int는 항상 4바이트, long은 항상 8바이트로 고정되기 때문에, 어떤 하드웨어에서 실행되더라도 동일한 결과를 보장할 수 있습니다.

이러한 고정된 크기는 다음과 같은 장점이 있습니다:

  • 성능 최적화: 각 데이터 타입에 맞게 메모리를 미리 할당할 수 있어, 메모리 관리가 간편해지고 성능이 최적화됩니다.
  • 이식성: 자바는 "Write Once, Run Anywhere"를 지향하는 언어로, 기본 데이터 타입의 크기가 고정됨으로써 프로그램이 다양한 플랫폼에서 동일하게 작동할 수 있습니다.

Q2: 참조 타입의 초기값이 null로 설정되는 이유는 무엇인가요?

답변:
참조 타입의 초기값이 null로 설정되는 이유는 객체가 아직 할당되지 않았음을 나타내기 위해서입니다. 참조 타입은 변수에 값이 아닌 메모리 주소를 저장하는데, 객체가 생성되지 않았다면 그 변수에는 유효한 메모리 주소가 없으므로, 이때 참조 변수의 초기값은 null로 설정됩니다. null은 자바에서 객체가 참조되지 않는 상태를 나타내는 특별한 값입니다.

참조 타입 변수가 null인 상태에서 해당 변수로 객체에 접근하려고 하면 NullPointerException이 발생할 수 있기 때문에, 객체를 사용할 때는 먼저 null인지 확인한 후 안전하게 사용해야 합니다.

Q3: 참조 타입에서 == 연산자와 equals() 메서드를 사용하는 적절한 시점은 언제인가요?

답변:
참조 타입에서 == 연산자와 equals() 메서드는 서로 다른 목적으로 사용되며, 적절한 사용 시점을 구분해야 합니다.

== 연산자:

  • == 연산자는 메모리 주소(참조 값)를 비교합니다. 즉, 두 변수가 동일한 객체를 가리키고 있는지를 확인할 때 사용합니다.
    적절한 시점: 두 참조 타입 변수가 같은 객체를 참조하는지 확인할 때 사용합니다.
    예시:
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);  // false, 서로 다른 객체를 가리킴

equals() 메서드:

equals() 메서드는 객체의 내용을 비교합니다. 즉, 두 객체가 같은 값을 가지는지를 확인하는 데 사용합니다. 특히, String, Integer 등의 클래스는 equals() 메서드를 재정의하여 객체의 내용이 같은지를 비교합니다.
적절한 시점: 두 객체의 값이 같은지 확인하고 싶을 때 사용합니다.
예시:

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));  // true, 내용이 같음

결론:

  • == 연산자는 참조 비교(같은 객체를 가리키는지)를 할 때 사용하고,
  • equals() 메서드는 내용 비교(같은 값인지)를 할 때 사용합니다.
profile
백엔드에서 서버엔지니어가 된 사람

0개의 댓글