객체지향이란 도대체 무엇일까?
객체 지향 프로그래밍이란?
객체 지향 프로그래밍 (Object-Oriented Programming, OOP)은 프로그래밍에서 필요한 데이터를 추상화 시켜서 상태와 행위를 가진 객체
로 만들고, 객체들간의 상호작용을 통해 로직을 구성하게끔 프로그래밍 하는 방법이다.
출처 : https://www.reddit.com/r/ProgrammerHumor/comments/418x95/theory_vs_reality/
그렇다면 객체란?
객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장 할 변수
와 작업을 수행 할 메소드
를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다.
객체지향 프로그래밍을 레고에 빗대 표현 할 수 있는데, 객체
가 레고의 조각이 될 것이고 레고의 조각을 조립해서 무언가를 만드는 방식이 객체지향 프로그래밍이라고 할 수 있다.
또한 레고 조각과도 비슷하게 객체는 여러군데에서 재사용 할 수 있는데 이는 부품화
와 재사용성
이라는 객체 지향 프로그래밍의 특징을 보여주기도 한다.
객체 지향 프로그래밍의 특징
객체 지향 프로그래밍은 크게 추상화
, 캡슐화
, 상속
, 다형성
의 네가지 특징을 가진다.
1. 추상화
추상화란 객체에서 공통된 속성과 행위를 추출 하는 것으로써, 공통의 속성과 행위를 찾아서 타입을 정의하는 과정이다. 즉, 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것이다.
추상화가 왜 필요한가?
그림을 보면 Audi, Nissan, Volvo 는 모두 Car 에 해당된다. 자동차라는 추상화 집합을 만들어두고 자동차들이 가진 공통적인 특징들을 만들어서 활용한다. 만약 Hyundai 와 같은 다른 자동차 브랜드가 추가된다고 가정 해보자. 이때 추상화로 Car 를 구현해 놓으면 다른 곳의 코드를 수정할 필요 없이 추가로 만들 부분만 새로 생성해주면 된다.
2. 캡슐화
캡슐화란 데이터와 데이터를 다루는 메서드를 하나의 단위로 묶어 외부에서의 접근을 제어하는 것을 말한다. 이는 객체의 내부 구현을 외부로부터 숨기고, 외부에서는 오직 정의된 인터페이스를 통해서만 객체에 접근 할 수 있도록 하는 것을 목적으로 한다.
이를 통해 낮은 결합도
를 유지할 수 있도록 프로그래밍 할 수 있다.
낮은 결합도 (Low Coupling)
결합도란 두모듈간의 의존도를 나타내는데, 이는 한 모듈이 다른 모듈에 얼마나 의존하고 있는지를 나타낸다. 낮은 결합도는 각 모듈이 독립적으로 변경될 수 있고, 한 모듈의 변경이 다른 모듈에 큰 영향을 미치지 않도록 하는 것을 의미한다. 한마디로 캡슐화는 이러한 낮은 결합도를 유지하는 데 도움을 준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Getter
public class Person {
private String name;
private int age;
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Name cannot be null or empty");
}
this.name = name;
}
if (age < 0) {
throw new IllegalArgumentException("Age cannot be negative");
}
this.age = age;
}
}
예를 들어, 위의 Person 클래스의 name, age 는 private 로 선언되어 있고, 이에 접근 하기 위해서는 get/set 메서드를 사용해야 한다. 이와 같은 캡슐화 구조를 통해 외부에서는 Person 객체 내부 구현에 대해 알 필요가 없으며, 내부 구현이 변경되더라도 외부에는 영향을 미치지 않는다.
따라서 캡슐화를 통해 객체의 상태를 안전하게 유지할 뿐만 아니라, 객체간의 의존성을 줄여 결합도를 낮출수 있다.
3. 상속(Inheritance)
클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것을 말한다.
이를 통해 코드 재사용성을 높이고, 계층 구조를 형성하여 소프트웨어를 보다 체계적으로 설계할 수 있다.
4. 다형성(Polymorphism)
동일한 인터페이스를 통해 서로 다른 클래스의 객체들이 다르게 동작할 수 있도록 하는 개념이다.
이는 상속과 함께 사용되며, 다형성을 구현하기 위해서는 상속, 메서드 오버라이딩, 인터페이스와 같은 개념이 필요합니다.
다형성의 핵심 아이디어는 한 인터페이스나 추상 클래스를 여러 개의 구현체로 대체할 수 있다는 것이다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있다.
다형성은 런타임 시에 객체의 실제 타입에 따라 동작이 결정되므로, 동적 바인딩이라고도 한다.