반응형

객체지향 프로그래밍(OOP)...?

개발을 하다 보면 “유지보수”, “확장성”, “재사용성”이라는 말을 정말 자주 듣는다.


**객체지향 프로그래밍(OOP, Object-Oriented Programming)**은 

바로 이 세 가지를 잘 달성하기 위해 널리 쓰이는 프로그램 설계 방식이다.

오늘은 “객체지향이 정확히 무엇인지”를  정리해볼 예정이다.

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

1. 객체지향 프로그래밍의 예시

절차지향 vs 객체지향 비교 그림

 

위 그림처럼, 절차지향은 보통 “데이터”와 “함수”가 분리되어 움직이고,
객체지향은 “데이터 + 함수”를 객체 단위로 묶어서 책임 단위로 관리한다.

----------------------------------------------------------------------------------------------------------------------------------------------------------------


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. 오늘의 결론 요약

 

객체지향은 데이터(상태를 담는 필드)와 그 데이터를 다루는 메서드(행동)
하나의 단위(객체)로 묶어 프로그램을 구성한다.
그리고 객체들끼리는 메시지(메서드 호출)를 통해 협력하게 설계한다.

 

 

목표는 변경에 강한 구조(유지보수/확장/재사용)이고,

 

 

핵심 키워드는 캡슐화추상화상속다형성이다.

 

 

 

즉, 객체지향 프로그래밍이란 상태(데이터)행동(메서드)객체로 묶어, 
캡슐화·상속·다형성·추상화를 바탕으로 유연하고 재사용 가능한 구조로 설계하는 방식이다. 

 

 

 

반응형

+ Recent posts