안녕하세요.
이 공간은 제가 프론트엔드를 처음 접하며 배운 것을 주저리주저리 쓰는 공간입니다.
이번 내용은 javascript 11편입니다.
프로그래밍 언어에는 예외가 발생하면 정보를 확인할 수 있는데, 그것을 예외 객체라 합니다.
try catcha 구문을 사용할 때 catch 괄호 안에 입력하는 식별자가 바로 예외 객체입니다.
통상적으로 e, 혹은 exception이라는 식별자를 써요.
try {
// ~~~~~~
} catch (exception) { // 저 exception이 예외 객체입니다.
// ~~~~~~
}
그럼 예시를 보겠습니다.
try {
const array = new Array(99999999999999)
} catch (e) {
console.log(e)
console.log()
console.log(`예외 이름: ${e.name}`)
console.log(`예외 메세지: ${e.message}`)
}
자바스크립트의 배열 크기는 한정되어 있어요.
그래서 배열을 엄청나게 크게 선언하면 오류가 발생한다고 합니다.
이를 예외처리하고 오류를 콘솔에 출력해볼거에요.

상황에 따라서 예외를 강제로 발생시켜야 하는 경우도 있습니다.
이 때 throw 키워도를 사용합니다.
// 단순하게 예외를 발생시킵니다.
throw 문자열
// 좀 더 자세하게 예외를 발생(??)시킵니다.
throw new Error(문자열)
사실 이러한 예외를 왜 강제로 발생시켜야 하는지 이해가 잘 안되는데요.
예시를 보면서 알아보겠습니다.
function divide(a, b) {
if (b === 0) {
throw '0외에 다른 숫자를 입력해주세요!'
}
return a / b
}
console.log(divide(10, 5))
console.log(divide(10, 2))
console.log(divide(10, 0))

숫자를 0으로 나누려 할 때 오류를 발생시킵니다.
이처럼 예외를 강제로 발생시키는 이유는 내가 만든 함수를 다른 사람이 사용할 때 주의를 주면서 애초에 의도한 목적대로 처리할 수 있도록 도와줍니다.
그렇다면 이러한 예시를 한 번 더 볼까요?
function functionTest(object) {
console.log(object.a + object.b)
}
test({})
위 코드에서는 object.a와 object.b 둘 다 undefined가 됩니다.
결국 undefined + undefined가 되는데요.
자바스크립트에서는 숫자가 아닌 값을 명시하는 NaN이 출력되죠.
즉, 이처럼 오류없이 정상적으로 실행되는데 결과는 우리가 원하는 결과가 아닌 셈입니다.
이럴때 예외를 강제로 발생시켜서, '이 코드는 잘못 사용하고 있다.'라고 인지시켜 줄 수 있는거죠.
function functionTest(object) {
if (object.a !== undefined && object.b !== undefinded) {
console.log(object.a + object.b)
} else {
throw new Error('a와 b 속성을 지정해주세요.')
}
}
functionTest({})
if문을 통해 object.a와 object.b 둘 다 undefined가 아닐 경우에만 더해주는 값을 콘솔에 출력해주고, 그렇지 않을 땐 에러메세지를 출력해줍니다.

객체 지향 패러다임은 클래스라는 문법으로 객체를 효율적이면서 안전하게 만들어 좀 더 쉽게 프로그래밍에 적용할 수 있도록 해줍니다.
객체는 수많은 속성을 가지고 있고, 모두 데이터가 될 수 있습니다.
그 중 프로그램에 필요한 요소만 사용해서 객체를 표현하는 것을 추상화라고 부릅니다.
학생들의 성적관리 프로그램을 만든다고 생각해보겠습니다.
그러면 아마도 아래와 같은 순서로 진행되지 않을까 싶어요.
1. 학생이라는 객체가 다수 필요합니다.
2. 여러 학생들(객체들)로부터 프로그램에 입력할 필요한 정보가 뭔지 확인합니다.
3. 확인한 공통된 정보, 사항들을 추출(=추상화)합니다.
4. 추출한 요소(=추상화한 요소)를 배열을 이용해 관리합니다.
예시를 볼게요.
const students = []
students.push({이름: 'Alpha', 국어: 88, 수학: 90, 영어: 98, 과학: 60})
students.push({이름: 'Bravo', 국어: 91, 수학: 86, 영어: 30, 과학: 53})
students.push({이름: 'Charlie', 국어: 24, 수학: 76, 영어: 52, 과학: 91})
students.push({이름: 'Delta', 국어: 69, 수학: 20, 영어: 43, 과학: 73})
console.log(JSON.stringify(students, null, 2))
JSON.stringify는 해당 객체(예시에선 (students, null, 2)가 되겠네요.)를 JSON문자열로 반환시키는 메소드입니다.
결과는 어떻게 나올까요?

여기에서 학생들의 성적 평균을 구하는 기능을 추가해보겠습니다.
const students = []
students.push({이름: 'Alpha', 국어: 88, 수학: 90, 영어: 98, 과학: 60})
students.push({이름: 'Bravo', 국어: 91, 수학: 86, 영어: 30, 과학: 53})
students.push({이름: 'Charlie', 국어: 24, 수학: 76, 영어: 52, 과학: 91})
students.push({이름: 'Delta', 국어: 69, 수학: 20, 영어: 43, 과학: 73})
let output = '이름\t총점\t평균\n'
for (const s of students) {
const sum = s.국어 + s.수학 + s.영어 + s.과학
const average = sum / 4
output += `${s.이름}\t${sum}점\t${average}점\n`
}
console.log(output)

for 반복문을 돌려 내부에서 성적의 총 합을 구하고, 이를 기반으로 평균값을 구했습니다.
학급 평균을 깎아먹는 범인은 Delta였네요.
위에서 살펴본 총합과 그 값을 기반으로 평균앖을 구하는 기능은 다양하게 활용할 수 있습니다.
단순하게 계산하기 보다는, 총합값과 평균값을 구하는 함수를 만들어놓고 매개변수로 학생 객체를 받아와 평균을 구하는 방법이 좀 더 편리하겠네요.
// 객체를 선언합니다.
const students = []
students.push({이름: 'Alpha', 국어: 88, 수학: 90, 영어: 98, 과학: 60})
students.push({이름: 'Bravo', 국어: 91, 수학: 86, 영어: 30, 과학: 53})
students.push({이름: 'Charlie', 국어: 24, 수학: 76, 영어: 52, 과학: 91})
students.push({이름: 'Delta', 국어: 69, 수학: 20, 영어: 43, 과학: 73})
// 객체를 더하는 함수를 만들어줍니다.
function getSumOf (student) {
return student.국어 + student.수학 + student.영어 + student.과학
}
// 객체의 평균을 구하는 함수를 만들어줍니다.
function getAverageOf (student) {
return getSumOf(student) / 4
}
// 출력합니다.
let output = '이름\t총점\t평균\n'
for (const s of students) {
output += `${s.이름}\t${getSumOf(s)}점\t${getAverageOf(s)}점\n`
}
console.log(output)

결과는 같은데 코드만 길어진 느낌이죠?
하지만, 객체를 만드는 부분/객체를 활용하는 부분으로 나누었습니다.
추후 다른 기능이 계속 추가된다면 이제 훨씬 쉽게 유지보수가 가능합니다.
동현님,, 블로그 항상 열심히 쓰시는 거 넘 대단합니다 ,,!!!