λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Java] μ™œ μ œλ„€λ¦­μ€ μ›μ‹œ νƒ€μž…μ„ μ‚¬μš©ν•  수 μ—†λŠ”κ°€

좜처

ChatGPT


1. μ œλ„€λ¦­μ˜ μž‘λ™ 방식과 νƒ€μž… μ†Œκ±°(Type Erasure)

μ œλ„€λ¦­μ€ 컴파일 μ‹œκ°„μ— νƒ€μž…μ„ κ²€μ‚¬ν•˜κ³ , λŸ°νƒ€μž„μ—λŠ” νƒ€μž… 정보λ₯Ό μœ μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉, μ œλ„€λ¦­ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜λŠ” 컴파일 μ‹œμ μ—λ§Œ μœ νš¨ν•˜λ©°, νƒ€μž… μ†Œκ±°(Type Erasure) κ³Όμ •μ—μ„œ μ»΄νŒŒμΌλŸ¬λŠ” μ œλ„€λ¦­ νƒ€μž… 정보λ₯Ό μ œκ±°ν•˜κ³  λͺ¨λ“  μ œλ„€λ¦­ νƒ€μž…μ„ ν•΄λ‹Ή 경계(bound) λ˜λŠ” Object둜 λŒ€μ²΄ν•œλ‹€.

 

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 μ œλ„€λ¦­ ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•΄λ³Έλ‹€.

public class Box<T> {
    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }
}

 

컴파일 ν›„, μ œλ„€λ¦­ νƒ€μž… TλŠ” Object둜 λŒ€μ²΄λ˜μ–΄ λ‹€μŒκ³Ό 같은 ν˜•νƒœκ°€ λœλ‹€.

public class Box {
    private Object value;

    public void setValue(Object value) {
        this.value = value;
    }

    public Object getValue() {
        return value;
    }
}

 

νƒ€μž… μ†Œκ±° κ³Όμ •μ—μ„œ λͺ¨λ“  μ œλ„€λ¦­ νƒ€μž… 정보가 μ œκ±°λ˜μ–΄, κ²°κ΅­ 컴파일된 λ°”μ΄νŠΈμ½”λ“œμ—λŠ” μ›μ‹œ νƒ€μž…κ³Ό κ΄€λ ¨λœ μ œλ„€λ¦­ 정보가 λ‚¨μ•„μžˆμ§€ μ•Šκ²Œ λœλ‹€.

 

2. μ›μ‹œ νƒ€μž…(Primitive Type)κ³Ό μ°Έμ‘° νƒ€μž…(Reference Type)의 차이

μžλ°”μ—λŠ” 두 가지 μ£Όμš” 데이터 νƒ€μž…μ΄ μžˆλ‹€.

 

μ›μ‹œ νƒ€μž…(Primitive Type)

int, char, boolean, byte, short, long, float, double λ“±.

  • μ›μ‹œ νƒ€μž…μ€ 기본적으둜 μŠ€νƒ λ©”λͺ¨λ¦¬μ— μ €μž₯되며, κ³ μ •λœ 크기λ₯Ό 가지고 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, intλŠ” 4λ°”μ΄νŠΈ 크기이닀.
  • μ›μ‹œ νƒ€μž…μ€ μ°Έμ‘° νƒ€μž…κ³Ό 달리 λ©”λͺ¨λ¦¬μ— 직접 값을 μ €μž₯ν•œλ‹€.

μ°Έμ‘° νƒ€μž…(Reference Type)

λͺ¨λ“  클래슀, μΈν„°νŽ˜μ΄μŠ€, λ°°μ—΄ 등이 이에 ν•΄λ‹Ήν•œλ‹€.

  • μ°Έμ‘° νƒ€μž…μ€ 객체의 μ°Έμ‘°(λ©”λͺ¨λ¦¬ μ£Όμ†Œ)λ₯Ό μ €μž₯ν•˜λ©°, μ‹€μ œ λ°μ΄ν„°λŠ” νž™ λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€.
  • μ°Έμ‘° νƒ€μž…μ€ null을 κ°€μ§ˆ 수 있고, 객체 생성 μ‹œ λ©”λͺ¨λ¦¬ 할당을 톡해 νž™ λ©”λͺ¨λ¦¬ μƒμ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•œλ‹€.

 

3. μ œλ„€λ¦­μ—μ„œ μ›μ‹œ νƒ€μž…μ„ μ‚¬μš©ν•  수 μ—†λŠ” 이유

νƒ€μž… μ†Œκ±°μ™€ λ©”λͺ¨λ¦¬ λͺ¨λΈμ˜ 차이

