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

C# 기초다지기 - 클래스




안녕하세요 열코입니다.

이번시간에는 C# 클래스에 대해 알아보겠습니다.

클래스는 구조체와 비슷한 사용자 정의 자료형이지만 메소드(함수)를 가질 수 있습니다.

객체(Object)는 클래스의 인스턴스입니다. 클래스를 구성하는 변수와 메소들르 클래스의 멤버라고 합니다.


클래스 정의하기

클래스 정의는 class 키워드와 클래스의 이름으로 시작합니다.

클래스의 몸체는 중괄호 { }로 둘러싸여있습니다.

다음 예제와 같이 자세히 설명하도록 하겠습니다.

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
using System;
 
namespace SquareApplication {
    class Square {
        private double length;
        public double GetLength() {
            return length;
        }
        public void SetLength(double length_) {
            length = length_;
        }
        public double GetArea() {
            return length * length;
        }
    }
    class mainfunction {
        static void Main(string[] args) {
            Square sq1 = new Square();
            Square sq2 = new Square();
 
            sq1.SetLength(2);
            sq2.SetLength(10);
 
            Console.WriteLine("SQUARE1 AREA : {0}", sq1.GetArea()); // 4 출력
            Console.WriteLine("SQUARE2 AREA : {0}", sq2.GetArea()); // 100 
        }
    }
}
cs


- 액세스 지정자는 멤버에 대한 접근 규칙을 지정합니다.

- public 지정자는 함수 외부에서 직접 접근이 가능합니다.

- private 지정자는 함수 내부에서만 직접 접근이 가능합니다.

- protected 지정자는 상속받은 클래스 내부에서만 직접 접근이 가능합니다.

- 클래스 멤버의 기본 액세스 지정자는 private 입니다.

- 클래스 맴버에 접근하기위해 점(.) 연산자를 사용합니다.


멤버함수 및 캡슐화

클래스의 멤버 함수는 다른 변수와 비슷한 클래스 정의내에 프로토타입을 갖는 함수입니다.

위의 예제에서 SetLength, GetLength, GetArea 함수가 멤버함수를 의미합니다.

C#에서 캡슐화는 액세스 지정자에 의해 결정됩니다.

-> C# 캡슐화 설명보러가기

위의 예제코드는 캡슐화를 구현하기 위해 멤버 변수 length를 private 멤버로 숨기고,

public 메소드를 통해 함수 외부에서 간접적으로 접근하도록 하였습니다.


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
using System;
 
namespace SquareApplication {
    class Square {
        private double length;
        
        public Square() {
            Console.WriteLine("생성자가 호출되었습니다.");
        }        
 
        public double GetLength() {
            return length;
        }
        public void SetLength(double length_) {
            length = length_;
        }
        public double GetArea() {
            return length * length;
        }
    }
    class mainfunction {
        static void Main(string[] args) {
            Square sq1 = new Square(); // 생성자 호출
            Square sq2 = new Square(); // 생성자 호출
 
            sq1.SetLength(2);
            sq2.SetLength(10);
 
            Console.WriteLine("SQUARE1 AREA : {0}", sq1.GetArea()); // 4 출력
            Console.WriteLine("SQUARE2 AREA : {0}", sq2.GetArea()); // 100 출력
        }
    }
}
cs



위 코드에서 23, 24번줄에 Square 클래스의 객체를 생성할 때 정의된 생성자가 호출됩니다.

생성자를 따로 지정하지 않아도 기본(default) 생성자가 호출됩니다.

기본 생성자는 아무일도 하지않는 함수입니다.

생성자는 대게 멤버 변수 값을 초기화하는 용도로 사용됩니다.

또한 생성자에 매개변수를 추가하여 오버라이딩하여 사용할 수 있습니다.

다음 예제를 통해 확인하세요.

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
using System;
 
namespace SquareApplication {
    class Square {
        private double length;
        
        public Square(double length_) {
            length = length_;
            Console.WriteLine("생성자가 호출되었습니다.");
        }        
 
        public double GetArea() {
            return length * length;
        }
    }
    class mainfunction {
        static void Main(string[] args) {
            Square sq1 = new Square(4.0); // 생성자 호출
            Square sq2 = new Square(12); // 생성자 호출
 
            Console.WriteLine("SQUARE1 AREA : {0}", sq1.GetArea()); // 16 출력
            Console.WriteLine("SQUARE2 AREA : {0}", sq2.GetArea()); // 144 출력
        }
    }
}
cs

 

18, 19번줄의 객체를 생성하는 과정에서 매개변수 값을 넘겨주어 생성자에서 멤버 변수의 값을 초기화합니다.



C# 소멸자

소멸자는 클래스의 객체가 지정된 범위를 벗어나 할 일을 모두 끝냈을 때 호출되는 특정 멤버 함수입니다.

접두사 물결(~)이 붙어있으며 생성자와 같이 함수 이름은 클래스의 이름과 동일합니다.

사용자가 정의하지 않아도 기본(default) 소멸자가 제공되며, 대게 메모리를 해제하는데 사용됩니다.

