Java

[JAVA] 자바 - 무엇이든 담을 수 있는 제네릭(Generic) 프로그래밍

Seong-Jun 2025. 2. 20. 15:23
728x90
반응형
SMALL

제네릭을 사용하지 않았을 경우 발생하는 문제점

  • 프로그래머의 실수가 컴파일 과정에서 발견되지 않음
  • 프로그래머의 실수가 실행 과정에서 조차 발견되지 않을 수 있음

제네릭이란?

  • 클래스에서 사용하는 변수의 자료형이 여러 개일 수 있고, 그 기능(메서드)은 동일한 경우 클래스의 자료형을 특정하지 않고 추후 해당 클래스를 사용할 때 지정할 수 있도록 선언함
  • 실제 사용되는 자료형의 변환은 컴파일러에 의해 검증되므로 안정적인 프로그래밍 방식이다
  • 클래스 또는 메소드에서 사용되는 다양한 데이터타입을 일반화 시켜서 정의하는 방법

제네릭 프로그래밍이란?

어떤 값이 하나의 참조 자료형이 아닌 여러 자료형을 사용할 수 있도록 프로그래밍 하는 것

특징

  • 코드 재사용성이 높아짐
  • 타입 안정성 제공 ( 의도하지 않은 타입 사용 방지 )
  • 불필요한 형변환 줄임

제네릭 클래스

표현법

접근제한자 class 클래스명<타입매개변수> {}

특징

  • 제네릭 클래스 객체 생성 시 타입(파라미터,전달값)를 결정해주는 것이 좋음
        => 명시되지 않으면 [Object]로 처리됨
  • 제네릭 클래스의 참조 변수 선언 시 타입(파라미터,전달값)을 명시하고,
        생성 부분(new) 에서는 <>만 사용 가능.
        => 체 생성 시 [기본 자료형]은 사용할 수 없음
  • 적용 범위 : 필드의 데이터 타입 및 메서드 반환, 매개변수타입, 지역변수

제네릭 메소드 (제네릭이 적용된 메소드)

표현법

접근제한자 <타입매개변수> 반환형 메서드명(매개변수정보) {}

특징

  • 메소드 내에서 사용하는 데이터타입을 일반화시켜 정의
  • 제네릭 메소드의 타입 파라미터를 결정하는 방법
    • 호출 시 직접 명시하기
    • 호출 시 전달되는 값의 타입에 따라 자동으로 결정되게 하기
            => 매개변수의 타입이 제네릭 타입이어야 함!
    • 호출 시 반환 값을 받는 변수의 타입에 따라 자동으로 결정되게 하기
            => 반환타입이 제네릭 타입이어야 함!
            => 매개변수가 제네릭을 사용하지 않아야 함!

제네릭 클래스 사용하기

Powder.java

public class Powder {
	public String toString() {
		return "재료는 Powder 입니다.";
	}
}

Plastic.java

public class Plastic {
	public String toString() {
		return "재료는 Plastic 입니다.";
	}
}

GenericPrinter.java

public class GenericPrinter<T> {  // T자리에 실제적으로 사용할 자료형을 쓴다. 나중에 쓸 때
	private T material;
	
	public void setMeterial(T material) {
		this.material = material;
	}
	
	public T getMaterial() {
		return material;
	}
	
	public String toString() {
		return material.toString();
	}
}

=> <> 다이아몬드 연산자 안에 T는 자료형 매개변수이다. 타입 매개변수에 extends 키워드를 사용할 때 확장이 가능한 클래스를 사용해야한다.

GenericPrinterTest.java

public class GenericPrinterTest {

	public static void main(String[] args) {
		Powder powder = new Powder();
		
		GenericPrinter<Powder> powderPrinter = new GenericPrinter<>(); // <> : 다이아몬드 연산자
		powderPrinter.setMeterial(powder);
		
		Powder p = powderPrinter.getMaterial(); // 형변환을 하지 않는다.
		// 형변환을 하지 않는 이유 : GenericPrinter<Powder>이렇게 작성하면 컴파일될 때 GenericPrinter 클래스에 있는 모든 T가 Powder로 바뀜.
		
		System.out.println(powderPrinter.toString());
		
	}

}

출력 결과

재료는 Powder 입니다.

 

=> 아래 내용 참고

https://seong-jun.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94-%EC%A0%9C%EB%84%A4%EB%A6%AD%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95

 

[JAVA] 자바 - 제네릭의 기본 문법

다중 매개변수 기반 제네릭 클래스의 정의하기class DBox { private L left; // 왼쪽 수납 공간 private R right; // 오른쪽 수납 공간 public void set(L o, R r) { left = o; right = r; } @Override public String toString() { return le

seong-jun.tistory.com

 

728x90
반응형
LIST