Post

제네릭

제네릭

제네릭(generic)이란 클래스나 메소드에서 사용할 내부 데이터 타입을 외부에서 지정하는 방법이다 js와 타입스크립트 같은 느낌인듯

제네릭 사용 이유

1
2
3
4
5
6
7
public static void main(String[] args) {
    List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    int sum = 0;
    for (Object number : numbers) {
        sum += (int) number; //int로 강제 형변환
    }
} 

제네릭 사용

1
2
3
4
5
6
7
public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
    int sum = 0;
    for (Integer number : numbers) {
        sum += number;
    }
}

이미 integer형이기 때문에 형변환이 필요없다

또한 컴파일시 타입을 체크하기 때문에 의도치 않은 타입이 들어오는 것을 막을 수 있다

 

제네릭 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class man <T> {
	private T lastName;
	private T firstName;
	
	public T getFirstName() {
		return firstName;
	}
	public void setFirstName(T firstName) {
		this.firstName = firstName;
	}
	public T getLastName() {
		return lastName;
	}
	public void setLastName(T lastName) {
		this.lastName = lastName;
	}
}

위 변수 타입을 모두 T로 선언 해주었다 T는 객체를 생성할 때 해당 타입으로 변경된다

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
		
		man<String> man1 = new man<>();
		//새로운 객체 생성시 원하는 타입을 부여하면 된다.
		
		man1.setFirstName("minjeong");
		man1.setLastname("kim");
		//선언시 스트링 타입으로 선언하여 스트링 데이터를 입력하였다.
		
		System.out.println(man1.getFirstName()); //minjeong
		System.out.println(man1.getLastname()); //kim
		
	}

 

멀티 제네릭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class man <2,T2> {
	private T lastName;
	private T firstName;
	private T2 age;
	
	public T getFirstName() {
		return firstName;
	}
	public void setFirstName(T firstName) {
		this.firstName = firstName;
	}
	public T getLastName() {
		return lastName;
	}
	public void setLastName(T lastName) {
		this.lastName = lastName;
	}
	public T2 getAge() {
		return age;
	}
	public void setAge(T2 age) {
		this.age = age;
	}
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) {
		
		man<String,Integer> man1 = new man<>();
		
		man1.setFirstName("minjeong");
		man1.setLastname("kim");
  	man1.setAge(26);
	
		
		System.out.println(man1.getFirstName()); //minjeong
		System.out.println(man1.getLastname()); //kim
		System.out.println(man1.getAge()); //26
	}

 

제네릭 메서드

메서드의 리턴타입이 앞에 선언한 제네릭 타입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Car<T> {
    private final T name;

    private Car(T name) {
        this.name = name;
    }

    public static <M> Car<M> from(M name) {
        return new Car<>(name);
    }

    public <M> void printEqualsCar(Car<M> car) {
        System.out.println(this.equals(car));
    }
}

여기서는 printEqualsCar가 제네릭 메서드이다

This post is licensed under CC BY 4.0 by the author.