객체지향 프로그래밍(OOP)...?
개발을 하다 보면 “유지보수”, “확장성”, “재사용성”이라는 말을 정말 자주 듣는다.
**객체지향 프로그래밍(OOP, Object-Oriented Programming)**은
바로 이 세 가지를 잘 달성하기 위해 널리 쓰이는 프로그램 설계 방식이다.
오늘은 “객체지향이 정확히 무엇인지”를 정리해볼 예정이다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 객체지향 프로그래밍의 예시

위 그림처럼, 절차지향은 보통 “데이터”와 “함수”가 분리되어 움직이고,
객체지향은 “데이터 + 함수”를 객체 단위로 묶어서 책임 단위로 관리한다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
2. 객체(Object)와 클래스(Class)는 뭐가 다른가?
객체지향에서 가장 먼저 헷갈리는 개념이 클래스 vs 객체 이다.
클래스(Class): 객체를 만들기 위한 설계도(타입)
객체(Object): 클래스로부터 만들어진 실체(인스턴스)
쉽게 말해서,
“붕어빵 틀”이 클래스라면
“붕어빵”은 객체(인스턴스)이다.

----------------------------------------------------------------------------------------------------------------------------------------------------------------
3. 객체지향 4대 특성(핵심 키워드)
객체지향을 설명할 때 빠지지 않는 4가지가 있다.
바로 '캡슐화', '추상화', '상속', '다형성' 이다.
1) 캡슐화(Encapsulation)
데이터(상태를 담는 변수/필드)와 기능(메서드)을 한 덩어리로 묶어
외부에서 직접 내부 상태(필드)를 건드리지 못하게 보호하는 것
“내부 구현은 숨기고, 필요한 기능만 공개”
실수로 상태가 깨지는 것을 줄이고, 변경 영향 범위를 좁혀준다.
2) 추상화(Abstraction)
복잡한 시스템으로부터 핵심적인 부분만 드러내고, 불필요한 세부구현을 감추는 것
“무엇을 하는지(What)에 집중, 어떻게(How)는 숨김”
예시) 결제는 “pay()”만 호출하면 되고, 내부 승인/정산 로직은 몰라도 됨
3) 상속(Inheritance)
이미 작성된 클래스를 재사용 또는 확장시켜서 사용할 수 있는 것
“공통 로직 재사용 + 확장”
이점:
코드의 재사용: 관련된 기능이나 특성을 한 곳으로 모으고 분류한다.
유지보수성: 코드의 수정이 일어났을떄, 책임이 있는 객체만 수정함
관련 키워드:
virtual: 기본 구현은 주되, 원하면 재정의 할 수 있게 만드는 확장용 키워드
abstract: 시그니처로 선언하며, 파생 클래스가 반드시 구현되도록 강제하는 키워드
ㄴ> 시그니처: 메서드 이름 + 매개변수 목록(개수, 목록, 형식, 한정자)
interface: 클래스 또는 구조체가 구현해야 하는 멤버들의 집합을 정의하는데 사용되는 C#의 순수 추상 계약 도구
(다중 상속이 가능하다)
상속이 깊어질수록 결합도가 커질 수 있어서 주의하자.
4) 다형성(Polymorphism)
하나의 메서드나 클래스가 다양한 방법으로 동작하는 것
코드가 특정 타입에 덜 묶여서, 확장이 쉬워진다.
“같은 호출, 다른 결과”
예시로는 오버로딩과 오버라이딩이 있다.
오버로딩: 같은 이름을 가진 메서드를 메서드의 타입, 매개변수의 유형, 개수 등으로 구분
오버라이딩: 부모 클래스로부터 상속받은 메서드를 자식 클래스에서 재정의 하는 것

----------------------------------------------------------------------------------------------------------------------------------------------------------------
4. “결제”를 객체지향스럽게 바라본다면?
객체지향에서는 “기능”을 늘어놓기보다, 책임(역할) 중심으로 나눈다.
예를 들어 결제는 “결제한다”는 역할은 같지만, 카드/계좌/포인트 등 방식이 다를 수 있다.
공통 역할: 결제한다(pay)
구현은 각 결제 수단이 담당
→ 이렇게 하면 결제 수단이 늘어나도 기존 코드를 크게 흔들지 않고 확장 가능(다형성)
객체지향은 “클래스 문법”이 아니라 “설계 방식”이다
많이들 “클래스 쓰면 객체지향”이라고 생각하는데, 핵심은 그게 아니라:
현실/도메인을 객체로 모델링하고
객체별 책임과 경계를 적절히 나누고 변경에 강하게 만드는 구조를 만드는 것
이게 객체지향의 본질에 더 가깝다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
5. 오늘의 결론 요약
객체지향은 데이터(상태를 담는 필드)와 그 데이터를 다루는 메서드(행동)를
하나의 단위(객체)로 묶어 프로그램을 구성한다.
그리고 객체들끼리는 메시지(메서드 호출)를 통해 협력하게 설계한다.
목표는 변경에 강한 구조(유지보수/확장/재사용)이고,
핵심 키워드는 캡슐화, 추상화, 상속, 다형성이다.
「 즉, 객체지향 프로그래밍이란 상태(데이터)와 행동(메서드)을 객체로 묶어,
캡슐화·상속·다형성·추상화를 바탕으로 유연하고 재사용 가능한 구조로 설계하는 방식이다. 」
'1일 1 cs' 카테고리의 다른 글
| 6. Unity의 생명주기(Life Cycle)란? (0) | 2026.01.21 |
|---|---|
| 5. 동기/비동기 프로그래밍이란? (0) | 2026.01.19 |
| 4. 제네릭 이란? (+ 오브젝트 풀링) (0) | 2026.01.18 |
| 3. 디자인 패턴(싱글톤, 팩토리, 상태, 전략)이란? (0) | 2026.01.17 |
| 2. 설계 원칙(SOLID)이란? (0) | 2026.01.16 |
