[CS 기초] 객체 지향 프로그래밍(OOP)의 4가지 속성
객체 지향 프로그래밍(Object-Oriented Programming):
컴퓨터 프로그램을 여러 '객체(Object)'들의 모임으로 보고, 이 객체들이 서로 상호작용하도록 만드는 프로그래밍 패러다임(설계 사상)
→ 기능별로 각 컴포넌트(부품)을 만들고, 해당 컴포넌트들을 조립하는 프로그래밍 방식.
[ 캡슐화, 상속, 다형성, 추상화 ] 이 네 가지 속성을 가지고 있음.
캡슐화:
관련된 데이터와 기능을 하나로 묶고, 외부의 직접적인 접근을 막아 정보를 은닉하는 것
특징:
- 데이터의 기능과 통합: 객체라는 하나의 캡슐 안에 관련된 데이터(속성, 변수)와 그 데이터를 처리하는 기능을 포함시킴
- 정보 은닉: 객체 내부의 중요한 데이터는 외부에서 직접 접근하지 못하도록 막고(private), 공개된 메서드(public)를 통해서만 접근할 수 있도록 허용함
장점:
- 데이터 보호: 외부에서 데이터를 마음대로 변경하는 것을 막아 객체의 무결성을 유지할 수 있음
- 유지보수 용이: 객체 내부의 구현 방식이 변경되더라도, 외부에서는 공개된 메서드만 사용하므로 다른 코드에 미치는 영향이 적음
ex) "사람" 객체 내부에 "나이" 데이터를 private 변수를 이용해서 보호하고, "새해맞이()"와 같이 허용된 기능을 통해서만 나이가 +1 되도록 설계함. 이렇게 하면 외부에서 "나이 = -5"와 같이 규칙에 어긋나는 값으로 임의 변경하는 것을 방지할 수 있음
상속:
부모 클래스의 속성과 기능을 자식 클래스가 물려받아 그대로 사용하거나 확장하는 것
특징:
- 기존 클래스(부모/상위 클래스)를 재사용하여 새로운 클래스(자식/하위 클래스)를 생성
- 자식 클래스는 부모 클래스의 모든 기능을 물려받은 상태에서 기능을 확장하거나, 부모의 기능을 재정의 할 수 있음
장점:
- 코드 재사용성: 중복 코드를 반복해서 작성할 필요가 없어 생산성이 향상됨
- 계층 구조: 클래스 간의 관계를 논리적인 계층 구조로 만들어 코드를 보다 쉽게 이해/관리할 수 있도록 함
- 확장성: 기존 코드의 수정 없이 손쉽게 새로운 기능을 추가할 수 있음
ex) "동물" 클래스에 "먹다", "자다"라는 기능이 있다면, 강아지 클래스는 이를 그대로 물려받고, "짖다"라는 자신만의 기능을 추가할 수 있음
다형성:
하나의 인터페이스가 상황에 따라 여러 가지 다른 형태로 실행되는 것
특징:
- 같은 이름의 메서드를 호출했더라도, 호출한 객체에 따라 실제 실행되는 내용이 달라짐
- 메서드 오버라이딩(Overriding)과 오버로딩(Overloading)을 통해 구현됨
장점:
- 유연성과 확장성: 새로운 자식 클래스가 추가되어도 기존 코드의 수정 없이 동일한 메시지로 제어할 수 있음
- 결합도 감소: 사용하는 쪽에서는 실제 객체가 어떤 타입인지 몰라도 상관 없음. 사용할 객체들의 '표준'을 만들어 간편하게 제어할 수 있기 때문임
ex) "동물" 타입의 객체에게 "소리내다()"라는 명령을 내리면, "강아지" 객체는 "멍멍" 짖고, "고양이" 객체는 "야옹"하고 소리냄
명령은 하나였으나, 객체에 따라 결과가 달라짐
추상화:
복잡한 내부 구현은 숨기고, 외부에는 핵심적인 기능만 노출하는 것
특징:
- 객체들의 공통적인 속성을 추출하여 하나의 추상적인 개념으로 정의
- 이를 통해 사용자는 객체가 "무엇을" 하는지에만 집중할 수 있음.
장점:
- 복잡도 감소: 불필요한 세부 정보를 숨김으로써 시스템을 더 단순하게 이해하고 모델링 할 수 있음
- 유지보수 용이: 객체 내부의 구현 방식이 변경되더라도, 외부에서는 공개된 메서드만 사용하므로 다른 코드에 미치는 영향이 적음 (캡슐화와 목표가 비슷하지만, 추상화는 '모델링' 관점에 더 집중함)
ex)
"자동차"나 "TV 리모컨"처럼 여러 부품들이 상호 작용하는 도구를 사용할 때, 복잡한 내부 원리를 알지 못해도 사용할 수 있음
앞서 설명한 네 가지 특징은 독립적인 개념처럼 보이지만, 실제로는 서로 맞물리는 형태로 동작한다.
추상화를 통해 핵심 기능을 정의하고,
상속을 통해 이를 재사용 및 확장하며,
다형성으로 유연한 구조를 만들고,
캡슐화로 각 객체의 자율성 및 안전성을 보장한다.