[자바(Java)] Generic (미지정 자료형)

방용환·2023년 4월 20일
0
post-thumbnail

1. Object 클래스

1. Object 클래스로 필드 선언

  • 표현대상을 추상화하여 클래스로 선언할 경우 필드의 자료형이 추상적인 경우 필드의 자료형에 따라 여러개의 클래스를 선언하여 사용하는 경우 발생
    => 필드의 자료형을 Object 클래스로 선언하면 필드에는 모든 클래스로 생성된 객체 저장
  • Object 타입의 필드에 모든 클래스의 객체를 전달하여 저장 가능한 장점이 있음

2. Object 클래스의 단점

  • Object 타입의 필드에 저장된 객체를 반환받아 사용하기 위해서는 반드시 명시적 형변환을 해야함

NonGeneric.java

NonGeneric.java

public class NonGeneric {
	private Object field;

	public NonGeneric() {
		// TODO Auto-generated constructor stub
	}

	public NonGeneric(Object field) {
		super();
		this.field = field;
	}

	public Object getField() {
		return field;
	}

	public void setField(Object field) {
		this.field = field;
	}

}

NonGenericApp.java

NonGenericApp.java

public class NonGenericApp {
	public static void main(String[] args) {
		
		NonGeneric nonGeneric1 = new NonGeneric();
		
		nonGeneric1.setField(100);
		
		Integer returnObject1 = (Integer)nonGeneric1.getField();
		
		System.out.println(returnObject1);
		System.out.println("=====================");
		
		NonGeneric nonGeneric2 = new NonGeneric();
		
		nonGeneric2.setField(12.34);
		
		if (nonGeneric2.getField() instanceof Double) {
			Double returnObject2 = (Double)nonGeneric2.getField();
			System.out.println(returnObject2);
		}
		System.out.println("=====================");
		
		NonGeneric nonGeneric3 = new NonGeneric();
		
		nonGeneric3.setField("홍길동");
		
		String returnObject3 = (String)nonGeneric3.getField();
		
		System.out.println(returnObject3);
		System.out.println("=====================");
	}
}
// 100
// =====================
// 12.34
// =====================
// 홍길동
// =====================

2. Generic (미지정 자료형)

1. Generic

  • Generic : 필드의 자료형(참조형)이 추상적인 경우 자료형 대신 사용될 식별자
  • Java 자료형 (참조형) 선언시 <> 기호에 제네릭 타입 (식별자) 선언
public class 클래스명<제네릭, 제네릭, ...> {

}
  • <> 안에 제네릭 타입은 ','기호를 사용하여 나열 선언 가능
  • 제네릭 타입의 식별자는 대문자로 작성하는 것을 권장

2. Generic Class 사용

Generic.java

Generic.java

public class Generic<T> {
	private T field;

	public Generic() {
		// TODO Auto-generated constructor stub
	}

	public Generic(T field) {
		super();
		this.field = field;
	}

	public T getField() {
		return field;
	}

	public void setField(T field) {
		this.field = field;
	}

}

GenericApp.java

GenericApp.java

public class GenericApp {
	public static void main(String[] args) {

		Generic<Integer> generic1 = new Generic<Integer>();
	
		generic1.setField(100);
		
		Integer returnObject1 = generic1.getField();
		
		System.out.println(returnObject1);
		System.out.println("=====================");
		
		Generic<Double> generic2 = new Generic<Double>();
		
		generic2.setField(12.34);
		
		Double returnObject2 = generic2.getField();
		
		System.out.println(returnObject2);
		System.out.println("=====================");
		
		Generic<String> generic3 = new Generic<String>();
		
		generic3.setField("홍길동");
		
		String returnObject3 = generic3.getField();
		
		System.out.println(returnObject3);
		System.out.println("=====================");
	}
}

// 100
// =====================
// 12.34
// =====================
// 홍길동
// =====================
  • 제네릭 클래스를 사용할 경우 제네릭 타입 대신 사용될 Java 자료형 전달하여 사용
  • 전달받은 Java 자료형을 제네릭 타입 대신 사용하여 필드 또는 메소드 완성
  • 제네릭 타입 대신 사용될 Java 자료형과 다른 자료형의 객체를 전달한 경우 에러 발생

3. 장점

  • 제네릭 타입 대신 설정된 Java 자료형의 객체만 필드에 저장 가능
    => 제한적인 객체 저장
  • 필드값을 반환받아 명시적 객체 형변환 없이 사용 가능
    => 필드값 가져와서 사용하기 편함

4. 제네릭 전달 제한

  • 제네릭으로 전달받을 수 있는 Java 자료형을 상속 기능을 사용하여 제한 가능
public class 클래스명<제네릭 extends 부모클래스> {

}
  • 제네릭은 반드시 부모클래스를 상속받은 Java 자료형만 전달받아 사용 가능

0개의 댓글