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은 멤버는 동일한 어셈블리 내에서 접근할 수 있지만 다른 어셈블리에서는 접근할 수 없다.
DLL은 Dynamic 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(); // 다른 어셈블리와 파생 클래스에서 접근 가능
}
}
이처럼 접근 제한자는 의도된 용도 및 보안 고려 사항에 따라 클래스 멤버의 적절한 가시성을
캡슐화하고 유지 관리하는 데 유용하게 쓰인다.
접근 제한자가 바로 객체 지향 프로그래밍의 중요한 다형성, 캡슐화, 상속성, 추상화중 하나에 속한다.
'Unity > c#' 카테고리의 다른 글
5. C# 캡슐화와 프로퍼티 (0) | 2023.09.01 |
---|---|
4. C# 생성자(Constructor)와 소멸자(Destructor) (0) | 2023.08.06 |
2. C# - 많이 쓰는 Math 클래스와 클래스의 인스턴스 (0) | 2023.07.17 |
2. C# - 클래스의 기본1 (1) | 2023.07.08 |
1. C#의 기본2(조건문, 반복문을 활용한 로또 출력하기, 주민등록번호와 성별 출력하기) (0) | 2023.06.20 |
댓글