'상속'에 해당되는 글 3건

  1. 2018.11.09 C# 기초다지기 - 상속
  2. 2018.10.17 자바 상속
  3. 2018.09.08 C++ 자바 상속 비교

C# 기초다지기 - 상속




안녕하세요 열코입니다.

이번시간에는 C# 상속에 대해 알아보도록하겠습니다.

상속은 객체지향 프로그래밍에서 가장 중요한 개념으로, 클래스를 다른 클래스로 정의할 수 있으며

프로그램을 쉽게 만들고 유지관리를 할 수 있습니다.

또한 코드 재사용을 하여 구현시간을 단축할 수 있습니다.


클래스의 상속

클래스를 만들때 완전히 새로운 데이터 멤버 및 함수를 작성하는 대신 프로그래머는 새 클래스가 기존 클래스의

멤버를 상속해야할때 클래스를 상속할 수 있습니다. 기존 클래스를 기본(상위)클래스라고 하며 상속받은 새 클래스를

파생(하위)클래스라고 합니다.

상속의 개념은 is-a 관계를 구현합니다.

예를들어, 포유류 is a 동물, 개 is a 포유류이며 따라서 개 is a 동물이 될 수 있습니다.

 클래스의 상속은 :(콜론)을 이용하여 상속합니다.


기본클래스와 파생클래스

클래스는 하나 이상의 클래스 또는 인터페이스에서 파생(상속)될 수 있습니다.

여러 클래스 또는 인터페이스에서 데이터와 함수를 상속받을 수 있습니다.

예를들어 C#에서 기본 클래스 Shape에서 파생 클래스 Rectangle 예제입니다.

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
using System;
 
namespace InheritanceApplication {
    class Shpae {
        protected int width;
        protected int height;
 
        public void setWidth(int w) {
            width = w;
        }
        public void setHeight(int h) {
            height = h;
        }
    }
 
    class Rectangle : Shape {
        public int getArea() {
            return (width * height);
        }
    }
 
    class Inheritance {
        static void Main(string[] args) {
            Rectangle rect = new Rectangle();
 
            rect.setWidth(3);
            rect.setHeight(5);
 
            Console.WriteLine("AREA : {0}", rect.getArea());
        }
    }
}
cs


기본 클래스 초기화

파생 클래스는 기본 클래스 멤버 변수와 함수를 상속합니다.

기본 클래스 객체는 파생 클래스가 만들어지기 전에 만들어야합니다.

멤버 초기화 목록에서 기본 클래스 초기화는 base 함수를 사용하여 초기화합니다.

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
using System;
 
namespace RectangleApplication {
   class Rectangle {
      
      //member variables
      protected double length;
      protected double width;
      
      public Rectangle(double l, double w) {
         length = l;
         width = w;
      }
      public double GetArea() {
         return length * width;
      }
      public void Display() {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle  
   class Tabletop : Rectangle {
      private double cost;
      public Tabletop(double l, double w) : base(l, w) { }
      
      public double GetCost() {
         double cost;
         cost = GetArea() * 70;
         return cost;
      }
      public void Display() {
         base.Display();
         Console.WriteLine("Cost: {0}", GetCost());
      }
   }
   class ExecuteRectangle {
      static void Main(string[] args) {
         Tabletop t = new Tabletop(4.57.5);
         t.Display();
         Console.ReadLine();
      }
   }
}
cs



C#의 다중 상속

C#에서는 다중 상속을 지원하지 않지만 인터페이스를 통해 다중 상속을 구현할 수 있습니다.

다음 예제는 인터페이스로 다중 상속을 구현하는 예제입니다.

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
using System;
 
namespace InheritanceApplication {
   class Shape {
      public void setWidth(int w) {
         width = w;
      }
      public void setHeight(int h) {
         height = h;
      }
      protected int width;
      protected int height;
   }
 
   // Base class PaintCost
   public interface PaintCost {
      int getCost(int area);
   }
   
