# 함수형 코딩
# 객체 지향 프로그래밍
객체 지향 프로그래밍은 객체와 클래스, '정보은닉', '추상 데이터 타입'에 대한 초기 개념을 정리했습니다. 객체지향 프로그램의 핵심 개념은 두가지. 모두 데이터 접근에 관한 내용.
- 모든 변수가 어떤 구조에 '캡슐화'되거나 '포함'된다는 것. 코드의 특정 부분에서만 변수에 접근할 수 있기 때문에 코드를 관리하고 읽기 쉬워짐. 프로그램 가장 위에 변수를 선언하지 않고 블록 안에 로컬 변수를 선언하거나 클래스의 메서드만 접근할 수 있도록 안전하게 변수를 선언할 수 있습니다.
- 두번째는 상속. 상속은 단순한 클래스에 변수나 메서드를 추가하거나 메서드를 재정의해서 더 복잡한 객체를 만드는 것을 의미합니다. 상속도 캡슐화가 있기 때문에 가능.
# 함수형 프로그래밍
- 함수형 프로그래밍은 부수 효과 구성에 관한 내용입니다. 부수 효과를 잘 관리해서 코드의 아무 곳에나 있지 않도록 하는 것입니다. 함수형 프로그래밍에도 연결된 두 가지 핵심 개념이 있습니다. 하나는 계산과 액션을 구분하는 것입니다. 계산은 외부에 어떤 영향을 주지 않기 때문에 여러 번 실행해도 같은 결과를 돌려줍니다. 하지만 화면에 글씨를 표시하거나 로켓을 발사하는 것과 같은 액션은 실행할 때마다 다른 결과가 나올 수 있습니다. 즉, 액션은 부수효과를 가지고 있습니다. 따라서 코드에 어떤 부분에 부수 효과가 있고 어떤 부분은 '순수한 계산'인지 쉽게 구분할 수 있는 패턴으로 구성하면 프로그램을 쉽게 이해할 수 있습니다. 이 패턴은 단일 스레드(순차적 실행)에서 실행하는 경우와 다중 스레드(동시 실행)에서 실행하는 경우로 나눌 수 있다.
- 두번째 중요한 개념은 배열, 리스트 , 데이터베이스와 같은 컬렉션을 하나씩 처리하지 않고 '한 번에' 처리한다는 개념입니다. '한 번에' 처리하기 위해서는 컬렉션 항목에 외부에 영향을 주는 부수 효과가 없어야 합니다.
# 액션과 계산, 데이터의 차이를 알기
- 액션: 실행 시점과 횟수에 의존. 다른 말로 부수효과(side effects), 부수 효과가 있는 함수(side-effecting function), 순수하지 않은 함수(impure function)라고 부르기도 합니다. 예) 이메일 보내기, 데이터 베이스 읽기
- 계산: 입력으로 출력을 계산합니다. 다른 말로 순수 함수(pure function), 수학 함수(mathematical function)라고 부르기도 합니다. 예) 최댓값 찾기, 이메일 주소가 올바른지 확인하기
- 데이터: 이벤트에 대한 사실. 예) 사용자가 입력한 이메일 주소, 은행 API로 읽은 달러 수량
# 데이터에 관하여
# 불변성
함수형 프로그래머는 불변 데이터 구조를 만들기 위한 두 가지 원칙을 사용.
- 카피 온 라이트: 변경할 때 복사본을 만듬.
- 방어적 복사: 보관하려고 하는 데이터의 복사본을 만듬.
# 데이터의 장점
- 직렬화: 직렬화된 데이터는 전송하거나 디스크에 저장했다가 읽기 쉽다.
- 동일성 비교: 계산이나 액션은 서로 비교하기 어렵지만 데이터는 쉽다.
- 자유로운 해석: 데이터는 여러 가지 방법으로 해석할 수 있음.
# 데이터의 단점
유연하게 해석할 수 있음은 장점이지만, 해석이 반드시 필요하다는 단점. 계산은 해석하지 않아도 실행 가능하나, 해석하지 않은 데이터는 쓸모없는 바이트일 뿐.