Notice
Recent Posts
Recent Comments
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Spring & Java

래퍼클래스 (기본형 참조형) 본문

JAVA 객체지향 이해하기

래퍼클래스 (기본형 참조형)

dev.hyuck 2025. 12. 8. 20:00

● 메서드 - 모듈화의 시작

● 클래스와 객체

● JVM 메모리 영역

● 래퍼클래스 (기본형 참조형)

● static - 클래스가 공유

● final - 변하지 않는 값

● 인터페이스 - 표준화의 시작

● 객체지향 PART 1 -  캡술 (접근제어자)

● 객체지향 PART 2 -  상속

● 객체지향 PART 3 - 추상화

● 객체지향 PART 4 - 다형성

 

래퍼클래스

 

학습키워드

● 래퍼클래스

● 기본형 변수 - 실제 값을 저장하는 변수

● 참조형 변수 - 객체의 메모리 주소를 저장하는 변수

● 오토박싱 언박싱 - 래퍼형을 기본형으로 자동으로 변환해주는 기능

 

래퍼클래스( Wrapper Class) 란?

● 기본자료형을 객체로 감싸는 클레스 입니다.

 

 

참조형 ( Reference Type )

● 변수에 객체가 담기면 해당 변수를 참조형변수 라고 말합니다.

● 참조형 변수는 데이터가 저장된 메모리 주소를 가리킵니다.

ㅡ> Heap 메모리 주소

● 객체 데이터는 Heap 영역에 저장되어 있기 때문입니다.

● 객체, 배열등이 참조형에 속합니다.

Person personA = new Person("Steve"); // ✅ 객체가  담긴 personA 는 참조형 변수입니다.
Syetem.out.println(personA.name);
System.out.println(personA); // ✅ 출력하면 @123 메모리의 주소값이 출력됩니다.

int[] arr = {1, 2, 3, 4}; // ✅ 배열이 담긴 arr 는 참조형 변수입니다.
System.out.println(arr); // ✅ 출력하면 @123 메모리의 주소값이 출력됩니다.

 

래퍼클래스도 객체 입니다.

● 래퍼클래스가 담겨 있는 변수도 참조형 변수 입니다.

● 하지만 출력시 메모리 주소값이 나오지 않습니다.

Integer num = 100;
System.out.println(num); // 출력 100

● 내부적으로 toString()이 오버라이딩 되어 있기 때문입니다.

● 오버라이딩 수업은 상속 수업에서 다룰 예정입니다.

● 지금은 내부적으로 어떤 처리가 되어 있기 때문에 데이터가 직접 출력 되는구나 정도로 이해하고 남어가셔도 좋습니다.

 

왜 래퍼클래스를 사용할까?

● 기본형은 객체처럼 속성, 기능을 가질 수 없습니다.

● 하지만 객체는 기능을 제공할 수 있습니다.

● 기본형을 감싼 객체를 만들어 기능을 제공하면 편리하게 데이터처리를 할 수 있습니다.

Integer num = 123; // 래퍼클래스
String str = num.toString(); // ✅ 편리한 기능

int a = 100; // 그냥 데이터 100
String str = a.toString(); // ❌ 변환 불가

 

직접 래퍼클래스를 만들어봅시다.

class CustomInteger {
		// 속성
    int value; 

    // 생성자
    CustomInteger(int value) {
        this.value = value;
    }

		// 기능
    // 값을 가져오는 메서드
    int getValue() {
        return value;
    }

    // 값을 설정하는 메서드
    void setValue(int value) {
        this.value = value;
    }

    // toString() 오버라이딩 (값을 출력할 수 있도록)
    @Override
    public String toString() {
        return String.valueOf(value);
    }
}

public class Main {
    public static void main(String[] args) {
        CustomInteger num1 = new CustomInteger(100);
        System.out.println(num1); // 100
        System.out.println(num1.getValue()); // 100

        num1.setValue(200);
        System.out.println(num1); // 200
    }
}

 

오토박싱 vs 언박싱

