[LG CNS AM INSPIRE CAMP 1기] 제네릭 Generic 완벽하게 이해하기

2025. 1. 14. 14:15·LG CNS AM CAMP 1기
🔑완벽하게 이해했나..?

💡 제네릭 클래스 Generic Class


📃 제네릭은 컴파일 시 타입을 지정하여 타입의 안정성을 보장하고 코드의 재사용성을 높이는 기능입니다. 이를 통해 타입을 명시하지 않고도 유연하게 데이터 타입을 처리할 수 있습니다

https://salithachathuranga94.medium.com/generics-in-java-3c791555e924

💻Generic 예시

class Box<T> {
    private T item;
    
    public void setItem(T item) {
        this.item = item;
    }
    
    public T getItem() {
        return item;
    }
}


public class MyTest {
	public static void main(String[] args) {
		// String 타입의 Box 생성
        Box<String> stringBox = new Box<>();
        stringBox.setItem("안녕하세요");
        String str = stringBox.getItem();
        System.out.println("String 값: " + str);
        
        // Integer 타입의 Box 생성
        Box<Integer> intBox = new Box<>();
        intBox.setItem(100);
        int number = intBox.getItem();
        System.out.println("Integer 값: " + number);
    }
 }
 
// String 값: 안녕하세요
// Integer 값: 100

⬆️ 일반적으로, 위의 예시처럼 String과 Integer 타입의 Box를 생성하려면 각각 StringBox와 IntegerBox 클래스를 작성해야 했습니다. 그러나 제네릭을 활용하면 중복 코드를 제거하고, 다양한 타입에 대해 유연한 클래스를 작성할 수 있습니다

 

💡 제네릭 메서드 Generic Method


📃 리턴타입 또는 매게변수의 타입을 제네릭 타입으로 선언하여 다양한 타입의 입력을 처리할 수 있습니다

💻CODE

public class GenericMethodExample {

