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

권정익님의 프로필 이미지
권정익

작성한 질문수

김영한의 실전 자바 - 중급 1편

섹션 5. 문자열과 타입 안전성 1

해결된 질문

작성

·

160

0

마지막 return price * (discountPercent / 100); 이 무조건 0이 반환되는 이유가 뭔가요?

예를들어 BASIC에 들어오면 discountPercent 에는 10의 값이 들어가고

마지막에 price ( 10 / 100); 이 되는 거 아닌가요?ㅠㅠ

public int discount (String grade, int price) {
    int discountPercent = 0;

    if (grade.equals("BASIC")) {
        discountPercent = 10;
    } else if (grade.equals("GOLD")) {
        discountPercent = 20;
    } else if (grade.equals("DIAMOND")) {
        discountPercent = 30;
    } else {
        System.out.println(grade + "할인X");
    }
    return price * (discountPercent / 100);
}

답변 1

0

안녕하세요. 권정익님, 공식 서포터즈 y2gcoder입니다.

마지막 return price * (discountPercent / 100); 이 무조건 0이 반환되는 이유가 뭔가요?

예를들어 BASIC에 들어오면 discountPercent 에는 10의 값이 들어가고

마지막에 price ( 10 / 100); 이 되는 거 아닌가요?ㅠㅠ

=> 저도 말씀하신 내용이 맞다고 생각하는데, 위와 같이 생각하신 이유나 원인에 대해서 좀 더 설명해주시면 감사하겠습니다!

감사합니다.

권정익님의 프로필 이미지
권정익
질문자

이것처럼 코드를 짰는데 노란불이 들어와서 확인해보니 '리턴값이 항상 0'이라고 표시되어있었습니다!

그리고 메인에서 실행시키면 그 값이 항상 0이 나왔습니다!!

return price * (discountPercent / 100); 에서

예를들어 첫번째 if에서 ture가 만족해서 discountPercent = 10이 들어가게 되니,

price = 10000; 이라고 한다면,

return price (discountPercent / 100)

-> return 10000 * (10 / 100);

-> return 1000; 이

나올 거라고 생각했는데 생각지 못한 0이 나왔습니다.ㅠㅠ

 

실제 코드를 봐야 알 것 같습니다!
혹시 메인 코드를 포함한 관련 코드들을 보여주실 수 있으십니까?
혹 메인 코드에서 값이 위에 If 문 조건에 해당하는 값이 아니면(!grade.contains(BASIC, GOLD, DIAMIOND))

당연히 else에만 조건이 걸릴 테니 0이 나오는 것이 맞습니다.
아니면
실제 동작하는 전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx


주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요


추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명


링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

권정익님의 프로필 이미지
권정익
질문자

보내주신 코드 살펴보았습니다! 두 가지 정도를 고쳐주셔야 할 것 같습니다!

package enumeration.ex2;

public class DiscountService {

    public int discount(ClassGrade classGrade, int price) {
        int discountPercent = 0;

        if (classGrade == ClassGrade.BASIC) {   // 1. classGrade -> ClassGrade
            discountPercent = 10;
        } else if (classGrade == ClassGrade.GOLD) { // 1. classGrade -> ClassGrade
            discountPercent = 20;
        } else if (classGrade == ClassGrade.DIAMOND) {  // 1. classGrade -> ClassGrade
            discountPercent = 30;
        } else {
            System.out.println("할인x");
        }

        return price * discountPercent / 100; //2. 괄호 제거! 괄호 연산 순서 + 반환타입 int 형!
    }

}

일단 첫번째는 사소하다고 할 수 있지만, classGrade 에서 BASIC, GOLD, DIAMOND를 가져오는 것이 아니라 클래스에서 가져오는 것으로 변경해주십쇼! 아무래도 상수를 쓰는 만큼 후자의 방법이 자연스럽다고 생각합니다

두번째는 괄호를 지워주시면 될 것 같습니다! 사실 저도 이게 왜 연산 결과가 다른지 잠깐 고민을 했습니다 ...근데 저희 계산 반환 타입이 int형인 것이 기억났습니다! 만약

return price * (discountPercent / 100);

에서 discountPercent가 100 이하라면... 모든 값들은

return price * 0;

이 됩니다!

자바 입문 섹션 6. 스코프, 형변환 > 계산과 형변환 에서 저희가 학습했던 내용을 떠올려 보시면 이해가 되실 겁니다!

 

권정익님의 프로필 이미지
권정익

작성한 질문수

질문하기