1. 개요
절차지향, 객체지향, 함수형 프로그래밍등 코디의 기초라고 할 수 있는 것들을 잘 알고 있을까?
각각의 차이점을 말하라고 한다면 잘 말 할 수 있을까? 라고 물어보면 그렇지않나? 라는 자신감 없는 대답이 나올 것 같다. 따라서 이번 포스팅을 통하여 정리해 보고자 한다.
2. 프로그래밍 패러다임
프로그래밍 패러다임
- 프로그래머에게 프로그래밍 관점을 갖게하고 코드를 어떻게 작성할지 결정하는 역할을 한다. 새로운 프로그래밍 패러다임을 통해서 새로운 방식으로 생각하는 법을 배우게 되고, 이를 바탕으로 코드를 작성하게 된다.
최근의 프로그래밍 패러다임
- 명령형 프로그래밍 : 무엇(What) 할건지를 나타내기 보다 어떻게(How)을 할 건지 설명하는 방식
- 절차지향 프로그래밍 : 수행되어야 할 순차적인 처리 과정을 포함하는 방식
- 객체지향 프로그래밍 : 객체들의 집합으로 프로그램의 상호작용 표현
- 선언형 프로그래밍 : 어떻게(How) 할건지를 나타내기 보다 무엇(What)을 할 건지 설명하는 방식
- 함수형 프로그래밍 : 순수 함수를 조합하고 소프트웨어를 만드는 방식
3. XX지향(형) 프로그래밍
1) 절차지향 프로그래밍
- C언어, 파스칼, 코볼
- 특징
- 초기의 프로그래밍 방식으로, 일이 진행 순서대로 프로그래밍 하는 방법( 데이터의 흐름에 기반한 프로그래밍 )
- 순차적인 처리가 중요하며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그램 기법
- 함수로 부터 데이터를 받아서 기능을 구현하는 방식
- 컴퓨터의 작업 처리방식과 유사하여 상대적으로 더 빠르다.
- 순서와 흐름을 먼저 세우고 필요한 자료구조와 함수들을 설계하는 방식.
- '프로그램이 무슨일을 하는가?' 라는 사고에서 비롯된 개념(기능적 가치)
- 상위로부터 하위로 쪼개 나가는 방식 때문에 Top-down방식이라고도 함(큰 문제를 해결하기 위해 몇개의 작은 문제들로 나누어 해결)
- 단점
- 각 코드의 순서가 민감하게 연결되어있어, 규모가 커지고 복잡도가 올라갈 수록 유지보수 및 분석에 어려움이 있다.
2) 객제지향 프로그래밍
- 'JAVA', 'C++', 'Python' 등 최근언어는 모두 적용
- 모든 데이터를 객체로 취급하고, 객체가 처리 요청을 받았을 때, 객체 내부의 기능을 사용해 처리하는 방법
- 함수보다 데이터를 표현하는 객체 중심으로 프로그래밍하며 객체간의 유기적인 동작을 한다.
- 자료구조와 이를 중심으로 한 모듈들을 먼저 설계한 다음에 실행 순서와 흐름을 짜는 방식
- '현실세계의 어떤 대상을 모델링 하는가?'의 관점으로 바라본 프로그래밍 기법
- 객체들을 조합하여 큰 문제를 해결하는 Bottom-up방식을 지향함(작은 문제를 해결 해결할 수 있는 객체를 만든 후 이를 조합하여 큰 문제를 해결)
- 독립성/신뢰성 높게 만들어 놓으면 이후 재사용가능 -> 개발기간, 비용이 줄어듦
- 객체지향의 특성
- 캡슐화 : 데이터와 함수를 하나로 묶는 것
- 정보은닉 : 캡슐화에서 가장 중요한 개념으로, 다른 객체에게 자신의 정보를 숨기고 연산만을 통해 접근허용( 세부적인 내용을 숨김으로써 응집도를 높이고 결합도를 낮춘다. )
- 추상화 : 객체의 중요한(공통된) 속성에만 중점을 두어 모델화 하는 것
- 상속성 : 이미 정의된 클래스의 모든 속성, 연산을 물려받는 것
- 다형성 : 메시지에 의해 클래스가 연산을 수행하게 될 때 각 객체가 가지고 있는 고유의 방법으로 응답할 수 있는 능력(오버라이딩)
- 단점
- 처리 속도가 상대적으로 느리다.
- 설계에 많은 시간이 소요된다.
※정보은닉의 이유
https://effectiveprogramming.tistory.com/entry/객체지향-정보-은닉information-hiding에-대한-올바른-이해
다음 블로그에서 정보은닉에 대해 자세하게 다루고 있다. 여기서는 간단하게 요약을 해보고자 한다.
정보은닉은 객체지향의 궁극적인 목적이라 할 수 있다. 객체지향언어를 사용하여 기능의 수정/ 추가/ 교체를 수월하게 하기 위해 세운 전략이기 때문이다. 또한 객체지향의 대부분의 언어적 특성은 정보은닉을 위해 만들어진 것들이라고 볼 수 있다.
단순히 정보를 숨기는 것이 정보은닉의 목적이라고 할 수 없을 것이다. 정보은닉은 객체가 다른 객체들이 자신을 모르게 하는 것이 가장 이상적인 형태일 것이다. 즉, 존재감이 없는 객체가 가장 정보은닉을 잘 수행하고 있다는 것을 말한다.
그 이유는 객체가 더 유연해지기 위함인데, 다른 객체가 A객체를 모르고 실행된다는 뜻은 A객체가 수정되거나 변경될때 심지어 없어지더라도 다른 객체들에 전혀 영향이 없는 것이기 때문이다.
정보은닉의 종류
- 객체의 구체적 타입 은닉(= 상위 타입 캐스팅)
- 객체의 필드 및 메소드 은닉(= 캡슐화)
- 구현 은닉(= 인터페이스 및 추상 클래스 기반 구현)
( 세가지 다른 케이스가 아니라 겹쳐있을 수 있다.)
정보은닉의 목적
- 구체적인 코드(타입, 메소드, 구현)에 의존하는 것을 막아줌으로써 객체간 구체적인 결합도를 약화시킨다.
- 동일한 타입의 다른 구현 객체들을 교체하며 동적으로 기능을 변경할 수 있게 함(추상클래스 OR 인터페이스 활용)
- 연동할 구체적인 구현이 없는 상태에서도 정확한 연동 코드 생성이 가능하다. 즉, 연동할 객체가 변경되거나 삭제되더라도 연동하는 코드에 영향을 끼치지 않는다.(추상클래스 OR 인터페이스를 이용)
3) 함수형 프로그래밍
- 클로저, 하스켈, 리스프
- 함수 자체가 일급객체가되는 프로그래밍 기법. (객체지향에서는 클래스(또는 Object)가 일급객체이다.)
일급 객체란 다른 요소들과 아무런 차별이 없는 객체를 뜻함. - 상태값을 지니지 않는 함수들의 연속. (객체지향에서는 프로그램에서 상호작용하는 객체들의 집합)
- 값의 연산 및 결과 도출 중심으로 코드작성이 이루어짐.
- 함수는 인자로 받은 값을 별도로 저장하지 않고, 간결한 과정으로 처리하고 매핑하는데 목적을 둠.
- 객체지향보다 코드가 간결하여 사이드이펙트를 미연에 방지한다.
- 데이터형에 구애받지 않는다.
명령형과 선언형 자바스크립트 비교
- 명령형
function mult2 (arr){
let results = []
for(let i=0; i<arr.length; i++{
results.push(arr[i]*2);
}
return result
}
- 선언형
function mult2(arr){
return arr.map((v) => item *2);
}
위에서 보는바와 같이 명령형(절차/객체 지향)은 어떻게(HOW) 하는지 차근차근 풀어쓰는 반면 선언형(함수형) 프로그래밍은 무엇(What)을 할것인가를 짧게 나타낸다.
명령형 프로그래밍 | 함수형 프로그래밍 | |
프로그램이란? | 명령의 수행이다. | 함수의 계산이다. |
중점적 시각 | How | What |
이론적 배경 | 튜링 머신 | 람다 계산식 |
주요 프로그래밍 언어 | C언어, 자바 등 | Scheme, Haskell, ML, Erlang |
https://velog.io/@sgyos000/함수형-객체지향-프로그래밍
https://jhnyang.tistory.com/322
https://velog.io/@jonah/객체지향-언어의-특징
https://daehwa123.com/181
'ComputerScience > Languages' 카테고리의 다른 글
[프로그래밍언어] 자바(2) 언어적 부분 (0) | 2021.06.21 |
---|---|
[프로그래밍언어] 자바(1) 비 언어적 부분( 구성, 특성 ) (0) | 2021.06.02 |
댓글