개발/C#

[C#] 자습서 7장 - 상속(1)

by Majangnan 2023. 1. 13.

객체지향의 3대 요소

은닉성, 상속성, 다형성

  • 은닉성(캡슐화) : 값의 보호를 위해 객체의 필드, 메서드를 감추거나 들어내는 것.
  • 상속성 : 부모 클래스로부터 새 클래스를 정의
    • 상속 받는 순간 부모의 모든 기능을 물려받음.
  • 다형성 : 한 부모에게서 다양한 클래스들이 만들어짐.
    • 부모의 클래스 변수에 자식 객체를 담을 수 있음.

상속

상속은 이미 정의해 놓은 클래스로부터 새 클래스를 정의하는 기법이다. 기존의 클래스를 '부모/기반 클래스'라고 하며 상속에 의해 새로 만들어지는 클래스를 '자식/파생 클래스'라고 한다. (필자는 부모, 자식 클래스가 좀 더 익숙한 느낌이어서 앞으로도 그렇게 쓰겠다) 생성자, 파괴자 등의 특수한 몇 개를 제외한 모든 멤버가 상속되며 액세스 지정은 유지된다. private 멤버 또한 상속 되지만 자식이 액세스 할 수는 없다. 자식은 상속받은 후 멤버를 더 추가할 수 있어 기능이 확장되며 더 특수한 대상을 표현한다. 상속은 이미 만들어 놓은 클래스를 재활용하는 아주 편리한 방법이며 클래스의 계층을 구성하여 '다형성'을 발휘한다. 자식 클래스를 정의하는 형식은 다음과 같다.

자식클래스 이름 : 부모클래스 {

               //멤버 목록               

}                                             

 

상속의 특징

  1. 부모의 클래스 변수에 자식 객체를 담을 수 있다. 컴파일러를 설계할 때, '다형성'이라는 관리가 편한 문법을 구현하기 위해 C++, Java, C# 모두 이렇게 만들었다.
  2. Human H를 매개변수로 하면 Human 객체 자신 또는 파생된 클래스 객체를 받을 수 있다. → 그러므로 일일이 클래스 별로 매개변수 받는 메서드를 만들지 않아도 최상위 부모 클래스 변수를 매개변수로 가진 메서드 1개만 만들어도 된다.

 

상속의 원칙

  • 구조체는 상속의 대상이 아니다. 구조체는 값 타입이기 때문에 상속의 대상이 될 수 없다.
  • 모든 클래스는 단 하나의 부모 클래스만 가진다. (C#은 다중상속을 제외해버렸다) 
  • 모든 클래스는 반드시 하나의 기반 클래스를 가져야 한다. 기반 클래스를 생략하면 자동으로 루트인 object 로부터 상속받는다. C#의 모든 클래스는 직간접적으로 object로부터 파생되며 유일한 예외는 object 자신뿐이다.
  • 한 클래스로부터 파생되는 클래스의 개수에 제한이 없다.
  • 파생의 깊이에 제한이 없다.

 

is, as 연산자

객체별로 차별화된 처리를 하려면 특정 변수가 실제 어떤 타입의 객체인지 조사해야 한다. C# 에서는 이를 위해 두 개의 연산자를 제공한다.

  • is 연산자: 좌변의 변수가 우변의 타입인지 조사한다. A is B  형식으로 사용하며 A가 B 타입이면 true를 리턴한다. A가 B의 파생 타입이어도 true를 리턴한다. 이 연산자를 사용하면 타입에 따라 차별화된 처리를 할 수 있다.
  • as 연산자: 타입을 안전하게 변환한다. A as B 형식으로 사용하며 A 객체를 B 타입으로 변환하여 리턴하되 is a 관계가 성립하지 않으면 null을 리턴하며 예외는 발생하지 않는다.

is 연산자는 점검만 하고 as는 점검 후 변환까지 수행을 한다. 타입 점검만 한다면 is, 변환 후 바로 사용하려면 as 연산자를 쓴다.

//is 연산문
Student S;
    if(H is Student){
        S = (Student) H;
    }else {
        S = null; }
        
//as 연산문

Student S = H as Student;

위의 두 연산문은 같은 의미이다.

 

 

 

 

 

 

 

Reference

http://soen.kr/

 

SoEn:소프트웨어 공학 연구소

 

soen.kr

 

'개발 > C#' 카테고리의 다른 글

[C#] 자습서 9장 - 인터페이스  (0) 2023.01.27
[C#] 자습서 8장 - 상속(2)  (0) 2023.01.17
[C#] 자습서 6장 - 함수  (0) 2023.01.11
[C#] 자습서 5장 - 클래스  (0) 2023.01.10
[C#] 자습서 4장 - 제어문  (1) 2023.01.05

댓글