[Java]데이터 타입-참조타입

kim·2025년 3월 31일

Java

목록 보기
1/3

자바 데이터 타입 정리 ✨

자바의 데이터 타입은 크게 기본 타입참조 타입으로 나뉩니다. 이번 포스팅에서는 이 두 가지 타입의 특징과 차이점에 대해 깔끔히 정리해 보겠습니다.

1. 데이터 타입 분류 📌

1-1. 기본 타입(Primitive Type)

기본 타입은 값을 직접 저장하는 타입입니다.

  • 종류 : byte, short, int, long, float, double, char, boolean (총 8개)
  • 저장 위치 : 스택(Stack) 메모리에 저장되어 빠르고 간단합니다.
  • 특징 :
    • 값 자체를 저장하므로 다른 변수에 값을 복사하면 서로 독립적입니다.
    • 초기화하지 않으면 기본값이 설정됩니다. (예: int는 0, boolean은 false)
int a = 10;
int b = a; // b는 a의 값을 복사 받음
b = 20; // b값을 변경해도 a는 영향을 받지 않음.

1-2. 참조 타입(Reference Type)

참조 타입은 객체가 생성된 메모리의 주소(번지)를 저장합니다.

  • 종류 : 클래스, 배열, 인터페이스, 열거형 등

열거형(Enum) 알아보기

열거형이란 상수 값들의 집합을 하나의 이름 아래 묶어서 사용하는 데이터 타입입니다.

enum Day { MONDAY, TUESDAY, WEDNESDAY }
Day today = Day.MONDAY;
  • 사용 목적 : 코드의 가독성과 안정성을 높이기 위해 사용합니다.
  • 장점 :
    • 가독성 향상 (숫자 대신 이름으로 표현)
    • 타입 안정성 (허용된 값만 사용 가능)

열거형의 고급 활용 💡

  • 필드와 메서드를 추가하여 확장 가능합니다.
enum Planet {
    EARTH(5.97e+24, 6.371e6);

    private final double mass;
    private final double radius;

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }

    public double surfaceGravity() {
        final double G = 6.67300E-11;
        return G * mass / (radius * radius);
    }
}
  • 인터페이스 구현도 가능합니다.
interface Greeting {
    String getMessage();
}

enum Language implements Greeting {
    ENGLISH { public String getMessage() { return "Hello!"; } },
    KOREAN { public String getMessage() { return "안녕하세요!"; } }
}

참조 타입의 특징 📝

  • 저장 위치 : Stack에는 참조(주소)만 저장되고, Heap에는 실제 데이터가 저장됩니다.
  • 특징 : 같은 객체를 참조하면 서로 영향을 줄 수 있습니다.
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;
arr2[0] = 10;
System.out.println(arr1[0]); // 출력: 10

1-3. 기본 타입과 참조 타입 비교표 🔍

특성기본 타입참조 타입
데이터 저장값 자체데이터의 메모리 주소 (참조)
저장 위치스택(Stack)스택 + 힙 (Stack에 주소, Heap에 데이터)
복사 시 동작값만 복사, 독립적참조 복사, 동일 객체 공유
종류int, boolean 등배열, 객체, String 등

비유로 이해하기 📖

  • 기본 타입: 책을 복사해 각자 독립적인 책을 가진 상태
  • 참조 타입: 도서관에서 한 권의 책을 같이 보는 상태

2. 자바 메모리 사용 영역 🧠

자바 프로그램이 실행될 때 메모리는 여러 영역으로 나뉘어 관리됩니다. 각 영역의 특징을 이해하면 프로그램을 효율적으로 설계할 수 있습니다.

메모리 영역 종류 및 특징 📌

2-1. 메서드 영역(Method Area)

  • 역할: 클래스 정보, 메서드 정보, static 변수 등을 저장
  • 특징:
    • 프로그램 전체에서 공유되는 정보
    • 클래스의 메타데이터(클래스 이름, 필드, 메서드 정보 등)를 보관
  • 비유: 건물 설계도처럼 프로그램 전체에서 사용되는 정보가 저장됩니다.

2-2. 힙 영역(Heap Area)

  • 역할: 객체와 인스턴스 변수가 저장되는 공간
  • 특징:
    • new 키워드로 생성된 객체들이 위치
    • 동적으로 크기가 조정되며, JVM의 가비지 컬렉터(GC)가 관리
  • 비유: 창고와 비슷해 사용하지 않는 물건(객체)은 자동으로 정리됩니다.

2-3. 스택 영역(Stack Area)

  • 역할: 메서드 호출 시 사용되는 지역 변수와 메서드 호출 정보를 저장
  • 특징:
    • 메서드 호출 시 할당되고, 종료 시 제거되는 LIFO(후입선출) 구조
    • 빠르고 효율적인 메모리 관리
  • 비유: 작업대와 같아 작업 중인 데이터만 올려두고 끝나면 정리합니다.

2-4. PC 레지스터(Program Counter Register)

  • 역할: 현재 실행 중인 명령어 주소 저장
  • 특징:
    • 각 스레드마다 독립적으로 존재하여 멀티스레드 환경에서 중요
  • 비유: GPS처럼 현재 실행 위치를 표시합니다.

2-5. 네이티브 메서드 스택(Native Method Stack)

  • 역할: Java 외부 언어(C, C++)로 작성된 네이티브 메서드를 실행할 때 사용
  • 특징:
    • JVM 외부 언어 코드 실행을 지원
  • 비유: 외부 기술 지원 센터와 같은 역할로, JVM 내부에서 해결되지 않는 작업을 처리합니다.

메모리 사용 예제 코드 🛠️

public class MemoryExample {
    static int staticVar = 100; // 메서드 영역

    public static void main(String[] args) {
        int localVar = 10; // 스택 영역

        MyClass obj = new MyClass(); // 힙 영역에 객체 생성
        obj.instanceVar = 20; // 힙에 저장된 객체의 변수 사용
    }
}

class MyClass {
    int instanceVar; // 힙 영역
}

메모리 영역 요약표 🗃️

영역저장 내용특징
메서드 영역클래스, 메서드 정보, static 변수프로그램 전체에서 공유
힙 영역객체, 인스턴스 변수동적 할당, GC 관리
스택 영역메서드 호출 정보, 지역 변수LIFO 구조
PC 레지스터실행 중인 명령어 위치각 스레드 독립적
네이티브 메서드 스택네이티브 코드 관련 데이터JVM 외부 언어 지원

profile
공부하자

0개의 댓글