회고록 블로그
[공부 필기] Java 기본 공부하기 (35) 본문
공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의.
링크 : https://cafe.naver.com/cstudyjava
※ 강의 청강 중 필요한 내용만 필기함
※ 틀린 필기가 있을 수 있음..
1. 제네릭 메소드
- 제네릭 메소드도 제네릭 클래스와 비슷함
- 앞에서 배운 제네릭 클래스 복습 (예시 코드)
public class Box<T> {
T obj;
public void set(T o) {
obj = o;
}
public T get() {
return obj;
}
}
- 제네릭 메소드는 메소드 하나를 제네릭으로 정의하는 것임
- 제네릭 메소드 예시 코드
→ 클래스 전부가 아니라, 메소드 하나만 제네릭으로 하고 싶을 때
public class Stuff {
// 반환값은 Box<T>
public <T> Box<T> get(T o) {
Box<T> b = new Box<>();
b.set(o);
return b;
}
}
→ 어렵게 생각할 것 없이, 아래와 같이 생각하면 됨
* public : 접근수준 지시자
* <T> : [제네릭]임을 표현한 글자
원래 [제네릭 클래스]이면 클래스 이름 옆에 붙어 있어야 하는데,
메소드 하나만을 제네릭으로 표현하고 싶기 때문에
클래스 이름 옆에 붙어 있어야 할 <T>를 떼온 것이라고 생각하면 이해가 편함
* Box<T> : 리턴값
* get(T o) : 메소드명과 매개변수
- 제네릭임을 표현한 글자, "<T>"에 대해서 좀 더 공부
→ 제네릭 클래스 같은 경우, 타입 매개변수 T는 [인스턴스가 생성될 때] 결정됐었음
→ 제네릭 메소드는 [메소드를 호출할 때] T가 결정됨
- 제네릭 메소드를 호출하는 방법은 아래와 같음(코드는 예시)
→ 여기에서 타입 인자는 "Integer"가 됨
Stuff stf = new Stuff();
// 메소드 호출을 위해서 인스턴스 생성 먼저
// 사실 "메소드 호출만을 위해서" 생성한거라, 차라리 static 메소드로 선언하는게 더 나았을듯함
Box<Integer> boxInt = stf.<Integer>get(5);
// T는 Integer 클래스로 설정됨
// 리터럴이 인자로 왔기 때문에 오토박싱 진행
→ 타입 인자는 생략 가능함 (아래 코드 참고)
* 타입 인자를 생략하면, 인자(argument)를 보고 컴파일러가 알아서 판단해줌
Stuff stf = new Stuff(); // 메소드 호출을 위해서 인스턴스 생성 먼저
Box<Integer> boxInt = stf.get(5);
// T는 Integer 클래스로 설정됨
// 리터럴이 인자로 왔기 때문에 오토박싱 진행
→ 보통 타입 인자를 생략해서 많이 사용한다고 함
* 컴파일러가 코드만 보고 유추해서 처리해줄 수 있는 부분은 컴파일러에게 넘김
- 제네릭 메소드 또한 타입 매개변수를 제한할 수 있음
→ 제네릭 메소드의 타입 인자는 Person 인스턴스 혹은 Person 객체를 상속하는 인스턴스가 와야함
→ 제네릭 클래스의 타입 인자를 제한했을 때 생긴 효과는 제네릭 메소드에도 똑같이 유효함
public class Stuff {
public <T extends Person> Box<T> get(T o) {
...
}
}
'2. 프로그래밍 언어 공부 > Java' 카테고리의 다른 글
[공부 필기] Java 기본 공부하기 (37) (0) | 2021.12.22 |
---|---|
[공부 필기] Java 기본 공부하기 (36) (0) | 2021.12.20 |
[공부 필기] Java 기본 공부하기 (34) (0) | 2021.12.17 |
[공부 필기] Java 기본 공부하기 (33) (0) | 2021.12.16 |
[공부 필기] Java 기본 공부하기 (32) (0) | 2021.12.15 |