• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

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

23.05.27 23:49 작성 23.05.27 23:50 수정 조회수 254

1

 안녕하세요,

제네릭 클래스(연장 전반전) 5:30 부분에서 궁금한 점이 있어 질문드립니다.

 

CoffeeByUser 클래스의 method로서 ready() 를 정의해주었는데, 이때 출력구문에 들어간 user.name 에 대해 잘 이해가 되지 않아 여쭤봅니다.

 

user는 CoffeeByUser 클래스의 아직 자료형이 정의되지 않은 '변수'인데, 어떻게 User 클래스의 변수인 name과 함께 쓰여서 user.name이 될 수 있는건가요?

만약 user.name이 아니라 단순히 user 혹은 name 으로 변경한다면 출력값이 다른 걸까요?

 

감사합니다.

답변 3

·

답변을 작성해보세요.

0

ssunics님의 프로필

ssunics

2023.06.21

안녕하세요. 저도 똑같이 이부분에 대해 이해가 안되어서 질문을 드릴까했었어요.

상속에 대해 배울 때에는 상속을 받은 자식 클래스들은 각각 객체를 만들어서 부모클래스에 접근하는 것까지 배웠는데 갑자기 자식 클래스에 있는 user라는 변수가 부모클래스에 있는 인스턴스변수에 접근을 하길래 배운 적이 없는 것 같은데 생각이 들어서 저도 이게 어떻게 된건지 궁금했어요. 상속이라는 자체는 이해한 것 같은데 user.name으로 접근하는 것에 대해서는 이해가 확실히 가질 않네요. ㅜ

0

안녕하세요?

아래 주어진 코드에서 타입 매개변수인 T 는 User 클래스를 상속 (extends 부분) 한다고 가정합니다. 클래스 이름 바로 옆에 적혀 있는 부분으로 인해서 말이죠.

public class CoffeeByUser <T extends User> { // 이 부분
    public T user;

    public CoffeeByUser(T user) {
        this.user = user;
    }

    public void ready() {
        System.out.println("커피 준비 완료 : " + user.name);
        user.addPoint();
    }
}

그리고 User 클래스에는 이렇게 name 이라는 인스턴스 변수가 있습니다.

public class User {
    public String name;
    ...
}

그러므로 User 클래스 또는 이를 상속하는 자식 클래스 (예제에서는 VIPUser) 에서는 모두 name 이라는 변수에 접근이 가능하게 되므로 ready() 메소드에서 user.name 을 사용할 수 있게 되는 것입니다.

마치 어느 대학교에서는 학생 식당을 할인된 금액으로 이용하기 위해서 반드시 학생증이 필요하다고 가정하겠습니다. 그러면 매번 식사를 할 때 학생증을 카드 리더기에 인식시켜야 할인이 적용되겠죠. 이때 카드가 가지고 있는 정보 중에 name 이 있는 겁니다. 그러면 "xxx 학생, 할인이 적용되었습니다" 와 같이 안내하면서 할인된 금액으로 식사를 할 수 있겠죠. 그런데 학생증이 아닌 교통카드나 일반 신용카드를 인식시킨다면 name 정보가 없어서 할인이 적용되지 않을 겁니다.

다행히 우리 코드에서는 <T extends User> 를 통해서 반드시 User 클래스 또는 이를 상속한 클래스, 그러니까 앞에서 설명드린 예시에서는 교통카드나 신용카드가 아닌 학생증만 인식된다고 가정하였기 때문에 name 이 사용 가능해진 것이라고 보시면 되겠습니다 😊

이해에 도움되었으면 좋겠습니다.
감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.05.29

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

CoffeeByUser 클래스에서 선언한 변수 user는 User 클래스의 인스턴스를 참조하는 변수입니다. User 클래스에 선언된 name 변수는 User 클래스의 인스턴스 변수입니다. 따라서, user.name은 User 클래스를 참조하는 변수 user가 참조하는 인스턴스의 name 변수를 의미합니다.

만약 user를 출력한다면 User 클래스의 toString() 메소드가 호출되어 출력됩니다. name을 출력한다면 User 클래스의 인스턴스 변수인 name이 출력됩니다. 따라서 user.name 대신 단순히 user나 name을 출력한 경우에는 출력값이 다르게 나올 것입니다.

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

Ambition님의 프로필

Ambition

2023.08.11

안녕하세요 혹시 CoffeeByUser 클래스 중 public T user; 이 부분이 지난 시간 인터페이스(후반전)에서 배운 FactoryCam 클래스의 private Detectable detector; private Reportable reporter; 가 인터페이스 변수라는 것과 비슷한 원리인가요??