leesulog.

lightdark
[북클럽 챌린지] DAY 12
2023-01-247 min read
  • Book
thumbnail

DAY 12

🔖 오늘 읽은 범위 : 에피소드 35 ~ 38

  1. 비밀번호는 어떻게 저장될까?
  2. 객체 지향 프로그래밍이 뭐죠? (1)
  3. 객체 지향 프로그래밍이 뭐죠? (2)
  4. 함수형 프로그래밍이 뭐죠?

😃 기억하고 싶은 내용

  • 괜찮은 비밀번호 시스템의 예: 해시함수
    내가 입력한 값을 무작위 값으로 둔갑시켜주는 녀석이야.

    • 규칙 1. 동일한 입력값에 대해 동일한 출력값을 가진다. (12345 → !aef3zed&^)
    • 규칙 2. 입력값이 아주 살짝만 바뀌어도 출력값은 엄청나게 크게 바뀐다.
    • 규칙 3. 반대로 입력한다고 해서 원래 값이 나오지 않는다.
  • 해시함수도 완벽하진 않다! 레인보우 테이블
    사실 해시함수를 통과한 값은 레인보우 테이블에서 찾아보면 원래 값을 알 수 있어.

  • 최종병기 솔트
    12345와 같은 비밀번호를 무작위 텍스트인 솔트와 합쳐서 해시함수에 통과시키는 거야. 그러면 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수 없을거야!

  • 객체 지향 프로그래밍 - 코드의 효율성을 UP

    • 프로그래밍 패러다임 : 절차 지향 프로그래밍 / 객체 지향 프로그래밍 / 함수형 프로그래밍
      → 프로그래머가 프로그래밍을 할 때의 관점, 방식 이런 것을 말하고 프로그래밍을 하는 사고의 틀이라고 생각해도 좋아.

    • class : 쉽게 말해 우리가 재료만 공장에 넣어주면 나머지 코드는 공장이 알아서 찍는거야.
      새 속성을 부여할 때는 공장에 알려주기만 하면 되는거지. 바로 이런 자연스런 생각이 객체 지향 프로그래민의 클래스(class)라는 개념이야.

      // 플레이어의 공장, 클래스
      class Player {
        constructor(name, health, skill) {
          this.name = name;
          this.health = health;
          this.skill = skill;
          this.xp = 0;
        }
      }
      
      const bill = new Player('Bill Gates', 85, 'Programmer');
      const elon = new Player('Elon Musk', 90, 'Tesla');
    • extends : 가지고 있는 class A를 다른 class B에 상속을 시키면 class A의 기본 속성은 다 가지면서 class B 자신만의 속성을 추가할 수 있어.

      class Human {
        constructor(name) {
          this.name = name;
          this.arms = 2;
          this.legs = 2;
        }
      }
      
      class Teenager extends Human {
        constructor(name) {
          this.emotional = true;
        }
        curse() {
          return '%^@!%#!#$';
        }
      }
      
      class Baby extends Human {
        constructor(name) {
          this.cute = true;
        }
        cry() {
          return 'waa waa';
        }
      }
  • 함수형 프로그래밍

    • 배워야하는 이유 → 버그가 발생하기 어려운 구조

    • 선언형 프로그래밍과 명령형 프로그래밍의 차이

      선언형 프로그래밍 명령형 프로그래밍
      원하는 결괏값을 선언한다. 원하는 결괏값에 어떻게 도달하는지 명령한다.
      결과 중심으로 코드를 작성하니 실수도 적고, 동료가 코드를 이해하기도 쉽다. 할일을 세세하게 지시할 수 있는 대신 개발자가 실수하기 쉽고, 작성한 코드를 동료가 이해하기 어렵다는 특징이 있다.
      // 선언형 프로그래밍
      function spaceToHeart(text) {
        return text.replaceAll(’ ’, ‘❤️’);
      }
      
      // 명령형 프로그래밍
      function spaceToHeart(text) {
        let result = “”;
        for(let i=0; i < text.length; i++) {
          if(text[i] === ‘ ‘) {
            result += ‘❤️’;
          } else {
            result += text[i];
          }
        }
      }
    • 함수형 프로그래밍
      함수 중심으로 코드를 적는 방식으로 선언형 프로그래밍 콘셉트를 유지해.

      function checkForOdd(item) {
        return item % 2 === 0;
      }
      
      function removeOdd(items) {
        return items.filter(checkForOdd);
      }
      // checkForOdd 라는 함수를 인자로 보냈다.

🤔 오늘의 파트에 대한 소감

  • 이름만 들으면 어려울 것 같은 객체 지향 프로그래밍을 살짝 이해할 수 있었다! 공장처럼 찍어낼 수 있는 class 개념과 class를 그대로 가져갈 수 있는 상속 개념처럼 어디선가 많이 봤던 코드를 조금이나마 알아볼 수있다고 생각하니 기쁘다.
  • 선언형과 명령형 프로그래밍 패러다임의 특징을 구분할 수 있게 되었고, 내가 써왔던 코드가 함수형 프로그래밍이었다는 사실도 알게 되었다.

🔎 추가로 알게 된 것

(책 내용 +알파로 궁금한 것, 이해가 가지 않는 것 등)


🤟소감 3줄 요약

  • 비밀번호는 해시함수를 이용해 솔트를 팍팍쳐야 안전하다.
  • 객체지향 프로그래밍, 선언형 프로그래밍, 명령형 프로그래밍, 함수형 프로그래밍의 특징을 말할 수 있다.
  • 공장처럼 찍어낼 수 있는 class 잘 기억해두겠다.
Profile Image

leesul, 이슬

frontend developer
스스로 올바른 선택을 할 수 있는 사람이 될 것

© 2024. leesul all rights reserved.