프로그래밍 패러다임
코드를 어떻게 작성할 지에 대한 방법론이다.
목표에 따라 적절한 것을 골라서, 혹은 병합해서 사용해야 한다.
- 명령형 프로그래밍: 어떻게(How) 할 건지를 설명하는 방식
- 절차지향 프로그래밍: 데이터에 대한 순서를 파악하고 필요한 기능을 함수로 만들어 절차적으로 진행시키는 방법
- 객체지향 프로그래밍: '데이터와 기능(함수)들을 묶어 하나의 객체’로 만들어 사용하는 방식
- 선언형 프로그래밍: 무엇(What)을 할 건지를 설명하는 방식
- 함수형 프로그래밍: 연산의 과정들을 쪼개 순수 함수로 만들어 실행시키는 프로그래밍 패러다임.
객체 지향 프로그래밍
객체란?
- 사물, 내가 아닌 모든 대상
- 사물은 자신만의 상태(익은 상태), 속성(빨간색), 동작(먹을 수 있다)을 가지고 있다.
- 이것을 프로그래밍에 접목하는 것이 객체지향 프로그래밍이다.
객체지향프로그래밍이란?
- 데이터의 정리 단위를 객체의 의미를 사용해서 정하는 것.
- 프로그래밍 시에 데이터나 함수를 사용해야할 때 필요한 종류의 객체에서 꺼내 사용하는 것.
객체지향을 사용하는 이유?
- 프로그램이 복잡하고 거대해지면서 절차형 프로그래밍을 좀 더 체계적이고 효율적으로 사용하도록 보완하기 위해 나온 것.
- 반대되는 개념이 아니다.
특징
- 캡슐화
- 비슷한 역할을 하는 속성과 메소드들을 하나의 클래스로 모은 것
- 정보 은닉 - 캡슐 내부의 로직이나 변수들을 감추고 외부에는 기능(api)만을 제공하는것
- 추상화
- 공통적인 로직만 뽑아내 작성하는 것
- 인자로 변경점을 받아서 다양하게 사용할 수 있다
- 상속
- 상속이란 클래스를 재사용 하는 것
- 상위 클래스를 하위 클래스에서 상속 받게 되면 상위 클래스의 멤버변수나 메소드를 그대로 물려 받을 수 있다
- 프로토타입 방식도 있음 - 물려받는 게 아닌 공유하는 방식으로도 상속을 구현할 수 있다.
- 다형성
- 같은 모양의 함수가 상황에 따라 다르게 동작 하는것을 의미.
- 오버로딩: 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있음.
- 오버라이딩: 상위 클래스의 메소드를 하위 클래스에서 똑같은 이름으로 재정의 하는 것을 의미.(덮어씌우기)
객체 생성과 상속
객체는 함수를 통해 만들어 진다. (js관점)
- 객체 리터럴
- Object( ) 생성자 함수
- 사용자 정의 생성자 함수
extends키워드로 다른 생성자 함수의 메소드와 클래스를 물려받거나 공유해 사용할 수 있다.
방법은 크게 Class, Prototype 두 가지가 있다.
인스턴스의 관점에서 내 생성자 말고 확장된 다른 생성자의 값을 어떻게 사용할 것이냐
class (복사)
- 자신의 상속자와그 상속자에 확장된 모든 생성자값이 복사됨
prototype (연결)
- 실제 가지는 건 내 생성자의 값만이고, 확장된 다른 생성자의 값은 그냥 참조로만 접근 가능함
함수형 프로그래밍
연산의 과정들을 쪼개 순수 함수로 만들어 실행시키는 프로그래밍 패러다임.
반환값을 입력으로 이어서 받는 파이프라인의 방식으로 연속 진행시킬 수 있다.
무엇을 실행시킬지 선언만 해주면 되기 때문에 가독성이 좋다.
특징
부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터로 넘기거나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.
- 순수함수
- 1급 객체
- 참조 투명성
- "for" 또는 "while”대신 재귀함수를 사용함