230202(목)
🎄 성장일지 3.1
책 행복한 이기주의자(웨인 다이어)
의 내용에 자극받아 시작하는 소박한 성장기록
살아있는 꽃과 죽은 꽃은 어떻게 구별하는가?<br/> 성장하고 있는 것이 살아 있는 것이다.<br/> 생명의 유일한 증거는 성장이다!
🌳 키워드 (1.0)<br/> 최대한 간단하게 정리, 추후에 보면서 스스로 설명<br/> 🍉 경험 위주로 (2.0)<br/> 단순 정보를 전달하기보다 무엇을 배웠고 어떻게 해결했는지 짧고 간단하게 작성<br/> ❄️ 정해진 템플릿에 맞춰서 (3.0)<br/> 키워드, 경험 모두 좋다. 다만 매일 작성하기로 마음 먹은만큼 핵심만 간결하게 정리할 수 있게 템플릿을 작성 (3.1) 230102부터 시작되는 학습에 관한 내용 추가
🔑 오늘의 키워드
함수 합성
- 함수형 프로그래밍에서 잘게 나누어진 순수함수들을 조합하는 방법
고차함수
- 함수를 인자로 전달받는 함수
- 함수를 반환하는 함수
- 인자로 받은 함수를 필요한 시점에 호출하거나 클로저를 이용하여 반환한다.
- 자바스크립트에서 함수는
일급 객체
이기에 가능하다!
커링(Currying)
- 커링은 f(a, b, c)처럼 단일 호출로 처리하는 함수를 f(a)(b)(c)와 같이 각각의 인수가 호출 가능한 프로세스로 호출된 후 병합되도록 변환하는 것
- 함수형 프로그래밍에서 매개변수로 전달해야할 값이나 함수를 감추는 역할로 쓰이는 느낌!(클로저로 저장해두는 느낌)
불변성(Immutability)
- 변하지 않는 성질
- 자바스크립트에서 원시 타입은 기본적으로 불변성을 갖는다.
- 객체는 기본적으로 가변성을 갖는다.
- 불변하는 객체를 만들기 위해 Object.freeze(), rest parameter을 통한 객체 반환 등의 방법이 있다.
순수함수(Pure Function)
- 부수 효과(side effect)가 없는 함수.
- 어떤 함수에 동일한 인자를 주었을 때,
항상
같은 값을 반환하는 함수 - 즉, 우리가 수학에서 배우던 함수의 개념
함수형 프로그래밍
- 부수 효과(side effect)를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 패러다임
참조 투명성(Referential Transparency)
- 함수가 함수의 외부 영향을 받지 않는 것
- 동일한 입력에 대해 동일한 값을 반환하는 성질
참고자료
📝 요약 및 하루 간단 회고
와... 그래도 이제 어느정도 객체지향적으로 코드를 쓰는 법을 알 것 같다. 물론 아직 단순하게 객체 하나의 행동을 정의하고 그 상태를 다루는 정도다. 좀더 본격적으로 내가 요청하고자하는 메시지를 잘 나누고 그에 대한 책임 분배를 잘해서 좀더 유연한 객체 간 협력이 이루어지도록 해보고 싶다!<br/> 객체지향으로 구현한 코드를 최대한 함수형으로 작성해보려하는데, 쉽지가 않다. 그나마 테오의 글들 덕분에 조금씩 진도가 나가고 있다! 헌데 습관적으로 객체가 갖는 상태나 행동들을 함수형에 클로저로 전달하게 되어서 커링 함수를 구현하게 된다. 이게 옳은 건지 모르겠지만, 뭔가 개인적으로 가독성은 그닥 안좋은 느낌..? 내일은 이 부분에 대해서도 찾아보려 한다. 추가로 순수함수에 대해 아직 조금 헷갈리는 부분에 대해 헷갈리는 부분이 있어 이렇게 기록해둔다.(여러 사람들, 커뮤니티에도 올렸지만 아직 명백한 답은 못받았다..!)
아래에서 함수 b는 순수함수인가?!
const a = (x) => x; const b = (y) => { const outerValue = a(1); return y + outerValue; };
아래는 내가 커뮤니티에 올린 나의 생각..!
단순하게 a라는 외부함수의 호출을 매개변수 없이 사용하기때문에 순수함수가 아니라고 생각이 들었어요!
다만, a가 const로 선언되었기에 다시 초기화될 가능성이 없고 b 내부에서 고정된 1이라는 인자를 전달 중이니,
b는 언제나 같은 input에 대해 같은 output이 나오니까 순수함수라고 할 수도 있나 싶어서요..!
추가)
커뮤니티에서 알게 되어 실제로 뵙고 정말 정말 존경하게 된 시니어 개발자분께 들은 대답!!!(감사합니다, 테오!)
순수함수의 정의에 따라 모든 외부인자들을 명시적인 인자로 만들면 좋겠지만 실무에는 괜한 복잡도를 가져오는게 사실입니다.
그래서 지금처럼 함수 외부에 있는 값을 명시적인 인자가 아닌 형태로 사용하는 것이 보통이고 고민이 될거라고 생각합니다.
외부의 값을 가져오는 경우 그 데이터가 상수라면 사실 아무런 문제가 되지 않습니다. 코드를 바꿔치기하면 역시 순수함수가 될테니까요.
그래서 지금의 코드상에서는 a함수의 사용은 문제될게 없습니다. a함수는 순수함수이므로 a(1)의 값은 언제나 같은 값을 반환하기에 상수로 취급할 수 있습니다.
오히려 문제가 되는 것은 outerValue라고 하는 값입니다. outerValue가 달라지면 같은 b함수 호출이라도 결과값이 달라지게 됩니다.
outerValue가 상수라면 문제될것 없습니다.
오늘의 잘한 점
- 객체지향으로 일단 구현 성공! 거기다가 타입스크립트! 거기다가 인터페이스까지 사용했다!!!! 뿌듯!!!!
- 집중해서 시간 가는 줄 모르고 몰입해서 공부하는 점
오늘의 아쉬운 점
- 구현하느라 인강을 못들었다 ㅠ
- 신문을 요 몇일 건너뛰었다... 빠르게 훑자!
- 새벽 6시 헬스장 넘나 가기 힘들더... 조금만 따뜻해지면 더 쉬울 거 같으니 괜찮다!
undefined