   // Derived class
   class Rectangle : Shape, PaintCost {
      public int getArea() {
         return (width * height);
      }
      public int getCost(int area) {
         return area * 70;
      }
   }
   class RectangleTester {
      static void Main(string[] args) {
         Rectangle Rect = new Rectangle();
         int area;
         
         Rect.setWidth(5);
         Rect.setHeight(7);
         area = Rect.getArea();
         
         // Print the area of the object.
         Console.WriteLine("Total area: {0}",  Rect.getArea());
         Console.WriteLine("Total paint cost: ${0}" , Rect.getCost(area));
         Console.ReadKey();
      }
   }
}
cs



이상 'C# 상속'에 대해 알아보았습니다.

질문 사항은 모두 커뮤니티에서 받습니다. -> 커뮤니티 바로가기

메인 페이지로 이동하시면 더 많은 자료를 볼 수 있습니다.


'C#' 카테고리의 다른 글

C# 기초다지기 - 클래스  (0) 2018.11.08
C# 기초다지기 - 구조체  (0) 2018.11.08
C# 기초다지기 - 문자열  (2) 2018.11.07
C# 기초다지기 - 배열  (1) 2018.11.06
C# 기초다지기 - 상수  (0) 2018.11.06
C# 기초다지기 - 캡슐화  (0) 2018.11.05
C# 기초다지기 - 프로그램 구조  (0) 2018.11.05
C# 기초다지기 - 변수  (0) 2018.11.05

자바 상속




안녕하세요 열코입니다.

상속은 객체지향 프로그래밍의 중요한 기능중 하나입니다.


주요 용어

- Super Class : 기능이 상속 된 클래스 (기본, 상위 클래스)


- Sub Class : 다른 클래스를 상속하는 클래스(파생, 하위 클래스)

서브 클래스는 수퍼 클래스 필드와 메소드 외에도 자체 필드와 메소드를 추가 할 수 있습니다.


- Reusability : 재사용성

새로운 클래스를 만들 때 상위 클래스에 이미 포함된 코드를 새 클래스에 파생시켜 재사용합니다.



상속을 사용하기 위해 extends 키워드를 사용합니다.

예)


1
2
3
class child extends parent {
    // methods and fields
}
cs


상속의 구체적인 설명을 위해 예제 코드를 통해 알아보도록 하겠습니다.


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
public class Main {
    public static void main(String[] args) 
    {
        Child c = new Child(5);
        c.up();
        c.up();
        c.print();
    }
}
class Parent {
    protected static int a;
    
    public Parent(int get) {
        a = get;
    }
    
    public void up() {
        a++;
    }
    public void down() {
        a--;
    }
    
    public void print() {
        System.out.println(a);
    }
}
 
class Child extends Parent {
    private int b;
    
    public Child(int get) {
        super(a);
        a = get;
        b = get + 5;
    }
    
    public void print() {
        System.out.println(a + ", " + b);
    }
}
cs


위 프로그램에서 상속하는 동안 수퍼클래스가 아닌 하위클래스 객체만 생성됩니다.

Child 클래스의 객체가 만들어지면 수퍼클래스의 모든 메소드와 필드의 복사본을 Child 객체의 메모리로 가져옵니다.

그래서 하위 클래스의 객체에서 수퍼클래스의 멤버에 접근할 수 있습니다.



자바에서는 여러가지 상속 유형을 지원합니다.

1. 단일 상속(Single Inheritance)

단일 상속에서 하위 클래스는 수퍼 클래스의 기능을 상속받습니다.

위 그림에서 부모클래스는 자식클래스의 기본 클래스로 사용됩니다.


2. 다중 레벨 상속(Multilevel Inheritance)

다중 레벨 상속에서 파생클래스는 기본 클래스를 상속하며 파생 클래스도 다른 클래스의 기본 클래스로 작동합니다.

자바에서 자식클래스가 조부모 클래스의 멤버에 직접 접근할 수 없습니다.(해당 참고자료)


3. 계층적 상속(Hierarchical Inhreitance)

계층적 상속은 하나의 클래스에서 둘 이상의 하위 클래스를 상속하는것을 말합니다.


4. 다중 상속(Multiple Inheritance)

하나이상의 수퍼클래스를 가지는것을 다중상속이라고합니다.

원래 자바에서는 다중상속을 지원하지는 않지만 인터페이스를 통해 구현이 가능합니다.


5. 하이브리드 상속(Hybrid Inheritance)

하이브리드 상속 역시 다중상속에 포함되기 때문에 자바에서 지원하지 않지만

인터페이스를 통해 구현 가능합니다.


자바 상속 관련

- 수퍼 클래스 : 수퍼 클래스가 없는 Object 클래스를 제외한 모든 클래스에는 하나의 수퍼클래스가 존재합니다.

다른 명시적 수퍼클래스가 없으면 암시적으로 Object 클래스의 서브 클래스입니다.

- 수퍼클래스는 하나만 존재 : 수퍼클래스는 여러개의 하위 클래스를 가질 수 있지만

하위 클래스는 하나의 수퍼클래스만 가질 수 있습니다. 이는 자바가 클래스와 함께 다중상속을 지원하지 않기 때문입니다.

위에서 설명했듯이 인터페이스를 통해 다중상속을 구현할 수 있습니다.

- 생성자 : 하위 클래스는 수퍼클래스의 모든 멤버를 상속합니다.

생성자는 멤버가 아니기 때문에 상속되지 않지만 super() 키워드를 통해 하위 클래스에서 호출 가능합니다.


하위 클래스 관련

- 상속된 필드는 다른 필드와 마찬가지로 직접 사용될 수 있습니다.

- 수퍼클래스에 없는 새 클래스를 서브클래스에 선언할 수 있습니다.

- 수퍼클래스에 없는 새 메소드를 서브클래스에 선언할 수 있습니다.

- 수퍼클래스에 있는 동일한 이름을 가진 메소드를 작성하여 오버라이드할 수 있습니다.

- 수퍼클래스에 있는 이름과 같은 새로운 static 메소드를 만들어 숨길 수 있습니다.



이상 '자바 상속'에 대해 알아보았습니다.

질문 또는 오타나 잘못된 정보가 있는 경우 댓글로 달아주세요!

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.





C++ 자바 상속 비교



상속의 목적은 C++과 자바 모두 동일합니다.

우리가 상속을 받는 목적은 코드를 재사용하거나 is-a 관계를 생성하기 위함입니다.

그렇다면 이 두 객체지향언어(Object-Oriented Laguage)의 상속의 차이점에 대해 비교해보겠습니다.


◎ 자바에서 모든 클래스(Class)는 직접 또는 간접적으로 Object Class에서 상속받습니다. 자바에서 상속받지 않는 클래스를 작성하면 기본적으로 Object 클래스에서 자동으로 상속됩니다. 


◎ 자바에서는 부모의 부모(조부모; GrandParent) 클래스에 직접 접근할 수 없습니다.(not directly accessible, c++에서는 :: 연산자를 사용하여 접근 가능합니다.) 부모의 부모 클래스에 접근하기 위해서는 부모 클래스를 통해 접근할 수 있습니다. 


예)

