230526_

hoy_·2023년 5월 26일
0

Today, I Learned

목록 보기
8/36

1. 오늘의 일정

  1. 제네릭 문제 풀기

  2. 람다식의 사용




2. 배운 내용

  1. 문제를 풀며 헷갈릴만한 것이나 꼭 기억해야할 것들을 적곤 하는데, 오늘은 제네릭이다! 형변환과 다형성이 늘 어려워서 고민인데... 까먹지 말고 꼭 기억하자는 의미로 정리해본다.

다음 중 올바르지 않은 문장을 모두 고르시오.

class Box<T extends Fruit> {
T item;

void setItem(T item) {
	this.item = item;
    }

T getItem() {
	return item;
    }

  
============================


1. Box<?> b = new Box();
2. Box<?> b = new Box<>();
3. Box<?> b = new Box<Object>();
4. Box<Object> b = new Box<Fruit>();
5. Box b = new Box<Fruit>();
6. Box<? extends Fruit> b = new Box<Apple>();
7. Box<? extends Object> b = new Box<? extends Fruits>();
  1. Box<?> b = new Box(); // OK
  • Box<?>Box<? extends Object>를 줄여쓴 것이다. 객체 생성에 지네릭 타입을 지정해 주지 않았지만 문제가 되지는 않는다. 그래도, new Box()대신 new Box<>()를 사용하는 것이 좋다.

  1. Box<?> b = new Box<>(); // OK
  • new Box<>();는 타입을 생략한 것으로, 일반적으로는 참조변수의 타입과 같은 타입으로 간주된다. 참조변수의 타입이 <?>, 즉 <? extends Object>이므로 생략된 타입은 Object라고 생각하기 쉬운데 여기서는 지네릭 클래스 Box에 정의된 타입이 <T extends Fruit>와 같이 제한되어 있기 때문에 <Object>가 아니라 <Fruit>이 생략된 것으로 봐야 한다.
Box<?> b = new Box<>();	// OK. Box<?> b = new Box<Fruit>();와 동일
Box<?> b = new Box<Object>();	// 에러
Box<?> b = new Box<Fruit>();	// OK
// Box<?> b = new Box<Object>();와 같이 하면 에러가 발생한다. 
// Object는 Fruit의 자손이 아니기 때문이다.
  1. Box<?> b = new Box<Object>(); // 에러.
  • 2번 설명 참조

  1. Box<Object> b = new Box<Fruit>(); // 에러.
  • 타입 불일치

  1. Box b = new Box<Fruit>(); // OK.
  • 바람직하지 않음. Box<?> b가 더 낫다.

  1. Box<? extends Fruit> b = new Box<Apple>(); // OK.

  2. Box<? extends Object> b = new Box<? extends Fruits>(); // 에러.
  • new연산자는 타입이 명확해야 하므로 와일드 카드와 같이 사용 불가함.



3. 발생한 오류

  1. 해당 없음




4. 앞으로의 나는

  1. 프로그램을 처음부터 설계하려니 막막하기만 하다. 앞으로 시작할 개인 프로젝트에 앞서 기본 문법 개념을 다지고 코드를 구상해봐야겠다.
profile
배우는 사람

0개의 댓글