✅ 절차 지향 이란?
절차 지향
절차 지향 모델링은 프로그램을 기능중심으로 바라보는 방식으로 "무엇을 어떤 절차로 할 것인가?"가 핵심이 된다. 즉, 어떤 기능을 어떤 순서로 처리하는가에 초점을 맞춘다.
절차 지향 프로그래밍(Procedural Programming)
- 시간이나 사건의 흐름에 따른 프로그래밍
- 일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스를 탄다-> 요금을 지불한다 -> 학교에 도착
- 순차적인 처리가 중요시 되며 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법
절차 지향 프로그래밍의 장/단점
- 장점
✔️ 컴퓨터의 처리구조와 유사하여 실행 속도가 빠름
- 단점
✔️ 유지보수가 어려움 : 유기적으로 연결되어 있어 한 부분이 잘못되면 다른 부분까지 영향을 주므로 시스템 전체를 고쳐야 함
✔️ 실행 순서가 정해져 있으므로 순서가 바뀌면 동일한 결과를 보장하기 어려움
✔️ 코드를 분석하기 어려움
✔️ 디버깅이 어려움
✅ 객체 지향 이란?
객체 (Object)
- 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간
- 값을 저장할 변수와 작업을 수행할 메소드를 서로 연관된 것들끼리 묶어서 만든 것
- 의사나 행위가 미치는 대상 (사전적 의미)
- 구체적, 추상적 데이터의 단위 (학생, 회원, 생산, 주문, 배송)
객체 지향 프로그래밍 (Object Oriented Programming)
- 프로그래밍에서 필요한 데이터를 추상화(Abstraction)시켜 상태와(변수) 행위(메소드)를 가진 객체를 만들고 그 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 기법
객체 지향 프로그래밍의 장/단점
- 장점
✔️ 클래스를 재사용하거나 상속을 통해 확장함으로써 코드 재사용이 용이하고 반복적인 코드를 최소화하고 코드를 최대한 간결하게 표현 가능
✔️ 클래스 단위로 수정이 가능하므로 코드 변경을 최소화 하고 유지 보수가 편리함
✔️ 클래스 단위로 모듈화 시켜서 개발이 가능하므로 업무 분담이 편리하고 대형 프로젝트에 적합함
- 단점
✔️ 상대적으로 실행 속도가 느림
✔️ 객체의 수가 많아짐에 따라 용량이 커질 수 있음
✔️ 설계에 많은 시간이 소요 될 수 있음
객체 지향 프로그래밍의 4가지 특징
1. 추상화(Abstraction)
- 객체에서 불필요한 세부 사항들은 제거하고 가장 본질적이고 공통적인 부분만을 추출하여 표현한 것
- 객체의 공통적인 속성(변수)과 기능(메소드)을 추출하여 정의하는 것
- 예시로, 지하철 노선도는 서울의 지리를 추상화하여 보여주는 대표적인 예시로 볼 수 있음
- 추상화 구현 문법으로는 인터페이스(Interface)와 추상 클래스(Abstract Class)가 있음
- 추상화를 통해 객체가 수행해야 하는 역할을 규정하고, 실제적인 구현은 각 객체에서 하도록 역할과 구현을 분리할 수 있음
2. 상속(Inheritance)
- 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 문법
- 상위 클래스로부터 확장된 하위 클래스들이 상위 클래스의 속성과 기능을 간편하게 사용할 수 있음
- 클래스들 간의 공유하는 속성과 기능을 반복적으로 정의할 필요 없이 한 번만 정의해두고 재사용할 수 있어 반복적인 코드를 최소화 할 수 있음
- 추상화와 비슷하지만 다른 차이점은, 상속은 상위 클래스의 속성과 기능을 그대로 사용하거나 재정의(오버라이딩)하여 선택적으로 사용할 수 있는 반면, 인터페이스에 정의된 내용은 하위 클래스에서 반드시 정의 되어야 함
3. 다형성(polymorphism)
- 어떤 객체의 속성이나 기능이 상황에 따라 다른 역할을 수행할 수 있는 객체 지향의 특성
- 다형성의 대표적인 예로 오버라이딩(Overriding)과 오버로딩(Overloading)이 있음
- 오버라이딩: 부모 클래스의 메소드와 같은 이름으로 매개변수도 같으나 내부 소스를 재정의 하는 것
- 오버로딩: 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 경우에 따라 호출하여 사용하는 것
- 가장 중요한 다형성의 정의는, 한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 만드는 것 -> 상위 클래스 타입의 참조 변수로 하위 클래스의 객체를 참조할 수 있음
- 그러나 다형성 만으로는 높은 결합도를 해결할 수 없고, 그래서 등장한 것이 Spring의 의존관계 주입(Dependency Injection)이라는 개념임
4. 캡슐화(Encapsulation)
- 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
- 서로 관련있는 데이터와 기능들을 한 곳에 모아 관리하는 것
- 캡슐화의 목적은 데이터 보호(data protection)와 데이터 은닉(data hiding)에 있음
- 데이터 보호: 외부로부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉: 내부의 동작을 감추고 외부에는 필요한 부분만 노출
- 외부로부터 클래스에 정의된 속성과 기능들을 보호하고, 필요한 부분만 외부로 노출될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을 안전하게 지키고자 하는 목적
- 캡슐화를 구현하기 위한 방법은 접근제어자 및 getter/setter 메소드를 사용하는 방법이 있음
- 캡슐화를 사용하면, 객체 내부 동작을 외부로의 노출을 최소화하여 각 객체의 자율성을 높이고, 이를 통해 객체 간 결합도를 낮추어 객체 지향의 이점을 살릴 수 있음
캡슐화 Method 설계 방법
- 자신이 가지고 있는 속성에 대해서 상태를 변경하는 기능을 제공해야 한다.(Method)
- 실물 객체가 가진 기능을 모두 제공해야 한다. (자동차 렌탈/반납/주행거리 계산 등)
-각각의 Method는 서로 관련성이 있어야 한다 - 각 속성의 상대되는 기능을 제공해야 한다.
- 객체 안의 Method는 객체 안의 속성을 처리해야 하며, 다른 객체를 전달받아 해당 다른 객체에 정의된 속성을 직접 처리하면 안된다.
캡슐화 메소드 종류
- Getter/Setter - 내부 속성에 직접 접근하는 것이 아닌 Getter/Setter 메소드를 통해 접근
- CRUD Method - 데이터 처리를 위한 기본적인 CRUD 메소드를 제공
- Business Logic Method - 비지니스 로직 처리를 위한 메소드 제공
- 객체의 생명주기 처리 Method - destroy(), disconnect() 등 소멸에 대한 메소드
캡슐화 장점
-
객체지향의 패러다임 중 하나인 추상화를 제공한다. 실제로 메소드가 어떻게 동작하는지는 외부에서 알 필요가 없고 이를 단순히 호출하면 해당 기능을 실행할 수 있고 내부에서 알아서 동작한다. 이를 통해 객체 단위로 프로그램 설계가 가능하다.
-
재 사용성이 향상된다. 한 객체에 관련된 속성 및 메소드는 모두 캡슐화의 형태로 제공되므로, 객체의 모듈성과 응집도가 높아진다. 이를 통해 재 사용성이 높아진다.
-> 절차적 프로그래밍에서 메소드를 재사용하면, 메소드가 참조하는 전역 변수 및 내부에서 호출하는 메소드가 미치는 영향을 모두 체크해야 하지만, 객체의 경우는 단일 객체에만 영향을 주기때문에 재 사용성이 높다.
-
위 내용들로 인해 유지보수의 효율성이 향상 된다.
-
무결성을 유지할 수 있다. 기본적으로 속성은 Private으로 유지되고 Method를 통해 속성을 변경하므로, 메소드를 통해 속성을 변경할 때 매개변수에 대한 Validation 체크를 하므로 값에 대한 유효성을 가질 수 있다.
객체 지향과 절차 지향의 차이점
- 객체 지향과 절차 지향의 서로 반대의 개념이 아님
- 절차 지향은 순차적으로 실행에 초점, 객체 지향은 객체 간의 관계/조직에 초점을 두고 있음
- 절차 지향은 데이터 중심, 객체 지향은 기능 중심
✅ 함수형 프로그래밍 이란?
함수형 프로그래밍
- 선언형 프로그래밍(어떻게 할건지보다 무엇을 할 건지를 설명하는 방식) 패러다임을 따르는 방식으로, 순수 함수를 조합하고 소프트웨어를 만드는 방식을 말함
- 모든 것을 순수 함수로 나누어 문제를 해결하는 기법으로, 작은 문제를 해결하기 위한 함수를 작성하는 것
- 대입문이 없는 프로그래밍
함수형 프로그래밍 특징
순수 함수
- 동일한 입력에는 항상 같은 값을 반환해야 하는 함수
- 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
- Side Effect가 없는 함수
- Side Effect는
- 변수의 값이 변경됨
- 객체의 필드 값을 설정함
- 예외나 오류가 발생하며 실행이 중단됨
- 파일에 읽고 쓰는 작업
- 예시
int num = 1;
void add(int a) {
return a + num;
}
void add(int a, int b) {
return a + b;
}
비상태성, 불변성
- 함수 외부에서 데이터를 수정하지 않음
- 함수의 계산을 수행하는 동안 함수의 인자 값은 변하지 않음
일급 객체
- 일급 객체에 대한 내용은 해당 링크 참조 - 링크
- 함수형 프로그래밍에서 함수는 일급 객체로 취급 됨
고차 함수
- 함수를 인수로 받거나 함수를 반환하는 함수
- 함수를 인자로 전달할 수 있고 함수의 반환 값으로 또 다른 함수를 사용할 수 있음
참조 투명성
- 함수형 프로그래밍에서 함수는 항상 같은 동작을 함으로써, 동일한 인자에 대해 항상 동일한 결과를 반환함
함수형 프로그래밍의 장/단점
-
장점
✔️ 사용하는 모든 데이터가 변경 불가능(immutable)하고 함수는 부수 효과를 가지고 있지 않기 때문에 동시성과 관련된 문제를 원천적으로 차단
✔️ 함수는 입력과 그에 대한 출력만을 책임지기 때문에 테스트가 쉽고 가독성이 좋음
✔️ 고차 함수로 인해 함수들 간의 결합, 조합이 간결해지며, 익명 함수를 사용할 수 있음
✔️ 코드 재사용성이 높음
✔️ 깔끔하고 유지보수가 용이함
✔️ 프로그램의 동작을 예측하기 쉬움
-
단점
✔️ 함수가 많아질수록 함수를 조합하기 복잡해지며 꾸주한 리팩토링이 필요함
✔️ 상태가 없으므로 함수형 프로그래밍만으로 프로그램 작성할 수 없음
✔️ 각각의 함수들을 파악하고 유지 관리가 어려울 수 있음
참고 Reference