이전에 객체지향에 대해 알아봤다.
그 중 상속에 대해 더 적어볼까 한다.
상속은 클래스 만들지 정말 자주 쓰는 기능..
간단하게 자동차에 대해 만든다 하더라도
자동차의 클락션 기능은 모든 자동차에 들어가는 기능이고
일부 기능들은 각 제조사에 따라 들어갈수도 안들어갈수도있다.
이러한 부분들을 생각하며 클래스를 구성한다면 중복되는 코드들을 상당히 줄여나갈 수 있다.
그리하여 상속하는 방법중 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();
}
}
|
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();
}
}
|
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();
}
}
|
cs |
IADAS라는 Interface 선언 후 해당 Interface는 TESLA에만 확장시켰다.
(벤츠나 BMW나 다 ADAS기능은 있다 예시일뿐.........)
그리하여 TESLA만 ADAS 기능을 사용할 수 있고 다른 BENZ, BMW는 사용하지 못한다.
이런식으로 클래스의 확장 기능인 Interface를 사용하면된다.
설명을 들인 예제가 좀 안좋아서인지.. 아니면 제조사별로 내세울수 있는 기능들로 예를 들었어야 하는지..
(필자가 귀찮아서...)
사용방법은 아무튼 이렇다. ㅇㅖ제는 예제일뿐이고.. 실제로 사용하는 것이 중요한거지!!