μ›μ‹œ νƒ€μž…μ€ λ©”λͺ¨λ¦¬μ—μ„œ 직접 값을 μ €μž₯ν•œλŠ 반면, μ œλ„€λ¦­μ€ 기본적으둜 Object와 같은 μ°Έμ‘° νƒ€μž…μ„ κΈ°λŒ€ν•œλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” μ œλ„€λ¦­ νƒ€μž…μ„ μ°Έμ‘° νƒ€μž…μœΌλ‘œ μ·¨κΈ‰ν•˜μ—¬ Object둜 λ³€ν™˜ν•˜μ‹œλ§Œ, μ›μ‹œ νƒ€μž…μ€ 이와 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”λ‹€. μ›μ‹œ νƒ€μž…μ„ μ œλ„€λ¦­μœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€λ©΄ νƒ€μž… λ³€ν™˜ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

상속 ꡬ쑰의 차이

λͺ¨λ“  μ°Έμ‘° νƒ€μž…μ€ Objectλ₯Ό μƒμ†ν•˜μ§€λ§Œ, μ›μ‹œ νƒ€μž…μ€ 그렇지 μ•Šλ‹€. μ œλ„€λ¦­μ€ νƒ€μž… 경계λ₯Ό Object둜 μ„€μ •ν•˜λŠ” κ²½μš°κ°€ λ§Žμ€λ°, μ›μ‹œ νƒ€μž…μ„ 이λ₯Ό μƒμ†ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.

μžλ™ λ°•μ‹±κ³Ό μ–Έλ°•μ‹±μ˜ μ„±λŠ₯ 문제

μ œλ„€λ¦­μ—μ„œ μ›μ‹œ νƒ€μž…μ„ 직접 μ‚¬μš©ν•  수 μ—†λ‹€ λ³΄λ‹ˆ, int 같은 μ›μ‹œ νƒ€μž…μ„ μ‚¬μš©ν•  λ•Œλ§ˆλ‹€ μ»΄νŒŒμΌλŠ” 이λ₯Ό Integer둜 μžλ™ λ³€ν™˜ν•˜λŠ” λ°•μ‹±(Boxing)을 μˆ˜ν–‰ν•΄μ•Ό ν•˜κ³ , λ°˜λŒ€λ‘œ μ–Έλ°•μ‹±(Unboxing)도 ν•„μš”ν•˜λ‹€. 이 과정은 μ„±λŠ₯에 영ν–₯을 λ―ΈμΉ  수 있으며, λͺ…μ‹œμ , λ˜λŠ” μ•”μ‹œμ  νƒ€μž… μΊμŠ€νŒ…κ³Ό κ΄€λ ¨λœ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλ‹€.

 

4. μ œλ„€λ¦­κ³Ό 래퍼 클래슀의 μ‚¬μš©

λŒ€μ‹ , μ œλ„€λ¦­μ€ 래퍼 클래슀(예: Integer, Double, Character)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›μ‹œ νƒ€μž…μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, List<int>λŠ” μ‚¬μš©ν•  수 μ—†μ§€λ§Œ, List<Integer>λŠ” κ°€λŠ₯ν•˜λ‹€.

 

예제

import java.util.ArrayList;
import java.util.List;

public class GenericExample {
    public static void main(String[] args) {
        // μ›μ‹œ νƒ€μž…(int)을 μ‚¬μš©ν•  수 μ—†κΈ° λ•Œλ¬Έμ—, 래퍼 클래슀 Integerλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);  // μ˜€ν† λ°•μ‹±: int -> Integer
        numbers.add(2);
        numbers.add(3);

        int sum = 0;
        for (Integer number : numbers) {
            sum += number;  // μ˜€ν† μ–Έλ°•μ‹±: Integer -> int
        }

        System.out.println("Sum: " + sum);  // 좜λ ₯: Sum: 6
    }
}

 

5. κ²°λ‘ 

 

  • νƒ€μž… μ†Œκ±°λ‘œ 인해 μ œλ„€λ¦­μ—μ„œλŠ” μ°Έμ‘° νƒ€μž…λ§Œ μ‚¬μš©ν•  수 있으며, μ›μ‹œ νƒ€μž…μ„ 직접 μ‚¬μš©ν•  수 μ—†λ‹€.
  • μ›μ‹œ νƒ€μž…κ³Ό μ œλ„€λ¦­μ˜ λ©”λͺ¨λ¦¬ λͺ¨λΈκ³Ό 상속 ꡬ쑰의 차이둜 인해 μ›μ‹œ νƒ€μž…μ€ μ œλ„€λ¦­μ— λ§žμ§€ μ•Šλ‹€.
  • λŒ€μ‹  래퍼 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ œλ„€λ¦­μ—μ„œ μ›μ‹œ νƒ€μž…μ„ μ²˜λ¦¬ν•˜λ©°, μžλ™ λ°•μ‹±κ³Ό μ–Έλ°•μ‹±μœΌλ‘œ λ³€ν™˜λœλ‹€.