039. 상속의 방법(virtual, abstract, interface)

2022. 1. 7. 18:18·사소한 아이의 소소한 스킬/C#
반응형

이전에 객체지향에 대해 알아봤다.

 

그 중 상속에 대해 더 적어볼까 한다.

 

상속은 클래스 만들지 정말 자주 쓰는 기능..

 

간단하게 자동차에 대해 만든다 하더라도

 

자동차의 클락션 기능은 모든 자동차에 들어가는 기능이고

 

일부 기능들은 각 제조사에 따라 들어갈수도 안들어갈수도있다.

 

이러한 부분들을 생각하며 클래스를 구성한다면 중복되는 코드들을 상당히 줄여나갈 수 있다.

 

그리하여 상속하는 방법중 3가지 virtual, abstract, interface을 알아보도록 하자.

 

1. Virtual

Virtual은 말 그대로 가상이다. 부모클래스에서 선언을 했더라도 자식클래스에서 재정의하여 사용하는 것이 가능하다..!

 

또한 재정의를 하지 않아도 사용 가능! 즉 재정의가 필수가 아닌것이다.! 하지만 재정의를 하기 위해서는 virtual 키워드를 꼭 사용해 주어야 한다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Car
    {
        public virtual void klaxon()
        {
            Console.WriteLine("-");
        }
    }
 
    public class BENZ : Car
    {
        public string LOG = "BENZ";
 
        public override void klaxon()
        {
            Console.WriteLine(LOG);
        }
    }
 
    public class TESLA : Car
    {
        public string LOG = "TESLA";
 
        public override void klaxon()
        {
            Console.WriteLine(LOG);
        }
    }
 
    public class BMW : Car
    {
        public string LOG = "BMW";
    }
 
    public class StartClass
    {
        public StartClass()
        {
            Car CAR = new Car();
            CAR.klaxon();
 
            BENZ CAR1 = new BENZ();
            CAR1.klaxon();
 
            TESLA CAR2 = new TESLA();
            CAR2.klaxon();
 
            BMW CAR3 = new BMW();
            CAR3.klaxon();
        }
    }
Colored by Color Scripter
cs

 

Car라는 부모클래스에 BENZ, BMW, TESLA라는 자식 클래스가 존재한다. 자식클래스 중 BENZ, TESLA의 경우 klaxon함수를 재정의하였으나 BMW는 재정의 하지 않았다. 하지만 BMW 또한 Car라는 부모클래스를 상속받았기에 klaxon함수를 사용할 수 있고, Car에 해당하는 klaxon함수를 호출한다. 허나 TESLA, BENZ는 재정의한 klaxon함수를 호출하여 사용한다.

 

2. abstract

abstract는 virtual과는 다르게 불안전한 함수이다. 부모클래스에서는 함수에 대한 선언만 진행 할 뿐 내용은 정의하지 못한다. 내용은 자식 클래스에서 작성하여야 한다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    public abstract class Car
    {
        public abstract void klaxon();
    }
 
    public class BENZ : Car
    {
        public string LOG = "BENZ";
 
        public override void klaxon()
        {
            Console.WriteLine(LOG);
        }
    }
 
    public class TESLA : Car
    {
        public string LOG = "TESLA";
 
        public override void klaxon()
        {
            Console.WriteLine(LOG);
        }
    }
 
    //public class BMW : Car
    //{
        //public string LOG = "BMW";
 
        /// Car를 상속받았으나 Klaxon함수를 재정의하지않았으므로 에러가 난다.
    //}
 
    public class StartClass
    {
        public StartClass()
        {
            //Car CAR = new Car();   // klaxon을 정의하지 않았으므로 에러
            //CAR.klaxon();
 
            BENZ CAR1 = new BENZ();
            CAR1.klaxon();
 
            TESLA CAR2 = new TESLA();
            CAR2.klaxon();
        }
    }
Colored by Color Scripter
cs

 

Virtual과 많이 다르진 않다. 꼭 정의를 해주어야 하느냐 안해주어도 되느냐 정도로 생각하면 될 것 같다.

 

3. interface

 

Interface를 가장 많이 쓰지 않을까 싶다. Interface는 말그대로 연결해주는 것.

 

특정 기능을 가진 정보들을 여러 클래스에 붙혀서 사용할 수 있다. 즉, 상속보단 확장의 개념이라고 생각하면 편할 것같다.

예를 들어 요새 ADAS, 즉 자율주행기능이 많이들 들어간다. 못넣는 제조사도 있고... 아무튼 이러한 자율주행기능을 확장시켜서 넣는다고 생각하면 편할 것 같다.

 

