본문으로 바로가기

[C#] 6. C# 초급 (1) 클래스

category 개발자과정준비/C# 2020. 5. 31. 23:04
반응형

드디어 기초에서 초급으로 업그레이드 됬습니다!!

그말은 즉슨 강의 내용이 점점 더 어려워 진다는 것이죠.... 낙오 되지않고 끝까지 한번 달려보겠습니다.

 

저번 시간은 클래스, 구조체, 배열에대해 맛보기로 알아봤었는데요, 오늘은 클래스에 대해 좀 더 살펴보는 시간을 가져보겠습니다.

 

프로그래밍을 함에있어서 C#의 기본 자료형들로는 현실 세계를 모델링하기에 역부족합니다. 그래서 객체지향 프로그래밍 언어는 기본 타입 외에 개발자가 원하는 객체의 타입을 새롭게 정의해서 사용할 수 있는 기능이 바로 클래스라고합니다. 붕어빵을 예를들면, 붕어빵을 만들때 붕어빵을 객체라고하면 붕어빵기계의 틀을 클래스라고합니다. 붕어빵기계틀이라는 클래스에 넣어서 계속 붕어빵이라는 객체를 만드는 것이죠

클래스를 정의할때는 클래스를 만들고 그 안에서 변수를 만들면 그 변수는 객체가 됩니다.

Class 클래스_명

{

//속성(attribute) 정의 -> 변수

//행위(behavior) 정의 -> 메서드

}

이때 선언만으로는 사용할 수 없으며, new 연산자로 할당해야합니다. 만약 생성과 동시에 객체를 초기화하고 싶다면 생

성자(construct)를 정의해야합니다.(생성자는 밑에서 다루도록 하겠습니다).

class Car로 클래스 선언 예시

내부 클래스(inner class)는 클래스 안에 선언된 클래스이며, 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언합니다.

 

생성자(Constructor)

생성자는 객체가 생성되는 시점에 자동으로 해당 메서드가 호출됩니다. 클래스와 이름 규칙이 동일하며 반환 타입을 명시하지 않는다는 특징이 있습니다. 객체를 생성하는 시점에 코드가 담기고, 생성자를 한번이라도 정의하지 않았으면 C#에서는 일부러 빈 생성자를 클래스에 집어넣고 컴파일합니다.

 

기본 생성자(default construcor)

기본 생성자는 매개변수가 하나도 없는 생성자이며 만약 우리가 생성자를 정의한 경우 C#에서는 기본 생성자를 추가하지 않습니다.

 

오버로딩(overloading)

클래스 내에서 같은 이름의 메서드를 여러 개 선언하는 것입니다. 메서드 오버로딩의 조건은 매개 변수의 타입, 개수, 순서중 하나가 달라야 합니다.

 

같은 범위에서 똑같이 변수 선언을하면 빨간줄이 뜬다

 

필드

필드는 객체에 속한 변수입니다. 메서드 내부에서 정의된 지역 변수(local variable)와 구분하는 의미에서 멤버 변수(member variabel)이라고도 합니다.

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
 class Program
    {
        class Car    // 클래스안에 클래스도 만들 수 있다(inner class/이너 클래스라 부른다.)
        {         
            //상태정보
            
            public int ispeed;  //속도
            int iNum;   // 클래스변수
 
            public void Acc()   //클래스 가속하는 메서드
            {
                ispeed = ispeed + 10;  // 메서드 변수
                                   // 같은 클래스에서 변수선언이 되어있어서 변수선언 안해도 빨간줄이 뜨지않는다
                                   // 클래스 안에있는 애들끼리 변수를 공유한다
            }
            public void DeAcc()  // 감속하는 메서드
            {
                ispeed = ispeed - 10;
            }
            public void Status()
            {
                Console.WriteLine("현재속도는 {0}km입니다. ", ispeed);
            }
        }
        static void Main(string[] args)  
        {
            // 
            /*
            Car MyCar;    // 원래있던(int나 char같은거)게 아니고 사용자 정의 타입
            MyCar = new Car();  // 객체는 Heap영역에 만들어야하기때문에 new영역이 필요함
            MyCar.ispeed = 0;
            Console.WriteLine("현재속도는 {0}km입니다. ", MyCar.ispeed);
            // MyCar.ispeed = MyCar.ispeed + 10;       // 이렇게 해도되지만 클래스를 써먹어보자
            MyCar.Acc();       // 속도 증가 메소드
            MyCar.DeAcc();    // 속도 감소 메소드
            */
 
            // 중복된 코드를 모두 제거하고 객체지향으로 표현
            Car MyCar;  
            MyCar = new Car();  
            MyCar.ispeed = 0;
            MyCar.Status();
            MyCar.Acc();
            MyCar.Status();
            MyCar.DeAcc();
            MyCar.Status();
        }
    }
cs

컴파일러 출력

void Main에 주석처리된 부분을 더 깔끔하게 밑에 코드처럼 객체지향언어로 바꿀 수 있습니다.

 

기본적으로 void Main에서 Car 타입을 정의해서 MyCar라는 변수를 선언했습니다. 밑에 ispeed같은 변수를 선언했는데 컴파일러 오류가 뜨지않았는데 이는 class car에서 명시적으로 public이라는 예약어를 사용해서 클래스의 필드를 정의했기때문입니다. public은 영역 '{ }' 밖에서도 외부로 사용할 수 있게 해주는 예약어 입니다.

 

 

 

 

 

 

 

Car라는 클래스를 만들고 가속, 감속 메서드이용, 생성자사용 예제

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 Program
    {
        class Car
        {
            public int _iSpeed;
 
            public Car(int iSpeed)
            {
                _iSpeed = iSpeed;
                Console.WriteLine("Car 클래스 생성됨");
            }
            public void Acc() 
            {
                _iSpeed = _iSpeed + 10;
            }
 
            public void DeAcc()
            {
                _iSpeed = _iSpeed - 10;
            }
 
            public void Status()
            {
                Console.WriteLine("현재 속도는 {0}Km입니다.", _iSpeed);
            }
 
        }
        static void Main(string[] args)
        {
            Console.WriteLine("1==================");
            Car MyCar = new Car(3);
            MyCar.Status();
 
            Console.WriteLine("2==================");
            Car MyCar1 = new Car(100);
            MyCar1.Status();
 
            Console.WriteLine("3==================");
        }
cs

 

끝에서 두번째 예시화면

 

 

class Car에서 메서드 Car(), Car(int iSpeed)로 오버로딩 사용

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
class Program
    {  // 참조는 호출된 횟수를 얘기함
        class Car
        {
            public int _iSpeed;
 
            public Car()  //  디폴트 생성자 // 자동으로 0이 들어감
            {
                _iSpeed = 0;
                Console.WriteLine("Car 클래스 생성됨");
            }
            public Car(int iSpeed)
            {
                _iSpeed = iSpeed;
                Console.WriteLine("Car(int) 생성자 호출");
            }
            public void Acc() 
            {
                _iSpeed = _iSpeed + 10;
            }
 
            public void DeAcc()
            {
                _iSpeed = _iSpeed - 10;
            }
 
            public void Status()
            {
                Console.WriteLine("현재 속도는 {0}Km입니다.", _iSpeed);
            }
 
        }
        static void Main(string[] args)
        {
            Console.WriteLine("1==================");
            Car MyCar = new Car(0);
            MyCar.Status();
 
            Console.WriteLine("2==================");
            Car MyCar1 = new Car(100);
            MyCar1.Status();
 
            Console.WriteLine("3==================");
        }
    }
cs

 

 

반응형