C#.5 객체지향

D·2021년 4월 17일

C#공부

목록 보기
6/9

프로그래밍 패러다임.

패러다임이란 그리스어에서 유래한 단어이며 범례,방법론,개념안이라는 뜻으로 쓰인다.

↑머리 터지게 많은 프로그램 패러다임들.

언어가 패러다임에 종속된것은 아님. C언어로도 객체지향적인 형태로 프로그래밍할수 있으며 패러다임은 고정되어있는 진리가 아님.

현재 메이저하게 인지도가 있는 프로그래밍 패러다임은 다음과 같다

  • 절차적 프로그래밍 - 절차지향이라고 하기도 하지만 부적절한 표현이며 작은 코드모음인 함수를 통해서 재사용성을 높힌 패러다임이다. 기능을 중심으로 코드가 짜여지며 순서에 따라 작동하므로 순서가 뒤바뀌면 결과를 예측하기 힘들고 대형프로젝트에 적용하기 힘들다
  • 객체지향 프로그래밍
  • 함수형 프로그래밍(언어) - 선언된 함수들이 가장 우선시되는 프로그래밍 패러다임과 그를 따르는 언어로 하스켈/LISP이 유명하며 같은 입력이 들어왔다면 무조건 같은 출력이 나오는 불변성과 여기에 연계되는 특징이 주된 언어이다.

객체지향 프로그래밍이란

변수와 메소드의 집합인 객체를 기반으로 해서 이 객체들간의 상호작용으로 프로그래밍 하는것을 객체지향 프로그래밍이라고 한다.

즉 객체지향은 기본적으로 어떤 기능을 가진 객체들로 구성된 프로그래밍을 하는것이다. 어떠한 특정한 작업이나 데이터를 가진 객체를 정의하고 이 객체들을 이용해서 프로그래밍 하는것을 의미한다.

상속


기존의 클래스에서 요소를 물려받아서 새 클래스를 만드는것. 상속받은 클래스는 기존 클래스의 구성요소를 가지고 새클래스의 구성요소를 가지고 새로운 기능을 추가할수 있다.

캡슐화


캡슐화는 내부에서 벌어지는 내용중에 외부에 알릴 필요 없는 요소를 가리는것을 의미한다.

사진과 같은 접근 제한자는 캡슐 화를 위해서 존재하며 이를 통해서 외부로 공개할 요소는 공개하고 내부적으로 감출 요소는 감출수 있다.

프로그래머는 객체의 내부에서 벌어지는 일에 대해서 덜 신경쓰게 하며 각 모듈간의 결합도를 높이는것에 주력할수 있지만 반대로 다른 객체가 다른 객체의 요소에 접근하는것에 문제가 있기 때문에 get,set등을 통해서 접근하는것이 강요된다.

추상화

추상화는 기본적으로 객체를 정의하는것이다. 코드의 데이터, 메소드, 속성등를 묶어서 이를 객체로 구성하는것을 의미한다.

다형성

다형성은 같은 이름/속성을 가진 메소드,클래스를 다른 방식으로 구현해서 사용할수 있음에 대한것이다.

C#에서 상속을 받은 파생 클래스는 기본클래스의 모든 메소드,속성,필드를 얻는데 파생클래스에서는 다음과 같은 선택을 할수있다

  • 파생클래스에서 기본클래스의 메소드를 재정의해서 비가상 구현을 정의할수 있다
  • 파생클래스에서 기본클래스의 가상메소드를 재정의해서 쓸수있다
  • 파생클래스에서 상속받은 메소드를 재정의하지 않고 기존 메소드를 보존한 상태에서 다른 파생클래스에서 재정의를 도움

파생클래스는 기본클래스의 메소드등을 재정의할수 있으며 C#의 컴파일러는 메소드의 매개변수등을 분석해서 호출 가능한 최선의 메소드를 호출한다.

객체지향 프로그래밍의 장단점

기본적으로 코드의 재사용성을 높히기 위한 패러다임인 만큼 잘 사용할경우 코드의 재사용성을 높여서 개발 효율을 높일수 있다.

객체지향이 항상 옳다고는 할수없다. 기능을 객체로 나누는 과정에서 소규모 프로젝트일 경우 절차지향 언어에 비해서 객체화 하는 과정에서 매우 복잡해진다. 이때문에 객체지향이 코드 재사용성을 극대화 했다고는 하지만 실제로 무한정하진 않으며 상속을 남발해서 너무 많이 상속하게될경우 코드가 매우 복잡해져서 효율을 떨어뜨린다.

또한 기본적으로 객체가 생성될때마다 메모리를 할당하는데 이를 자주 반복하기 때문에 메모리 관리 측면에서 매우 힘들며 따라서 필요한 메모리가 많아지고 이에 대한 관리또한 필요해진다. 가비지 컬렉션이 중요한 이유이기도 하다.

또한 추상화와 캡슐화 때문에 데이터에 접근하기위해 추가적인 함수호출이 필요하여 이때문에 발생하는 성능손실이 존재한다.

Base 키워드

Base키워드는 파생 클래스에서 기본 클래스의 멤버에 접근하기 위한 키워드이다.


Base 키워드를 쓸경우 이렇게 기본 클래스에서 지정된 메소드에 접근할수 있으며 호출되는 기본클래스는 Base 키워드가 사용된 클래스가 상속한 기본클래스이며 원본 클래스가 상속받은 기본클래스는 따지지 않는다.

정적 메소드에서는 Base 키워드를 쓸수없다.

메소드 오버라이딩

메소드 오버라이딩은 다형성과 연관되는 부분으로 같은 이름의 메소드를 만들수 있는 기능이다.




메소드 오버라이딩은 메소드 오버로딩과 약간의 차이가 있는데 다음과 같다

  • 오버로딩:같은 클래스 내와 상속관계의 클래스의 메소드하고도 가능함.
  • 오버라이딩:상속관계에서만 가능함.

다이나믹 메소드 디스패치

다형성에서 언급한것과 같이 C#의 컴파일러는 매개 변수를 기반으로 오버로딩,오버라이딩 된 메소드들의 최선의 메소드를 호출해준다. 해당 과정을 다이나믹 메소드 디스패치라고 부른다.

추상클래스

추상 클래스는 인터페이스 처럼 인스턴스로 만들수 없는 클래스이다.

인터페이스는 기본적으로 실제 코드의 구현을 담지 못하고 정의만 담을수 있지만 추상 클래스는 인터페이스와는 다르게 실제 구현을 담을수가 있다. 또한 인터페이스는 접근 한정자를 달수 없지만 추상 클래스에는 접근 한정자를 달수 있다. 또한 추상 클래스는 추상 메소드도 가질수 있다.

여러가지를 따졋을때 추상 클래스는 인터페이스 보단 클래스에 가까운 특징을 가지고 있다.

Sealed 키워드

개발자는 특정 클래스가 상속될수 없도록 Sealed 키워드를 통해서 상속을 막을수 있다. Sealed 키워드가 쓰인 클래스는 상속 봉인이 된 봉인 클래스가 된다.

상속 봉인을 고려할때는 2가지 고려점이 있다

  • Sealed를 했을때의 잠재적 이점이 있는가
  • 해당 클래스가 다른 클래스에 상속되었을때 제대로 동작하지 않을수도 있는가

봉인 클래스는 기본 클래스가 될수 없으며 따라서 추상클래스로는 만들수 없으며 런타임 단계 최적화때 봉인된 클래스는 약간더 빨라지는 부수적인 효과가 있다.

출저

0개의 댓글