제로의영역

7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is와 as 1. 본문

C#

7.9 기반 클래스와 파생 클래스 사이의 형식 변환, 그리고 is와 as 1.

아이큐제로 2019. 5. 30. 18:50

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

1. 형식 변환

 (1) 정의: 변수를 다른 데이터 형식의 변수에 옮겨 담는 것

 

 (2) 용도: 데이터 형식끼리 변환할 필요가 있을 때 사용

 

 (3) 사용 방법: 데이터형식 + 식별자(변수의이름) = (변환할 데이터 형식) + 식별자(변수의 이름)

float a = 0.9f;
int b = (int)a;	//float a를 int b로 형식 변환

2. 기반 클래스와 파생 클래스 사이의 형식 변환

 (1) 정의: 자식클래스의 인스턴스(객체:변수와 메소드)를 부모클래스의 인스턴스로 사용 가능하도록 변환하는 것.

 

 (2) 용도: 자식 클래스에 사용되는 동일한 기능의 많은 메소드를 구현할 때 많은 메소드를 사용하지 않고 동일한 기능

    을 하나의 메소드만으로 구현하여 생산성을 높이기 위해 사용.

 

 (3) 사용법: 자식클래스 + 자식클래스의 인스턴스=(자식클래스) + 부모클래스의 인스턴스

    1) 상단의 '(자식클래스)부모클래스의 인스턴스' 의 '(자식클래스)' 는 형식 변환 연산자: 부모 클래스의 인스턴스를 자

      식클래스 형식으로 변환하라는 의미

    2) 부모 클래스와 자식 클래스 사이에서만 가능.

 

 사용 예)

 

   1) 개와 고양이가 젖을 먹인다는 공통점때문에 포유류라는 클래스 작성

class Mammal
{
	public void Nurse(){...}
}

class Dog : Mammal
{
	public void Bark(){...}
}

class Cat : Mammal
{
	public void Meow(){...}
}

   2) 사용 코드

형식 변환을 사용하지 않는 사용 코드

형식 변환을 사용하는 코드

Mammal mammal = new Mammal();
mammal.Nurse();

Dog dog = new Dog();
dog.Nurse();
dog.Bark();

 

Cat cat = new Cat();
cat.Nurse();
cat.Meow();

Mammal mammal = new Mammal();

mammal.Nurse();

 

mammal = new Dog();

mammal.Nurse();

 

Dog dog = (Dog)mammal;

dog.Nurse();

dog.Bark();

 

mammal = new Cat();

mammal.Nurse();

 

Cat cat = (Cat)mammal;

cat.Nurse();

cat.Meow();

   3) 300마리의 동물을  씻기는 Wash() 메소드 구현

형식 변환을 사용하지 않는 사용 코드

형식 변환을 사용하는 코드

class Zookeeper

{

   public void Wash( Dog dog ) { /* ... */ }

   public void Wash( Cat cat ) { /* ... */ }

   public void Wash( Elephant elephant ) { /* ... */ }

   public void Wash( Lion lion ) { /* ... */ }

 

// 등등등... 하여 300개 버전의 Wash() 메소드 선언

class Zookeeper

{

   public void Wash( Mammal mammal ) { /* ... */ }

}

형식 변환을 사용하지 않으면 300개의 Wash() 메소드를 오버로딩해야 하지만 형식 변환을 사용하면 동물 클래스 들이 Mammal 클래스로부터 상속 받았기 때문에 모두 Mammal로 간주 할 수 있어 Wah() 메소드로 사용 가능 

 

3. is와 as

   (1) 정의

     1) is: 객체가 해당 형식에 해당하는지를 검사하여 그 결과를 bool 값(true, false)으로 반환.

     2) as: 형식 변환 연산자와 같은 역할. 형식 변환 연산자가 변환에 실패하는 경우 예외를 던지는 반면, 객체 참조를

       null로 만듬.

 

   (2) 용도

     1) 형변환에 사용

     2) 형식 변환 연산자 대신 as 연산자를 사용하는 쪽을 권장.

     3) 형식 변환에 실패하더라도 예외가 일어나 갑자기 코드의 실행이 점프하는 일이 없어 코드 관리가 편함.

 

   3) 사용법

     A. is: 형식 변환전 호환 여부를 확인하기 위해 사용.

      if(변수 + is + 형식이름(자식클래스))

                       //실행 코드

Mammal mammal = new Dog();
Dog dog;

if(mammal is Dog)
{
   dog = (Dog)mammal;	//mammal 객체가 Dog 형식임을 확인했으므로 안전하게 형식변환이 이루어짐
   dog.Bark();
}

         

     B. as

       (A) 참조 형식에서만 사용 가능.

       (B) 값 형식의 객체는 형식 변환 연산자 사용.

 

      자식클래스 + 자식클래스의 인스턴스= 부모 클래스의 인스턴스 + as + 자식클래스  

      if ( 자식클래스의 인스턴스 != null)

                //실행코드

Mammal mammal2 = new Cat();

Cat cat = mammal2 as Cat;
if (cat != null)	/*mammal2가 Cat 형식 변환에 실패했다면 cat은 null이 됨. 하지만 이 코드에서
는 mammal2는 Cat 형식에 해당하므로 안전하게 형식 변환이 이루어짐.*/
{
    cat.Meow();
}

 

 (5) 정리

   1) 부모 클래스와 자식 클래스 사이의 형식 변환도 기본 형식 변환 연산자와 형식은 비슷하다.

   2) is는 호환여부를 확인하는데 사용 

   3) 형식 변환 연산자는 변수가 값 형식(데이터)일 때만 사용하고 참조 형식일 때는 as연산자를 사용.

 

 내용을 정리하는데만 하루 종일 걸렸네요.