[노마드북클럽/IT 5분 잡학사전] #12_TIL

2023. 1. 24. 21:40STUDY/BOOK

728x90
반응형

#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로 ❤️라고 교체하는 것 말고는 없다.

 

정리하자면, 명령형 프로그래밍은 할 일을 세세하게 지시할 수 있는 대신 개발자가 실수하기 쉽고, 코드를 동료가 이해하기 어렵다.

선언형 프로그래밍은 결과 중심으로 코드를 작성하기 때문에 실수가 적고, 동료가 코드를 이해하기도 쉽다.

 

 

책에서 기억하고 싶은 내용을 써보세요.

📌 해시 함수는 내가 입력한 값을 무작위 값으로 둔갑시켜준다. 동일한 입력값에 동일한 출력값을 가진다. 반대로 입력한다고 해서 원래 값이 나오지 않는다.

 

📌 객체지향 프로그래밍은 코드를 효율적으로 짤 수 있고, 클래스를 통해 여러 객체를 쉽게 생성할 수 있다.

 

📌 선언형 프로그래밍은 원하는 결괏값을 선언하여 코드를 작성하기 때문에 실수가 적고, 명령형 프로그래밍은 코드를 세세하게 작성하기 때문에 실수하기 쉽고, 남이 이해하기 어렵다.

 

 

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

🗣 비밀번호가 어떻게 관리되는지 궁금했었는데 이번 파트를 통해 해시 함수와 레인보우 테이블, 솔트의 개념을 알게 되었다.

 

🗣 객체지향 프로그래밍의 꽃 - 클래스와 상속! 쉬운 예시를 보며 읽으니 더 쉽게 이해하기 되었다.

 

🗣 명령형 프로그래밍 - 스파게티 코드가 생각난다. 선언형 프로그래밍으로 효율적으로 코드를 짤 수 있고, 함수 중심으로 코드를 적는 방식이라 선언형 프로그래밍 콘셉트를 유지한다는 것을 알게 되었다.