회고록 블로그
[공부 필기] Java 기본 공부하기 (37) 본문
공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의.
링크 : https://cafe.naver.com/cstudyjava
※ 강의 청강 중 필요한 내용만 필기함
※ 틀린 필기가 있을 수 있음..
1. 와일드카드 (본격적으로 학습)
- 사실 와일드카드는 제네릭 메소드와 너무 유사하기 때문에 헛갈릴 수 밖에 없음
→ 왜 각각으로 존재하는지 이해하기가 어려움
- 와일드카드와 제네릭 메소드가 하는 일은 별반 다르지 않는데
"굳이 따로 따로" 문법이 존재하는 이유는 둘이 함께 사용했을 때 시너지 효과가 굉장하기 때문임
→ 와일드카드를 제네릭 메소드와 함께 사용해서 굉장한 효과를 내기 위함
→ 여기까지 와일드카드를 학습하기 전, 혼란스러울만한 부분을 미리 예고함..
- 와일드카드의 문법은 아래와 같음 (예시)
→ 매개변수에 있는 다이아몬드 기호 안에 물음표(?)가 있는데 이는 [임의의 값]을 의미함
→ 즉, 다이아몬드 기호 안에 "어떤 값을 넣어도 괜찮다"는 의미
→ 물음표 기호에는 어떤 값이든 올 수 있음
// 메소드명은 임의로 설정함
public void checkValidUserInfo(Box<?> b) {
...
}
- 제네릭 메소드의 문법을 다시 상기해보기
→ 예시
public <T> void checkValidUserInfo(Box<T> b) {
...
}
- 와일드카드와 제네릭 메소드를 해석해보면 알 수 있지만, 둘은 기능적으로 똑같음
→ 와일드카드는 물음표 기호("?")를 통해 임의의 타입을 받아들일 수 있고
→ 제네릭 메소드의 타입 매개변수 "T"는 메소드 호출 시 프로그래머에 의해 임의로 결정되어 인자로 전달할 수 있음
→ 즉, '무엇이든 올 수 있다'는 점에서 둘은 똑같은 기능을 함
- 하지만 와일드카드와 제네릭 메소드가 완전히 같은 것은 아님
→ 코드상의 문법도 다르지만, 동작하는 방식에서도 차이가 있음
- 참고로 기능적으로 같기 때문에 아무 문법이나 쓸 것 같지만, 주로 "와일드카드 기반 메소드 정의"를 더 많이 사용한다고 함
→ 와일드카드를 통해 메소드를 정의하면 더 간결해 보이기 때문
→ 메소드를 정의하는 코드가 길어지고 복잡해지는 것보다는 간결한게 여러모로 좋음
→ 또한 '간결해진다'는 장점 덕분에 여러 문법에서 사용을 권고할 정도라고 함
2. Bounded Wildcards
- 와일드 카드에는 상한 제한된(Upper-Bounded) 와일드카드와 하한 제한된(Lower-Bounded) 와일드카드가 있음
- 제한된 와일드카드를 공부하기 전에 제네릭 메소드를 복습
→ 제네릭 메소드에서는 타입 인자를 제한하는 방법으로 extends 키워드를 사용했었음 (방법이 한가지였음)
→ 와일드카드도 extends 키워드를 통해 제한하는데,
제네릭 메소드와 다른 점이 있다면 "super" 키워드를 통해서도 제한할 수 있다는 점임
(즉, 제한할 수 있는 방법이 두가지인 것)
- 상한 제한된 와일드카드(Upper-Bounded Wildcards)
→ 제네릭 메소드에서 타입 인자를 제한할 때 사용한 "extends" 키워드
→ 와일드카드에서도 동일하게 "extends" 키워드를 사용함
→ 의미도 동일함
→ 아래의 예시 코드를 보자
* 메소드의 인자로는 Box<Person> 인스턴스 혹은
(Person 클래스를 상속하는 자식 클래스 = "Student"를 기반으로 한) Box<Student> 인스턴스가 올 수 있음
// 메소드명은 임의로 설정함
// Person이라는 부모 클래스가 있고, 자식 클래스로는 Student 클래스가 있다고 가정함
public void checkValidUserInfo(Box<? extends Person> b) {
...
}
→ 위와 같은 코드를 [상한 제한된 와일드카드]라고 함
* 인자로 올 수 있는 값은 Person 인스턴스보다 하위에 있는 객체만 올 수 있음
* 쉽게 말하면 UML 다이어그램을 그렸다고 했을 때, 인자로 올 수 있는 객체 중 가장 최상단에 있는 인스턴스는 "Person"임
* [상한]인 이유를 한마디로 쉽게 정리하자면, "위쪽을 제한"했기 때문임
// 작성중
'2. 프로그래밍 언어 공부 > Java' 카테고리의 다른 글
[공부 필기] Java 기본 공부하기 (36) (0) | 2021.12.20 |
---|---|
[공부 필기] Java 기본 공부하기 (35) (0) | 2021.12.18 |
[공부 필기] Java 기본 공부하기 (34) (0) | 2021.12.17 |
[공부 필기] Java 기본 공부하기 (33) (0) | 2021.12.16 |
[공부 필기] Java 기본 공부하기 (32) (0) | 2021.12.15 |