자바스크립트 함수 질문입니다.

조회수 432회

< 코딩 테스트 > 문제 중 질문입니다.

  • Mark 의 BMI가 John 의 BMI 보다 크면 true를 반환하는 변수를 만드는 게 문제입니다.
  • Mark 와 John 의 몸무게와 키가 주어져서 코드를 짜봤습니다.
  • BMI = mass / height * height
const Mark = {

    "mass": 78,
    "height": 1.69,

    BMI: function () {
        console.log(this.mass / (this.height * this.height))
    }
}

const John = {

    "mass": 95,
    "height": 1.688,

    BMI: function () {
        console.log(this.mass / (this.height * this.height))
    }
}

const markBMI = Mark.BMI();

const johnBMI = John.BMI();

const markHigherBMI = function (i, j) {
    if (i > j) {
        return true
    } 

console.log(markHigherBMI(markBMI, johnBMI)) 

출력 결과 : undefined 로 나옵니다.

코드 피드백 부탁드립니다.;

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    현재 코드에서 console.log(johnBMI)를 찍어보시면 아마 undefined가 나올 겁니다. 왜냐하면 John.BMI()가 무엇을 return하는지 '결정되지 않았기("undefined")' 때문입니다. 왜냐하면 그 메소드에 return문이 없거든요. 그러니 markHigherBMI(markBMI, johnBMI)는 오류를 일으키게 되는데 그 오류란 결국 "내가 왜 결정되지도 않은 무엇인가를 가지고 작업을 해야 하나" 하는 항의인 것입니다.

    일단 원하시는 결과만 얻어보자면, 정의하신 함수들이 정확히 뭔가를 return하도록 고친 다음 다시 실행하시면 될 겁니다.

    const John = {
        BMI: function () {
            let computed = this.mass / (this.height * this.height);
            console.log(computed);
            return computed;
        }
    };
    // Mark 도 같은 느낌으로 손봐주세요.
    
    const markHigherBMI = function (i, j) {
        return i > j; // 이렇게 함으로써 이 함수는 무조건 뭔가 boolean 을 반환하게 됩니다.
    }; 
    

    그런데 기왕 객체 개념을 도입할 거라면 그 이점을 좀 살려봅시다. 아닌막말로 지금 John과 Mark 단둘이 있으니까 망정이지 예컨대 한 학년 100여 명의 학생들 BMI를 다 정의하려면, BMI: function () ...을 일일이 다 복붙해서 정의하셔야 하거든요.

    그런 걸 하지 말고, 다음과 같이 좀더 체계적으로("programmatically") 원하는 것을 해봅시다.

    // Mark도 John도 BMI를 신경쓰고 사는 '사람'입니다.
    // 그렇다면, 상위 존재인 '사람'을 정의합시다.
    const Human = function (name, weight, height) {
    
        // 초기에 입력받는 weight, height 는 개인정보니까 공개적으로 반환하지 맙시다.
        // name 과 BMI 관련 메소드 정도만 return 해도 충분하겠지요.
        return {
            name: name,
            getBMI: function () {
                return weight / (height ** 2)
            },
            hasHigherBMI: function (anotherHuman) {
                return anotherHuman.getBMI() < this.getBMI();
            }
        };
    };
    
    // 이제 사람의 정의로부터 Mark와 John의 정의를 파생해 냅시다.
    let A = new Human('Mark', 78, 1.69);
    let B = new Human('John', 95, 1.688);
    
    // 이제 우리는 Mark와 John에 대해서 알아야 할 만큼만 알 수 있게 됩니다.
    console.log(A.getBMI()); // 나옴
    console.log(A.weight); // 안나옴, undefined 찍힘
    
    // 그리고 이제 하고 싶은 일을 할 수 있죠.
    // 아래 코드가 다음과 같은 이점이 있는지 생각해 봅시다.
    // 1. 재사용 가능한가? (아무 Human이나 넣어도 작동하는가?)
    // 2. 가독성이 있는가? (코드를 읽어봄으로써 이 코드의 작동 절차, 원리 등을 알 수 있는가?)
    if (B.hasHigherBMI(A)) {
        console.log(B.name + ' has worse BMI than ' + A.name + '!!!');
    }
    
    • 제가 어느 부분에서 놓쳤는지 잘 알게 됐습니다 ! 학원 강사분 보다 더 자세하게 설명해주셔서 정말 감사합니다 ! yubin cho 2021.4.6 02:49

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

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

(ಠ_ಠ)
(ಠ‿ಠ)