프로그래밍/JAVA
객체 지향 프로그램이란,
YERIEL
2022. 1. 16. 12:23
객체 지향 프로그램
객체지향이란, 현실 세계의 개체(Entity)를 기계의 부품처럼 하나의 객체(Object)로 만들어, 기계쩍인 부품들을 조립하여 제품을 만들듯이 소프트웨어를 개발할 때에도 객체들을 조립해서 작성할 수 있는 기법.
- 객체지향 기법은 구조적 기법의 문제점으로 인한 소프트웨어 위기의 해결책으로 채택되어 사용되고 있다.
- 복잡한 구조를 단계적, 계층정으로 표현하고, 멀티미디어 데이터 및 병렬 처리를 지원한다.
- 현실 세계를 모형화하므로 사용자와 개발자가 쉽게 이해할 수 있다.
객체 지향 프로그램의 장점
- 소프트웨어의 재사용 및 확장이 용이하다.
- 리팩토링 (유지보수)에 용이하다.
- 디버깅이 쉽다. - 객체 단위로 코드가 나뉘어 작성되기 때문
- 업무 분담이 용이하다. - 클래스 단위로 모듈화 시켜서 개발할 수 있기 때문
객체 지향 프로그램의 단점
- 처리 속도가 상대적으로 느리다.
- 객체가 많으면 용량이 커질 수 있다.
- 설계 시 많은 시간과 노력이 필요하다.
객체지향의 주요 구성 요소와 개념
1. 객체 (Entity)
객체란, 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것.
- 객체는 속성과 동작으로 구성되어 있는데, 속성은 필드(field), 동작은 메소드(method)라고 부른다.
- 속성(Attribute) = 필드(Field) = 데이터 = 상태 = 변수 = 상수 = 자료 구조 : 객체가 가지고 있는 정보로 속성이나 상태, 분류 등을 나타낸다.
- 동작(Operation) = 메소드(Method) = 서비스(Service) = 연산 : 객체가 수행하는 기능으로 객체가 갖는 데이터(속성, 상태)를 처리하는 알고리즘이다.
- 객체는 독립적으로 식별 가능한 이름을 가지고 있다.
- 객체가 가질 수 있는 조건을 상태(State)라고 하는데, 일반적으로 상태는 시간에 따라 변한다.
- 객체와 객체는 상호 연관성에 의한 관계가 형성된다.
- 객체가 반응할 수 있는 메시지(Message)의 집합을 행위라고 하며, 객체는 행위의 특징을 나타낼 수 있다.
- 객체는 일정한 기억장소를 가지고 있다.
- 객체의 메소드는 다른 객체로부터 메시지를 받았을 때 정해진 기능을 수행한다.
객체 모델링 (Object Modeling)이란, 현실 세계의 객체를 소프트웨어 객체로 설계하는 것. 현실 세계 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 메소드로 정의하는 과정.
2. 클래스 (Class)
클래스란, 공통된 속성과 연산(행위)를 갖는 객체의 집합. 객체의 일반적인 타입(Type)을 의미.
- 클래스는 각각의 객체들이 갖는 속성과 연산을 정의하고 있는 틀이다.
- 클래스는 객체지향 프로그램에서 데이터를 추상화하는 단위이다.
- 클래스에 속한 각각의 객체를 인스턴스(Instance)라고 하며, 클래스로부터 새로운 객체를 생성하는 것을 인스턴스화(Instantiation)라고 한다.
- 동일 클래스에 속한 각각의 객체(인스턴스)들은 공통된 속성과 행위를 가지고 있으면서, 그 속성에 대한 정보가 서로 달라서 동일 기능을 하는 여러 가지 객체를 나타내게 된다.
- 최상위 클래스는 상위 클래스를 갖지 않는 클래스를 의미한다.
- 슈퍼 클래스(Super Class)는 특정 클래스의 상위(부모) 클래스이고, 서브 클래스(Sub Class)는 특정 클래스의 하위(자식) 클래스를 의미한다.
3. 캡슐화 (Encapsulation)
캡슐화란, 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것. 외부 객체는 객체 내부의 구조를 알지 못하여 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있음.
- 필드와 메소드를 캡슐화하여 보호하면, 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 막을 수 있다.
- 캡슐화된 객체는 인터페이스를 제외한 세부 내용이 은폐(정보 은닉)되어 외부에서의 접근이 제한적이기 때문에 외부 모듈의 변경으로 인한 파급 효과가 적다.
- 캡슐화된 객체들은 재사용이 용이하다.
- 객체들 간의 메시지를 주고받을 때 상대 객체의 세부 내용은 알 필요가 없으므로 인터페이스가 단순해지고, 객체 간의 결합도가 낮아진다.
4. 상속 (Inheritance)
상속이란, 부모 클래스의 멤버를 자식 클래스에게 물려주는 것.
- 상속을 이용하면 하위 클래스는 상위 클래스의 모든 속성과 연산을 자신의 클래스 내에서 다시 정의하지 않고서도 즉시 자신의 속성으로 사용할 수 있다.
- 하위 클래스는 상위 클래스로부터 상속받은 속성과 연산 외에 새로운 속성과 연산을 첨가하여 사용할 수 있다.
- 소프트웨어의 재사용(Reuse) - 이미 잘 개발된 클래스를 재사용하기 때문에 코드의 중복을 줄여주고 효율적이고, 개발 시간을 절약시켜준다.
- 다중 상속(Multiple Inheritance) : 한 개의 클래스가 두 개 이상의 상위 클래스로부터 속성과 연산을 상속받는 것이다.
- 프로그램에서는 자식이 부모를 선택한다. 자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 선택하여 extends 뒤에 부모 클래스를 기술한다.
5. 다형성
다형성이란, 하나의 객체가 여러 가지 타입을 가질 수 있는 것. 메시지에 의해 객체(클래스)가 연산을 수행하게 될 때 하나의 메시지에 대해 각각의 객체(클래스)가 가지고 있는 고유한 방법(특성)으로 응답할 수 있는 능력.
- 객체(클래스)들은 동일한 메소드명을 사용하며 같은 의미의 응답을 한다.
- 응용 프로그램 상에서 하나의 함수나 연산자가 두 개 이상의 서로 다른 클래스의 인스턴스들을 같은 클래스에 속한 인스턴스처럼 수행할 수 있도록 하는 것이다.
class Parent {...}
class Child extends Parent {...}
Parent parent = new Parent() (o)
Child child = new Child() (o)
Parent p = new Child() (o)
Child c = new Parent() (x)
6. 연관성
연관성이란, 두 개 이상의 객체(클래스)들이 상호 참조하는 관계.
- is member of (연관화, Association) : 2개 이상의 객체가 상화 관련되어 있음을 의미
- is instance of (분류화, Classfication) : 동일한 형의 특성을 갖는 객체들을 모아 구성하는 것
- is part of (집단화, Aggregation) : 관련 있는 객체들을 묶어 하나의 상위 객체를 구성하는 것
- is a
- (일반화, Generalization) : 공통적인 성질들로 추상화한 상위 객체를 구성하는 것
- (특수화/상세화, Specialization) : 상위 객체를 구체화하여 하위 객체를 구성하는 것
객체지향 설계 원칙
- SRP (Single Responsiblity Principle, 단일 책임 원칙) : 객체는 단 하나의 책임만 가져야 한다는 원칙. 응집도는 높고, 결합도는 낮게 설계하는 것을 의미한다. 변경사항이 있을 때 애플리케이션 파급 효과가 적으면 SRP 원칙을 잘 따랐다고 본다.
- OCP (Open-Closed Principle, 개방-폐쇄 원칙) : 기존의 코드를 변경하지 않고 기능을 추가할 수 있도록 설계해야 한다는 원칙. 확장에는 열려있고, 변경에는 닫혀있어야 한다는 원칙. 요구사항에 추가사항이나 변경사항이 있더라도 기존 구성요소는 변경이 일어나지 않아야 하며, 기존 구성요소를 확장하여 재사용 가능하도록 해야한다. 공통 인터페이스를 하나의 인터페이스로 묶어 캡슐화하는 방법이 태표적이다.
- LSP (Liskov Substitution Principle, 리스코프 치환 원칙) : 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다는 설계 원칙. 자식 클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하도록 해야한다. 똑같은 연산을 하지만 약간씩 다르다면 인터페이스 상속의 방법을 사용한다.
- ISP (Interface Segregation Principle, 인터페이스 분리 원칙) : 자신이 사용하지 않는 인터페이스와 의존 관계를 맺거나 영향을 받지 않아야 한다는 원칙. 어떤 클래스가 다른 클래스에 종속될 때에는 최소한의 인터페이스만을 사용해야한다. 단일 책임 원칙이 객체가 갖는 하나의 책임이라면, 인터페이스 분리 원칙은 인터페이스가 갖는 하나의 책임이다.
- DIP (Dependency Inversion Principle, 의존 역전 원칙) : 각 객체들 간의 의존 관계가 성립될 때, 추상성이 낮은 클래스보다 추상성이 높은 클래스와 의존 관계를 맺어야 한다는 원칙. 구현 클래스가 아니라 인터페이스에 의존하라는 의미이다. 일반적으로 인터페이스를 활용하면 이 원칙은 준수된다.