회고록 블로그

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

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

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

김간장 2021. 12. 22. 22:58

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

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

 

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

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

cafe.naver.com

 

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

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

 


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"임

         * [상한]인 이유를 한마디로 쉽게 정리하자면, "위쪽을 제한"했기 때문임

 

// 작성중

 

Comments