회고록 블로그

[공부 필기] Java 기본 공부하기 (35) 본문

2. 프로그래밍 언어 공부/Java

[공부 필기] Java 기본 공부하기 (35)

김간장 2021. 12. 18. 22:55

공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의.

링크 : https://cafe.naver.com/cstudyjava

 

윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페

윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^

cafe.naver.com

 

※ 강의 청강 중 필요한 내용만 필기함

※ 틀린 필기가 있을 수 있음..

 


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) {
    	...
	}
}

 

 

Comments