250x250
Notice
Recent Posts
Recent Comments
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

minjea.dev의 코딩블로그

[c#] 접근제한자란? 본문

코딩강좌/c#

[c#] 접근제한자란?

minjea.dev 2022. 4. 12. 12:00
728x90
접근 제한자 설명
private 클래스 내부에서만 접근가능.
protected 클래스 내부에서 접근할수 있고, 클래스를 상속받은 클래스에서도 사용이 가능하다.
public 클래스 내부와 외부 모두 접근이 가능하다.
internal 동일한 어셈블리에서만 접근가능.
internal protected 동일 어셈블리 내에서 정의된 클래스이거나, 다른 어셈블리라면 파생 클래스인 경우에 한해 접근을 허용.

접근 제한자는 클래스와 구조체, 인터페이스, 클래스의 메서드, 필드 등에서도 사용이 가능합니다.

 

private

private는 모든 클래스 멤버의 기본적인 접근제한자로써, 다음과 같이 작성하면, private 접근 제한자가 생략된것으로 간주됩니다.

public class testClass {
    int num; // 클래스 내부에선 접근가능.
    string str; // 클래스 내부에선 접근 가능.
    
    // 아래 메서드도 클래스 내부에서만 접근 가능
    void print(string str) {
        Console.WriteLine(str);
    }
}

즉, 위 코드는 아래 코드와 동일하다고 봅니다.

class testClass {
    private int num; // 클래스 내부에선 접근가능.
    private string str; // 클래스 내부에선 접근 가능.
    
    // 아래 메서드도 클래스 내부에서만 접근 가능
    private void print(string str) {
        Console.WriteLine(str);
    }
}

그런데, 위에 표에선, private 설명을 보면 클래스 내부에서만 접근이 가능하게 하는 접근제한자라고 설명이 되어있습니다. 이게 도데체 무슨 소리일까요?

 

클래스 내부에서만 접근이 가능하다는 말은, 말 그대로 클래스의 메서드 등에서 접근이 가능하다는 뜻입니다. 아래 코드를 보시면

class testClass {
    private int num; // 클래스 내부에선 접근가능.
    private string str; // 클래스 내부에선 접근 가능.
    
    public testClass(int num, string str) {
        this.num = num;
        this.str = str;
    }
    
    // 아래 메서드도 클래스 내부에서만 접근 가능
    private void print() {
        Console.WriteLine(this.str);
    }
}

testClass ts = new testClass(0,"Hello C#!");
ts.print(); // Hello C#! 이 뜸

정말로 메서드같은 클래스 내부에선 접근이 가능합니다. 그렇다면 클래스 외부에서 접근하면 어떻게 될까요?

class testClass {
    private int num; // 클래스 내부에선 접근가능.
    private string str; // 클래스 내부에선 접근 가능.
    
    public testClass(int num, string str) {
        this.num = num;
        this.str = str;
    }
    
    // 아래 메서드도 클래스 내부에서만 접근 가능
    private void print() {
        Console.WriteLine(this.str);
    }
}

testClass ts = new testClass(0,"Hello C#!");
Console.WriteLine(ts.str);

바로 마지막줄에서 에러가 발생합니다. 이로써, 정말 private 접근제한자가 적용된 필드나 메서드는, 클래스 내부에서만 접근이 가능하다는것을 우리는 알게 되었습니다.

 

public

public 접근제한자가 적용된 클래스의 메서드나 필드의 경우엔, 클래스 내부에서도 접근이 가능하고, 외부에서도 접근이 가능합니다. 즉, 어디서든 접근이 가능하다는 소리입니다. 그러면 아까 정의한 testClass의 내용을 다음과 같이 바꾸어봅시다.

public class testClass {
    public int num; // 클래스 내부에선 접근가능.
    public string str; // 클래스 내부에선 접근 가능.
    
    public testClass(int num, string str) {
        this.num = num;
        this.str = str;
    }
    
    // 아래 메서드도 클래스 내부에서만 접근 가능
    public void print() {
        Console.WriteLine(this.str);
    }
}

그리고 그 밑에 다음과 같은 코드를 추가해주면,

testClass ts = new testClass(0,"Hello C#!");
ts.print(); // Hello C#! 이 뜸
Console.WriteLine(ts.str); // Hello C#! 이 뜸​

아까와 달리 클래스의 필드에 직접 접근해도 정상적으로 접근할수 있다는것을 알게 되었습니다.

 

protected, internal, internal protected

이 세개의 접근제한자에 대하여서는 나중에 상속이랑 어셈블리를 설명하며 알려드리도록 하겠습니다.

728x90