    public static <T> void printArray(T[] array) {
        for (T item : array) {
            System.out.print(item + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // Integer 배열 출력
        Integer[] intArray = {1, 2, 3, 4, 5};
        System.out.print("Integer Array: ");
        printArray(intArray);

        // String 배열 출력
        String[] strArray = {"Hello", "World"};
        System.out.print("String Array: ");
        printArray(strArray);

        // Double 배열 출력
        Double[] doubleArray = {1.1, 2.2, 3.3};
        System.out.print("Double Array: ");
        printArray(doubleArray);
    }
}

⬆️ 동일한 printArray 메서드를 Integer, String, Double 타입 배열에 대해 재사용할 수 있습니다

 

💡제네릭 클래스에서 범위 제한 (Bounded Type)


📃 제네릭 클래스 타입을 제한하여 특정 타입 또는 타입 계층만 허용하도록 설정할 수 있습니다

💻CODE

class NumberBox<T extends Number> {
    private T number;

    public void setNumber(T number) {
        this.number = number;
    }

    public T getNumber() {
        return number;
    }

    public double getDoubleValue() {
        return number.doubleValue(); // Number 클래스 메서드 사용
    }
}

public class Main {
    public static void main(String[] args) {
        // Integer 타입 사용
        NumberBox<Integer> intBox = new NumberBox<>();
        intBox.setNumber(100);
        System.out.println("Integer 값: " + intBox.getNumber());
        System.out.println("Double 값: " + intBox.getDoubleValue());

        // Double 타입 사용
        NumberBox<Double> doubleBox = new NumberBox<>();
        doubleBox.setNumber(55.5);
        System.out.println("Double 값: " + doubleBox.getNumber());
        System.out.println("Double 값 (doubleValue): " + doubleBox.getDoubleValue());

        // String 타입 사용 불가 (컴파일 오류)
        // NumberBox<String> stringBox = new NumberBox<>(); // ❌ 컴파일 에러
    }
}

⬆️ 이전에 작성했던 Box는 String 타입을 허용했지만, NumberBox 클래스는 Number 오브젝트를 상속 받음으로 범위를 제한할 수 있습니다

 

💡제네릭 메서드에서 범위 제한 (Bounded Type)


📃 제네릭 메서드에서의 범위 제한도 마찬가지로 extends를 통해 리턴 혹은 입력 타입을 제한할 수 있습니다

💻CODE

class GenericMethod {
	// String 타입으로 범위 제한
	public <T extends String> T method1(T t) {
		return t;
	}
}

public class MyTest {
	public static void main(String[] args) {
		GenericMethod gm = new GenericMethod();
		System.out.println(gm.<String>method1("문자열")); // 가능
		System.out.println(gm.method1(120)); // 불가능
		
    }
 }

⬆️ GenericMethod클래스에 method1은 String값으로 범위를 제한하고 있습니다

 

💡제네릭(Generic)의 활용: 와일드카드와 범위 제한


📃 Java의 제네릭에서는 와일드카드 (?), 상한(? extends T), 하한(? super T)을 활용하여 유연성과 타입 안정성을 조화롭게 유지할 수 있습니다

💻CODE

class Goods<T> {
    private T t;
    public T get() { return this.t; }
    public void set(T t) { this.t = t; }
}

class GenericMethod {
    void method1(Goods<A> g) {}                  // 정확히 Goods<A> 타입만 허용
    void method2(Goods<?> g) {}                  // 모든 타입 허용
    void method3(Goods<? extends B> g) {}        // B 또는 B의 하위 타입만 허용
    void method4(Goods<? super B> g) {}          // B 또는 B의 상위 타입만 허용
}

// 클래스 계층 구조
class A {}
class B extends A {}
class C extends B {}
class D extends C {}

public class MyTest {
    public static void main(String[] args) {
        GenericMethod gm = new GenericMethod();

        // Case 1: 정확히 Goods<A>만 허용
        gm.method1(new Goods<A>());              // 가능
        // gm.method1(new Goods<B>());          // 컴파일 오류
        // gm.method1(new Goods<C>());          // 컴파일 오류
        // gm.method1(new Goods<D>());          // 컴파일 오류

        // Case 2: 모든 타입 허용 (와일드카드)
        gm.method2(new Goods<A>());              // 가능
        gm.method2(new Goods<B>());              // 가능
        gm.method2(new Goods<C>());              // 가능
        gm.method2(new Goods<D>());              // 가능

        // Case 3: B와 B의 하위 타입만 허용
        // gm.method3(new Goods<A>());          // 컴파일 오류
        gm.method3(new Goods<B>());              // 가능
        gm.method3(new Goods<C>());              // 가능
        gm.method3(new Goods<D>());              // 가능

        // Case 4: B와 B의 상위 타입만 허용
        gm.method4(new Goods<A>());              // 가능
        gm.method4(new Goods<B>());              // 가능
        // gm.method4(new Goods<C>());          // 컴파일 오류
        // gm.method4(new Goods<D>());          // 컴파일 오류
    }
}

⬆️ 제네릭과 와일드카드를 활용하면 코드의 유연성과 재사용성을 극대화할 수 있습니다

 

📝 SUMMARY


📌 제네릭 클래스: 타입 안정성과 코드 재사용성을 높이는 기능으로, 컴파일 시 타입을 지정하여 유연하게 데이터를 처리

📌 제네릭 메서드: 리턴 타입이나 매개변수의 타입을 제네릭으로 선언, 다양한 타입의 입력을 처리 가능

📌 범위 제한 (Bounded Type): extends 키워드를 사용해 특정 타입 계층만 허용.

저작자표시 비영리 변경금지
'LG CNS AM CAMP 1기' 카테고리의 다른 글
  • [LG CNS AM INSPRIRE CAMP 1기] Springboot 들어가기전 알아야할 핵심 개념 3가지 IoC, DI, AOP
  • [LG CNS AM INSPIRE CAMP 1기] 어노테이션과 Maven 빌드 관리 도구 빠르게 이해하기
  • [LG CNS AM INSPIRE CAMP 1기] AMaze 영상 메모 웹앱 구현 - VERSION 2
  • [LG CNS AM INSPRIRE CAMP 1기] 최상위 객체 Object & final & abstract & interface 정리하기
Jelong
Jelong
커스텀 웹: https://jaehong-park.com Github: https://github.com/qkrwoghd04
  • Jelong
    24/7 Developer's Note
    Jelong
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Software Engineering
      • Ubuntu
      • Network
      • JavaScript
      • Web
      • Interaction Design
      • React Native
      • React
      • Algorithm
      • Java
      • Database design
      • IT Trend
      • TroubleShooting
      • AWS
      • Interview
      • LG CNS AM CAMP 1기
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Queues
    티스토리챌린지
    java
    오블완
    자바스크립트
    mininet
    ChatGPT
    화이트 박스 테스트
    JS
    generic
    블랙 박스 테스트
    BST
    데이터 구조
    소프트웨어 공학
    이진트리
    알고리즘
    javascript
    GPT-4
    css
    미니넷
    heap
    html
    typescript
    알고리즘 분석
    expo
    React
    자바
    frontend
    AWS
    prototyping
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Jelong
[LG CNS AM INSPIRE CAMP 1기] 제네릭 Generic 완벽하게 이해하기
상단으로

티스토리툴바