코드 ㄱㄱ

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 public abstract class Car
    {
        public abstract void klaxon();
    }
 
    interface IADAS
    {
        void ADASON();
    }
 
    public class BENZ : Car
    {
        public string LOG = "BENZ";
 
        public override void klaxon()
        {
            Console.WriteLine(LOG);
        }
    }
 
    public class TESLA : Car, IADAS
    {
        public string LOG = "TESLA";
 
        public override void klaxon()
        {
            Console.WriteLine(LOG);
        }
        
        public void ADASON()
        {
            Console.WriteLine("ADAS ON");
        }
    }
 
    public class BMW : Car
    {
        public string LOG = "BMW";
 
        public override void klaxon()
        {
            Console.WriteLine(LOG);
        }
    }
 
 
    public class StartClass
    {
        public StartClass()
        {
            BENZ CAR1 = new BENZ();
            CAR1.klaxon();
 
            TESLA CAR2 = new TESLA();
            CAR2.klaxon();
            CAR2.ADASON();
 
            TESLA CAR3 = new TESLA();
            CAR3.klaxon();
        }
    }
Colored by Color Scripter
cs

 

IADAS라는 Interface 선언 후 해당 Interface는 TESLA에만 확장시켰다.

(벤츠나 BMW나 다 ADAS기능은 있다 예시일뿐.........)

 

그리하여 TESLA만 ADAS 기능을 사용할 수 있고 다른 BENZ, BMW는 사용하지 못한다.

 

이런식으로 클래스의 확장 기능인 Interface를 사용하면된다.

 

설명을 들인 예제가 좀 안좋아서인지.. 아니면 제조사별로 내세울수 있는 기능들로 예를 들었어야 하는지..

(필자가 귀찮아서...)

 

사용방법은 아무튼 이렇다. ㅇㅖ제는 예제일뿐이고.. 실제로 사용하는 것이 중요한거지!!

반응형
저작자표시 비영리 변경금지 (새창열림)
'사소한 아이의 소소한 스킬/C#' 카테고리의 다른 글
  • ChatGPT로 써보는 C# Thread
  • 041. json을 처리해보자
  • 038. 객체지향의 특징
  • 037. Partial Class
JOOJI
JOOJI
그냥 혼자좋아하는 것들 남기는 블로그....
  • JOOJI
    사소한프로그래머의 소소한행복
    JOOJI
  • 전체
    오늘
    어제
    • 분류 전체보기 (963)
      • 사소한 아이의 소소한 일상 (246)
      • 사소한 아이의 소소한 먹거리 (44)
      • 사소한 아이의 소소한 정보 (75)
      • 사소한 아이의 소소한 감사 (4)
      • 사소한 아이의 소소한 운동 (63)
      • 사소한 아이의 소소한 여행 (40)
        • 2013_전주 (1)
        • 2014_독일 (13)
        • 2014_군산 (1)
        • 2015_제주도 (3)
        • 2015_서울모토쇼 (3)
        • 2015_진해 (1)
        • 2015_전주 (1)
        • 2016_여수 (1)
        • 2020_강릉 (1)
        • 2022_제주도 (4)
      • 사소한 아이의 소소한 강짱 (22)
        • 하트투하트 (10)
        • MAPS (1)
        • 화려한 유혹 (2)
        • 한여름의 추억 (2)
      • 사소한 아이의 TV (50)
        • Drama (9)
        • 예능 (32)
        • 사소한 아이의 다현 (9)
      • 사소한 아이의 소소한 스킬 (130)
        • Scaleform (2)
        • C# (74)
        • QT (3)
        • 알고리즘 (4)
        • Python (21)
        • PyQT5 (9)
        • C_C++ (2)
      • 사소한 아이의 소소한 축구 (283)
        • Korea (25)
        • Germany (45)
        • Bayern Munich (64)
        • Soccer_ETC (75)
        • Euro 2016 (12)
        • 친선경기 (3)
      • 사소한 아이의 소소한 생활정보 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
    • 관리
  • 링크

    • 독일여행
    • 레바티스토리
    • 프라치노 공간
    • 남성패션꿀템 블로그
  • 공지사항

  • 인기 글

  • 태그

    문제
    회사밥
    바이에른 뮌헨
    분데스리가
    c#
    python
    독일
    러닝
    뮌헨
    WPF
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
JOOJI
039. 상속의 방법(virtual, abstract, interface)
상단으로

티스토리툴바