<기초>
클래스에서 필드에 형식 설정을 하지 않은 경우,
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 |