C#은 클래스를 어떻게 정의하는지 알아보자.

C++의 클래스와 거의 동일하다. 다만 조금 다른 부분이 있다.

 

C++은 아래와 같이 클래스를 정의한다.

class A
{
public:
    void func(){}
}

 

C#에선 아래와 같이 정의한다.

class A
{
    public func() {}
}

 

C++에선 접근 제한 지정자를 작성하면 그 아래에 있는 코드들은 해당 접근 제한 지정자의 영향을 받는다.

반면, C#은 접근 제한 지정자를 변수, 메소드 별로 앞에 붙여주어야 한다.

 

접근 제한 지정자는 C++에는 public, protected, private 3가지가 있고, C#에도 동일하게 있다. 역할 또한 똑같다. 

다만, C#에는 internal과 protected internal 이라는 2개의 접근 제한 지정자가 추가로 있다. 

 

internal은 같은 어셈블리 내에서만 접근이 가능하도록 제한하는 키워드이다. 그렇다면 어셈블리란 무엇일까?

컴파일을 통해 나온 결과물을 어셈블리라고 한다. exe파일도 하나의 어셈블리고, dll파일도 하나의 어셈블리이다.

 

어셈블리 내에서만 접근할 수 있도록 제한한다는 의미는 해당 프로젝트가 라이브러리로 컴파일되어 다른 프로젝트에서 사용되었을 때, 외부에서는 접근을 하지 못하도록 막는다는 의미인 듯 하다.

 

표로 정리해보면 아래와 같다.

접근 제한 지정자 C++ C#
public 어디에서나 참조 가능 어디에서나 참조 가능
protected 상속 관계에서만 참조 가능 상속 관계에서만 참조 가능
private 클래스 내부에서만 참조 가능 클래스 내부에서만 참조 가능
internal 없음 어셈블리 내에서만 참조 가능
protected internal 없음 어셈블리 내에 있는 상속 관계의 클래스에서만 참조 가능

 

C#에는 C++과 달리 프로퍼티라는 기능도 지원해준다.

프로퍼티란 쉽게 말하면 getter, setter이다.

 

C++에선 멤버 변수를 외부에서 안전하게 참조할 수 있도록 getter와 setter을 아래와 같이 만든다.

class Test
{
public:
    int GetA()
    {
        return A;
    }
    
    void SetA(int _A)
    {
        A = _A;
    }
    
private:
    int A = 0;
}

 

물론 C#도 위와 같이 getter, setter을 선언하여 사용할 수도 있다.

하지만, C#에서 지원해주는 프로퍼티란 기능을 사용할 수도 있다.

 

아래 코드를 보자.

class Class1
{
    public int AProperty
    {
        get 
        { 
            return A; 
        }

        set 
        {
            A = value; 
        }
    }

    private int A = 0;

}

 위와 같이, get set 키워드를 통해 getter과 setter을 간단하게 선언할 수 있다.

class Class1
{
    public int AProperty
    {
        get 
        { 
            return A; 
        }

        set 
        {
            if(A > 0)
            {
                A = value; 
            }
        }
    }

    private int A = 0;

}

이렇게 내부에 조건문을 추가할 수도 있고 선행작업이나 후행작업이 필요하다면 그 것도 추가할 수 있다.

 

class Class1
{
    public int AProperty
    {
        get { return A; }
        set {if(A > 0) A = value;}
    }

    private int A = 0;

}

이렇게 짧게 쓸 수도 있고, get이나 set중에 하나만 넣어줄 수도 있다.

 

일반적인 getter, setter이랑 사실 크게 다른 건 없어보인다. 그래도 문법에서 지원해주니까 프로퍼티를 사용하는게 아무래도 코드의 통일성을 유지하기 좋을 것 같다. 아니면 그냥 본인 쓰기 편한대로 써도 될 것 같다.

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

C# - const, readonly  (0) 2024.08.10
C# - is, as 연산자  (0) 2024.08.07
C# - C#의 자료형  (0) 2024.07.24
C# - 클래스와 콘솔 출력  (2) 2024.07.24
C# - C#과 .NET 프레임워크  (2) 2024.07.23

+ Recent posts