개발공부

JAVA쪼렙탈출기: generic

Yuniverse. 2023. 6. 16. 16:36
Python과 SQL만 써본 주니어 분석가. '개발공부를 해보고 싶다', '개발도 공부하긴 해야하는데...'는 말만 한지 어연 1년이 넘어가는 중, 이대로는 안되겠다 싶어 냅다 JAVA 수업 수강에 카드를 긁었다. 쪼렙 중의 쪼렙이 JAVA를 배워나가는 여정을 "JAVA 쪼렙 탈출기"라는 시리즈로 남길 예정이다.

 

generic

  • 모든 종류의 데이터 타입을 다룰 수 있도록 일반화된 타입 매개변수로 class를 정의하는 방법
  • 선언시에 클래스 이름 뒤에 '<>' 기호를 붙여서 괄호 안에 타입 파라미터 이름을 정의한다.
  • ex:
    class 클래스명<타입 파라미터> {

           }
  • 타입 파라미터는 일반적으로 알파벳 대문자 하나로 작성한다.
public class ExGeneric<T> {
	
	private T data; // 멤버필드에 정의한다. 특정 데이터타입으로 정의내리지 않는 것.
	
	public T getData() { return data; }
	
	public void setData(T data) {
		this.data = data;
	}

}

 

예시 코드)

public class Basic {
	
	private Object obj;
	
	public Object getObj() { return obj; }
	
	public void setObj(Object obj) {
		this.obj = obj;
	}
	
	

}
public class Fruits {
	
	private String name;	// 과일 이름
	private int ea;			// 과일 수량
	
	public Fruits(String name, int ea) {
		this.name = name;
		this.ea = ea;
	}
	
	public String toString() {
		return "품명 : " + name + " - 수량 : " + ea;
	}

}
public class GenericTest {
	
	public static void main(String[] args) {
		
		Basic basicA = new Basic();
		basicA.setObj(new String("basicA")); // Basic의 멤버필드는 object이기 때문에 모든 타입을 다 넘길 수 있다.
		String stnA = (String)basicA.getObj(); // 다운캐스팅해서 원하는 데이터 타입으로 맞춤.
		System.out.println(stnA);
		System.out.println();
		
		Basic basicB = new Basic();
		basicB.setObj(new Fruits("사과",20));
		Fruits fra = (Fruits)basicB.getObj();
		System.out.println(fra);
		System.out.println();
		
		ExGeneric<String> egA = new ExGeneric<String>(); // String으로 쓸 것이라고 정의. new ExGeneric<>();라고 써도 상관없다.
		egA.setData("test"); 
		String stnB = egA.getData(); // generic(<>)을 활용함으로써 다운캐스팅 작업이 필요없어진다.
		System.out.println(stnB);
		System.out.println();
		
		ExGeneric<Fruits> egB = new ExGeneric<>();
		egB.setData(new Fruits("바나나", 10));
		Fruits frB = egB.getData();
		System.out.println(frB);
		System.out.println();
		
		ExGeneric<Integer> egC = new ExGeneric<>();
		egC.setData(1234); // auto boxing되기 때문에 egC.setData(new Integer(100))으로 쓰지않아도 된다.
		int ia = egC.getData(); // 마찬가지로auto unboxing되기 때문에 바로 써도 ㅇㅋ
		
		ExGeneric<String> egD = new ExGeneric<String>();
		egD.setData("1000");
		int ib = Integer.parseInt(egD.getData());
		
		
	}

}

[결과값]

basicA

품명 : 사과 - 수량 : 20

test

품명 : 바나나 - 수량 : 10