안녕하세요 삽잡이입니다.
이번시간에도 저번시간과 같이 C#에서 제공하는 여러 문법들을 알아보려고합니다.
객체지향 언어의 요소는 크게
''속성'과 '기능' 이 두가지로 나눌 수 있습니다.
C#에서는 필드, 이벤트, 속성이라는 용어를 '속성' 이라고 부릅니다.
멤버 메서드, 연산자 중복등을 '기능'이라고 부르지요...
즉, 원래 객체지향이란 두개로 나눌 수 있는데 이를 더 세분화를 하는 것입니다.
속성은 원래 기능이지만, 속성처럼 사용합니다.
그리고 이벤트도 내부적으로 만들어진 정의 형식인데, 속성처럼 사용합니다...
-this 키워드
this 키워드는 두가지 용도로 사용됩니다.
우선 첫번째 용도는 '자기 자신 참조'입니다.
이처럼 필드와 매개변수의 이름이 같다면 어떻게 될까요?
이렇게 데이터 필드와 매개변수가 동일한 이름을 가지고 있다면
즉, 범위의 모호성을 해결 하기 위해 사용할 수 있습니다.
this는 '자기 객체의 참조'를 뜻하기 때문에 사용이 가능한 것입니다.
두번째 용도로는 '생성자를 연쇄적으로 호출'하는 것입니다.
C++에서는 생성자에서 생성자를 호출할 수 없었습니다.
단지, 위임하는 것일 뿐이었습니다.
아무튼... 참조를 이용해서 필드에 접근하던지, 생성자를 호출하던지...
이 두가지가 this의 기능입니다.
-static
'static에서는 static만!'
static 필드를 사용할 때에는 모두 다 static 메서드만 사용합니다.
static 필드는 대부분 public이 아닙니다...
따라서 static 필드에 접근하기 위해서는 인터페이스 메서드가 필요합니다..
또한 static 키워드는 객체 없이도 호출할 수 있어야하니... 객체도 static이어야합니다.
-static 정적 생성자
생성자란, 객체의 생성, 초기화를 목적으로 만들어진 메서드입니다.
한마디로 객체가 생성될 때마다 호출이 됩니다.
그런데, 정적 생성자는 다릅니다.
정적 생성자는 정적 멤버를 초기화 하기 위해서 '단 한번' 호출합니다.
그 '단 한번'호출은 타입이 인식될 때 입니다...
예를 들어서
이라는 정적 필드가 있는데, 이 필드를 언제 초기화하냐... 하면...
이 int 놈을 보고... 즉, 타입이 인식되면
'int 타입이 있군!' 하면서 runtime 때 알아내서 '단 한번'호출 되는 것입니다.
그리고 어떤 객체보다도 먼저 호출이 되지요...
예를 들어서 100개의 객체가 있다고 생각해봅시다...
이 타입들이 다 사용될까요???
예를 들어서 이러한 워드 파일이 있다고 해봅시다...
여기에는 수 많은 객체들이 있을 것입니다.
그런데 우리가 이 기능 다 사용합니까...
아닙니다... 우리가 사용하는 기능은 몇개 안되지요...
주로 사용하는 기능은 몇개 없다는 것입니다.
따라서 사용빈도가 적은 객체는 만들어지지 않습니다.
모든 클래스형 객체를 생성할 필요 없이, 사용되는 타입만...
즉, 최초의 타입이, 최초의 멤버가 사용될 때 인식하고 메모리 상에 생성한다 이겁니다.
이런 것을 바로 '인식'이라고 부르지요...
닷넷은 타입을 생성하기 전에 타입에 관련된 '정보 객체'를 하나 생성합니다.
Class Point
{
}
이와 같은 클래스가 있다면 생성 전에 타입 객체가 하나 만들어지지요...
이 '타입 객체'는 Point라는 타입에 대한 완벽한 정보를 알고 있는 객체입니다.
이녀석을 보고 타입이 인식됬다는 것을 알게 되는 것입니다...
'아 ! Point 라는 타입이 있군!'이렇게 말입니다...
C++은 클래스를 보고 객체가 만들어지지만,
닷넷은 타입 객체를 보고 객체가 만들어지는 것입니다.
음... 정적 생성자 얘기하다가 여기까지 왔군요...
아무튼... static 정적 생성자는 '단 한번'호출 되는데
바로 '타입이 인식할 때'입니다.
즉, 타입 객체가 만들어질 때 딱 한번 호출된다는 소리입니다...
이 타입 객체는 어떤 객체 생성이나 객체의 메서드 호출보다도 먼저 생성이되고 인식됩니다.
그리고 이 정적 생성자의 목적은 '정적 필드 초기화'이구요...
정적 생성자(메서드)의 기능은 '정적 필드 초기화'라구요~!
이번 시간은 여기까지 하도록 하겠습니다.
이상 삽잡이였습니다!
'삽질의 현장 > - .NET' 카테고리의 다른 글
#027_닷넷(.NET)_.Net Framework 기본 - Getter/Setter (속성) & 생성자 (0) | 2015.10.27 |
---|---|
#026_닷넷(.NET)_.Net Framework 기본 - 접근 한정자 (0) | 2015.10.27 |
#024_닷넷(.NET)_.Net Framework 기본 - C# 여러가지 문법 (1) (0) | 2015.10.26 |
#023_닷넷(.NET)_.Net Framework 기본 - ToString() 오버라이드 (0) | 2015.10.24 |
#022_닷넷(.NET)_.Net Framework 기본 - 참조 타입과 값 타입에 대하여 (0) | 2015.10.24 |