객체 지향(OOP) 프로그래밍
객체 지향 프로그래밍(Object-Oriented Programing) 이란?
소프트웨어를 객체라는 단위로 나누어 개발하는 프로그래밍 패러다임으로,
객체들이 상호작용하는 방식으로 프로그램을 구성합니다.
코드 재사용성이 좋고, 유지보수에 용이합니다.
- 프로그래밍 언어에서 객체란
객체 = 인스턴스(실제 메모리에 할당된 상태) + 클래스(자료형)
클래스와 인스턴스의 차이?
클래스는 객체를 생성하기 위한 설계도, 인스턴스는 그 설계도로부터 생성된 실제 객체 입니다.
- 클래스 자체는 메모리에 할당되지 않지만 인스턴스는 메모리에 할당됩니다.
- 하나의 클래스는 여러 개의 인스턴스를 가질 수 있습니다.
장점
- 유지보수
- 각 객체가 독립적으로 동작하므로, 수정 시 영향을 최소화 할 수 있습니다.
- 코드 재사용성
- 상속을 통해 기존 코드를 재사용합니다.
단점
- 관계가 많아지면 구성하는데 복잡하다고 느낄 수 있다.
- 용량 비대화가 생길 수 있다.
다형성을 제공하지만 절차지향보다 오버헤드가 조금 더 발생한다.
하지만 그만큼 다형성이 프로그래머에게 도움을 굉장히 많이 주기 때문에
오버헤드를 감수하고 객체지향을 사용합니다.
추상화
프로그래밍의 추상화란 실제 사물을 보고 코드로 만들기 위해 공통된 요소들을 추출하는 작업입니다.
이 추상화를 완성하기 위한 클래스의 3대 특성이 있습니다.
바로 캡슐화(은닉화), 상속성, 다형성입니다.
추상화를 완성하기위한 클래스의 3대 특성
캡슐화(은닉화) | 객체 내부 상태와 구현을 숨기고, 외부에서는 지정된 인터페이스를 통해서만 접근할 수 있도록 해서 사용자는 내부 구현을 몰라도, 필요한 기능만으로 객체를 사용할 수 있게 합니다. |
상속성 | 자식 클래스는 부모 클래스의 속성과 함수를 물려받아, 코드의 재사용성과 확장성을 높입니다. |
다형성 | 동일한 함수나 연산자가 여러 형태로 동작하는 특성입니다 (가상함수, 캐스팅 등) |
캡슐화
캡슐화란 객체의 내부 데이터와 이를 처리하는 함수들을 하나의 단위로 묶고,
외부에서 내부 상태에 직접 접근하는 것을 제한하는 개념입니다.
사용자가 굳이 알 필요 없는 내용을 숨겨서 필요한 부분에만 집중 할 수 있도록 합니다.
어떤 내용물이 들어있는지는 몰라도 플레이어와 관련된 일은
플레이어 클래스에 있을 것이라고 알릴 수 있습니다.
상속성
상속이란 베이스 클래스(부모 클래스)의 특성을 파생 클래스(자식 클래스)가 물려받는 기능입니다.
파생 클래스는 베이스 클래스의 성분을 가지고 생성됩니다.
상속을 왜 쓰는가?
상속을 활용하면 부모 클래스의 속성과 함수를 자식 클래스에서 재사용하면서
새로운 기능을 추가하거나 기존 기능을 확장할 수 있습니다.
상속의 주요 특징
- 코드 재사용성
- 부모 클래스에서 정의된 속성과 함수를 자식 클래스에서 재사용 가능
- 확장성
- 부모 클래스를 기반으로 새로운 기능 추가 가능
- 다형성
- 다형성은 상속을 기반으로 구현되는 개념으로,
자식 클래스가 부모 클래스의 함수를 다르게 동작하도록 재정의 할 수 있다. (오버라이딩)
자식 객체 생성/소멸 과정
1
2
3
4
자식 객체 생성 과정
1. 메모리 할당
2. 부모 생성자 호출
3. 자식 생성자 호출
1
2
3
4
자식 객체 소멸 과정
1. 자식 소멸자 호출
2. 부모 소멸자 호출
3. 메모리 반환
상속의 관계
- is - a 관계
- 위로 갈수록 일반화, 아래로 갈수록 구체화
↑일반화 / ↓구체화
- has - a 관계 (다중 상속)
- 하나의 클래스가 여러 부모 클래스를 상속 받는 경우.
이 때 모호성 문제가 발생할 수 있다.
다중 상속
하나의 클래스가 두 개 이상의 기본 클래스로부터 상속을 받는
객체 지향 프로그래밍의 개념입니다. (c++가능, C#불가능)
- 이름 충돌과 다이아몬드 문제(중복 상속)와 같은 문제를 일으킬 수 있다
-> 가상 상속으로 해결 - 다중 상속을 사용할 때는 설계가 명확하고 충돌을 최소화 하는 방식으로 사용해야 한다.
가상 상속
-
virtual
키워드를 사용하여 부모 클래스를 가상으로 상속합니다. - 부모 클래스가 여러번 상속될 경우, 부모 클래스의 인스턴스를 하나만 생성하도록 보장합니다.
class B : virtual public A
public, private, protected 상속의 차이점은?
부모가 public으로 선언한 함수일지라도 private으로 상속받은 경우,
클래스 외부에서는 사용할 수 없다. 클래스 내부에서만 사용 가능하다.
protected는 외부에서 부모의 public함수를 사용하지 못한다.
다형성
다형성이란 하나의 인터페이스(함수, 클래스 등)가 여러 형태로 동작할 수 있게 하는 특성 입니다.
코드의 재사용성과 유연성, 유지보수성 향상에 목적을 둡니다.
정적 다형성과 동적 다형성
-
정적 다형성
- 컴파일 타임에 어떤 함수가 호출될지 결정합니다.
- 함수 오버로딩 : 동일한 이름의 함수를 매개변수 타입이나 개수로 구분
- 연산자 오버로딩 :
+
,*
등을 사용자 정의 타입에 맞게 정의
-
동적 다형성
- 런타임에 어떤 함수가 호출될지 결정합니다.
- 함수 오버라이딩 : 부모 클래스로부터 상속받은 함수를 자식 클래스에서 재정의
오버로딩과 오버라이딩의 차이
매개변수 목록이 다른 함수를 같은 이름으로 중복 정의 하는 것이 오버로딩,
상속 받은 멤버 함수를 재정의 하는 것이 오버라이딩 입니다.