자바스크립트 함수 질문입니다.
조회수 434회
< 코딩 테스트 > 문제 중 질문입니다.
- 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 답변
-
현재 코드에서
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 + '!!!'); }
댓글 입력