※ 이전 블로그의 포스트임(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에 대해서는 다음 포스팅 때 다뤄야 겠다.
'Book Study > 시작하세요! C# 6.0 프로그래밍' 카테고리의 다른 글
C#의 변수, 배열, 범위(scope), 참조(reference) #2 (0) | 2020.02.09 |
---|---|
교재(시작하세요 C# 6.0)에 대한 고찰 #1 - 첨자/색인(index/subscript) (0) | 2020.02.09 |
C#의 기본 자료형 (0) | 2020.02.09 |
MonoDevelop을 써볼까. (inc. 설치 방법) (0) | 2020.02.09 |
닷넷 프레임워크(.NET Framework) 용어 한줄 정리 (0) | 2020.02.09 |