프로그래밍 패러다임 | Part2. 명령형과 객체지향형 프로그래밍
[index]
1. 명령형 프로그래밍이란?
2. 객체지향형 프로그래밍이란?
- 2-1 객체지향형 프로그래밍이란?
- 2-2. 객체 지향 프로그래밍의 특징 4가지
- 2-3. 객체 지향 프로그래밍 설계 원칙 SOLID
- 2-4. SOLID 원칙을 적용하는 예시
1. 명령형 프로그래밍이란?
명령형 프로그래밍은 프로그램이 어떻게 수행되어야 하는지를 명시적으로 정의하는 프로그래밍 패러다임 중 하나입니다. 이는 컴퓨터에게 단계별로 실행해야 할 명령을 명시하고 상태 변화를 통해 원하는 결과를 얻어내는 방식으로 작동합니다. 주로 명령형 프로그래밍에서는 변수, 할당문, 제어문(조건문, 반복문), 서브루틴 등을 사용하여 작성됩니다. 프로그램이 어떻게 실행되어야 하는지를 명확하게 기술하는 것이 특징이며, 절차적 프로그래밍 언어(Procedural Programming Language)와도 밀접한 관련이 있습니다.
명령형 프로그래밍에서는 개발자가 직접 컴퓨터의 동작을 제어하기 때문에 세부적인 구현에 대한 명확한 이해가 필요합니다. 그러나 이로 인해 개발자는 프로그램의 흐름과 상태를 명확하게 파악할 수 있고, 세밀한 최적화가 가능하다는 장점이 있습니다.
이러한 명령형 프로그래밍 패러다임은 절차적 언어뿐만 아니라 객체지향 언어에서도 사용되며, C, Java, Python 등 다양한 프로그래밍 언어에서 지원하고 있습니다.
2. 객체지향형 프로그래밍이란?
2-1. 객체 지향형 프로그래밍이란?
객체 지향 프로그래밍은 소프트웨어를 개발하는 패러다임 중 하나로, 프로그램을 '객체'라 불리는 독립적인 모듈로 나누어 구성합니다. 각 객체는 데이터와 이를 처리하기 위한 메서드를 포함하며, 이러한 객체들 간에는 메시지 전달을 통해 상호 작용합니다.
2-2. 객체 지향 프로그래밍의 특징 4가지
1. 추상화(abstaction)
복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것
추상화는 복잡한 시스템이나 객체에서 중요한 특성을 간추려내는 개념입니다. 이를 통해 현실 세계의 복잡성을 단순화하여 모델링하고, 핵심적인 특성에 집중하여 설계할 수 있습니다.
2. 캡슐화(encapsulation)
객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉하는 것을 말합니다.
객체의 상세한 내부 구현을 숨기고 필요한 부분만을 노출하는 것을 의미합니다. 이를 통해 객체의 동작 방식을 외부에서 신경 쓰지 않고 사용할 수 있으며, 이는 코드의 모듈성과 유지보수성을 향상시킵니다.
3. 상속성(inheritance)
상위 클래스의 특성을 하위 클래스가 이어받아서 재사용하거나 추가, 확장하는 것을 말합니다.
상속은 이미 존재하는 클래스를 기반으로 새로운 클래스를 만들어 코드의 재사용성을 높이는 개념입니다. 부모 클래스의 특성을 자식 클래스가 물려받아 사용할 수 있어서 코드의 중복을 방지하고 구조를 계층화하여 유지보수를 용이하게 합니다.
4. 다형성(polymorphism)
하나의 메서드나 클래스가 다양한 방법으로 동작하는 것을 말합니다.
다형성은 같은 인터페이스를 공유하는 다양한 객체를 처리할 수 있는 능력을 의미합니다. 이는 메서드 오버로딩과 메서드 오버라이딩을 통해 구현되며, 코드의 유연성을 높여 다양한 상황에 대처할 수 있게 합니다.
대표적으로 오버로딩, 오버라이딩이 있습니다.
- 오버로딩(overloading)이란?
오버로딩은 같은 메서드 이름을 가지면서 매개변수의 개수나 타입을 다르게 정의하는 것을 말합니다. 즉, 동일한 메서드 이름을 사용하지만 매개변수의 시그니처가 다르게 정의되어 있습니다. 컴파일러는 호출된 메서드의 매개변수에 따라 적절한 메서드를 선택합니다. 이를 통해 동일한 기능을 수행하는 메서드를 명시적으로 표현할 수 있습니다.
-> 정적 다형성
- 오버라이딩(overriging)이란?
오버라이딩은 상위 클래스에서 정의된 메서드를 하위 클래스에서 재정의하는 것을 의미합니다. 즉, 상속 관계에 있는 클래스 간에 같은 메서드 시그니처를 가져야 하며, 하위 클래스에서는 부모 클래스의 메서드를 재정의하여 사용합니다. 이를 통해 다형성이 구현되어, 상위 클래스 타입의 참조 변수로 하위 클래스의 객체를 다룰 수 있습니다.
-> 동적 다형성
2-3. 객체지향 프로그래밍 설계 원칙 SOLID
SOLID는 객체지향 프로그래밍 설계 원칙으로 다섯 가지 원칙을 의미합니다. 각 원칙은 소프트웨어 설계에서 유연성, 확장성, 유지보수성을 향상시키기 위한 가이드라인으로 사용됩니다
Single Responsibility Principle 단일 책임 원칙(SRP)
하나의 클래스는 하나의 책임만 가져야 합니다. 즉, 클래스는 변경의 이유가 하나여야 하며, 이는 클래스를 이해하고 변경할 때의 복잡성을 줄여줍니다.
Open Closed Principle 개방- 폐쇄 원칙(OCP)
확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 합니다. 새로운 기능이 추가될 때 기존의 코드를 수정하지 않고 확장할 수 있도록 설계해야 합니다.
-> 기존의 코드는 잘 변경되지 않도록(폐쇄적으로)하면서 확장은 쉽게(개방적으로)되도록 해야합니다.
Liskov Substitution Principle 리스코프 치환 원칙(LSP)
상위 타입의 객체는 하위 타입의 객체로 대체될 수 있어야 합니다. 이는 상속 관계에서 하위 클래스가 상위 클래스의 기능을 무시하거나 변경하지 않고 사용할 수 있도록 보장합니다.
Interface Segregation Principle 인터페이스 분리 원칙(ISP)
클라이언트는 자신이 사용하지 않는 메서드에 의존하며, 인터페이스는 그 인터페이스를 구현하는 클래스들이 사용할 메서드들만 포함해야 합니다.
Dependency Inversion Principle 의존 역전 원칙(DIP)
고수준 모듈은 저수준 모듈에 의존하면 안되며, 둘 모두 추상화에 의존해야 합니다. 또한, 추상화는 세부 구현에 의존해서는 안 됩니다. 이를 통해 시스템의 유연성과 확장성을 높일 수 있습니다.
2-4. SOLID 원칙을 적용하는 예시
예를 들어, 주문 시스템을 만들 때 SOLID 원칙을 적용할 수 있습니다. 주문 시스템에서는 주문을 생성하고 저장하는 책임이 있는 클래스가 있을 겁니다. 이때 SRP를 적용하면 주문 생성과 저장을 위한 두 개의 클래스로 분리할 수 있습니다. 또한, OCP를 고려하여 새로운 결제 방법을 추가하려면 기존 코드를 수정하지 않고 새로운 결제 클래스를 추가할 수 있습니다.
또한, LSP를 적용하여 각 결제 방법 클래스가 특정 기능을 무시하거나 변경하지 않고도 사용될 수 있도록 설계할 수 있습니다. ISP를 고려하여 각 결제 방법에 필요한 인터페이스를 정의하고, DIP를 적용하여 주문 생성 클래스가 구체적인 결제 방법 클래스에 의존하지 않고 추상화에 의존하도록 만들 수 있습니다. 이런 식으로 SOLID 원칙을 적용하면 시스템이 더 유연하고 확장 가능해집니다.
'Web Development > Front End 관련 개념 정리' 카테고리의 다른 글
프로그래밍 패러다임 | Part1. 선언형과 함수형 프로그래밍 (0) | 2023.12.18 |
---|---|
TNT : Tailwind CSS + Next.js + TypeScript 조합에 대한 분석과 실제 프로젝트에서의 경험 공유 (0) | 2023.12.09 |
[Next.js] Next.js | 기술적 분석 + 사용해보며 느낀점 (1) | 2023.12.09 |
[FE] 상태관리란? (0) | 2023.11.28 |
SPA(Single Page Application)란? (0) | 2023.10.10 |