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 클래스다.