반응형
면접을 위한 CS 전공지식 노트 - section 1.2 내용입니다.
프로그래밍 패러다임
- 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론
- 언어는 특정한 패러다임을 지원하기도 하는데 jdk 1.8 이전의 자바는 객체지향 프로그래밍을 지원
- jdk 1.8부터 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입
- 선언형 프로그래밍을 위해 스트림 같은 표준 API 추가
- 여러 패러다임을 지원하는 언어도 있음 ex) c++, 파이썬, 자바스크립트 ...
선언형과 함수형 프로그래밍
- 선언형 프로그래밍
- '무엇을' 풀어내는가에 집중하는 패러다임
- "프로그램은 함수로 이루어진 것이다."라는 명제가 담겨있는 패러다임
- 함수형 프로그래밍
- 선언형 패러다임의 일종
- '순수 함수'들을 블록처럼 쌓아 로직을 구현하고 '고차 함수'를 통해 재사용성을 높인 프로그래밍 패러다임
- ex: 자바스크립트, 파이썬
순수 함수: 출력이 입력에만 의존하는 것을 의미
const pure = (a, b) => { return a+b}
고차 함수: 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것
이때 고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져야 한다.
일급 객체
- 변수나 메서드에 함수를 할당할 수 있다.
- 함수 안에 함수를 매개변수로 담을 수 있다
- 함수가 함수를 반환할 수 있다.
특징을 보고 바로 Python이 떠올랐다.. 그렇다면 일급 객체인 Python에서 고차함수의 예를 보면 map이란 함수가 있다.!
고차함수의 예: map함수는 인자로 함수와 순회가능한 객체를 받는다
number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = list(map(lambda x: x ** 2, number_list))
print(result)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
객체지향 프로그래밍(OOP, Object-Oriented Programming)
- 객체들의 집합으로 프로그램의 상호 작용을 표현
- 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식
- 설계에 많은 시간이 소요되며 처리 속도가 다른 프로그래밍 패러다임에 비해 상대적으로 느리다.
객체지향 프로그래밍 특징
- 추상화
- 복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것
- 공통의 속성이나 기능을 묶어 이름을 붙이는 것
- 동물이나 식물들의 종류로 나뉘어 있는 객체들이 있다면 그들을 동물, 식물로 묶어서 표현할 수 있음
- 캡슐화
- 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것을 말한다.
- 클래스안에 속성과 메서드를 묶고 접근 제어자를 활용해 속성에 접근을 못하거나 메서드에 접근하지 못하도록할 수 있다.
- 그냥 묶는 것이 아니라 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶는다고 할 수 있다.
- 상속성
- 상위 클래스의 특성을 하위 클래스가 이어받아서 재사용하거나 추가, 확장하는 것을 말한다.
- 코드의 재사용, 계층적인 관계, 유지 보수성 측면에서 매우 중요
- 자동차라는 클래스를 사용하고 있었는데 뚜껑이 열리는 자동차들이 생겨났을 때 기본 자동차를 상속받아 슈퍼카를 만들어 확장할 수 있음
- 다형성
- 하나의 메서드나 클래스가 다양한 방법으로 동작하는것
- 오버로딩
- 같은 이름을 가진 메서드를 여러 개 두는 것
- 메서드의 타입, 매개변수의 유형, 개수 등으로 여러개 둘 수 있으며 컴파일 중에 발생하는 '정적' 다형성
- 오버라이딩
- 상위 클래스로부터 상속받은 메서드를 하위 클래스가 재정의하는 것
- 런타임 중에 발생하는 '동적' 다형성
설계 원칙
- 단일 책임 원칙(SRP, Single Responsibility Principle)
- 모든 클래스는 각각 하나의 책임만 가져야하는 원칙
- A라는 로직이 존재한다면 어떠한 클래스는 A에 관한 클래스여야 하고 이를 수정한다고 햇을 때도 A와 관련된 수정이어야 한다.
- 개방-폐쇄 원칙(OCP, Open Closed Principle)
- 유지 보수 사항이 생긴다면 코드를 쉽게 확장할 수 있도록 한다
- 수정할 때는 닫혀있어야 한다
- 기존의 코드는 잘 변경하지 않으면서 확장은 쉽게 할 수 있어야 한다.
- 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
- 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
- 클래스는 상속되기 마련이고 부모, 자식이라는 계층 관계가 만들어지는데 부모 객체에 자식 객체를 넣어도 시스템이 문제없이 돌아가게 만드는 것을 말한다.
- 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
- 하나의 일반적인 인터페이스보다 구체적인 여러 개의 인터페이스를 만들어야 하는 원칙
- 하나에 다 때려박지 말고 기능에 따라 구체적으로 여러 개로 나누어라
- 의존 역전 원칙(DIP, Dependency Inversion Principle)
- 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 원칙
- ex: 타이어를 갈아 끼울 수 있는 틀을 만들어 놓은 후 다양한 타이어를 교체할 수 있어야 한다.
- 상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립해야 한다
절차형 프로그래밍
- 로직이 수행되어야 할 연속적인 계산 과정으로 이루어짐
- 코드의 가독성이 좋으며 실행 속도가 빠르다
- 계산이 많은 작업 등에 쓰인다.
- 단점으로 모듈화하기 어렵고, 유지 보수성이 떨어진다
정리
- 여러가 지프로그래밍 패러다임이 존재하지만 각자의 장단점이 있으며 사용에 있어 정해진 것은 없다.
- 비즈니스 로직이나 서비스의 특징을 고려해 패러다임을 정해한다.
- 하나의 패러다임을 기반으로 통일하여 서비스를 구축하는 것도 있지만 여러 패러다임을 조합하여 상황과 맥락에 따라 패러다임 간의 장점만 취해 개발하는 것이 좋다.
반응형
'면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
네트워크 (0) | 2022.11.30 |
---|---|
면접을 위한 CS 전공지식 노트 - 1장-2 (0) | 2022.11.24 |
면접을 위한 CS 전공지식 노트 - 1장 (0) | 2022.11.22 |