# 객체지향 프로그래밍 (OOP) / 캡슐화 / 상속 / 다형성

2021. 1. 25. 08:44개발/C#

객체지향 프로그래밍 (Object-Oriented Programming)

 

 

컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나,

여러 개의 독립된 단위인 객체들의 모임으로 보는 패러다임

 

아주 많은 기능이 있을 때, 비슷한 기능끼리 클래스로 묶으면, 가독성 & 유지보수성 증가

결국 객체지향 프로그래밍은 비슷한 것들끼리 모아놓는 형태의 프로그래밍 방식이다.

 

 

클래스는 같거나 비슷한 종류의 집단에 속하는 속성과 행위를 정의한 것으로, 

상속, 다형성 등을 구현하는데 필요하다.

 

객체는 클래스가 인스턴스화된 결과물로, 고유 속성을 가지며, 클래스에서 정의한 행위를 수행 가능

 

네임스페이스 보통 네임스페이스를 정의하고, 그 안에 클래스를 정의한다.

클래스들을 네임스페이스 안에서 정의하여, 관리 및 사용하는데 충돌이 발생하지 않게 한다.

 

 

 

또한 캡슐화, 상속, 다형성 등의 특징을 가진다.

 

캡슐화는 외부에서 접근을 하지 못하도록 

적절한 접근제한자를 통해 데이터 컨텍스트를 분리하는 것

외부에서는 보통 꼭 필요한 메서드나 변수만 오픈한다.

 

이렇게 함으로써 외부에서 불필요한 접근을 최소화하여

유지보수를 용이하게 하며, 각각의 클래스 단위로 나누어

구현하기 때문에 코드를 재사용하기에도 좋다.

 

상속을 사용하는 이유는 예를들어 중복되는 코드를 

여러 클래스에서 써야할 때 부모 클래스에 한번 선언해놓고, 

필요한 클래스마다 부모 클래스를 상속하면

부모 클래스의 코드를 쓸 수 있기 때문에 불필요한 비용을 줄일 수 있다.

 

다형성이란 객체가 여러가지 형태를 가질 수 있다라는 의미로

예를 들어 A라는 클래스 객체가 B라는 클래스를 상속하면

이 객체는 A 클래스 타입이기도 하고, B 클래스 타입이기도 하다.

이 클래스들 안에서 메서드를 어떻게 정의하느냐에 따라

같은 이름의 메서드라도 다르게 실행될 수 있다.

 

 

 


 

캡슐화 (Encapsulation)

 

캡슐화는 외부에서 접근을 하지 못하도록 

적절한 접근제한자를 통해 데이터 컨텍스트를 분리하는 것이다.

외부에서는 보통 꼭 필요한 메서드나 변수만 오픈한다.

 

일반적으로 모든 클래스 내의 멤버를 기본적으로 private, protected

필요한 부분만 정도에 따라 외부 엑세스를 허용 (보통 프로퍼티를 많이 사용)

 


 

다형성 (Polymorphism)

 

자식 클래스인 Circle은 Shape 클래스를 상속 받았으므로, 

Circle을 Shape 리스트에 넣으면 Shape 타입으로 캐스팅 된다.

 

엄밀히 말하면 Circle은 Circle 클래스이기도하고, Shape 클래스이기도 하다.

 

 

그러면 만약에 두 클래스에 Draw라는 메서드가 동일하게 구현되어 있다면?  

 

자식 클래스인 Circle에서 Draw 메서드가 Overriding 되어 있다면Circle에서 overriding한 Draw 메서드가 실행

자식 클래스인 Circle에서 Draw 메서드를 Overriding 되지 않았다면, Shape의 Draw가 실행될 것이다

 

 

Polymorphism은 이처럼 여러가지 형태를 가질 수 있다는 객체지향 프로그래밍의 특징이며,

인터페이스와 상속은 둘 다 Polymorphism을 구현하는 하나의 방식이다.

 


 

상속 (Inheritance)

 

공통되는 부분을 Base Class (Super Class)에 두고,

파생 클래스 (Sub Class)에서 상속하면, 

모든 파생 클래스들에 중복되는 코드를 작성할 필요가 없다.