인프런 커뮤니티 질문&답변

최재영님의 프로필 이미지
최재영

작성한 질문수

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

퀴즈 #10

_Quiz_10 번 문제

해결된 질문

작성

·

276

0

 저는 Customer 클래스를 선언할 때 name, age를 private 으로 선언하고 Getter, Setter를 이용하여 값을 접근할려고 짯습니다. 근데 map() 을 하는 과정에서 아래와 같은 오류가 떠서 setName()을 그냥 String 반환값으로 고쳐서 했더니 에러가 해결이 됐습니다. 근데 왜 이런 오류가 났는지 이해가 안갑니다

 

public class _Quiz_10 {
    public static void main(String[] args) {
        List<Customer> customerList = new ArrayList<>();

        customerList.add(new Customer("챈들러",50));
        customerList.add(new Customer("레이첼", 42));
        customerList.add(new Customer("모니카", 21));
        customerList.add(new Customer("벤자민", 18));
        customerList.add(new Customer("제임스", 5));

        System.out.println("미술관 입장료");
        System.out.println("==================");

        customerList.stream()
                .map(x->x.getAge()>=20 ? x.setName(x.getName() + " 5000원"):x.setName(x.getName()+ " 무료"))
                .forEach(System.out::println);

    }
}

class Customer{
    private String name;
    private int age;

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

답변 2

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?
Getter 와 Setter 를 이용하여 클래스를 작성하신 것은 정말 잘하셨습니다.
다만 스트림에서 우리가 하려는 작업은 사람의 나이에 따른 입장료를 조건에 따라 서로 다르게 출력하는 것이며 Customer 의 name 을 "레이첼 5000원" 과 같이 직접 바꾸는 것은 아니므로 SetName 을 사용하실 필요는 없답니다. 아마 이 과정에서 문제를 겪으신 듯 한데요. 다음과 같이 코드를 작성하시게 되면 Getter 와 Setter 가 적용된 Customer 클래스로 퀴즈를 해결할 수 있습니다.

import java.util.ArrayList;
import java.util.List;

public class _Quia_10 {
    public static void main(String[] args) {
        List<Customer> customerList = new ArrayList<>();
        customerList.add(new Customer("챈들러", 50));
        customerList.add(new Customer("레이첼", 42));
        customerList.add(new Customer("모니카", 21));
        customerList.add(new Customer("벤자민", 18));
        customerList.add(new Customer("제임스", 5));

        System.out.println("미술관 입장료");
        System.out.println("--------------");
        customerList.stream()
        .map(x -> x.getAge() >= 20 ? x.getName() + " 5000원" : x.getName() + " 무료")
        .forEach(System.out::println);
    }
}


class Customer{
    private String name;
    private int age;

    public Customer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

여기서 눈여겨봐야 할 부분은 바로 이 코드인데요.

.map(x -> x.getAge() >= 20 ? x.getName() + " 5000원" : x.getName() + " 무료")

리스트의 각 요소 (x) 에 대해서 getAge() 를 사용하여 나이 정보를 얻어온 다음 이 값이 20 이상인지 ( >= 20) 를 확인합니다.

20 이상이면 getName() 을 이용하여 해당하는 사람의 이름을 얻어온 뒤에 5000원 이라는 문자열을 붙인 값으로, 그렇지 않으면 무료 라는 문자열을 붙인 값으로 map 을 통해 변환시킵니다. 이때 map 은 원본 데이터를 변경하는 것은 아니라는 것에 주의하셔야 해요. 그런 뒤에 마지막으로

.forEach(System.out::println);

를 통해 변환된 결과를 출력하게 되는 것입니다.
이렇게 하면 Getter 를 이용하여 퀴즈를 해결할 수 있게 됩니다 😊

궁금증 해결에 도움되길 바라겠습니다.
감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요. Customer 클래스의 setName() 메서드를 String 타입으로 변경하신 이유에 대해 설명드리겠습니다.

Stream의 map() 메서드는 스트림의 각 요소를 변환하는 데 사용됩니다. 여기서는 Customer 객체의 이름(name)에 추가 정보를 덧붙여 반환하려고 하십니다.

Map 함수에서 사용하는 람다식 x -> x.getAge()>=20 ? x.setName(x.getName() + " 5000원"):x.setName(x.getName()+ " 무료")에서 setName() 메서드의 반환값을 사용하려고 하셨지만, setName() 메서드는 반환값이 void이기 때문에 문제가 발생합니다. 따라서 오류가 발생하게 됩니다.

해결책으로는 setName()이 void를 반환하지 않고 Customer 객체 자체를 반환하도록 수정해야 합니다. 이를 위해서는 setName() 메서드를 String 타입을 반환하는 방식으로 고쳐야 합니다. 그래서 코드를 public Customer setName(String name) 으로 변경하신 것 같습니다.

이렇게 수정하면 map() 함수에서도 setName()을 호출한 결과를 사용할 수 있게 됩니다. 반환된 Customer 객체에 새로운 이름을 가지고 있는지 확인하기 위해 실행 결과를 출력할 수 있게 됩니다.

답변이 도움이 되었기를 바랍니다.

최재영님의 프로필 이미지
최재영

작성한 질문수

질문하기