posted by 준치 2013. 10. 16. 09:43

 

1 상속

1.1 상속

상속의 기본적인 이점은 기반클래스의 코드 재사용

객체 지향의 주용 특성 하나인 상속(Inheritance) 이미 만들어진 클래스의 멤버들을 물려받아

새로운 클래스를 정의하는 기법이다.

 

기존에 존재하는 클래스(Base Class) , 상속에 의해 새로 만들어진 클래스를 파생 클래스(Derived Class)

슈퍼 클래스 , 서브 클래스 라고도 하고 부모 클래스 , 자식 클래스 라고도 한다.

 

형식

지정자 class 이름 :  기반클래스 , 인터페이스

{

// 멤버 목록

}

 

:base 기반클래스를 의미한다.

:base에서 인수에 맞는 생성자를 호출하지만 없을 경우에는 기본 생성자를 호출하는데

기본 생성자가 없을 경우에는 에러 발생한다.

 

1.2 포함

상속이 코드를 재사용하는 유일한 방법은 아니며 포함 관계라는 것도 있다.

 

상속은 is a 관계 , 포함은 has a 관계를 표현

 

가장 차이점은 다형성의 발휘 여부이다.

상속은 클래스의 계층을 형성함으로써 다형성의 이점이 있지만

포함은 코드를 재사용하는 정도의 기능밖에 없다.

 

1.3 상속의 원칙

 

모든 클래스는 반드시 하나의 기반 클래스를 가질 있다.

 

Class Human : object { … }

 

기본적으로 object 상속받는다.

 

인라인화

 

1.4 안전한 변환

 

암시적,명시적 변환 관계가 상속 계층의 클래스끼리도 허용된다.

자식 타입의 객체는 별다른 지정이 없더라도 부모 타입으로 암시적 변환된다.

 

부모 타입의 변수는 자식 객체를 가리킬 있다!

 

최상위 부모 타입을 자식들을 대표하는 대포타입 이라고 한다.

 

is  연산자 타입을 점검

as 연산자 타입을 점검한 후에 변환까지 수행 - 결과가 null 인지 점검

typeof 연산자 변수의 타입을 표현하는 Type 또는 파생 객체를 리턴

 

실행 중에 타입에 대한 상세한 정보를 조사하는 기능을 리플렉션 이라 하는데 이런 기능이 있기 때문에

is , as , typeof 같은 연산자를 있는 것이다.

 

d = i as double 에러 발생 - as 좌변 객체가  우변 타입으로 바뀔 없을 null 리턴, 타입은 null 라는 것이

적용되지 않는다. 그래서 as 연산자는 반드시 참조형 이어야 한다. d = (double)i; 식으로 캐스트

 

2 재정의

2.1 멤버 숨기기

 

부모 클래스에서 사용된 메소드,프로퍼티,인덱서,연사자 동일한 명으로도 사용 있다.

하지만 경고가 뜬다. 진짜 그게 맞냐고?! 제대로 사용하려면 new 사용해서 쓴다.

 

public new void method(){ ….. }

 

2.2 메서드 재정의

재정의 대상은 메서드, 프로퍼티, 인덱스 같은 함수형 멤버들 모두 포함

 

Virtual - 부모 클래스의 함수 앞에 붙이며 자식 클래스에 의해 재정의될 있다는 뜻이다.

가상 함수라고도 불렀기 때문에 virtual 키워드 사용

재정의 가능한(override)이라고 이해하는 것이 직관적이다.

 

Override - 자식 클래스의 함수 앞에 붙이며 부모로부터 상속받은 함수와는 다르게 구현한다는

재정의되는 함수는 부모의 함수와 이름은 물론이고 시그니처도 일치해야 한다.

Base 키워드로 부모의 원래 함수를 호출 있다.

 

Virtual 선언 함수에서만 override 사용한다.

 

어떤 메서드를 호출할 것인가가 컴파일 결정되는 것이 아니라 실행 중에 결정된다.

가상 메서드 호출을 동적 결합이라고 한다.

 

2.3 다형성

클래스 타입의 변수는 정확하게 일치하는 객체뿐만 아니라 파생 클래스 타입의 객체까지도 가리킬 있다.

그리고 가상 메서드는 호출 객체의 실제 타입에 따라 선택되며 파생 클래스는 기반 클래스와는 다르게

메서드를 재정의 있다.

 

3 추상 클래스

3.1 추상 클래스

 

구현 코드를 가지지 않는 메서드도 있는데 이런 메서드를 추상 메서드 라고 한다.

 

public abstract int MoMo(int a, double b);

 

상위 클래스에서 파생 클래스를 위해 메서드 시그니처만 정의해 놓고자 추상 메서드가 사용된다.

파생 클래스에서 재정의해야만 호출 가능한 메서드가 된다.

파생 클래스에서 반드시 재정의해야 하므로 virtual 붙이지 않아도 자동으로 가상이다.

인스턴스를 생성할 없는 클래스이다.

클래스 선언문에 abstract 지정자를 붙이면 클래스는 추상 클래스가 된다.

 

내가 느낀 !

추상 클래스에 추상 메서드를 생성하면 파생클래스에서는 추상 메서드를 모조건 사용 - 추상멤버 사용 오류

추상 클래스에서 파생 클래스도 추상 클래스일 경우에는 추상 메서드를 사용 해도

 

*재정의 강제성*

 

3.2 봉인 클래스

지정자 sealed 메서드 앞에 붙이면 메서드는 봉인되며 이상 재정의할 없다.

최상위 부모 클래스에서는 키워드를 사용할 없다.

 

3.3 정적 클래스

생성자는 사용자에 의해서 호출되는 것이 아니라 컴파일러에 의해 자동으로 호출되므로 액세스 지정자는

통상 public이다.

특수한 경우에는 private , protected 수도 있다.

 

정적 클래스는 static 붙여서 클래스를 만든다.

생성자를 만들 없다.

정적 클래스는 멤버도 정적으로 생성해야 한다.

 

대표적인 클래스는 Convert 클래스다.