객체 지향 프로그래밍이란?
객체 지향 프로그래밍(Object-Oriented Programming)은 객체(Object)를 중심으로 프로그램을 설계, 개발해 나가는 것을 말합니다. 객체 지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 함수(처리 부분), 변수(데이터 부분)를 하나로 묶어 객체(인스턴스)로 만들어 사용한다는 점입니다.
C#은 여러 언어의 장점을 결합한 객체지향 언어입니다. 언어의 사용을 단순화하여 숫자를 객체와 같이 처리하게 하고, Collection에 저장할 수 있게 해줍니다. 또한, 박싱/언박싱의 개념을 가지고 있어 숫자를 객체로, 객체를 다시 숫자로 변경할 수 있게 해줍니다. 객체로 사용할 필요가 없는 숫자는 단순 값으로 처리되어 효율적인 사용이 가능합니다.
이 포스팅에서는 객체 지향 언어의 장단점과 객체 지향 언어의 4가지 특징에 대해 다뤄보겠습니다.
1. 객체 지향 언어와 절차 지향 언어의 비교
객체 지향 언어 | 절차 지향 언어 | |
장점 | - 코드의 재사용성이 용이 - 개발이 간단 - 유지보수가 쉬움 - 대규모 프로젝트에 적합 |
- 처리속도가 빠름 - 컴퓨터의 처리구조와 비슷해 실행속도가 빠름 |
단점 | - 처리속도가 느림 - 객체에 따른 용량 증가 - 설계 단계에서 시간이 많이 소요 |
- 유지보수가 어려움 - 대규모 프로젝트에 부적합 - 프로젝트 분석이 어려움 |
* 객체 지향 프로그래밍의 5가지 설계 원칙
1. 단일 책임 원칙 : 클래스는 단 하나의 목적을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다.
2. 클래스는 확장에는 열려 있고, 변경에는 닫혀 있어야 한다.
3. 리스코프 치환 원칙 : 상위 타입의 객체를 하위 타입으로 바꾸어도 프로그램은 일관되게 동작해야 한다.
4. 인터페이스 분리 원칙 : 클라이언트는 이용하지 않는 메서드에 의존하지 않도록 인터페이스를 분리해야 한다.
5. 의존 역전 법칙 : 클라이언트는 추상화(인터페이스)에 의존해야 하며, 구체화(구현된 클래스)에 의존해선 안 된다.
2. 객체 지향 프로그래밍의 4가지 특징
객체 지향에는 4가지 특징이 있습니다.
1) 캡슐화
2) 추상화
3) 상속
4) 다형성
1) 캡슐화
캡슐화는 연관있는 변수와 메소드를 묶어주는 작업을 말하며, 클래스의 접근을 제한하는 것과 관계가 있습니다. 접근 지정자(private, protected, public)를 통해 외부로부터의 접근을 제한하고, 객체 내에서만 접근이 가능하도록(정보 은닉) 해줍니다.
* 접근지정자 https://geukggom.tistory.com/83
클래스의 변수와 함수가 모두 public으로 만들어질 경우, 클래스의 고유의 객체 특성을 잃어버릴 수 있기 때문에 꼭 필요한 데이터 외에는 private(내부에서만 접근 가능)로 설정해야 합니다. 접근지정자에 대한 자세한 설명은 위 포스팅에서 좀 더 자세히 다루기 때문에 넘어가도록 하겠습니다.
2) 추상화
객체 지향에서 추상화란 객체에서 필요한 공통된 부분을 추출하는 것을 의미합니다.
이렇게 Cat, Dog라는 각각의 class가 있습니다.
각각의 클래스는 공통점을 가지는데, 이는 둘 다 Animal이라는 공통적인 속성을 가지고 있기 때문입니다. 따라서 아래와 같이 Animal이라는 추상적인 class로 둘의 공통된 부분을 묶을 수 있습니다.
다음, 상속에서 계속 설명이 이어집니다.
3) 상속
상속은 부모 클래스로부터 공통된 변수와 함수, 인터페이스를 그대로 물려받는 것을 말합니다.
상속은 비슷한 객체들의 부모 클래스와 인터페이스를 정의하여 공통화 한 다음 상속받아 객체를 좀 더 다루기 쉽게 합니다. 추상화에서 각 클래스의 공통된 부분을 묶었다면, 부모 class를 상속받아 거기에 포함된 데이터를 그대로 사용할 수 있습니다.
4) 다형성
다형성은 같은 종류의 클래스가 하나의 메시지에 대해 서로 다른 행동을 하는 것을 말합니다.
위의 예시에 이어서 설명하자면, Cat, Dog는 Animal이라는 공통적인 class를 상속받았지만, 각자의 고유한 특징(Say()함수)을 가집니다. 이렇듯 다형성을 통해 변경이 필요한 부분을 변경하여 사용할 수 있습니다.
다형성은 오버라이딩, 오버로딩 형태로 제공됩니다.
'[Unity] > [C#]' 카테고리의 다른 글
[C# 기초] #15. 클래스(class) - MonoBehavior와 상속 (0) | 2021.07.26 |
---|---|
[C# 기초] #14. 클래스(class) (0) | 2021.07.24 |
[C#] 두 점, 두 벡터 사이의 각도 구하는 법 (-180 ~ 180) (0) | 2021.07.22 |
[C# 기초] #13 : Collection(Stack, Queue) (0) | 2021.07.22 |
[C# 기초] #12 : Collection(Dictionary, HashTable) (0) | 2021.07.21 |