class GrandParent {

public void Print() {

System.out.println("GrandParent");

}

}


class Parent extends GrandParent {

public void Print() {

System.out.println("Parent");

}

}


class Child extends Parent {

super.super.Print(); // 에러 발생!!

public void Print() {

System.out.println("parent");    

}

}


class Main {

public static void main(String args[]) {

Child c = new Chid();

c.Print();

}

}


위 코드는 super.super.Print() 줄에서 오류가 발생합니다. 아래 코드처럼 수정할 수 있습니다.


class GrandParent {

public void Print() {

System.out.println("GrandParent");

}

}


class Parent extends GrandParent {

super.Print();

public void Print() {

System.out.println("Parent");

}

}


class Child extends Parent {

super.Print(); // 부모 클래스를 통해 접근 가능!

public void Print() {

System.out.println("parent");

}

}


class Main {

public static void main(String[] args) {

Child c = new Chid();

c.Print();

}

}


◎ 상속받지 않은 다른 클래스에서 protected 멤버에 접근할 수 있습니다.(클래스가 같은 패키지에 존재 해야합니다.)


예)

class A {

protected int x = 10;

}

class B {

public static void main(String[] args) {

A a = new A();

System.out.println(a.x); // 접근 가능!!

}

}


◎ 자바에서 상속은 extends 키워드를 사용합니다. C++과 달리 public, protected, private과 같은 지정자를 제공하지 않습니다. 


◎ 자바에서 메소드는 기본적으로 가상(Virtual) 메소드입니다. C++에서는 virtual 키워드를 명시적으로 사용해야 합니다.


예)

class A {

public void Print() {

System.out.println("A");

}

}


class B extends A {

public void Print() {

System.out.println("B");

}

}


class Main {

public static void main(String[] args) {

A a = new B();

b.show(); // B가 출력!!

}

}


◎ 자바는 추상클래스(abstract)와 인터페이스(interface)를 구분된 키워드로 사용합니다.


◎ 자바는 다중 상속(둘 이상의 클래스에서 상속)을 지원하지 않습니다. C++은 지원합니다.




코드는 직접 작성했기 때문에 오타 때문에 정상적으로 작동하지 않을 수 있습니다.

해당 게시글에 대한 궁금한점 있으시면 댓글로 달아주시면 답변 해 드리겠습니다.

공감♡ 버튼을 눌러주시면 더욱 유용하고 좋은 포스팅으로 찾아 뵙겠습니다.

'C, C++' 카테고리의 다른 글

C/C++ 구조체 사용법 및 예제  (1) 2018.10.08
C/C++ 배열 사용법  (0) 2018.10.05
C 파일처리  (0) 2018.10.02
C++ 벡터 사용법  (2) 2018.09.26
C언어 포인터  (8) 2018.09.25
C 랜덤 - 난수 생성하기  (7) 2018.09.06
C++ String 문자열 사용법 정리  (0) 2018.08.20
[C++] C# 연동하기 / C# dll 파일 만들기  (1) 2018.08.18

to Top