다형성
매개변수로 받은 숫자 2개를 더해주는 메서드를 만들고, 오버로딩을 시켜보겠다.
오버로딩의 조건
1. 두 메소드의 이름이 같다.
2. 매개변수의 개수 또는 타입이 달라야한다.
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
|
class Calculate {
public static int add(int a, int b) //정적 메소드 (클래스를 통한 호출)
{
;
Console.WriteLine("int add");
int ret = a + b;
return ret;
}
public float add(float a, float b)//객체를 통해서 호출
{ //매개변수의 데이터 타입 or 개수가 달라야
Console.WriteLine("float add");
float ret = a + b;
return ret;
}
class Program
{
static void Main(string[] args)
{
//오버로딩--> 클래스 안에 같은 이름 함수 만드는 것
//오버로딩과 오버라이딩을 통해 다형성 구현
int a = 20;
int b = 30;
float c = 3.4f;
float d = 4.5f;
//static을 사용하면 객체를 생성하지 않고 클래스로 바로 접근 가능
Calculate cal = new Calculate();
Console.WriteLine("{0}+{1}={2}", a, b, Calculate.add(a, b));
Console.WriteLine("{0}+{1}={2}", c, d, cal.add(c, d));
}
}
}
|
cs |
리턴타입이 int인것은 정적메소드 이기 때문에 클래스.메소드를 통해 접근이 가능하고,
리턴타입이 float인 것은 일반 메소드 이기 때문에 객체를 생성하고, 객체.메소드를 통해 접근이 가능하다.
상속
객체간의 관계를 맺는 방식에는 상속과 포함이 있다.
그 중 상속은 계층구조를 통해 관계를 맺는 방식이다.
Animal 클래스를 부모 클래스로 만들고, 자식 클래스인 chicken과 pig를 만들어보겠다.
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
62
63
64
65
66
|
class Animal
{
protected String name;
protected int height;
protected int weight;
protected int age;
protected int speed;
public Animal(String name,int height, int weight, int age,int speed)
{
this.name = name;
this.height = height;
this.weight = weight;
this.age = age;
this.speed = speed;
}
public void Speak()
{
Console.WriteLine("이름:{0}",name);
}
public void Run()
{
Console.WriteLine("{0}은/는 {1}속도로 달립니다.", name,speed);
}
}
class Pig : Animal
{
public Pig(String name,int height,int weight,int age,int speed) : base(name,height, weight, age, speed)
{
//base는 자바에서 super키워드와 비슷
}
}
class Chicken : Animal
{
private int fly_speed;
public Chicken(String name,int height, int weight, int age, int speed,int fly_speed) : base(name,height, weight, age, speed)
{
this.fly_speed = fly_speed;
}
public void fly()
{
Console.WriteLine("{0}은/는 {1}속도로 날라 다닙니다.", name,fly_speed);
}
}
class Program
{
static void Main(string[] args)
{
Pig pig = new Pig("돼지",10, 20, 30, 40);
Chicken chicken = new Chicken("치킨",10, 20, 30, 40, 50);
pig.Speak();
pig.Run();
chicken.Speak();
chicken.Run();
chicken.fly();
}
}
|
cs |
자바와 구분되는 두가지 특징이 있다.
1. : 키워드
자바에서는 class Pig extends Animal과 같이 extends 키워드를 썼다면, C#은 class Pig : Animal을 쓴다.
2. base 키워드
private int fly_speed;
public Chicken(String name,int height, int weight, int age, int speed,int fly_speed) : base(name,height, weight, age, speed)
{
this.fly_speed = fly_speed;
}
에서 자바였으면
private int fly_speed;
public Chicken(String name,int height, int weight, int age, int speed,int fly_speed)
{
super(name,height,weight,age);
this.fly_speed = fly_speed;
}
즉, 자바에서는 super키워드를 썼으면 C#에서는 base키워드를 쓴다.
'C#' 카테고리의 다른 글
[C#기초] 가상함수/ 동적바인딩,정적바인딩 (0) | 2021.08.14 |
---|---|
[C#기초] 복사 생성자/ static (0) | 2021.07.27 |
[C#기초] 클래스와 구조체의 차이 (0) | 2021.07.21 |
[C#기초] setter/getter 함수 (0) | 2021.07.19 |
[C#기초] 참조 (0) | 2021.07.19 |
댓글