본문 바로가기
Unity/c#

3. C# 메서드, 접근 제한자

by RongBee 2023. 8. 1.

C#에서 인스턴스 메서드 생성과 기본적인 사용방법은 이러하다.

 

class Program
{
   class ExMethod
   {
       public int Score(int a)
       { 
           return a * a;
       }
    }
    
    static void Main(string[] args)
    {
        ExMethod exmethod = new ExMethod();
        Console.WriteLine(ExMethod.Score(5));
    }
}

 

이렇게 인스턴스화될 때 메모리에 로드되고, 인스턴스 메서드는 클래스의 인스턴스에서 호출될 때만 사용할 수 있다.

 

하지만 static으로 정적 메서드를 만들어준다면 인스턴스를 생성하지 않고 메서드를 사용할 수 있게 된다.

 

 

 

 

Overloading : 이름은 같고, 매개변수는 다른 메서드를 만드는 방법이다.

 

위의 클래스는 Math 클래스이다.

 

이렇게 함수의 이름이 같아도 반환형과 매개변수의 자료형이 다른 Abs를 비롯한 여러 함수를 볼 수 있다.

 

이렇듯 함수의 Overloading의 개념이란 함수의 같은 이름으로 여러 값들을 반환할 수 있도록 해주는 중요한 개념이다.

 

 

 

C++과 C#에는 접근 제한자라는 개념이 있다.

 

대표적으로 public private protected가 있으며 C#에는 internal, protected internal이 있다.

 

우선 public은 동일한 어셈블리 내 모든 코드 또는 이를 참조하는 다른 어셈블리에서 필드의 멤버에 접근할 수 있게 된다.

 

public class MyClass
{
    public int MyPublicVariable;     // public 멤버 변수
    public void MyPublicMethod();    // public 멤버 함수
    
    private int MyPrivateVariable;   // private 멤버 변수
    private void MyPrivateMethod();  // private 멤버 함수
}

 

하지만 private가 붙은 필드의 멤버들은 같은 클래스 내에서만 접근이 가능하다. 

 

접근 제한자를 명시하지 않을 경우 자동으로 private가 적용된다는 점.

 

 

그리고 객체지향 프로그래밍에서 한 가지 또 중요한 상속이라는 개념과 관련이 있는 protected가 있다.

 

public class BaseClass
{
    protected int MyProtectedVariable;  // protected 멤버 변수
    protected void MyProtectedMethod(); // protected 멤버 함수
}

public class DerivedClass : BaseClass // BaseClass 상속
{
    public void SomeMethod()
    {
        MyProtectedVariable = 28; // 파생 클래스에서 접근 가능
        MyProtectedMethod();      // 파생 클래스에서 접근 가능
    }
}

 

이렇게 기반 클래스에 있는 멤버들에게 접근하기 위해선 파생 클래스에서 기반 클래스 상속을 선언해 준 후 접근하면 된다.

 

 

이번엔 internal에 대해 알아보자.

 

// Assembly1.dll
internal class MyClass
{
    internal int MyInternalVarialbe;   // internal 멤버 변수
    internal void MyInternalMethod();  // internal 멤버 함수
}

// Assembly2.dll
public class AnotherClass
{
    public void SomeMethod()
    {
        var myClass = new MyClass();
        myClass.MyInternalVariable = 28; // 이 어셈블리에서 접근할 수 없다.(컴파일 오류)
        myClass.MyInternalMethod();      // 이 어셈블리에서 접근할 수 없다.(컴파일 오류)
    }
}

 

internal은 멤버는 동일한 어셈블리 내에서 접근할 수 있지만 다른 어셈블리에서는 접근할 수 없다.

 

 

DLLDynamic Link Library이며 동적 링크 라이브러리라고 한다. 

 

DLL은 내부에는 다른 프로그램이 불러서 쓸 수 있는 다양한 함수들을 가지고 있으며, 확장 DLL은 클래스를 가지고 있다.

 

사용하는 방법에는 2가지가 있다.

 

묵시적 링킹(Implicit linking) : 실행 파일 자체에 어떤 DLL의 어떤 함수를 사용하겠다는 정보를 포함하며 OS가 프로그램 실행 시 해당 함수들을 초기화 하는 방법이다. (컴파일러가 자동으로)

 

명시적 링킹(Explicit linking) : 프로그램이 실행 중일 때 API를 이용하여 DLL 파일이 있는지 검사하고 동적으로 원하는 함수만 불러와 쓰는 방법이다.

 

 

 

protected internal은 internal과 다르게 서로 다른 어셈블리에 있더라도

 

동일한 어셈블리와 파생 클래스에서 접근 할 수 있다.

 

// Assembly1.dll
public class MyBaseClass
{
    protected internal int MyProtectedInternalVariable; // Protected internal 멤버 변수
    protected internal void MyProtectedInternalMethod() // Protected internal 멤버 함수
}

// Assembly2.dll
public class MyDerivedClass : MyBaseClass
{
    public void SomeMethod()
    {
        MyProtectedInternalVariable = 28;  // 다른 어셈블리와 파생 클래스에서 접근 가능
        MyProtectedInternalMethod();       // 다른 어셈블리와 파생 클래스에서 접근 가능
    }
}

 

이처럼 접근 제한자는 의도된 용도 및 보안 고려 사항에 따라 클래스 멤버의 적절한 가시성을 

 

캡슐화하고 유지 관리하는 데 유용하게 쓰인다. 

 

접근 제한자가 바로 객체 지향 프로그래밍의 중요한 다형성, 캡슐화, 상속성, 추상화중 하나에 속한다.

 

 

 

 

 

댓글