1. 반복문
단순한 반복을 줄여서 효율성을 높이는 반복문에 대해 배워보자. 절구질과 물레방아를 머릿속으로 비교하면서.
1.1 Achievement Goals
반복문 기초, 퀴즈, 실습
- 반복문을 활용하여 단순한 기능을 반복하여 수행할 수 있다.
- for문과 문자열, 숫자를 이용해 반복적으로 코드를 실행시킬 수 있다.
- 기본적인 for문 (for (let i = 0; i < 5; i++))을 응용하여 다양한 for문을 만들 수 있다.
- for와 while의 차이에 대해서 설명할 수 있다.
- 반복문에 조건문을 적용하여 특정 조건에서만 코드가 실행되도록 할 수 있다.
- 이중 포문이 무엇인지 이해하고 활용할 수 있다.
1.2 반복문 기초
- 반복문은 같거나 비슷한 코드를 여러 번 실행시켜야 하는 경우에 사용하는 구문이다.
- 반복문 작성해보기
1. 반복할 실행문과 조건을 코드로 작성한다.
2. for 구문의 문법에 맞게 적용해본다.
- 반복한 조건을 초기화, 조건식, 증감문 순으로 넣어준다.
- 초기화 -> (조건식 확인 -> 실행문 -> 증감문) 이걸 반복한다.
- while 구문
- for 구문은 초기화, 조건식, 증감문이 모두 모여 있는 식이었다면 while 구문은 그렇지 않다.
- for와 while은 서로 바꿔서 사용가능하다.
2. Sprint Review
- 조건문을 짤 때 우선순위가 중요한 이유?
- 겹치는 부분이 있다면 조건문에서 그것부터 사용해줘야 한다.
- 가장 작은 범위의 단위 부터 사용해줘야 한다.
- 코플릿에서 day, hour, minute 문제 내가 놓치고 있었던 부분. 나는 문제에서 작은 단위부터 쓰지 않았다. 그래도 답은 맞았는데..
- 조건문을 체를 거른다고 상상해보라.
- 3개의 숫자 중에 가장 작은 숫자를 구하는 알고리즘
- 가장 짧은 단어라는 변수를 만들어 임의로 num1을 담는 포인트
- 변수를 포함하고 있는 문자열을 쓸 때 백틱을 활용해보는 것
- for 문과 while문의 구별되는 점은?
- while은 내가 이 조건을 몇 번 반복할지 모를 때 활용하게 된다.
- 임의의 두 숫자를 받아서 작은 것과 큰 것을 구분하는 문제에서도 미리 변수에 할당을 해놓고 시작하는 것.
- 소수 확인하는 문제
- 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 아, 이런 수학적 개념까지..
3. Self Guided Lesson
3.1 디버깅
- 문법적인 오류
- 논리적인 오류
- 유용한 테스트 방법
- 경우의 수 정리
- 경우의 수에 대해 기대값과 실제값 비교하기
3.2 코드 스타일링
- 동료들이 이해하기 쉬운 코드를 작성해 소통비용을 줄인다.
- 코드에 에러를 쉽게 찾을 수 있다.
들여쓰기
- 탭보다는 스페이스 2번을 사용하기를 추천한다. 최근 들여쓰기 논쟁의 승리자가 되었다.
- 가장 최악은 탭과 스페이스 2번을 혼용해서 사용하는 것이다.
이름짓기
- 변수명은 할당되는 값의 의미를 담고 있어야 한다.
- 분야의 핵심을 잘 묘사하는 단어일수록 좋다.
- 한 단어로 표현하는 것이 좋다.
let interestRate = 0.2;
- 데이터의 모음이 할당된 변수의 이름은 복수명사가 좋다.
let animals = ['cat', 'dog', 'fish'];
- boolean이 할당된 변수는 is/are을 붙여서 분명히 표현한다.
let isDog = true;
- 함수의 이름은 기능을 담은 동사를 포함하면 좋다.
let countWaterBlocksBetweenTowers = function(){
}
- 변수 할당 값이 Class인 경우 주로 변수의 첫 글자를 대문자로 사용한다.(이 부분 잘 이해 안 된다.)
- 상수는 모두 대문자로 적는다.
기호 및 구두점
- 중괄호는 문법적으로 생략 가능한 때에도 생략하지 않는다.
- 자바스크립트 문자열 표시를 위해 작은 따옴표를 권장한다.
- 줄 바꿈이 필요한 문자열을 정의할 때 백틱사용을 권장한다.
- \n 기호보다 줄바꿈이 명확하게 눈이 보이기 때문이다.
- 코드 실행의 가장 작은 단위인 statement의 끝에 세미콜론을 사용한다.
- if, for, while문의 끝에는 세미콜론을 사용하지 않는다.
- 중괄호로 종료가 암시되어 있기 때문에, 중복해서 사용할 필요 없다.
- 함수 표현식의 끝에는 위와 다르게 중괄호 뒤에 세미콜론을 써야한다.
연산자와 키워드
- 엄격하지 않은 동치 연산 대신에 반드시 엄격한 동치 연산을 사용하라.
- 3항 연산자는 간결하고 가독성이 좋은 경우만 사용한다.
- not 연산자는 바로 앞에 붙여서 사용한다.
짧게 쓰기
- 뜻이 분명하고 실행 되는 한, 되도록 짧게 쓴다.
- 부정의 의미가 명확한 곳에만 NOT 연산자를 사용한다.
- 예시에서 드모르간의 법칙을 떠올리게 하는 배배 꼰 예시를 들었다.
- 비교문은 불리언 타입으로 평가되기 때문에 장황하게 조건문을 추가로 작성하지 않는다. (Boolean 평가되는 표현문은 바로 리턴)
코드 문장과 구문 사이 공간
- 한 번에 더 많은 코드를 읽기 위해, 줄바꿈을 최소화한다.
- 들여쓰기는 일관성있게, 최소화하여 사용한다.
- 값을 같은 라인에 두기 위한 들여쓰기는 지양한다.
- 콤마(,)사이는 한 칸 띄어쓴다.
- 연산자 사이는 한 칸 띄어쓴다.
'Failed [' + testName + ']'
if(actual === expected){
} else {
}
주석
- 주석은 꼭 필요한 경우에만 작성한다.
- 주석을 적기 전에, 변수 이름과 구조로 코드의 목적이 명확히 표현되면 주석을 작성할 필요가 없다.
- 주석으로 코드의 작동을 설명하는 것은 지양한다. 바로 이해할 수 있는 가독성 좋은 코드를 작성한다.
- 공부 초반에는 주석을 활용하되, 숙달되면서 점차 줄여나가도록 한다.
camelCase vs. snake_case
- JavaScript에서는 변수의 이름을 지정할 때 'Camel Casing'으로 지정한다.
- 뱀 모양을 사용하는 경우는 상수 이름을 지을 때다.
유명한 코드 스타일 가이드
4. 코플릿
나눗셈은 뺄셈의 반복이고, 곱셈은 덧셈의 반복이다. (k3)
while (num >= 0) {
if (num === 0) {
return false;
} else if(num === 1) {
return true;
}
num = num - 2;
}
}
- 나는 if문을 반복문 밖으로 빼주었는데, 여기에서는 안에 넣어주었다. 결국 0과 1이 체크해야하는 목표 숫자이긴 하니까, 이 방법도 괜찮다.
- 조건문을 적을 때, else if 대신 else를 썼을 때 그 뒤에 실행코드가 실행되지 않는다. 그 점을 바로 보지는 못했었다.
어떤 부분을 반복하는 패턴으로 잡을지 잘 생각한다.
- 혹은 패턴에서 벗어나는 부분이 있다면 반복문을 돌리고 substring 이나 slice 메소드를 활용해도 된다.
0 % 2 === 0 // true (k10)
- 0은 짝수일까? 2의 배수일까? 문제마다 원하는 조건이 다르다. 이 부분 챙기자.
- 찾는 조건에 어차피 부합하지 않는다면, 값을 임의로 바꿔주는 거 적용해볼 수 있는 아이디어다.
if (start === 0) {
start = 1;
}
비교 연산을 할 때는 숫자로, .length 속성을 사용할 때는 문자로! (k12)
- 스트링을 숫자로 바꾼 다음에 대소비교를 한다는 생각은 좋았지만, 반복문을 돌릴 때 number.length라는 말도 안 되는 짓을 해버렸다.
- 연산을 하고 있는 데이터의 타입을 잘 살펴야 한다. 숫자와 문자를 오갈 때 조금 헷갈렸다. 섞어서 비교연산을 하기도 했다.
문자열은 원시자료형이기 때문에 값 자체의 변경이 불가능하다 (k13)
- replaceAll 메소드로 쉽게 풀 수 있는 문제이지만, 반복문으로 로직을 짜보자. 배열을 배운 후에는 문자열을 배열로 만들어줘서 값을 바로 변경해줬다.
- 배열로 바꾸지 않고 사용할 수 있는 로직이 있었고, 고민한 후에 답을 스스로 찾았던 모양이다. 기존의 것을 수정하지 않고 새롭게 문자열을 만들어간다고 생각하는 논리였다.
소수 여부를 리턴하는 문제 (k17)
- 조건문의 우선순위에서 작은 범위를 먼저 (숫자 하나를 핀셋처럼 집어서 처리해주고 싶을 때, 그걸 가장 앞에 써야 한다) 하는 거 우연히 맞았다.
- 반복문 돌릴 때, 내가 원하는 조건을 만족시킬 때만 return을 해서 반복문을 멈추고 그렇지 않은 경우에는 끝까지 갔어야 하는데 그 포인트를 잘못 잡았던 것
- 변수를 i부터 설정하고 2씩 증가하게 한 것
- 거듭제곱근을 정수로 바꾸고 그 포인트까지만 나누게 한 것. 끝까지 돌려볼 필요가 없다.(advanced)
내가 생각한 로직대로 안 풀리면 debugger를 실행해봐!
- 맨 처음에 짠 로직에서 isPrime 초기화 위치만 제대로 했으면 그냥 정답이었는데..
- 짝수를 진작 빼줬으면 3부터 시작해도 됐지만, 그러지 않았으니 2부터 시작해야 했다.
- isPrime을 넣는 건 좋은 생각이었다. 그런데 초기화 되는 위치가 잘못 되었다. 반복문 안에 있었어야 했다. 이 때문에 엄청 헤맸구나..
- 진작 console.log를 찍어서 디버거를 해봤으면 좋았을 걸 싶다. 거기에서 힌트를 얻었다.
이중 반복문으로 문자열 안에 같은 글자가 있는지 확인하기 (k20)
- 자기 자신과 비교할 필요도 없고, 이미 확인한 글자를 또 확인할 필요가 없다. 이럴 때 변수 초기화 부분과 조건식을 어떻게 써줄지 고민!
이중 반복문에서 상상의 카운터, 혹은 상상의 줄을 생각해보기 (k21)
3, 10, 12, 17(), 18(x), 20, 21
Q) 함수 안에서 특정 문자열을 리턴을 하는 것과 콘솔 로그로 찍는 것은 어떤 차이를 만들어낼까?