All Honey Tip

[C#] 1. 접근 제어자

수정 일:

발행 일:

접근 제어자

C#에서 접근 제어자는 클래스 내부의 멤버 또는 타입에 대한 외부 접근을 제한하는 데 사용되는 키워드입니다. 다른 코드에서 클래스의 멤버나 타입에 접근할 때, 이러한 접근 제어자를 사용하여 해당 멤버나 타입에 대한 접근 범위를 조절할 수 있습니다.

[기술 면접] 3. 스프링의 @Transactional 어노테이션에 대해서 아시나요?

C#에서 다섯 가지 주요 접근 제어자가 있습니다.

접근 제어자

  1. public: 이 접근 제어자를 사용하면 해당 멤버나 타입은 어디에서든지 접근할 수 있습니다. 클래스 외부에서도 접근 가능합니다.
  2. private: 이 접근 제어자를 사용하면 해당 멤버는 같은 클래스 내부에서만 접근할 수 있습니다. 클래스 외부에서는 접근할 수 없습니다.
  3. protected: 이 접근 제어자를 사용하면 해당 멤버는 같은 클래스 내부와 해당 클래스를 상속받은 파생 클래스에서 접근할 수 있습니다. 클래스 외부에서는 접근할 수 없습니다.
  4. internal: 이 접근 제어자를 사용하면 해당 멤버나 타입은 같은 어셈블리(어셈블리는 컴파일된 코드의 단위입니다) 내에서 접근할 수 있습니다. 다른 어셈블리에서는 접근할 수 없습니다.
  5. protected internal: 이 접근 제어자를 사용하면 해당 멤버나 타입은 같은 어셈블리 내에서 접근 가능하며, 또한 해당 클래스를 상속받은 파생 클래스에서도 접근할 수 있습니다.

클래스의 멤버에 적용되는 접근 제어자와 클래스 자체에 적용되는 접근 제어자인 “class default 접근자”는 다소 다른 의미를 가집니다.

  • Class Member의 Default 접근 제어자: 클래스 멤버에 별도의 접근 제어자를 지정하지 않으면, 기본적으로 private 접근 제어자가 적용됩니다. 이는 해당 멤버가 클래스 내에서만 접근 가능하고 클래스 외부에서는 접근할 수 없음을 의미합니다.
  • Class의 Default 접근 제어자: 클래스의 경우 별도의 접근 제어자를 지정하지 않으면, 기본적으로 internal 접근 제어자가 적용됩니다. 이는 해당 클래스가 같은 어셈블리 내에서만 접근 가능하고 다른 어셈블리에서는 접근할 수 없음을 의미합니다.
using System;

// 클래스 정의
class MyClass
{
    // 멤버 변수 (private 접근 제어자가 기본)
    int privateVar = 10;

    // 멤버 메서드 (private 접근 제어자가 기본)
    void PrintPrivateVar()
    {
        Console.WriteLine(privateVar);
    }

    // 내부에서 접근 가능한 멤버 메서드
    internal void InternalMethod()
    {
        Console.WriteLine("Internal method");
    }

    // 내부에서 접근 가능하고 파생 클래스에서도 접근 가능한 멤버 메서드
    protected internal void ProtectedInternalMethod()
    {
        Console.WriteLine("Protected Internal method");
    }
}

// MyClass를 상속받은 파생 클래스
class DerivedClass : MyClass
{
    void AccessBaseClassMembers()
    {
        // 상속을 받았기 때문에 ProtectedInternalMethod()에 접근 가능
        ProtectedInternalMethod();
    }
}

// Main 메서드 시작
class Program
{
    static void Main()
    {
        MyClass myObj = new MyClass();

        // privateVar는 MyClass 내에서만 접근 가능
        // 컴파일 에러: 'MyClass.privateVar'는(은) 접근할 수 없습니다.
        //Console.WriteLine(myObj.privateVar);

        // PrintPrivateVar 메서드는 MyClass 내에서만 호출 가능
        // 컴파일 에러: 'MyClass.PrintPrivateVar()'는(은) 접근할 수 없습니다.
        //myObj.PrintPrivateVar();

        // InternalMethod은 같은 어셈블리 내에서 접근 가능
        myObj.InternalMethod();

        // ProtectedInternalMethod은 같은 어셈블리 내에서 접근 가능
        myObj.ProtectedInternalMethod();

        // DerivedClass의 인스턴스 생성
        DerivedClass derivedObj = new DerivedClass();

        // 파생 클래스에서 상속받은 ProtectedInternalMethod에 접근
        derivedObj.AccessBaseClassMembers();
    }
}

접근 제어자를 올바르게 사용하여 클래스와 멤버의 접근 범위를 관리하면 캡슐화(encapsulation)를 통해 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다.


코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다