객체 지향 프로그래밍(OOP)이란?
객체 지향 프로그래밍이란, 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화하여 상태와 행위를 가진 객체로 만들고, 그 객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.
◈ 프로그래밍 패러다임
프로그래밍 패러다임은 프로그램을 작성하는데 사용되는 전반적인 접근 방식이라고 볼 수 있습니다. 프로그래밍 패러다임은 언어나 도구에 따라 다르며, 프로그램의 구조와 동작을 결정하는 원칙과 규칙을 정의합니다. 프로그래밍 패러다임은 절차적, 객체 지향, 함수형 프로그래밍 등이 있습니다.
절차지향 프로그래밍
프로그램을 순차적인 절차들의 모음으로 구성하는 프로그래밍 패러다임입니다. 프로그램의 실행 흐름들 명령어의 순차적인 실행으로 제어합니다. 프로시저와 함수의 호출에 초점을 맞추어 프로그램을 작성합니다.
함수형 프로그래밍
함수의 사용과 조합에 중점을 둔 프로그래밍 패러다임입니다. 함수를 값으로 취급하고, 함수들을 조합하여 원하는 결과를 도출하는 방식으로 프로그램을 작성합니다.
논리형 프로그래밍
논리적인 규칙과 사실들의 집합으로 구성하여 문제를 해결하는 프로그래밍 패러다임입니다. 주요 목표를 명시하고, 시스템이 주어진 규칙과 사실들을 기반으로 추론하여 목표를 달성합니다.
◈ 객체 지향 프로그래밍 등장
이전에는 순차적인 단계로 프로그램을 구성하는 방식이 주로 사용되었습니다. 그러나 이러한 방식은 프로그램의 규모가 커질수록 코드의 가독성과 유지보수성이 저하되는 문제가 있었습니다. 객체 지향 프로그래밍은 이런 문제를 해결하기 위해 등장하였습니다.
객체 지향 프로그래밍은 프로그램을 여러 개의 객체로 나누고, 각 객체는 데이터와 그 데이터를 조작하고 처리하는 메서드로 이루어지며, 객체들은 서로 상호작용하여 기능을 수행합니다. 이를 통해 코드를 모듈화하고 필요한 경우 객체를 재사용할 수 있습니다. 이는 코드의 재사용성과 유지보수성을 높여줍니다.
◈ 객체 지향 프로그래밍의 특징
객체 지향 프로그래밍은 크게 4가지의 특징이 있습니다.
추상화(Abstraction)
객체들의 공통된 속성과 동작을 추출하여 모델을 정의하는 것을 말합니다. 클래스(class)를 통해 추상화를 구현하며, 클래스는 객체의 공통적인 특성을 정의하고, 인스턴스화하여 실제 객체를 생성할 수 있습니다. 추상화를 통해 복잡한 현실 세계를 단순화하고 모델링할 수 있습니다.
캡슐화(Encapsulation)
객체는 관련된 데이터와 그 데이터를 처리하는 메서드를 함께 묶어 캡슐화합니다. 이를 통해 데이터와 메서드가 함께 존재하고 외부에서 직접 접근하지 못하도록 제한할 수 있습니다. 데이터를 보호하고 응집도 높은 객체를 만들어 코드의 가독성과 유지보수성을 높이는 장점이 있습니다.
상속성(Inheritance)
객체는 다른 객체로부터 상속을 받을 수 있습니다. 상속을 통해 이미 정의된 클래스의 속성과 메서드를 자식 클래스에서 재사용할 수 있습니다. 이를 통해 코드의 중복을 줄이고, 클래스 간의 계층 구조를 구성하여 구조적이고 유연한 코드를 작성할 수 있습니다.
다형성(Polymorphism)
다형성은 같은 이름의 메서드가 다른 방식으로 동작하는 것을 말합니다. 다향성은 코드의 재사용성과 확장성을 높여줍니다. 일관된 방식으로 객체들을 다룰 수 있으며, 다양한 타입의 객체들을 한 번에 처리할 수 있는 일반화된 코드를 작성할 수 있습니다. 오버라이딩과 오버로딩이 있습니다.
오버라이딩(Overriding) : 부모 클래스의 메서드를 자식 클래스에서 재정의
오버로딩(Overloading) : 같은 이름의 메서드를 여러 개 정의하며, 매개변수에 따라 다르게 호출하여 사용
◈ 객체지향 설계 원칙 SOLID
SOLID는 객체지향 프로그래밍/설계의 5가지 기본 원칙으로 각 원칙의 머릿글자를 딴 약어입니다.
단일 책임 원칙 (Single Responsibility Principle, SRP)
- 하나의 클래스는 단 하나의 책임만 가져야 합니다.
- 클래스가 변경되어야 하는 이유는 오직 하나여야 하며, 변경의 이유는 클래스의 단일 책임과 관련되어야 합니다.
개방-폐쇄 원칙 (Open-Closed Principle, OCP)
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 합니다.
- 새로운 기능을 추가할 때는 기존의 코드를 수정하지 않고 확장할 수 있는 방법을 사용해야 합니다.
리스코프 치환 원칙 (Liskov Substitution Principle, LSP)
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 합니다.
- 즉, 부모 클래스 타입의 객체를 자식 클래스 타입으로 대체해도 기능적으로 문제 없어야 합니다.
인터페이스 분리 원칙 (Interface Segregation Principle, ISP)
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫습니다.
- 즉, 인터페이스는 클라이언트의 요구에 따라 작게 나누어져야 합니다.
의존 역전 원칙 (Dependency Inversion Principle, DIP)
- 추상화에 의존하도록 설계해야지, 구체화에 의존하면 안됩니다.
- 구체적인 구현에 의존하는 것보다 추상화에 의존함으로써 유연하고 재사용 가능한 코드를 작성할 수 있습니다.
◈ 객체 지향 프로그래밍 장/단점
장점
- 코드의 재사용이 용이합니다. 상속을 통해 코드의 재사용을 높임.
- 유지보수 용이 및 확장이 쉽습니다. 프로그램을 추가, 수정하더라도 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉬움.
- 대형 프로젝트에 적합합니다.
단점
- 절차지향에 비해 실행 속도가 느립니다. 컴퓨터의 처리구조와 비슷한 절차지향보다 상대적으로 느림.
- 객체가 많아지면 용량이 증가할 수 있습니다.
- 설계에 많은 노력과 시간이 요구됩니다.
'Etc' 카테고리의 다른 글
[자료구조] 스택(Stack)과 큐(Queue) (0) | 2023.04.28 |
---|---|
[자료구조] 자료구조(Data Structure)란? (0) | 2023.04.27 |
댓글