View

상속 (1)

sm_amoled 2019. 1. 1. 17:46
300x250


노트북, 데스크탑, 휴대폰에는 전원 켜기, 전원 종료, 리셋 등의 같은 역할을 하는 같은 기능이 공유되고 있다. 이는 모두 '컴퓨터'에서 파생되어 나온 기기이기 때문이다. 

새로운 전자기기를 만드는 작업을 한다고 가정해보면, 개발자들은 컴퓨터에서 사용되어지던 기능들에 대한 정보를 그대로 가져오면서 거기에 덧붙여 기능을 확장시키는 작업을 한다. 여기서 컴퓨터의 기능을 새로운 전자기기로 가져오는 작업이 상속에 해당된다.


상속

상위 클래스가 가지고 있는 특성을 하위 클래스에 물려주는 것.
여러 클래스가 가진 공통적인 특징을 상위 클래스 하나에서 구현하여 하위 클래스에 상속시켜줌으로써 작업의 Cost를 줄일 수 있다.

여기에서 상위 클래스를 '부모 클래스'라 칭하고, 하위 클래스를 '자식 클래스' 라고 칭한다. 
부모 클래스에는 공통적인 특징이 담겨있고, 자식 클래스에는 부모 클래스의 기능과 자식 클래스가 가지는 개별적인 특징을 가지고 있다.

부모클래스 A -> 자식클래스 a 에게 상속

class a : A        콜론을 통해 상속할 수 있고, 부모 클래스의 필드나 메서드를 허용된 범위 내에서 사용할 수 있다.
{                                                  
    ...                
}


상속을 받더라도 부모 클래스의 private 제한자가 붙은 필드나 메서드는 이용할 수 없다. 단, protected 제한자를 쓸 경우 상속받은 자식 클래스에서도 사용 가능하다.


클래스의 선언을 다음과 같이 하면 더 이상 상속을 해줄 수 없는 클래스로 만들 수 있다. ( 불임? )


sealed class A
{
    ...
}



형변환


부모 클래스는 일반적인 개념 ( coffee ) 이고, 자식 클래스는 특수한 개념 ( americano ) 이므로, 자식 -> 부모의 형변환은 가능하지만 부모 -> 자식의 형변환은 불가능하다.

( 자식이 가지는 메모리 크기 > 부모가 가지는 메모리 크기 -> 자식의 정보를 부모가 담기에는 메모리가 부족하여 정보 손실이 일어난다.)


as 연산자 & is 연산자

오류를 발생시키지 않으면서 형변환의 가능 여부를 체크하는 방법이다. 다음과 같은 방법으로 사용할 수 있다.

Name as Type
Name is Type


as 연산자의 경우, 형변환이 가능하면 형변환이 진행된 결과값을 반환하고 형변환이 불가능 한 경우 NULL을 반환한다.

참조형 변수 (클래스, 배열, 문자열 ) 에만 적용이 가능하며, 형변환에 대한 체크만 가능하다.


is 연산자의 경우, 형변환이 가능하면 True를 반환하고 현변환이 불가능 한 경우 False를 반환한다.

as 연산자와 마찬가지로, 참조형변수에만 적용이 가능하다.


형 변환을 통한 값이 필요할 때는 as 연산자를, Boolean 값이 필요할 때는 is 연산자를 이용하면 된다.


System.Object

부모 클래스를 지정해주지 않은 경우에는 컴파일러가 Object를 자동으로 부모 클래스로 지정하여 작동시킨다. Object는 C# 컴파일러에서 가장 상위 부모 클래스에 해당된다고 볼 수 있다.

따라서, 다음 두 문장은 같은 선언문이라 볼 수 있다.

class A
{
    ...
}

class A : Object
{
    ...
}


이렇게 되면, 참조형 ( 문자열, 배열, 클래스 ) 과 값형 ( int, char, ... ) 이 같은 부모 클래스인 Object에게서 상속받게 되는데, 둘은 작동 방식이 매우 다르기에, 값 형식 변수는 System.ValueType에 한번 더 상속시켜 문제를 해결해주었다. 

