목표
예전부터 누군가 나에게 OOP가 무엇인지 묻는다면 자동차를 예로 들거나, "원하는 객체를 만들어서 레고처럼 조립하는 거야!" 라는 식으로 두루뭉실하게 설명하며 "OOP는 무엇이다!" 라고 명확하게 정의하지 못했다. 오늘 글을 쓰면서 OOP에 대해 확실히 이해해보려고 한다. OOP언어를 배우면 가장 먼저 마주하는 내용이 OOP의 특성이다. OOP의 대표적인 4가지 특성을 글로 정리해 항상 이것을 참고하며 프로그램을 설계, 구현하고자 한다.
OOP란
OOP(Object-Oriented Programming) 객체 지향 프로그래밍
현실 세계에서 어떤 제품을 만들 때는 부품을 먼저 만들고, 이 부품들을 하나씩 조립해서 완성품을 만든다. 소프트웨어를 개발할 때에도 부품에 해당하는 객체를 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법을 OOP(객체 지향 프로그래밍)라고 한다.
OOP의 장점
- 다른 클래스를 가져와 사용할 수 있고, 상속받을 수 있어 코드의 재사용성이 증가한다.
- 클래스 단위로 모듈화가 가능하기 때문에 대형 프로젝트에 적합하다.
- 객체 단위로 코드가 나눠져 작성되기 때문에 유지보수가 용이하다.
OOP의 단점
- 처리 속도가 상대적으로 느리고 객체가 많아지면 프로그램의 용량이 커진다.
- 언제나 그렇지만 설계를 잘 하는게 어렵기 때문에 설계 시 많은 노력과 시간이 필요하다.
OOP의 4가지 특성
Encapsulation 캡슐화
- 캡슐화란 객체의 속성(필드)와 동작(메서드)를 하나로 묶고 실제 구현 내용을 외부에 노출되지 않게 감추는 것을 말한다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 의도적으로 노출한 필드와 메서드만을 사용할 수 있다.
- 필드와 메서드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하기 위해서이다. Java에서는 캡슐화된 멤버를 노출시킬 것인지 숨길 것인지를 결정하기 위해 Access Modifier(접근 제한자)를 사용한다.
Inheritance 상속
- OOP에서는 부모 역할의 상위 객체와 자식 역할의 하위 객체가 있다. 상속은 부모 객체가 가지고 있는 필드와 메서드를 자식 객체에게 물려주어 자식 객체가 사용할 수 있도록 한다는 개념이다.
- 상속은 코드의 재사용성(Reusability)를 높여준다. 잘 개발된 부모 객체의 필드와 메서드를 자식이 그대로 사용할 수 있어 자식 객체에서 중복 코딩을 하지 않아도 된다.
- 상속은 코드의 유지보수성(Maintainability)를 높여준다. 부모 객체의 필드와 메서드를 수정하면 모든 자식 객체들은 수정된 필드와 메서드를 사용할 수 있다.
Abstraction 추상화
- OOP에서 추상화란 객체의 공통적인 요소들을 추출하여 불필요한 부분들을 생략해 상위 객체를 만들어내는 것이다. 상속이 상위 객체를 이용해 하위 객체를 만들어내는 것이라면 추상화는 그 반대의 개념이라고 할 수 있다.
Polymorphism 다형성
- 다형성이란 사용 방법은 동일하지만, 실행 결과가 다양하게 나오는 성질을 말한다. 자동차의 부품을 교환하면 성능이 다르게 나오듯이 프로그램을 구성하는 객체를 바꾸면 프로그램의 실행 성능이 다르게 나올 수 있다.
[ 참고자료 ]