객체 지향 프로그래밍 이란?
정의 : 객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로,
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체지향 프로그래밍의 대표적인 장점 3가지
1. 코드 재사용성 및 확장성 (Reusability & Extensibility)
상속(Inheritance)과 다형성(Polymorphism)을 통해 기존 코드를 쉽게 확장하고 재사용할 수 있습니다.
새로운 기능이 필요할 때 기존 코드를 수정하는 대신, 기존 클래스를 상속받아 필요한 부분만 재정의(Override)하여 추가할 수 있으므로 개발 속도가 향상됩니다.
2. 유지보수성 및 모듈화 (Maintainability & Modularity)
캡슐화(Encapsulation)를 통해 데이터(상태)와 로직(행위)을 하나의 객체로 묶고, 외부 접근을 엄격하게 제어합니다.
버그가 발생했을 때 문제가 되는 객체 내부만 확인하고 수정하면 되므로 사이드 이펙트(Side Effect)를 최소화할 수 있습니다. 각 객체가 독립적인 모듈로 작동하기 때문에 여러 개발자가 동시에 협업하기에도 유리합니다.
3. 직관적인 현실 세계 모델링 (Intuitive Modeling)
추상화(Abstraction)를 통해 복잡한 시스템을 사람이 인지하기 쉬운 '객체' 단위로 나누어 설계할 수 있습니다.
기획서나 요구사항에 등장하는 명사(예: 플레이어, 몬스터, 무기)를 클래스로, 동사(예: 공격하다, 이동하다)를 메서드로 직관적으로 매핑할 수 있어 도메인 로직을 코드로 표현하기 수월합니다.
객체지향 프로그래밍의 대표적인 단점 3가지
1. 성능 오버헤드 (Performance Overhead)
절차지향 프로그래밍(C 등)에 비해 실행 속도가 상대적으로 느리고 메모리 사용량이 많습니다.
객체는 주로 힙(Heap) 영역에 동적 할당되며, 이는 가비지 컬렉터(GC)의 부하로 이어집니다. 또한 다형성 구현을 위한 가상 메서드 호출(Virtual Method Dispatch)은 vtable을 참조하는 추가 비용이 발생합니다. 최적화가 중요한 Unity 환경에서 Update 틱 내의 무분별한 객체 생성을 경계하는 것도 이러한 OOP의 특성 때문입니다.
2. 설계의 복잡성과 높은 초기 진입 장벽 (Design Complexity)
단순한 기능 하나를 만들더라도 클래스 설계, 객체 간의 결합도/응집도 고려, 적절한 디자인 패턴 적용 등 초기 설계에 많은 시간과 노력이 필요합니다.
설계를 잘못하여 상속 구조가 너무 깊어지거나(God Class 발생), 강하게 결합될 경우 오히려 유연성이 떨어지고 '스파게티 코드'가 생성될 위험이 있습니다.
3. 코드 크기 증가 (Increased Code Size)
캡슐화를 위한 프로퍼티(Getter/Setter), 인터페이스 정의, 클래스 분리 등 목적을 달성하기 위해 작성해야 하는 보일러플레이트(Boilerplate) 코드가 많아집니다.
이는 전체적인 프로젝트의 코드 라인 수와 바이너리 크기를 비대하게 만드는 원인이 됩니다.