if (a != 0) then a else b 형태의 if절을 줄일 방법이 있을까요..?

조회수 784회

예를 들면...

if a > 0 then
    return a
else 
    return b

이런 형태의 if절을 어떻게 예쁘게 바꾸는 방법이 있을까요..?

@Override
public int compareTo(Object obj) {
    if (this.make.compareTo(((Car) obj).getMake()) != 0) {
        return (this.make.compareTo(((Car) obj).getMake()));
    } else {
        return (this.model.compareTo(((Car) obj).getModel()));
    }
}

엄청 신경쓰이네요 ㅋㅋ큐ㅠㅠ

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    자바는 잘 모르지만 코드가 너무 남 일 같지 않아서 참견을 좀 하려고 답변글을 씁니다.

    일단 질문하신 것 자체만 놓고 보자면, 현시점에서는 이런 식으로 삼항 연산자로컬 변수 정도로 정리 가능할 거 같습니다.

    @Override
    public int compareTo(Object obj) {
        int make = this.make.compareTo(((Car) obj).getMake());
        return make != 0 ? make : this.model.compareTo(((Car) obj).getModel()));
    }
    

    그런데 사실 이건 정말 문제를 해결한 건 아닙니다. 이 코드의 진짜 문제는 무엇이냐? (Car) obj라는 객체가 멀쩡히 살아있는데 걔가 자기 앞가림을 너무 못하는 나머지 주체적으로 다른 무언가(여기서는 this.make)와의 비교 작업을 수행하지 못하고 신문 배달부에게 지갑을 넘겨주고 있다는 게 문제입니다. 신문 배달부는 또 무슨 얘기냐? 객체지향 프로그래밍 이론에서 매우 유명한 우화인데요, 신문 배달부가 고객에게서 다음달 구독료를 수금하겠다면서 문전에서 고객의 지갑을 요구하는 일은 없다 이거에요. 보통은 신문 배달부는 '구독료 주세요'라고 묻는 것까지만이 일이고, 지금 지갑에 돈이 얼마 있으며 구독료가 얼마이며 등을 따지는 건 신문 구독자 고객이 알아서 해서 줘야 되는 일이라는 겁니다.

    한마디로 객체를 사용하는 다른 대상이 그 객체의 속성을 날것 그대로 갖다쓰는 일이 없도록 구성해야 한다는 이야기입니다. 이 원칙을 가지고 현재 코드를 다시 살펴보면 compareTo()가 신문 배달부에 해당하고 (Car) obj가 고객에 해당하는데요, 그렇다면 예컨대 '이게 지금 getMake()를 갖다쓰면 되는 상황인지'를 판별하는 일부터가 (Car) obj의 임무가 되도록 고치는 편이 좋습니다. compareTo()는 그 판별된 결과만 거의 그대로 받아서 뭔가를 해야 하지, 무작정 인자로 들어온 객체에다 대고 getMake() 메소드부터 호출하고 보면 안된다 이거에요.

    요약하자면 지금 주어진 if ... else ... 조건 처리를 고도화한다고 될 문제가 아닌 맥락이라고 생각됩니다. 사실 이게 뭐 하는 코드인지 잘 몰라서 이 이상의 구체적인 참견은 못하겠군요. 도움이 되면 좋겠네요!

    • 새로운걸 알아가네요.. 감사합니다! Promixium 2021.5.31 10:38

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)