본문으로 바로가기

C# 수업#8

category C# 2020. 5. 29. 09:51

안녕하세요~! 문쑹입니다 :)

 

정적멤버, 인스턴스 멤버

어떤 타입을 실체화한 것을 객체 또는 인스턴스라고 한다. 인스턴스를 달리 표현하면 new 연산자를 거쳐서 메모리에 할당된 객체라고 할 수 있다. 그 객체와 관련된 멤버를 인스턴스 멤버라고 하며 필드,메서드, 생성자는 모두 여기에 속한다.

가끔씩 인스턴스와 관계없는 행동을 정의해야 할 때가 있다. 즉, 개별 인스턴스 수준이 아닌 해당 인스턴스의 타입 전체에 걸쳐 전역적으로 적용되는 필드, 메서드, 생성자 가 필요할 수 있는데, 이러한 멤버를 인스턴스 멤버와 구분해 정적 멤버(static member)라고 한다.

인스턴스 필드의 한계

원래라면 두번째 거북선에 결과값이 2가 나올것 이라고 생각 하였다. 하지만 인스턴스 필드는 new로 할당받은 객체마다 고유하게 메모리를 확보하기 때문에 클래스 전역적으로 값이 유지되지 않는다. 이 같은 요구사항을 만족하려면 클래스 단위의 필드를 정의해야 하고, 그것이 바로 정적 필드(static field)가 된다.

 

정적 필드 한계 극복

필드 정의에 static 예약어 붙었으며, 클래스 밖에서 이 필드를 사용할 때 [클래스이름].[정적필드] 형태로 접근했다. 실행 결과에서 보다시피 정적 필드의 값은 new로 할당된 인스턴스와 상관없이 존재한다. 아래와 같은 그림은 정적 필드와 인스턴스 필드의 메모리를 표현한 것입니다.

정적 필드와 인스턴스 필드의 메모리 표현

아래의 그림을 보게 되면 static 메소드는 static 멤버만 접근이 가능하다. SetNumThree1()에서는 iNumStatic과 SetNumThree2()를 불러 올 수 있는데 SetNumThree2() 메소드에서는 static 멤버들만 접근이 가능하다.

정적 생성자(static constructor)

정적 생정자는 기본 생성자에 static 예약어를 붙인 경우로 클래스에 단 한 개만 존재할 수 있고, 주로 정적 멤버를 초기화하는 기능을 하기 때문에 형식 이니셜라이져(type initializer)라고도 한다.

class 클래스_명

{

    static 클래스_명()

    {

        //단 한번, 가장 최초로 실행될 초기화 코드

    }

}

 

*정적 생성자단 한 개만 정의할 수 있고 매개변수를 포함할 수 없다. 참고로 정적 생성자에서 실행되는 코드는 오류를 발생시키지 않도록 주의해야 한다. 왜냐하면 정적 생성자의 실행이 실패하는 경우 해당 클래스 자체를 전혀 사용할 수 없게 되고, 오류의 원인을 찾는 것 또한 쉽지 않기 때문이다.(static constructor를 줄여서 cctor라고 부른다.)

 

정적 생성자는 클래스어떤 멤버든 최초로 접근하는 시점에 단 한 번만 실행된다는 점을 기억해야 합니다. 정적 멤버를 처음 호출할 경우이거나 인스턴스 생성자를 통해 객체가 만들어지는 시점이 되면 그 어떤 코드보다도 우선적으로 실행된다.  person1에서 호출 했을 때 static person()을 실행(cctor) 시키고 public Person(string name)을 실행 되었다. 이것을 보면 static 메서드가 우선적으로 실행된 것을 확인할 수 있다. 그다음 person2를 호출 했을 때는 static은 이미 실행이 되었기 때문에 ctor만 호출이 되었다.

 

접근 제한자

지금까지 별다른 설명 없이 사용했던 public 예약어를 비롯한 기타 접근 제한자가 있다. 우선 C#에서 접근 제한자(access modifier)와 관련된 예약어로는 private, protected, public, internal이 있고 접근 제한자가 적용되는 유형은 5가지다.

private 내부에서만 접근을 허용한다. 우리말로 "사설", "개인", "전용"이라고 상황에 따라 섞어서 표현한다.
protected 내부에서의 접근과 함께 파생 클래스에서만 접근을 허용한다.
public 내부 및 파생 클래스에서의 접근뿐만 아니라 외부에서도 접근을 허용한다. 우리말도 보통 "공용"이라는 표현을 쓴다.
internal 동일한 어셈블리 내에서는 public에 준한 접근을 허용한다. 다른 어셈블리에서는 접근할 수 없다.
internal protected 동일 어셈블리 내에서 정의된 클래스이거나 다른 어셈블리라면 파생 클래스인 경우에 한해 접근을 허용한다(protected internal로도 지정 가능). 즉, internal 또는 protected 조건이다.

이상 포스팅을 마치겠습니다. 감사합니다 :)

Hasta Luego~!

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

C# 수업#10  (0) 2020.06.02
C# 수업#9  (0) 2020.06.01
C# 수업#7  (0) 2020.05.28
C# 수업#6  (0) 2020.05.27
C# 수업#5  (0) 2020.05.26