다음 예제로 소멸자에 대해 살펴보도록하겠습니다.

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
using System;
 
namespace SquareApplication {
    class Square {
        private double length;
        
        public Square(double length_) {
            length = length_;
            Console.WriteLine("생성자가 호출되었습니다.");
        }        
 
        ~Square() {
            Console.WriteLine("소멸자가 호출되었습니다.");
        }
 
        public double GetArea() {
            return length * length;
        }
    }
    class mainfunction {
        static void Main(string[] args) {
            Square sq1 = new Square(4.0); // 생성자 호출
            Square sq2 = new Square(12); // 생성자 호출
 
            Console.WriteLine("SQUARE1 AREA : {0}", sq1.GetArea()); // 16 출력
            Console.WriteLine("SQUARE2 AREA : {0}", sq2.GetArea()); // 144 출력
        } // 이 시점에서 소멸자가 생성자의 역순으로 출력됩니다.
    }
}
cs


메인함수내의 Square 클래스의 객체 sq1과 sq2가 차례로 생성되고

27번줄에서 Main함수가 끝남과 동시에 객체 sq1과 sq2가 메모리 해제되며 소멸자가 호출됩니다.

소멸자는 생성자의 역순으로 sq2, sq1 순으로 호출됩니다.



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

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

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


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

C# 기초다지기 - 상속  (0) 2018.11.09
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

C# 기초다지기 - 구조체




안녕하세요 열코입니다.

이번시간에는 C# 구조체(Struct)에 대해 알아보도록 하겠습니다.


- 구조체란?

구조체는 사용자 정의 데이터 유형(Data Type)으로 int, double 등과 같은 기본적으로 제공되는 변수 유형이 아닌

새로운 유형, 여러가지 유형을 사용하기위해 사용자가 직접 만들어 사용됩니다.

C#에서 구조체는 일반 변수와 같이 값 형식의 데이터 형식입니다. (클래스는 참조형식)



- 구조체 정의하기

구조체를 정의하려면 struct 문을 사용합니다.

struct문은 프로그램에서 두개 이상의 멤버(변수)가 있는 새로운 데이터 형식을 정의합니다.

예를들어, 학생이라는 변수를 만들려고할 때 필요한 멤버들은 이름, 학번, 나이 등이 있습니다.

이를 Student 구조체로 만드는 방법은 다음과 같습니다.

1
2
3
4
5
struct Student {
    public string name;
    public int std_num;
    public int age;
};
cs


struct 키워드를 통해 Student라는 이름의 구조체를 정의하고 { } 대괄호 안에 멤버 변수들을 정의합니다.

정의된 구조체를 프로그램에서 사용하는 예제입니다.

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
using System;
 
struct Student {
    public string name;
    public int std_num;
    public int age;
};
 
public class MyStructTest {
    public static void Main(string[] args) {
        Student std; // 구조체 변수 선언
        Student std2;
 
        std.name = "세모지";
        std.std_num = 20181108;
        std.age = 26;
 
        std2.name = "열코";
        std2.std_num = 20181109;
        std2.age = 27;
 
        Console.WriteLine("Student 1 name : {0}", std.name);
        Console.WriteLine("Student 1 std_num : {0}", std.std_num);
        Console.WriteLine("Student 1 age : {0}", std.age);
 
        Console.WriteLine("Student 2 name : {0}", std2.name);
        Console.WriteLine("Student 2 std_num : {0}", std2.std_num);
        Console.WriteLine("Student 2 age : {0}", std2.age);
 
    }
}
cs


위와 같이 일반 변수처럼 구조체 변수를 선언한 후 구조체 변수의 멤버 변수에 .(점)을 통해 접근합니다.



- C# 구조체 특징

위에서 Student 라는 간단한 구조체를 사용했습니다.

C#에서의 구조체는 전통적인 C/C++의 구조체와 상당히 다른점이 존재합니다.

C# 구조체에는 다음과 같은 특징들이 존재합니다.

- C# 구조체에 메소드, 필드, 속성등을 가질 수 있습니다.

- C# 구조체에 생성자를 정의할 수 있습니다.

- C# 프로그램에서 new 연산자를 이용하여 struct 객체를 생성할 수 있습니다.


- C# 구조체에 기본(Default) 생성자를 정의할 수 없습니다.

- C# 구조체에 소멸자를 정의할 수 없습니다.

- C# 구조체는 다른 구조체나 클래스의 기본 구조체(상속하기 위한)가 될 수 없습니다.



- C# 구조체 vs 클래스

C#에서 구조체와 클래스는 다음과 같은 차이점이 존재합니다.

- 클래스는 참조유형이며 구조체는 값 유형입니다.

- 구조체는 상속을 지원하지 않습니다.

- 구조체는 기본(디폴트) 생성자를 가질 수 없습니다.



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

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

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


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

C# 기초다지기 - 상속  (0) 2018.11.09
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

C# 기초다지기 - 문자열




