객체지향 분석(Object-Oriented Analysis, OOA)
객체지향 분석(Object-Oriented Analysis, OOA)은 소프트웨어 개발에서 사용되는 분석 기법 중 하나입니다. 이 기법은 현실 세계의 객체와 그들 간의 상호작용을 중심으로 소프트웨어 시스템을 분석하고 모델링하는 방법론을 제공합니다. 객체지향 분석은 시스템의 요구사항을 이해하고 명세화하는 과정에서 사용됩니다.
개체지향 프로그래밍(Object-Oriented Programming, OOP)
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍 패러다임 중 하나로, 현실 세계의 객체를 소프트웨어의 구성 요소로 모델링하여 프로그램을 작성하는 방법론입니다. 객체지향 프로그래밍은 다음과 같은 주요 특징을 가지고 있습니다:
- 클래스(Class)와 객체(Object): 객체지향 프로그래밍에서는 현실 세계의 객체를 클래스(class)라는 추상화된 틀로 정의하고, 이 클래스로부터 생성된 실체를 객체(object)라고 합니다. 클래스는 객체를 생성하기 위한 템플릿으로서, 객체는 클래스의 인스턴스입니다.
- 캡슐화(Encapsulation): 캡슐화는 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어 객체 내부의 상태를 보호하는 개념입니다. 이를 통해 데이터의 은닉화가 이루어지고 외부에서 직접 접근할 수 없도록 합니다.
- 상속(Inheritance): 상속은 한 클래스가 다른 클래스의 특성(속성과 메서드)을 물려받는 것을 의미합니다. 이를 통해 코드의 재사용성이 증가하고 클래스 간의 계층 구조가 형성됩니다.
- 다형성(Polymorphism): 다형성은 같은 이름의 메서드가 다른 형태로 동작하는 능력을 말합니다. 다형성을 통해 코드의 유연성이 증가하고 다양한 상황에 대응할 수 있습니다.
객체지향 프로그래밍은 큰 규모의 소프트웨어를 개발할 때 코드의 재사용성, 유지보수성, 확장성 등을 향상시킬 수 있는 장점을 제공합니다. 또한 현실 세계의 개념을 직관적으로 모델링하여 프로그램을 이해하고 개발할 수 있도록 도와줍니다. Java, C++, Python 등 다양한 프로그래밍 언어에서 객체지향 프로그래밍을 지원하고 있습니다.
객체지향 구성요소
- 클래스(Class):
- 클래스는 객체를 생성하기 위한 틀 또는 설계도입니다.
- 클래스는 객체의 속성과 메서드를 정의하는데 사용됩니다.
- 객체들 간에 공통된 특성과 동작을 가지고 있으며, 이를 정의하기 위해 사용됩니다.
- 예를 들어, "사람" 클래스에는 이름, 나이와 같은 속성(attribute)과 걷다, 먹다와 같은 동작(method)이 정의될 수 있습니다.
- 객체(Object):
- 클래스의 인스턴스를 의미합니다.
- 클래스로부터 생성된 실체로, 메모리에 할당되어 사용됩니다.
- 각 객체는 고유한 상태를 갖고 있으며, 해당 클래스에서 정의된 속성과 메서드를 가집니다.
- 예를 들어, "사람" 클래스의 인스턴스로서의 객체는 실제 사람에 해당합니다.
- 속성(Attribute):
- 객체의 상태를 나타내는 데이터를 의미합니다.
- 클래스에서 정의된 속성은 각 객체가 가지고 있는 고유한 값을 나타냅니다.
- 예를 들어, "사람" 클래스의 속성으로는 이름, 나이, 성별 등이 있을 수 있습니다.
- 메서드(Method):
- 객체가 수행하는 동작을 정의하는 함수를 의미합니다.
- 클래스에서 정의된 메서드는 객체의 상태를 변경하거나 특정 작업을 수행합니다.
- 예를 들어, "사람" 클래스의 메서드로는 걷다, 먹다, 말하다 등이 있을 수 있습니다.
- 메시지(Message):
- 객체들 간에 상호작용을 나타내는 통신 단위입니다.
- 메시지는 한 객체가 다른 객체에게 특정한 작업을 수행하도록 요청하는 것을 의미합니다.
- 예를 들어, "사람" 객체가 "먹다" 메서드를 호출하는 것은 "먹다"라는 작업을 수행하도록 "음식" 객체에게 메시지를 보내는 것입니다.
객체지향의 5가지 특징
- 캡슐화(Encapsulation): 객체의 상태와 행위를 하나로 묶고, 외부에서의 직접적인 접근을 제한하는 것을 의미합니다.
- 상속(Inheritance): 한 클래스가 다른 클래스의 특성(속성과 메서드)을 상속받는 것을 의미합니다.
- 다형성(Polymorphism): 같은 이름의 메서드가 다른 형태로 동작할 수 있는 능력을 말합니다.
- 추상화(Abstraction): 객체의 공통된 특성을 추출하여 클래스로 정의하는 과정을 의미합니다.
- 정보은닉(Information Hiding): 객체의 내부 구현을 외부로부터 숨기고 접근을 제한하는 것을 의미합니다.
객체지향 기법에서의 관계성
- Is member of (속하는 것): 이 용어는 한 객체가 다른 객체의 구성원이거나 소속되어 있는 경우를 나타냅니다. 이것은 객체가 다른 객체의 일부분으로 간주되는 것을 의미합니다.
- Is part of (일부분인 것): 이 용어는 한 객체가 다른 객체의 일부분으로 포함되어 있는 경우를 나타냅니다. 이것은 전체-부분 관계를 나타내며, 전체 객체가 파괴되면 일부분 객체도 파괴될 수 있습니다.
- Is a (일종의 것): 이 용어는 상속 관계를 나타냅니다. 한 클래스가 다른 클래스의 일종이거나 특수한 형태인 경우를 나타내며, 이를 통해 클래스 간의 일반화와 특수화 관계를 표현합니다.
객체지향 설계원칙SOLID
SOLID는 객체지향 설계의 다섯 가지 기본 원칙을 나타내는 약어입니다. 각 원칙은 소프트웨어 설계를 더욱 견고하고 유연하게 만들어주며, 유지보수성을 향상시키고 확장성을 높입니다. 이러한 원칙은 로버트 C. 마틴(Robert C. Martin)에 의해 소개되었습니다. 다음은 SOLID의 다섯 가지 원칙입니다:
- 단일 책임 원칙(Single Responsibility Principle, SRP):
- 클래스는 하나의 책임만을 가져야 합니다. 즉, 클래스는 변경되어야 할 이유가 하나여야 합니다. 이는 클래스의 응집성을 높이고 유지보수성을 향상시킵니다.
- 개방-폐쇄 원칙(Open-Closed Principle, OCP):
- 확장에는 열려 있고, 수정에는 닫혀 있어야 합니다. 즉, 기존의 코드를 변경하지 않고 새로운 기능을 추가할 수 있어야 합니다. 이는 코드의 안정성을 유지하고 코드 변경으로 인한 부작용을 방지합니다.
- 리스코프 치환 원칙(Liskov Substitution Principle, LSP):
- 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 합니다. 즉, 파생 클래스는 부모 클래스의 기능을 제대로 수행할 수 있어야 합니다. 이는 상속을 안전하게 사용하고 일관성 있는 동작을 보장합니다.
- 인터페이스 분리 원칙(Interface Segregation Principle, ISP):
- 클라이언트는 자신이 사용하지 않는 메서드에 의존하도록 강요받지 않아야 합니다. 즉, 인터페이스는 클라이언트의 요구에 따라 작게 분리되어야 합니다. 이는 인터페이스의 책임을 명확히 분리하여 의존성을 최소화하고 클래스의 응집성을 높입니다.
- 의존 역전 원칙(Dependency Inversion Principle, DIP):
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안 됩니다. 두 모듈 모두 추상화에 의존해야 합니다. 즉, 의존성 주입(Dependency Injection)을 통해 상위 수준 모듈이 하위 수준 모듈에 종속되지 않도록 해야 합니다. 이는 모듈 간의 결합도를 줄이고 재사용성을 높입니다.