패러다임이란 그리스어에서 유래한 단어이며 범례,방법론,개념안이라는 뜻으로 쓰인다.
↑머리 터지게 많은 프로그램 패러다임들.
언어가 패러다임에 종속된것은 아님. C언어로도 객체지향적인 형태로 프로그래밍할수 있으며 패러다임은 고정되어있는 진리가 아님.
현재 메이저하게 인지도가 있는 프로그래밍 패러다임은 다음과 같다
변수와 메소드의 집합인 객체를 기반으로 해서 이 객체들간의 상호작용으로 프로그래밍 하는것을 객체지향 프로그래밍이라고 한다.
즉 객체지향은 기본적으로 어떤 기능을 가진 객체들로 구성된 프로그래밍을 하는것이다. 어떠한 특정한 작업이나 데이터를 가진 객체를 정의하고 이 객체들을 이용해서 프로그래밍 하는것을 의미한다.

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

캡슐화는 내부에서 벌어지는 내용중에 외부에 알릴 필요 없는 요소를 가리는것을 의미한다.
사진과 같은 접근 제한자는 캡슐 화를 위해서 존재하며 이를 통해서 외부로 공개할 요소는 공개하고 내부적으로 감출 요소는 감출수 있다.
프로그래머는 객체의 내부에서 벌어지는 일에 대해서 덜 신경쓰게 하며 각 모듈간의 결합도를 높이는것에 주력할수 있지만 반대로 다른 객체가 다른 객체의 요소에 접근하는것에 문제가 있기 때문에 get,set등을 통해서 접근하는것이 강요된다.
추상화는 기본적으로 객체를 정의하는것이다. 코드의 데이터, 메소드, 속성등를 묶어서 이를 객체로 구성하는것을 의미한다.
다형성은 같은 이름/속성을 가진 메소드,클래스를 다른 방식으로 구현해서 사용할수 있음에 대한것이다.
C#에서 상속을 받은 파생 클래스는 기본클래스의 모든 메소드,속성,필드를 얻는데 파생클래스에서는 다음과 같은 선택을 할수있다
파생클래스는 기본클래스의 메소드등을 재정의할수 있으며 C#의 컴파일러는 메소드의 매개변수등을 분석해서 호출 가능한 최선의 메소드를 호출한다.
기본적으로 코드의 재사용성을 높히기 위한 패러다임인 만큼 잘 사용할경우 코드의 재사용성을 높여서 개발 효율을 높일수 있다.
객체지향이 항상 옳다고는 할수없다. 기능을 객체로 나누는 과정에서 소규모 프로젝트일 경우 절차지향 언어에 비해서 객체화 하는 과정에서 매우 복잡해진다. 이때문에 객체지향이 코드 재사용성을 극대화 했다고는 하지만 실제로 무한정하진 않으며 상속을 남발해서 너무 많이 상속하게될경우 코드가 매우 복잡해져서 효율을 떨어뜨린다.
또한 기본적으로 객체가 생성될때마다 메모리를 할당하는데 이를 자주 반복하기 때문에 메모리 관리 측면에서 매우 힘들며 따라서 필요한 메모리가 많아지고 이에 대한 관리또한 필요해진다. 가비지 컬렉션이 중요한 이유이기도 하다.
또한 추상화와 캡슐화 때문에 데이터에 접근하기위해 추가적인 함수호출이 필요하여 이때문에 발생하는 성능손실이 존재한다.
Base키워드는 파생 클래스에서 기본 클래스의 멤버에 접근하기 위한 키워드이다.


Base 키워드를 쓸경우 이렇게 기본 클래스에서 지정된 메소드에 접근할수 있으며 호출되는 기본클래스는 Base 키워드가 사용된 클래스가 상속한 기본클래스이며 원본 클래스가 상속받은 기본클래스는 따지지 않는다.
정적 메소드에서는 Base 키워드를 쓸수없다.
메소드 오버라이딩은 다형성과 연관되는 부분으로 같은 이름의 메소드를 만들수 있는 기능이다.



메소드 오버라이딩은 메소드 오버로딩과 약간의 차이가 있는데 다음과 같다
다형성에서 언급한것과 같이 C#의 컴파일러는 매개 변수를 기반으로 오버로딩,오버라이딩 된 메소드들의 최선의 메소드를 호출해준다. 해당 과정을 다이나믹 메소드 디스패치라고 부른다.
추상 클래스는 인터페이스 처럼 인스턴스로 만들수 없는 클래스이다.
인터페이스는 기본적으로 실제 코드의 구현을 담지 못하고 정의만 담을수 있지만 추상 클래스는 인터페이스와는 다르게 실제 구현을 담을수가 있다. 또한 인터페이스는 접근 한정자를 달수 없지만 추상 클래스에는 접근 한정자를 달수 있다. 또한 추상 클래스는 추상 메소드도 가질수 있다.
여러가지를 따졋을때 추상 클래스는 인터페이스 보단 클래스에 가까운 특징을 가지고 있다.
개발자는 특정 클래스가 상속될수 없도록 Sealed 키워드를 통해서 상속을 막을수 있다. Sealed 키워드가 쓰인 클래스는 상속 봉인이 된 봉인 클래스가 된다.
상속 봉인을 고려할때는 2가지 고려점이 있다
봉인 클래스는 기본 클래스가 될수 없으며 따라서 추상클래스로는 만들수 없으며 런타임 단계 최적화때 봉인된 클래스는 약간더 빨라지는 부수적인 효과가 있다.
출저