조건문은 어떠한 조건을 판별하는 기준을 만들며, 반드시 비교연산자가 들어간다. 비교는 true, false의 Boolean로 결과가 나온다.
비교연산자는 >(큼), >=(크거나, 같음), <(작음), <=(작거나 같음), ===(일치), !==(불일치)가 있다.
등호를 ==, !=로 표현해도 괜찮지만, 두 가지는 피연산자의 타입이 서로 다르더라도 true 결과가 나올 수 있다.
const one = 1
one === '1' // 숫자형과 문자형으로 false의 결과
false
one == '1' // 숫자형과 문자형이지만 true의 결과
true
null == undefined // 타입이 다르지만 true의 결과
true
if(조건) {
조건 true시 실행될 구문
} else if(조건2){
조건 false, 조건2 true 시 실행될 구문 // 판단해야 할 조건이 한 가지라면 else if를 사용하지 않아도 된다.
} else {
모든 조건이 false 일 경우 실행될 구문
}
조건에서 Boolean 타입을 기대할 때 true로 평가되는 truthy(참 같은 값)과 false로 평가되는 falsy(거짓 같은 값)이 있다. 이러한 값들은 false, 0, -0, 0n, ''(빈 문자열), null, undeafined, NaN으로 8가지이다.
문자열 String은 두 개 이상의 문자 데이터로 구성되어 있다. 오늘 학습에서 문자열과 관련한 다양한 메소드나 프로퍼티를 학습했다. 그것들을 위주로 작성하고자 한다.
str[index]
// 문자열에 접근한다. 다만, 읽기만 가능하며 재할당해도 바뀌지 않는다.
let str = 'Hyunwoo';
console.log(str[0]) // 'H'
console.log(str[3]) // 'n'
console.log(str[0]) // 'H'
str[0] = 'J'
console.log(str) // 'Hyunwoo'
str.length
// 문자열의 전체 길이를 반환한다.
let str = 'Hyunwoo';
console.log(str.length); // 7
str.indexOf(searchValue)
// 찾고자 하는 문자열의 위치를 반환한다.
'Local Host'.indexOf('Host'); // 6
'Local Host'.indexOf('l'); // 4
'Velog TIL Writing'.indexOf('TIL') // 6
str.includes(searchValue)
// 배열이 특정 요소를 갖고 있는지 탐색한다.
const arr1 = ['Codestates', 'JS', 'String']
arr1.includes('String') // true
str.split(seperator)
// 분리 기준이 될 문자열로 분리하여 분리된 문자열이 포함된 배열을 반환한다.
// csv 형식을 처리할 떄 유용하다.
let str = 'Codestates, JS, String'
console.log(str.split(', '))
// ['Codestates', 'JS', 'String']
str.substring(start, end)
// 시작과 끝 인덱스 사이의 문자열을 반환한다.
// end 인덱스의 전 순서까지 반환한다.
let str = '문자열을 나눠보자'
console.log(str.substring(0,3)) // '문자열'
console.log(str.substring(0,7)) // '문자열을 나눠'
console.log(str.substring(3,5)) // '을'
str.slice(start, end)
// 시작과 끝 인덱스 사이의 문자열을 반환한다.
let str = '문자열을 나눠보자'
console.log(str.slice(0,3)) // '문자열'
console.log(str.slice(0,7)) // '문자열을 나눠'
console.log(str.slice(3,5)) // '을'
// 둘은 차이점을 가지고 있다.
// 1. 인덱스의 순서가 바뀌었을 때
// 다음과 같이 인덱스의 순서를 바꿔 입력하면
console.log(str.substring(5,0)) // '문자열을'
console.log(str.slie(5,0)) // ''
// substring이 자동으로 순서를 바꿔 반환한 반면에
// slice는 배열을 반환한다.
// 2. 시작점이 음수일 때
console.log(str.substring(-1,9)) // '문자열을 나눠보자'
console.log(str.slice(-1,9)) // '자'
// substring이 자동으로 start index를 0으로 설정한 반면에
// slice는 끝에서 음수만큼 앞 쪽 순서부터 반환한다.
// 3. 끝점이 음수일 때
console.log(str.substring(0, -1)) // ''
console.log(str.slice(0,-1)) // '문자열을 나눠보'
// substring이 빈 문자열을 반환한 반면에
// slice는 끝에서 음수만큼 앞 쪽 순서까지 반환한다.
// 4. 모두 음수일 때
console.log(str.substring(-1, -3)) // ''
console.log(str.slice(-1,-5)) // ''
console.log(str.slice(-4,-2)) // '나눠'
// substring이 빈 문자열을 반환한 반면에
// slice는 끝이 더 작을 경우 빈 배열을 반환하고, 아닌 경우는 2, 3을 적용하여 반환한다.
str.toLowerCase()
// 소문자로 반환한다.
console.log(LOWER.toLowerCase()) // 'lower'
str.toUpperCase()
// 대문자로 반환한다.
console.log(upper.toLowerCase()) // 'UPPER'
모든 spring method들은 immutable하여 원본은 변하지 않으나, array method는 그렇지 않은 mutalbe한 것도 있으므로 주의
오늘은 조건문과 문자열을 다루는 것을 학습했다. 어제는 어려움이 없었지만 오늘은 어려운 것들이 있었다.
매개변수로 점수를 입력하면, 학점을 빈환시켜야 하는 문제였다. 조건문을 사용하여 코드를 작성했고, 추가적인 조건으로 0 미만이거나 100을 초과하는 점수는 유효하지 않은 점수라는 문자열을 반환해야 했다.
모든 if, else if, else를 사용하여 모든 조건을 입력했지만, 저 유효하지 않은 점수 기준만큼은 반영되지 않았다. 페어와 고민하다가 페어가 정답을 찾았는데, 0 미만이거나 100을 초과하는 점수를 걸러내는 조건이 조건문에 마지막에 있었기 때문이다.
만약, 정상적으로 작성하기 위해선 가장 처음에 0 미만이거나 100을 초과하는 점수를 걸러내는 조건을 작성하여 시작부터 걸러냈어야 했다. 기 작성된 코드에서 반영이 안된 이유는 가장 마지막에 적어서 음수가 들어오거나 그 이상이 들어와도 일단 조건문에 의하여 진행되어 학점을 반환하여 조건문이 끝나버렸기 때문이다.
조건문을 작성하면서 정확히 어떤 의사코드를 진행해야 하는지 파악함의 중요성을 배웠다. 그리고, 미리 처리해야 할 저 0 미만, 100 초과 등의 규격 외를 처리하는 등의 경우 조건문 자체의 순서 또한 충분히 고려하고 진행해야 하는 것을 배웠다.