OOP란?
객체지향이론의 기본 개념은 '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 보든 사건들은 사물 간의 상호작용이다' 라는 것이다.
객체지향 프로그래밍 패러다임은 어떤 개념에 대한 자료형과 함수를 '객체' 형태로 함께 묶어서 관리하기 위해 등장했다.
객체 간의 독립성이 생기고, 중복되는 코드의 양이 줄어들어 유지보수에 용이하다는 장점이 있다.
1. 캡슐화 (Encapsulation)
- 객체의 속성을 보호하기 위해 (은닉화를 위해) 사용한다. 즉 객체 내부의 어떤 동작에 대한 구현이 어떻게 되어 있는지 감추어 외부에서 객체를 손상시키는 일을 방지할 수 있다.
- 정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계할 수 있다.
예) 만약 외부에서 나이라는 필드에 직접 접근한다면 0보다 낮은 값을 줄 수도 있는데 이 경우에는 객체의 무결성이 깨질 수 있다. 캡슐화를 통해 외부에서 액세스 방법을 지정하고, 직접 접근을 막고, 접근 전 부가적인 처리를 요구하며, 정보를 은닉하여 외부에서는 세부 내용에 집중하지 않도록 한다.
ex) 접근제한자를 private으로 두거나, getter/setter를 이용해 접근하도록
setter는 접근 범위에 한해서 메소드로 대입 전 유효성 검사를 하고 대입되게 하기 위해 사용되며 getter는 변수들의 외부 노출을 제한하고 노출 범위를 정해주며 한 클래스의 여러 값들 중 필요한 값만 가져올 수 있게 한다.
접근 제어자
public: 제한 없음
protected: 같은 패키지 내 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근 가능
default: 같은 패키지 내에서만 접근 가능
private: 해당 클래스에서 만 접근 가능
모듈화(Modularization)란 소프트웨어를 각 기능별로 나누는 것을 말한다. 각각의 기능별로 나눠진 모듈화의 결과를 모듈(Module)이라고 한다. 좋은 모듈화는 목적에 맞는 기능만으로 모듈을 나누는 것이다.
각각의 모듈은 주어진 기능만을 독립적으로 수행하며 다른 모듈과 적게 연관돼야 한다.
즉, 독립성이 높은 모듈일수록 좋으며 모듈의 독립성은 모듈의 결합도(Coupling)와 응집도(Cohesion)로 측정한다.
- 결합도(Coupling)
결합도는 서로 다른 모듈 간에 상호 의존하는 정도 또는 연관된 관계를 의미한다.
결합도가 높은 클래스는 다른 클래스와 연관된 정도가 높으며, 해당 클래스를 변경하면 연관된 클래스도 변경해야 되며, 클래스를 재사용하기 어렵다. 따라서 낮은 결합도를 가질수록 좋다.
- 응집도(Cohesion)
모듈의 독립성을 나타내며 정보 은닉의 확장 개념이다. 즉, 모듈이 독립적인 기능을 수행하는지 또는 하나의 모듈이 하나의 기능을 수행하는지를 나타내며 모듈이 높은 응집도를 가질수록 좋다.
2. 추상화 (Abstraction)
- 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출하는 것.
- 구체적인 개념을 정의하는 것이 아닌 추상적 개념으로 작성하여 설계에 유연한 변경을 할 수 있도록 한다.
3. 상속 (Inheritance)
- 상속이란 상위개념의 특징을 하위 개념이 물려받는 것을 의미한다.
하나의 클래스가 가지고 있는 특징 (데이터와 함수)들을 그래도 다른 클래스가 물려주고자 할 때 상속을 사용 - 최상위 클래스의 구조를 보고 하위 클래스의 동작을 이해할 수 있어 프로그램 구조에 대한 이해도를 향상시킬 수 있다.
- 재사용성 향상
- 일관된 형태의 객체를 추가 할 수 있어 확장성과 유지보수성이 좋음
- 단지 '코드 재사용'을 목적으로 상속을 이용하면 클래스의 결합도가 높아질 수 있다. 반드시 IS-A 관계가 성립할 때 사용
IS-A란?
추상화(형식이나 클래스와 같은)들 사이의 포함 관계를 의미하며, 한 클래스 A가 다른 클래스 B의 자식 클래스임을 이야기한다.
예) 강아지는 동물이다.(O)
HAS-A
구성(Composition) 관계를 의미하며 한 객체가 다른 객체에 "속한다(belongs to)"는 이야기다.
예) 컴퓨터 안에는 CPU가 있다. (O)
CPU는 컴퓨터다. (X)
4. 다형성 (Polymorphism)
하나의 객체가 여러가지 형태로 표현이 가능한 것
다형성 구현으로 코드를 간결하고 유연하게 만들 수 있다.
Overriding
상위 클래스의 메서드를 하위 클래스가 재정의 하는 것이다.
메서드의 이름은 물론 파라미터의 개수나 타입도 동일해야 하며,
주로 상위 클래스의 동작을 상속받은 하위 클래스에서 변경하기 위해 사용된다.
Overloading
메서드의 이름은 같고 매개변수의 개수나 타입이 다른 함수를 정의하는 것을 의미한다.
오버로딩(Overloading)은 기존에 없던 새로운 메서드를 정의하는 것이고,
오버라이딩(Overriding)은 상속받은 메서드의 내용만 변경하는 것이다.
참고
결합도 응집도
https://madplay.github.io/post/coupling-and-cohesion-in-software-engineering
'개인공부' 카테고리의 다른 글
JVM 구조 정리 (0) | 2022.12.14 |
---|---|
생성자와 변수의 초기화 정리 (0) | 2022.12.13 |
메서드 (Method) 정리 (0) | 2022.12.10 |
클래스 변수, 인스턴스 변수, 지역 변수 정리 (0) | 2022.12.06 |
클래스 / 객체 / 인스턴스 정리 (0) | 2022.12.06 |
댓글