( System.ValueType 에서 Object 메서드를 재정의하여 작동 방식을 바꿔주었다고 보면 된다 )


모든 클래스는 Object Class를 상속받았기에, Object 클래스에 속한 메서드를 이용할 수 있다.

ToString

ToString 메서드를 인스턴스에 이용할 경우 FQDN을 출력한다. 하지만, 기본타입 (int, char, ... ) 에 이용할 경우 해당타입의 값을 출력한다.

Console.WriteLine(americano.ToString());                인스턴스에 ToString을 이용
Console.WriteLine(americano.pub_value.ToString());      기본타입(int)에 ToString을 이용

CsharpStudy.Americano

2



GetType

클래스는 필드, 메서드, 프로퍼티등의 멤버를 가지는 또 다른 타입으로 볼 수 있다.
만약 개발자가 클래스로 타입을 정의 할 경우, 내부적으로 해당 클래스 타입에 대한 정보를 가진 System.Type의 인스턴스를 보유하게 되고, 이를 가져오는 메서드가 GetType이다.

    Latte latte = new Latte();            클래스로 타입을 정의
    Type type = latte.GetType();          해당 인스턴스를 가져와 Type형 변수 type에 저장

    Console.WriteLine(type.FullName);     type의 FQDN을 출력
    Console.WriteLine(type.IsClass);      type 이 class 이므로 true 를 출력
    Console.WriteLine(type.IsArray);      type 이 array가 아니므로 false 를 출력

CsharpStudy.Latte

True

False


ToString에서 기본타입의 FQDN을 가져오는 일이 불가능했지만, GetType 메서드를 이용하면 타입의 이름을 반환하는 작업을 수행할 수 있다.


   int numb = 5;
   Type intType = numb.GetType();
   Console.WriteLine(intType.FullName);


System.Int32


typeof 예약어를 이용한다면, 인스턴스에서 가져오지 않고 곧바로 클래스의 이름에서 Type을 구하는 방법도 사용할 수 있다.



공부하면서 작성한 예제

using System;

namespace CsharpStudy
{
    class MainClass
    {
        static void Main(string[] args)
        {
            Coffee coffee = new Coffee();
            coffee.Offer();                      부모 클래스가 가진 메서드

            coffee.Printpub();
            coffee.Printpri();                  
            coffee.Printpro();

            Americano americano = new Americano();
            americano.Offer();                   부모 클래스를 상속받은 자식 클래스도 부모의 메서드를 사용할 수 있다.    

            americano.Printpub_();
            // americano.Printpri_();  오류발생     부모 클래스의 private 는 이용할 수 없다.
            americano.Printpro_();                부모 클래스의 protected 는 자식 클래스도 이용할 수 있다.



        }
    }

    public class Coffee
    {
        public int size;
        public bool shot;
        public bool milk;
        public bool syrup;

        public void Offer() { }
        public void Clean() { }

        public int pub_value = 2;
        private int pri_value = 3;
        protected int pro_value = 4;

        public void Printpub() { Console.WriteLine(pub_value); }
        public void Printpri() { Console.WriteLine(pri_value); }
        public void Printpro() { Console.WriteLine(pro_value); }
    }

    public class Americano : Coffee
    {
        int numbofshot = 3;
        public int Hasshot() { return numbofshot; }

        public void Printpub_() { Console.WriteLine(pub_value); }
        // public void Printpri_() { Console.WriteLine(pri_value); }    오류발생
        public void Printpro_() { Console.WriteLine(pro_value); }

    }

    public class Latte : Coffee
    {
        int numbofshot;
        public int Hasshot() { return numbofshot; }
        int sizeofmilk;
        public int Hasmilk() { return sizeofmilk; }
    }
}




320x100

'Develop > C# 과 객체지향' 카테고리의 다른 글

다형성  (0) 2019.01.04
상속 (2)  (0) 2019.01.02
캡슐화  (0) 2018.12.30
클래스  (0) 2018.12.29
객체지향 프로그래밍  (0) 2018.12.27
Share Link
reply
반응형
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31