Java

제네릭

chaebideas77 2026. 6. 1. 13:59

<기초>

클래스에서 필드에 형식 설정을 하지 않은 경우,

Object로 데이터 타입 형식을 설정하는데

이렇게 하면 형변환을 코드에 매번 설정해줘야하는 불편함이 발생함.

@ToString  // @ 사용은 롬복 라이브러리를 다운받아서 사용함.
@Getter@Setter
@NoArgsConstructor
@AllArgsConstructor
class OldBox{
	// 상위클래스이기 때문에 아무거나 넣어줄 수 있음.
	Object content;
}

@ToString
@Getter@Setter
@NoArgsConstructor
@AllArgsConstructor
class Person{
	String name;
	int age;
}

rivate static void f1() {
		// 형변환을 계속 해줘야되는 불편함
		OldBox box = new OldBox();
		box.setContent(100);
		int data = (Integer)box.getContent();
		
		box.setContent("신한");
		Object obj = box.getContent();
		if(obj instanceof String) {
			String s = (String)box.getContent();
		}
		String s = (String)box.getContent();
		
		box.setContent(new Person("홍길동",20));
		Person p = (Person)box.getContent();
		
	}

 

제네릭을 사용하여 해결

데이터 타입 설정이 자유로움.

@ToString
@Getter@Setter
@NoArgsConstructor
@AllArgsConstructor
class Person{
	String name;
	int age;
}


@ToString
@Getter@Setter
@NoArgsConstructor
@AllArgsConstructor
// 타입이 안정적, 형변환 불필요.
class NewBox<T>{
	// 사용할 때 데이터 타입 결정.
	T content;
}

private static void f2() {
		// 제네릭을 이용해서 타입을 제한함.
		NewBox<String> box = new NewBox<String>();
		box.setContent("신한");
		String data = box.getContent();
		System.out.println(data);
		
		NewBox<Integer> box2 = new NewBox<>();
		box2.setContent(10);
		int data2 = box2.getContent();
		System.out.println(data2);
		
		NewBox<Person> box3 = new NewBox<>();
		box3.setContent(new Person("홍길동",10));
		Person data3 = box3.getContent();
		System.out.println(data3);
	}

 

<기본>

public interface Rentable<P> {
	public abstract P rent();
}

 

인터페이스에 P 타입 추상클래스를 선언해준다.

 

public class HomeAgent implements Rentable<Home>{

	@Override
	public Home rent() {
		// TODO Auto-generated method stub
		return new Home();
	}
}

 

rent 함수를 재정의 해주면서 리턴 타입을 Home 클래스 객체를 반환한다.

public class CarAgent implements Rentable<Car>{

	@Override
	public Car rent() {
		// TODO Auto-generated method stub
		return new Car();
	}
}

rent 함수를 재정의 해주면서 리턴 타입을 Car 클래스 객체를 반환한다.

 

class TV{
	public String toString() {
		return "TV입니다.";
	}
}

class Car{
	
	public void run() {
		System.out.println("자동차가 달립니다.");
	}
	
	@Override
	public String toString() {
		return "Car입니다.";
	}
}

class Home{
	public void turnOnLight() {
		System.out.println("전등을 켭니다.");
	}
}

public class GenericExample2 {

	public static void main(String[] args) {
		f2();

	}

	private static void f2() {
		HomeAgent homeAgent = new HomeAgent();
		Home home = homeAgent.rent();
		home.turnOnLight();
		
		CarAgent carAgent = new CarAgent();
		Car car = carAgent.rent();
		car.run();
	}

 

인터페이스 하나로 다른 클래스를 각각 출력할 수 있는 걸 확인함.

'Java' 카테고리의 다른 글

자바 jdbc로 미니 프로젝트  (0) 2026.06.16
스레드  (0) 2026.06.01
이것이 자바다 연습문제 Chap12  (0) 2026.06.01
참조형 변수  (1) 2026.05.19
자바 - 변수  (0) 2026.05.14