본문 바로가기
C#

[C# 기초] 다형성/상속

by Meaning_ 2021. 7. 27.
728x90
반응형

다형성


 

매개변수로 받은 숫자 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("돼지",10203040);
            Chicken chicken = new Chicken("치킨",1020304050);
            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키워드를 쓴다.

728x90
반응형

'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

댓글