※ 이전 블로그의 포스트임(2016/11/2)


 오늘 공부한 부분은 변수와 배열에 대한 부분이었다. 모든 언어가 그렇듯 변수와 배열을 공부하면 필연적으로 scope와 reference에 대해서도 1+1 처럼 공부를 하게 된다.

 

1. 기본 자료형 단일 변수 (int, byte, ...)

 C#에서 기본 자료형에 대한 변수 선언이나 사용 방식은 C 언어와 100% 동일하다. 

 

2. 배열 변수

 배열에 있어서는 C 언어와 다소 상이한 면이 있는데, C# 은 배열 변수를 stack 영역에 선언 할 수 없게 되어 있다. 단순히, 아래와 같이 구현을 하면 표기가 잘못되었다면서 컴파일 에러가 난다.

int line[33];
int rect[100][200];
short trie[10][15][25];

 

 실제로 위와 같은 배열을 선언하여 이용하고자 한다면 아래와 같이 코딩해야 한다.

int [] line = new int[33];
int [,] rect = new int[100,200];
short [,,] trie = new short[10,15,25];

 

 (배열 선언에 있어서 C# 만의 독특한 notation이 등장하는데, C와 JAVA와의 태생적 유사성에서 벗어나고자 하는 노력의 결과물로 보인다.)

 위 코드를 보면 JAVA와 거의 동일한 방식 임을 알 수 있다. C++ 과도 1차원 할당에 있어서는 동일하다. (C++ 은 2차원 이상은 한 번에 할당할 수 없다.) new 라는 명령어는 특정 객체(OOP 에서는 기본 자료형도 엄연히 객체이다.)를 heap 영역에 할당하는 역할을 한다. 즉, C# 은 배열이 무조건 heap 영역에만 존재하게 되어 있다.

 그런데, 교재에서 변수와 배열을 설명하기 위해 stack 과 heap 에 대해서도 페이지를 할애하여 기술을 하였는데, 내가 알고 있는 바와 상이한 면이 있어 특별히 포스트를 하나 작성하려 한다. (TBD)

 

3. 'string' 변수

 기본 자료형 중 string type 은 특별히 heap 에 내용이 저장되는 형태이다.

string helloworld = "Hello~ World!";

 

 이렇게 선언하면 "Hello~ World!" 는 heap 영역에 존재하게 되며, helloworld 는 해당 영역을 reference 하게 된다. 아무래도 문자열 역시 일종의 배열이기 때문일 것이다. 재밌는 건 C#에서는 배열 첨자 연산자를 통해 문자열의 특정 위치의 문자를 가리킬 수 있다.

string helloworld = "Hello~ World!";
char H = helloworld[0];

 

 H 에는 'H' 문자가 들어가게 된다. 그런데, 아래와 같이 하면,

string helloworld = "Hello~ World!";
helloworld[0] = 'C';	// error!

 

 빌드 에러가 난다. 읽기 전용 값을 수정하려 한다면서 말이다. 그렇다면? 아마도, '[ ]' 연산자에 대해 읽기 속성만 overloading 을 한 것 같고, JAVA의 String class처럼 문자열 자체를 읽지 전용 속성으로 저장하고 있는 것으로 보인다. 

 교재에 따르면, C#에서 읽기 전용 첨자 operator overloading을 indexer 구현이라고 부르는 것 같다. 공부하다보면 알게 되겠지.

 


 scope와 reference에 대해서는 다음 포스팅 때 다뤄야 겠다.

 

 

 

Posted by JMAN