inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

나도코딩의 자바 기본편 - 풀코스 (20시간)

제네릭 클래스 (연장 전반전)

제네릭스 클래스 질문

270

조민지

작성한 질문수 4

0

 제네릭스 클래스 (연장 전반전)

강의 5:51 부분과 관련해서 궁금한 점이 있어 문의를 드립니다.

CoffeeByUser<User> c7 = new CoffeeByUser<>(new User("강호동"));

1번 질문.

위의 줄에서 CoffeeByUser<>에 다이아몬드 안에 User를 넣은 이유가

CoffeeByUser 클래스 User를 상속받고 있기 때문인 걸까요? 아니면 User class 형태로 값을 받기 때문인 걸까요? 왜 <> 안에 User가 들어가는지 잘 모르겠습니다.

2번 질문.

CoffeeByUser<User> c7 = new CoffeeByUser<>(new User("강호동"));

에서 new CoffeeByUser<> 뒤에 (new User("강호동");이라고 작성되어 있습니다.

CoffeeByUser<User> c7 = new Coffee<>("강호동");

이 아니라 <> 뒤에 (new User("강호동");을 붙여준 이유가 CoffeeByUser가 User를 상속받고 있기 때문에 붙이는 걸까요?

 

java 객체지향

답변 2

0

나도코딩

안녕하세요?

먼저 CoffeeByUser 를 다음과 같이 정의하였습니다.

public class CoffeeByUser <T extends User> { ... }

이는 우리가 제네릭 타입 매개변수 T 가 User 타입이거나 User 를 상속하는 자식 클래스(강의에서는 VIPUser)여야 한다는 의미로 사용한 것이죠. 그래서 다음 코드와 같이 CoffeeByUser 클래스로부터 객체를 생성할 때는 어떤 타입(T 부분)으로 할지를 명시해줘야 합니다. 즉 User 또는 User 의 자식 클래스가 들어갈 수 있는 것이죠.

CoffeeByUser<User> c7 = new CoffeeByUser<>(new User("강호동"));

 

두 번째 질문도 같은 코드로 이어지네요.

CoffeeByUser<User> c7 = new CoffeeByUser<>(new User("강호동"));

위 코드를 분리하면 다음과 같습니다.

User user = new User("강호동");
CoffeeByUser<User> c7 = new CoffeeByUser<>(user);

즉 User 클래스로부터 만든 user 라는 객체를 CoffeeByUser 의 생성자에 인자로 전달하는 것인데요.

CoffeeByUser 생성자는 어떻게 생겼는지 한 번 볼까요? ( ) 괄호 속을 잘 확인해주세요.

public class CoffeeByUser <T extends User>{
    public T user;
    public CoffeeByUser(T user) { // 생성자
        this.user = user;
    }
    ...
}

1번 질문에서 제네릭 타입 매개변수 T 는 User 또는 User 의 자식 클래스가 들어갈 수 있다고 설명했기 때문에 생성자에 작성된 T 위치에도 User 클래스로부터 만든 user 객체를 넣어주는 것입니다.

그래서 말씀하신 것처럼

new User("강호동");

가 아닌

"강호동"

이라고만 하게 되면 User 객체가 아닌 String 객체이기 때문에 CoffeeByUser 가 기대하는 형태의 타입이 아니어서 에러가 발생하게 됩니다 😊

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

1번 질문에 대해서는 <> 안에 User가 들어가는 이유는 CoffeeByUser 클래스가 제네릭스 클래스이기 때문입니다. 제네릭스 클래스는 타입 파라미터를 받아서 클래스를 정의합니다. 따라서, <> 안에는 해당 제네릭스 클래스에서 사용할 타입을 지정해줘야 합니다. 이 경우, CoffeeByUser 클래스에서는 User 타입을 사용하도록 지정한 것입니다.

2번 질문에 대해서는 CoffeeByUser 클래스가 User를 상속받는 것이 아니라, User 타입의 인스턴스를 받아들이는 클래스입니다. 따라서 new CoffeeByUser<>(new User(“강호동”)) 코드에서는 인스턴스를 생성할 때, User 타입의 인스턴스를 생성해 주고, 이를 CoffeeByUser 클래스에 전달하도록 하고 있습니다. 이렇게 하면 CoffeeByUser 클래스 내부에서는 User 타입의 인스턴스를 사용할 수 있게 됩니다.

도움이 되셨길 바랍니다. 감사합니다.

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

1

146

2

static이 뭐였는지 기억이 안나요 ㅜㅜ

0

119

2

Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의

0

72

1

사고력 키우는 법이 어떤게 있나요?

0

94

2

getter setter

0

103

2

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

0

80

1

안녕하세요 갑자기 프로그램 에러가 떠서 안되네요

0

76

2

변수 이름짓는법

0

114

2

intelli J 실행오류

0

115

2

혹시 이건 수학적 사고가 부족한 걸까요?

0

152

2

영상이 재생이 안됩니다.

0

167

3

이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.

0

117

2

응용이 어렵습니다.

0

206

2

IntelliJ가 보이지 않습니다.

0

187

3

JDK 버전 문의

0

130

2

BlackBox 파일 내에서 메소드 정의

0

136

1

동기화

0

122

2

Iterator 문의

0

105

1

코드 순서 문의

0

143

1

클래스 메소드

0

150

2

Quiz_05 관련 질문드립니다 !

0

118

2

다운로드가 안됩니다

0

165

2

다형성

0

120

2

HashMap

0

80

2