2023. 1. 24. 21:40ㆍSTUDY/BOOK
#DAY12 : 에피소드 35 ~ 38
TIL (Today I Learned) 날짜
: 2022.01.24(화)
오늘 읽은 범위 :
✔️ 에피소드 35~38
오늘 TIL 3줄 요악
- 비밀번호 시스템의 원리 - 해시 함수, 레인보우 테이블, 솔트
- 객체지향 프로그래밍 - 클래스, 상속
- 선언형/명령형 프로그래밍의 차이
책에서 기억하고 싶은 내용을 써보세요.
35. [비밀번호는 어떻게 저장될까?]
✔️ 비밀번호 시스템
비밀번호를 데이터베이스에 그대로 저장하면? 데이터베이스에 접근할 수 있는 운영자, 개발자 모두 볼 수 있다.
그래서 어떤 회사는 데이터베이스 자체를 암호화해서 아무도 볼 수 없게 만든 후 비밀번호를 저장한다.
사용자는 회사에서 주는 key로 데이터베이스를 해제한 후 로그인한다.
✔️ 해시 함수
해시 함수는 내가 입력한 값을 무작위 값으로 둔갑시켜준다.
ex) 12345라고 비밀번호를 입력해서 회원가입을 하면 해시 함수가 !aekfjk#d8와 같은 값으로 만들어서 저장한다.
✔️ 해시 함수는 어떻게 동작하지?
1. 동일한 입력값에 대해 동일한 출력값을 가진다. -> 12345와 !aekfjk#d8의 일대일 대응 관계는 계속 유지된다.
2. 입력값이 아주 살짝만 바뀌어도 출력값은 엄청나게 크게 바뀐다. -> 12345가 아니라 1234가 입력되면 출력값은 5aZKde!처럼 완전히 다른 결과가 나온다.
3. 반대로 입력한다고 해서 원래 값이 나오지 않는다.
✔️ 레인보우 테이블
레인보우 테이블은 해시 함수가 변경한 값을 원래의 값과 연결한 표
✔️ 솔트
12345와 같은 비밀번호를 무작위 텍스트인 솔트와 합쳐서 해시함수에 통과시키는 것 -> 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수 없다.
36. [객체 지향 프로그래밍이 뭐죠? (1)]
✔️ 클래스
이 게임에서 플레이어를 1명만 만들 계획이라면 이렇게 코딩해도 상관없지만 여러명일 경우 코드가 비효율적이다.
플레이어는 모두 name, health, skill이라는 같은 속성을 가졌기 때문이다.
그래서 클래스라는 개념이 등장했다.
새 속성을 부여할 때는 재료를 공장에 넣으면 플레이어가 나타난다.
37. [객체 지향 프로그래밍이 뭐죠? (2)]
✔️ 상속
ex) 인간은 아기, 청소년, 성인과 같이 여러 단계를 거친다. 그것을 클래스의 상속으로 표현해보자.
class Human {
constructor(name) {
this.name = name;
this.arms = 2;
this.legs = 2;
}
}
class Teenager {
constructor(name) {
this.name = name;
this.arms = 2;
this.legs = 2;
this.emotional = true;
}
curse() {
return `#&$#%*`;
}
}
Human 클래스에는 이름, 팔 2개, 다리 2개가 있다.
Teenager 클래스에는 이름, 팔 2개, 다리 2개에 감정적이고 친구를 욕하는 기능이 있다.
여기서도 코드 중복 문제가 생긴다. 이때 상속이 등장!
중복을 해결하는 방법은 기본이 되는 Human클래스를 나머지 클래스에 상속시키면 된다.
class Teenager extends Human {
constructor(name) {
this.emotional = true;
}
curse() {
return `#$&*@$(`;
}
}
Human클래스의 기본 속성은 다 가지면서도 자신만의 속성을 추가할 수 있다.
38. [함수형 프로그래밍이 뭐죠?]
✔️ 선언형, 명령형 프로그래밍의 차이
선언형 프로그래밍은 원하는 결괏값을 선언한다. -> "BLT 샌드위치를 만들어 줘!"
<->
반대의 의미, 명령형 프로그래밍
1) 토스트 빵 2개를 꺼내서 구워라!
2) 양상추 2~3장 씻고, 토마토 얇게 썰어서 2조각 준비하고, 구운 베이컨 3개 준비해라!
3) 1)의 토스트 빵 1개 위에 2)의 재료를 쌓은 다음, 나머지 토스트 빵 1개로 덮어라!
선언형 프로그래밍의 대표적인 예 -> CSS
body { background-color: pink }
✔️ 자바스크립트로 보는 명령형 프로그래밍과 선언형 프로그래밍 차이
명령어 프로그래밍 - 공백을 ❤️로 바꾸기
function spaceToHeart(text) {
let result = "";
for (let i=0; i<text.length; i++) {
if (text[i] == " ") {
result += "❤️";
} else {
result += text[i];
}
}
return result;
}
선언형 프로그래밍 - 공백을 ❤️로 바꾸기
function spaceToHeart(text) {
return text.replaceAll(" ", "❤️");
}
코드를 보면, 바꾸고 싶은 text를 spaceToHeart함수에 넣어 주면 text공백을 replaceAll로 ❤️라고 교체하는 것 말고는 없다.
정리하자면, 명령형 프로그래밍은 할 일을 세세하게 지시할 수 있는 대신 개발자가 실수하기 쉽고, 코드를 동료가 이해하기 어렵다.
선언형 프로그래밍은 결과 중심으로 코드를 작성하기 때문에 실수가 적고, 동료가 코드를 이해하기도 쉽다.
책에서 기억하고 싶은 내용을 써보세요.
📌 해시 함수는 내가 입력한 값을 무작위 값으로 둔갑시켜준다. 동일한 입력값에 동일한 출력값을 가진다. 반대로 입력한다고 해서 원래 값이 나오지 않는다.
📌 객체지향 프로그래밍은 코드를 효율적으로 짤 수 있고, 클래스를 통해 여러 객체를 쉽게 생성할 수 있다.
📌 선언형 프로그래밍은 원하는 결괏값을 선언하여 코드를 작성하기 때문에 실수가 적고, 명령형 프로그래밍은 코드를 세세하게 작성하기 때문에 실수하기 쉽고, 남이 이해하기 어렵다.
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
🗣 비밀번호가 어떻게 관리되는지 궁금했었는데 이번 파트를 통해 해시 함수와 레인보우 테이블, 솔트의 개념을 알게 되었다.
🗣 객체지향 프로그래밍의 꽃 - 클래스와 상속! 쉬운 예시를 보며 읽으니 더 쉽게 이해하기 되었다.
🗣 명령형 프로그래밍 - 스파게티 코드가 생각난다. 선언형 프로그래밍으로 효율적으로 코드를 짤 수 있고, 함수 중심으로 코드를 적는 방식이라 선언형 프로그래밍 콘셉트를 유지한다는 것을 알게 되었다.
'STUDY > BOOK' 카테고리의 다른 글
[노마드북클럽/IT 5분 잡학사전] #14_파이널 미션 (0) | 2023.01.26 |
---|---|
[노마드북클럽/IT 5분 잡학사전] #13_TIL (1) | 2023.01.25 |
[노마드북클럽/IT 5분 잡학사전] #11_미션 (0) | 2023.01.23 |
[노마드북클럽/IT 5분 잡학사전] #10_TIL (0) | 2023.01.22 |
[노마드북클럽/IT 5분 잡학사전] #09_TIL (0) | 2023.01.21 |