📌 절차지향 프로그래밍? (Procedural Programming)
일이 진행되는 순서대로 프로그래밍하는 방법
장점
코드의 가독성이 좋음.
컴퓨터의 처리구조와 비슷해 실행 속도가 빠름.
단점
각각의 코드가 순서에 민감하게 연결 되어있어, 유지보수 및 분석이 어려움.
📌 객체지향 프로그래밍? (Object Oriented Programming)
모든 데이터를 객체(Object)로 취급하고,
객체가 처리 요청을 받았을 때, 객체 내부에 있는 기능을 사용해 처리하는 방법
서로 연관되어있는 함수와 변수들을 객체라는 것으로 그룹핑.
그 객체에 들어있는 함수들을 호출해서 다른 함수들과 분리/구분해줌.
4가지 특징!
1) 추상화 : 공통적인 속성이나 기능을 묶어서 이름을 붙이는 것
2) 캡슐화 : 데이터를 은닉하고 데이터 기능을 노출시키지 않음.
3) 상속성 : 상위 부모 객체의 속성과 특징을 하위 객체가 물려 받는 것.(만약 어떠한 객체가 이미 존재하는 객체의 특성을 가지고 있다면, 기존 객체의 특성을 상속시켜 만들 수 있음.)
4) 다형성 : 같은 함수가 있어도 매개변수에 따라 각자 다른 일을 하는 것
장점
코드의 재사용이 가능.(확장, 유지보수에 용이!)
분석과 설계의 전환이 쉬움.
단점
처리 속도가 상대적으로 다소 느림.
설계에 많은 시간이 소요됨.
객체지향 프로그래밍 언어: 자바, 스몰토크
📌 함수형 프로그래밍?
"순수 함수"를 사용해, 상태를 제어하기보단, 빨리 처리하는데 초점을 둔 방법
실행 순서를 지정할 필요가 없기 때문에 비절차형 언어라고도 함!
순수 함수란?
🍒동일한🍒 입력값을 넣었을 때 항상 🍒동일한🍒 리턴값을 반환하며 외부에 영향을 받지 않는 함수!
외부에 영향을 받지않음.
함수의 실행이 프로그램에 영향을 주지 않음.
비상태 불변성 유지.(전달된 데이터를 변경하는 것이 아니라 새로운 버전, 새로운 오브젝트를 만들어서 결과값으로 전달해야함!)
-> 여러가지 동시다발적인 멀티쓰레딩 환경에서도 안정적으로 동작할 수 있음!
예제 코드
// 순수 함수
function func(a, b) {
return a + b; // 인자로 들어온 값만 참조해, 리턴값을 생성
}
// 비순수 함수
function func(a, b) {
return a + b + c; // 외부 요인(c)에 따라 리턴값이 변경됨
}
장점
함수의 동작부가 간결해지기 때문에, 객체지향 프로그래밍에 비해 코드 이해도와 가독성이 좋아짐.
테스트가 쉬움.
단점
외부 데이터 혹은 내부 데이터의 상태를 조작할 수 없음.
함수형 프로그래밍 언어: Haskell, OCaml 등
C++, Python, JavaScript, Java와 같은 언어의 최신버전에 함수형 프로그래밍의 특징들이 더해짐.
📌 절차형 프로그래밍과 객체지향 프로그래밍의 차이
절차형 프로그래밍 위에서 객체지향 프로그래밍이 탄생한 것.
절차형 프로그래밍이 갖고 있는 부족함을 객체지향 프로그래밍이 보완해주는 역할.
절차형 프로그래밍은 함수가 있고, 객체지향 프로그래밍 또한 함수가 있지만 '객체'라는 개념이 등장함.
📌 함수형 프로그래밍과 객체지향 프로그래밍의 차이
1) 함수형 프로그래밍에서는 함수(Function) 자체가 일급 객체가 되지만, 객체지향 프로그래밍에서는 클래스(또는 객체, Object)가 일급 객체가 됨.
일급 객체란?
다른 요소들과 아무런 차별이 없는 객체.
즉, 함수의 인자로도 넘겨질 수 있고, 변수에 대입도 가능한 객체를 일급 객체.
일급 객체의 명확한 정의-
모든 일급 객체는 함수의 실질적인 매개변수가 될 수 있다.
모든 일급 객체는 함수의 반환값이 될 수 있다.
모든 일급 객체는 할당의 대상이 될 수 있다.
모든 일급 객체는 비교 연산(==, equal)을 적용할 수 있다.
2) 객체지향 프로그래밍에서는 프로그램을 상호작용(interaction)하는 객체들의 집합으로 볼 수 있지만, 함수형 프로그래밍에서는 상태 값을 지니지 않는 함수들의 연속으로 볼 수 있음.
객체지향 프로그래밍의 경우
클래스 디자인과 객체들의 관계를 중심으로 코드 작성이 이루어짐.
따라서, 상태, 멤버변수, 메서드 등이 긴밀한 관계를 가지고 있음.
특히, 멤버변수가 어떤 상태를 가지고 있는가에 따라 결과가 달라짐.
함수형 프로그래밍의 경우
값의 연산 및 결과 도출 중심으로 코드작성이 이루어짐.
함수는 인자로 받은 값을 별도로 저장하지 않고, 간결한 과정으로 처리하고 매핑하는데에 주 목적을 둠.
어느 하나가 우위에 있다고 말할 수 있다기보다는 필요에 따라 합쳐서 사용하기도 하고 원하는 목표에 따라 적절한 것을 잘 골라 사용해야함.
절차지향 프로그래밍:
절차지향 프로그래밍은 일련의 절차나 명령어들을 순서대로 실행하도록 하는 프로그래밍 방식입니다.
대표적인 언어로는 C언어가 있습니다.
장점으로는 코드가 단순하고 이해하기 쉬우며 실행 속도가 빠릅니다. 하지만 코드의 유지보수가 어렵고, 코드 재사용성이 낮습니다.
객체지향 프로그래밍:
객체지향 프로그래밍은 객체를 중심으로 프로그래밍하는 패러다임입니다.
객체는 데이터와 해당 데이터를 처리하는 메서드를 포함하고 있습니다. 대표적인 언어로는 Java, Python 등이 있습니다.
장점으로는 코드의 재사용성이 높아지며 유지보수가 용이해집니다. 객체 간의 관계를 잘 설계하면 코드의 확장성과 유연성이 좋아집니다.
하지만 초기 설계 단계에서 객체 간의 관계를 잘못 설계하면 코드의 복잡도가 높아질 수 있습니다.
함수형 프로그래밍:
함수형 프로그래밍은 함수를 중심으로 프로그래밍하는 패러다임입니다.
함수를 일급 객체로 취급하고, 함수의 입력과 출력만으로 모든 것을 처리하려는 프로그래밍 방식입니다. 대표적인 언어로는 Haskell, Lisp 등이 있습니다.
장점으로는 코드의 가독성이 좋고, 코드의 재사용성이 높아집니다. 함수형 프로그래밍은 부수 효과를 최소화하고, 상태를 변경하지 않으므로 코드의 안정성이 높아집니다.
하지만 함수형 프로그래밍은 초기 학습 비용이 높고, 높은 추상화 수준으로 인해 코드 이해가 어려울 수 있습니다.
각각의 프로그래밍 패러다임은 자신만의 장단점을 가지고 있습니다. 프로그램의 목적과 환경에 따라 적합한 패러다임을 선택하여 사용하는 것이 중요합니다.
https://velog.io/@majaeh43/%EC%A0%88%EC%B0%A8%EC%A7%80%ED%96%A5-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D