안녕하세요 열코입니다.

이번 시간에는 C# 프로그래밍의 문자열에 대해 알아보도록 하겠습니다.

C#에서는 다른 언어에서와 마찬가지로 문자열을 문자배열(char[])로 사용할 수 있습니다.

하지만 C#에서 기본 제공하는 string 키워드를 사용하여 문자열 변수를 선언할 수도 있습니다.

string 키워드는 System.String 클래스에 포함되어있습니다.


1. String 객체 만들기

- C#에서 String 클래스의 객체를 만드는 방법은 여러가지가 존재합니다.

1) 문자열 리터럴(상수)를 String 변수에 할당

2) String 클래스 생성자 사용

3) 문자열 연결 연산자(+) 사용

4) 문자열 반환 메소드 호출

- 다음 예제 소스코드를 통해 위 방법에 대해 설명합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
using System;
 
namespace MyStringApplication {
    class MyString {
        static void Main(string[] args) {
            string str1 = "HELLO";
            Console.WriteLine("str1 = {0}", str1);
            
            string str2 = new string("HELLO2");
            Console.WriteLine("str2 = {0}", str2);
            
            char[] letters = {'H''E''L''L''O''3');
            string str2_2 = new string(letters);
            Console.WriteLine("str2_2 = {0}", str2_2);
 
            string str3 = str1 + str2;
            Console.WriteLine("str3 = {0}", str3);
            
            string arr = {"HELLO""SEMOG""!!");
            string str4 = String.Join(" ", arr);
            Console.WriteLine("str4 = {0}", str4);
        }
    }
}
cs


- 출력 결과

str1 = HELLO

str2 = HELLO2

str2_2 = HELLO3

str3 = HELLOHELLO2

str4 = HELLO SEMOG !!


2. String 클래스 속성

- String 클래스에는 다음 두가지의 속성이 존재합니다.

1) Chars : 현재 String 객체의 지정된 위치에 있는 Char 객체를 반환합니다.

2) Length : 현재 String 객체의 문자 수(길이)를 반환합니다.


3. String 클래스 메소드

- String 클래스에는 문자열 객체를 작업하는데 도움이 되는 다양한 메소드(함수)들이 존재합니다.

- 다음 메소드들은 가장 일반적으로 사용되는 메소드들의 리스트입니다.

1) Compare()

1
public static int Compare(string srt1, string str2);
cs

- 두 String 객체를 비교하여 정렬 순서에 따라 상대위치를 나타내는 정수를 반환합니다.

- 정렬 순서는 ABC 순이며, 가장 앞 문자부터 비교합니다.

- str1이 str2 보다 정렬순서가 앞인 경우 : 음수(-1) 반환

- str1과 str2가 정렬순서가 동일한 경우 : 0 반환

- str1이 str2 보다 정렬순서가 뒤인 경우 : 양수(+1) 반환


2) Concat()

1
public static string Concat(string str1, string str2);
cs

- 두 문자열 객체를 연결하여 반환합니다.


3) Contains()

1
public bool Contatins(string str);
cs

- 문자열 내에서 지정된 String 객체가 존재하는지 여부를 나타내는 값을 반환합니다.


4) Copy()

1
public static string Copy(string str);
cs

- 지정된 문자열의 복사값으로 새 String 객체를 반환합니다.


5) Equals()

1
public static bool Equals(string str1, string str2);
cs

- 지정된 두 String 객체가 동일한지 여부를 반환합니다.


6) IndexOf()

1
public int IndexOf(char ch);
cs

- 현재 문자열에서 지정된 문자(유니코드)중 처음으로 나타나는 위치의 인덱스를 반환합니다.

- 매개변수가 문자열(string) 객체인 함수도 오버로딩되어있습니다.


7) Replace()

1
public string Replace(string str1, string str2);
cs

- 현재 문자열 객체에 있는 지정된 문자열을 모두 지우고 새로운 문자열로 변경한 문자열 객체를 반환합니다.


8) Split()

1
public string[] Split(params char[] seperator);
cs

- 현재 문자 배열 요소로 구분된 문자열 객체의 하위 문자열을 포함하는 문자열 배열을 반환합니다.

- 매개변수 기준으로 문자열을 쪼갠다고 생각하시면 됩니다.


9) Trim()

1
public string Trim();
cs

- 현재 String 객체에서 앞, 뒤 공백문자를 모두 제거합니다.

- 문자열 사이의 공백은 제거되지 않습니다.



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

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

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


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

C# 기초다지기 - 상속  (0) 2018.11.09
C# 기초다지기 - 클래스  (0) 2018.11.08
C# 기초다지기 - 구조체  (0) 2018.11.08
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


지속해서 업데이트 됩니다. (11/13)
ctrl + d를 눌러 북마크를 추가할 수 있습니다. 
모든 질문은 커뮤니티 Q&A 게시판에서 받습니다.


C/C++

  

C#



Python



Java



Android



HTML/CSS



JavaScript



PHP



DataStructure



Algorithm



Database



Network




to Top