오토박싱, 언박싱에 대해서 알아봅시다.

● 래퍼클래스 < ㅡ > 기본형으로 형변환은 굉장히 자주 일어납니다.

● Java에서는 이 형변환 과정을 자동으로 지원해 줍니다.

Integer num3 = 10; // 오토박싱 (기본형을 자동으로 래퍼 클래스 객체로 변환)
int num = num3;   // 오토 언박싱(참조형을 자동으로 기본형으로 변환)

 

오토박싱 ( Auto - boxing )

기본형 > 래퍼형으로 변환하는 과정을 오토박싱

● Integer는 참조형 (객체) 이지만 기본형 int 값을 직접 대입할 수 있습니다.

● 내부적으로 컴파일러가 자동으로 Integer.value0f(10)을 호출하여 객체를 생성하기 때문입니다.

Integer num3 = 10; // ✅ 오토박싱

// ✅ 내부적 자동 처리(래퍼형 <- 기본형)
Integer num = Integer.valueOf(10);

 

오토 언박싱

래퍼형 > 기본형으로 변환하는 과정을 오토언박싱

● num은 Integer 객체(참조형변수) 지만  기본형 int 변수에 대입할 수 있습니다.

● 내부적으로 컴파일러가 자동으로 num.intvalue()를 호출하여 기본형으로 변환하기 때문입니다.

Integer num3 = 10; 
int num = num3;   // ✅ 오토 언박싱

// ✅ 내부적 자동처리(기본형 <- 래퍼형)
int a = num.intValue();

 

기본형과 래퍼형 넝능 비교

● 래퍼형은 내부적으로 데이터를 감싸고 있기 때문에 연산시 불리합니다.

● 객체에서 기본형 값을 꺼내서 연산하는 추가작업이 발생하기 때문입니다.

● 이런 추가 작업때문에 기본형보다 래퍼클래스는 연산 속도가 느립니다.

● 빠른 작업이 필요한 경우 기본형을 직접 활용하는 것이 좋은 선택 입니다.

 

public class PrimitiveVsWrapperPerformance {
    public static void main(String[] args) {
        int iteration = 10_000_000; // 1000만 번 반복
        
        // 기본형 int 연산 성능 테스트
        long startTime1 = System.nanoTime();
        int sum1 = 0;
        for (int i = 0; i < iteration; i++) {
            sum1 += i;  // 기본형 연산
        }
        long endTime1 = System.nanoTime();
        long primitiveTime = endTime1 - startTime1;

        // 래퍼 클래스 Integer 연산 성능 테스트
        long startTime2 = System.nanoTime();
        Integer sum2 = 0;
        for (int i = 0; i < iteration; i++) {
            sum2 += i;  // 오토박싱 & 언박싱 발생
        }
        long endTime2 = System.nanoTime();
        long wrapperTime = endTime2 - startTime2;

        // 결과 출력
        System.out.println("기본형(int) 연산 시간: " + primitiveTime + " ns");
        System.out.println("래퍼 클래스(Integer) 연산 시간: " + wrapperTime + " ns");
        System.out.println("성능 차이 (배수): " + (double) wrapperTime / primitiveTime);
    }
}

 

코딩실력 빠르게 향상시키는 방법

 

언어 실력을 빠르게 키우려면 직접 생각하며 외국인과 대화하는 것이 효과적이듯 코딩 실력도 직접 코드를 작성하고 실행해보는 경험이 많을수록 향상됩니다.

손으로 직접 타이핑하고 실행하는 과정이 반복될수록 개념이 더 깊이 이해되고 실전에서 활용하는 능력이 자연스럽게 길러집니다.

 

 

'JAVA 객체지향 이해하기' 카테고리의 다른 글

인터페이스 - 표준화의 시작  (0) 2025.12.10
final - 변하지 않는 값  (0) 2025.12.10
Static - 클래스가 공유하는 공간  (1) 2025.12.09
JAVA 계산기 과제 (1차)  (0) 2025.12.09
JVM 메모리 영역  (0) 2025.12.08