제네릭(Generic) 1편[제네릭 기본]

2022. 10. 12. 20:49Java 프로그램

728x90

이번엔 자바 API를 마무리하고 제네릭에 대해서 알아보겠습니다.

 

 

제네릭이란?

- 제네릭은 타입을 파라미터로 가지는 클래스와 인터페이스를 말합니다.

- 선언시 클래스 또는 인터페이스 이름 뒤에  "<>" 를 붙혀 사용합니다.

- "<>" 사이에는 타입 파라미터의 위치가 되겠습니다.

 그렇다면 제네릭은 왜?? 사용 할까요?

- 컴파일 단계에서 잘못된 타입을 사용하여 초래되는 문제를 해결할 수 있기 때문입니다!

주로 컬렉션, 람다식(함수적 Interface), Stream 등등에서 사용 합니다.

즉, 실행 할 때 타입 에러가 나는 것을 방지할 수 있음이 가장 큰 이점이며 사용하는 이유라고 생각하면 될 것 같습니다.

///////////////제네릭을 사용하기 전///////////////////
List list1 = new ArrayList();
list.add("hello");
String str = (String) list.get(0);
///////////////제네릭을 사용하기 전///////////////////

-----------------------------------------------------------------
///////////////제네릭을 사용한 후///////////////////]
List<String> list2 = new ArrayList();
list.add("hello");
String str2 = list.get(0);
///////////////제네릭을 사용한 후///////////////////
// 제네릭을 사용하면 강제형변환이 필요 없어지는 것을 확인하고 넘어 가는 코드입니다.

연습을 한번 해보겠습니다.

public class Box {
	private Object obj;

	public Object getObj() {
		return obj;
	}

	public void setObj(Object obj) {
		this.obj = obj;
	}
	
	
}

Box 클래스를 따로 선언 한 후 main 메소드에서 객체 생성한 후에 사용해 보겠습니다.

public class Practice {

	public static void main(String[] args) {
		Box box = new Box();	//.....1
		box.setObj("hello");	//.....2
		String str = (String) box.getObj();	//.....3
		System.out.println(str);	//.....4
		

	}

}

연습 클래스인 practice 클래스의 main method 에서 Box 객체 생성 -> 사용 해보겠습니다.

1. Box클래스의 객체 생성을 위함입니다.

2. set 메소드를 사용하여 hello를 object 타입을 사용하여 자동 타입 변환을 통해 저장 하였습니다.

3. get 메소드를 사용하였지만 object 타입을 String 타입으로 강제 형변환을 시켜 return 받았습니다.

4. return 받아 hello가 저장되어 있는 String 타입의 문자열 str를 출력합니다.

------------여기까지 제네릭 타입을 사용하지 않은 상황 입니다------------------------------------

public class Box<T> {
	private T t;

	public T getT() {
		return t;
	}

	public void setT(T t) {
		this.t = t;
	}

	// 제네릭을 사용한 Box 클래스
	
}

제네릭을 사용해 Box 클래스를 작성하였습니다. 똑같이 연습 클래스인 practice의 main 메소드에서 사용해 보겠습니다.

public class Practice {

	public static void main(String[] args) {
		Box<String> box = new Box<String>();	//...1
		box.setT("hello");			//...2
		String str = box.getT();		//...3
		
		Box<Integer> box2 = new Box<Integer>();	//...4
		box2.setT(100);				//...5
		int number = box2.getT();		//...6
		
		System.out.println(str);		//...7
		System.out.println(number);		//...8
		
	}

}

1. box 객체를 생성하여 사용하는데 제네릭을 사용했기 때문에 원하는 데이터 타입을 <> 안에 지정해 주어 원하는 대로 사용했습니다. 즉, box객체는 정해진 타입이 아닌 원하는 타입을 정하여 사용한 String 타입 객체 입니다.

2. String을 Set 메소드를 사용하여 저장했습니다.

3. String 타입인 str에 get 메소드를 사용하여 return 받았습니다.

4. 이번엔 box 클래스를 Integer(정수형)으로 새롭게 객체를 생성하였습니다. 이것이 가능해 질 수 있다는 것이 제네릭의 장점이라고 볼 수 있겠습니다.

5. 이번엔 정수형 타입의 숫자 100 을 set 메소드를 통해 저장했습니다.

6. 정수형 타입 변수 number에 get 메소드를 통하여 return 받았습니다.

7~8. 각각 같은 클래스에서 파생된 다른 타입의 객체를 출력한 것 입니다.

 

제네릭의 전체적인 기본 개념과 이해만 하고 이번편은 끝내겠습니다. 다음편 제네릭 2편에서 이어서 하겠습니다 ㅎㅎㅎ

반응형