White Whale Studio

[C#] Class Part.2 본문

IT Engineering/C#.net

[C#] Class Part.2

glorymind 2012. 1. 9. 15:44
반응형
이번에는 클래스 멤버와 함께 잡다구리한 클래스에 관련된 애기들을 살펴보자.

먼저 클래스 멤버는 크게 초기화, 데이터 저장 및 처리, 기능 구현, 기타로 구분이 된다.
각각 구분별 세부 항목을 살펴보면 다음과 같다.

초기화 : 생성자, 소멸자
데이터 저장 및 처리 : 상수, 멤버 변수, 속성, 인덱서
기능 구현 : 메서드
기타 : 이벤트

1. 생성자

생성자는 메서드의 일종으로 클래스 명과 이름이 같으며, 객체를 사용할 때 가장 먼저 실행된다.
보통 객체 초기화 작업에 사용한다.

생성자는 중복 선언을 할수 있으며, 이런 기능을 생성자 오버로딩이라고 부른다.
글로 적어서는 잘 모를테고.. 코드를 보자.

class Example
    {
        public Example()
        {
            Console.WriteLine("생성자1 : Nothing");
        }
        public Example(int data)
        {
            Console.WriteLine("생성자2 : {0}", data);
        }
        public Example(string str)
        {
            Console.WriteLine("생성자3 : {0}", str);
        }
        public Example(double a, float b)
        {
            Console.WriteLine("생성자4 : {0} + {1} = {2}", a, b, a + b);
        }       
    }
    class Classexam
    {
        static void Main(string[] args)
        {
            Example obj1 = new Example();
            Example obj2 = new Example(3);
            Example obj3 = new Example("학교종");
            Example obj4 = new Example(3.14, 4.14f);
        }
    }

Example 클래스에서는 파라미터에 따라서 생성자를 각각 정의하고 있고, Classexam 클래스에서는 Example 객체 인스턴스를 정의하고 동시에 파라미터를 넘기고 있다.
같은 이름의 클래스임에도 불구하고 다른 결과가 나오는 것은 Example 클래스에서 같은 이름이지만 파라미터별로 상이한 생성자를 미리 정의해 두었기 때문이다.

생성자는 또한 보통 public 접근 제한자를 사용하는데, 외부에서 클래스 초기화 부분에 접근하기 위해서는 반드시 필요한 제한자이다. 접근 제한자의 종류는 뒤에서 살펴보도록 한다.

2. 상수/읽기 전용 필드
상수는 읽기 전용 속성을 가지고 있다. 컴파일 시에 초기 값이 결정되어 있어야한다.
생성자에서 파라미터를 받아 상수값을 결정하고 싶은 경우에는 readonly 키워드를 사용해서 읽기 전용 필드를 선언해야 한다.
readonly 타입의 변수는 한번 값을 결정하게 되면 값을 변경하거나 할당할수 없는 읽기 전용 필드가 되어 버린다.

class Example {
   public readonly int x;
   public const int y = 20;
   public Example(int data){
   x = data;
   }
}

위의 코드에서 보면 readonly로 선언한 x는 Example 생성자를 통해서 최초 1회 값을 결정해주게 되고, 이후에는 변경이 불가하다. const(상수 선언) 타입의 y변수는 20으로 미리 정의를 해두었기 때문에 물론 후에 변경 불가능하다.


3. 접근 제한자.
접근 제한자는 클래스 뿐만아니라 메서드나 멤버 변수등의 클래스 구성요소 앞에서 사용된다.

C#에서는 public, private, protected, internal, protected internal 과 같이 5가지의 접근 제한자를 가진다.

접근 제한자

클래스 내부

외부 클래스

파생 클래스

프로젝트

public

private

 

 

 

protected

 

 

internal

 

protected internal

 

대개 public 과 private가 많이 사용되는데, 이런식으로 접근을 제한한다는 것만 알아두면 되겠다.

4. 정적 변수 및 메서드
정적 즉 static 키워드를 사용하는 것이다.
static 키워드를 사용하게 되면, 메모리 힙(Heap) 영역에 데이터가 저장되어서 이 정적 변수는 프로그램 실행 중 유일한 값이 된다.
그래서 객체 인스턴스의 선언 없이도 [클래스명.필드명], [클래스명.메서드명] 과 같은 형식으로 사용을 할수 있다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Example
{   
    class Example
    {
        public static int i = 10;
        public static void show()
        {
            Console.WriteLine("으하하하 Static");
        }
    }
    class Classexam
    {
        static void Main(string[] args)
        {
            Console.WriteLine("{0}", Example.i);
            Example.show();
        }
    }
}

Main 메서드도 알고보니 static 형태이다.
Main 메서드는 프로그램의 진입점이기 때문에 어디에서든 접근할 수 있어야되기 때문이다.


5. Nested Class (내포 클래스)
내포 클래스는 말그대로 클래스 내에 클래스가 중복 기술되어 있다는 것이다.
이번에도 간단하게 코드로 살펴보자.
선언이야...

class National
{
    class State {
            class City{
            }
    } 
}
이렇게 하면 된다.
문제는 사용법!

National national = new National("대한민국");
National.State state = new National.State("경상북도");
National.State.City city = new National.State.City("경산시");
위와 같이 사용한다. 타이핑 해놓고보니 조금 복잡하기도 하고 지저분하기도 하고..=ㅅ=



반응형
Comments