객체지향 설계의 핵심 특성과 유연한 시스템 구조
캡슐화, 추상화, 상속, 다형성의 관계를 통해 객체지향 설계가 복잡성을 관리하고 재사용성과 확장성을 확보하는 방식을 정리합니다.
2026-08-14 · 최초 발행 2026-04-17
객체가 복잡한 변경을 감당하는 방식
소프트웨어 규모가 커질수록 절차 중심 구조에서는 코드가 얽히고, 한 부분의 수정이 예상하지 못한 부작용으로 이어지기 쉽다. 객체지향은 현실의 실체를 속성(Property)과 행위(Method)를 가진 객체로 표현하고, 객체 사이의 상호작용으로 기능을 구성한다.
데이터와 로직을 하나의 단위로 다루면 응집도를 높이고 결합도를 낮출 수 있다. 이 구조는 독립적인 모듈화와 코드 재사용을 가능하게 하며, 대규모 시스템의 유지보수성과 확장성을 뒷받침한다.
객체 내부를 보호하는 캡슐화와 정보은닉
캡슐화(Encapsulation)는 관련된 데이터와 이를 처리하는 함수를 클래스(Class)라는 단위로 묶는 방식이다. 외부에는 필요한 인터페이스만 제공하고 내부 구현은 드러내지 않으므로, 객체는 자신의 상태와 동작을 스스로 관리할 수 있다.
외부 코드는 공개된 메서드를 통해서만 객체의 상태를 바꾼다. 따라서 내부 로직이 바뀌어도 객체를 사용하는 코드에 미치는 영향을 줄일 수 있으며, 변경은 해당 객체 안으로 국지화된다.
정보은닉(Information Hiding)은 캡슐화를 구현하는 수단이다. Private, Protected, Public 같은 접근 제어자를 이용해 내부 속성에 대한 직접 접근을 제한한다. 일반적으로 속성은 private으로 두고, getter와 setter 메서드에서 유효성을 검증한 뒤 접근을 제어해 데이터 무결성을 유지한다.
세부 구현보다 모델의 의도에 집중하는 추상화
추상화(Abstraction)는 복잡한 세부 사항을 걷어내고, 공통 속성과 행위만으로 대상을 모델링하는 과정이다. 개발자는 지엽적인 구현에 매달리지 않고 고수준의 설계 의도에 집중할 수 있다.
데이터 추상화는 실체의 속성을 변수로 표현한다. 제어 추상화는 복잡한 하부 로직을 메서드 이름 뒤에 감추고 호출하는 방식이다. 자동차 모델을 다룰 때 엔진의 연소 과정이나 조향 기어의 회전비를 알지 못해도 전진(), 정지() 같은 인터페이스로 제어할 수 있는 것이 그 예다.
공통 기능을 계층으로 재사용하는 상속
상속(Inheritance)은 상위 클래스(부모 클래스)의 속성과 기능을 하위 클래스(자식 클래스)가 물려받아 사용하거나, 필요한 부분을 오버라이딩(Overriding)하는 특성이다.
상속 구조는 Is-A 관계를 코드에 반영한다. 예를 들어 개는 동물의 일종이라는 관계를 표현하면, 상위 개념에 정의한 일반 기능을 하위 개념에서 재사용할 수 있다. 중복을 줄이고 공통 기능을 일괄 관리하는 데 유용하다.
같은 메시지에 다른 동작을 연결하는 다형성
다형성(Polymorphism)은 동일한 인터페이스나 추상 메서드를 통해 서로 다른 객체가 각자의 방식으로 동작하게 하는 특성이다. 클라이언트 코드는 구체 클래스가 아니라 인터페이스 또는 추상 클래스에 의존할 수 있고, 새 기능을 추가할 때 기존 코드를 수정하지 않고 확장하는 OCP(Open-Closed Principle)를 따를 수 있다.
오버로딩(Overloading)은 같은 이름의 메서드를 매개변수 타입이나 개수에 따라 여러 개 정의하는 방식이다. 오버라이딩은 상위 클래스의 메서드를 하위 클래스의 특성에 맞춰 다시 정의한다.
SOLID 원칙으로 이어지는 객체지향 설계
객체지향의 특성은 실제 설계에서 SOLID 원칙으로 구체화된다. 단일 책임 원칙(SRP)은 캡슐화와 밀접하며, 인터페이스 분리 원칙(ISP)과 의존 역전 원칙(DIP)은 추상화와 다형성을 바탕으로 결합도를 낮춘다.
캡슐화는 객체의 자율성을 지키고, 추상화는 복잡성을 통제한다. 상속과 다형성은 재사용과 확장을 위한 구조를 제공한다. 이 특성들이 함께 작동할 때 변화에 견디는 소프트웨어 설계가 가능해진다.