1. 변수
수학에서와 마찬가지로, 프로그래밍에도 변수라는 것이 존재한다. 변수를 코드의 면모서 살펴보면 수학에서의 의미와 비슷하게 값을 대입시켜 변화시킬 수 있는 요소로 볼 수 있으나, 메모리의 관점에서 살펴보면 ‘데이터를 담는 일정한 크기의 공간’이라고 볼 수 있다. 이러한 변수를 ‘만든다’는 것을 개발자들은 ‘변수를 선언한다’라고 말한다. 변수를 선언한다는 말은 이 변수에 필요한 메모리 공간을 예약해달라는 말로 바꾸어 이해할 수 있다.
그 변수의 형식들은 다음과 같이 나열할 수 있다. 여기서 중요한 형식들 몇 가지만을 살펴보도록 한다.
그림 1 C# 변수의 형식
형식 중에는 정수 계열 형식이 있는데, 이 중에서 우리가 중점적으로 다룰 것은 int이다. int는 정수 계열 형식이라는 이름에 걸맞게 부호가 있는 정수를 담을 수 있는 변수 타입이다. 그림 1을 자세히 들여다보면 uint라는 이름이 비슷하게 생긴 형식을 볼 수 있는데, 이것은 부호가 없는 정수, 즉 0 이상의 정수를 저장하는 변수 타입이다. 이들이 저장할 수 있는 값의 최소와 최댓값을 보면 다름을 알 수 있는데, 이는 정수 계열 형식 변수가 부호 있는 정수를 표현하는 방식으로 인한 것이다. 정수 계열 형식 변수는 2의 보수를 이용하여 부호를 표현하는데, 앞의 비트를 부호 비트로 사용하는 이유로 최소와 최댓값의 범위가 위와 같이 달라지게 된 것이다. 또한, int에는 소수점이 붙은 수는 표현할 수 없는데, 만약 1/2의 계산 결과를 int에 저장하라고 명령하면 int에는 0만 저장되게 된다.
그 다음으로는 부동 소수점 형식이 있다. 여기에는 우리가 중점적으로 다루게 될 double 형식이 있는데, 이것을 이용해서 비교적 소수점이 많이 붙은 유리수를 표현할 수 있게 된다. 또한, 문자열 형식인 string 타입도 있는데, 이 타입을 이용하여 말 그대로 문자의 열을 저장할 수 있게 된다.
이러한 변수를 선언하는 방법은 다음과 같다. 여기서는 x라는 이름의 변수를 선언하려고 한다.
int x;
x = 10;
다음과 같이 변수의 이름 앞에 변수 형식을 먼저 쓴 뒤, 등호 연산자를 이용하여 x에 10이라는 값을 대입한다. 그리고 이렇게 명령문 하나가 끝날 때마다 뒤에 세미콜론(;)을 붙여 명령문이 끝났음을 알린다.
위를 아래와 같이 줄여 쓸 수 있다.
int x = 10;
2. 배열
위처럼 변수를 선언하다 보면 같은 타입의 변수를 아주 많이 선언한 다음, 나열해서 쓰고 싶을 때가 있다. 하지만 하나하나 선언하다 보면 욕이 먼저 튀어나올 것이다. 그래서 만들어진 것이 배열이다. 만약에 100개의 변수를 선언하고 싶다면, 100개의 용량을 가진 배열 한 개만 선언하면 되는 것이다. 배열은 다음과 같은 형식으로 선언한다.
데이터형식[ ] 배열이름 = new 데이터형식[ 용량 ];
만약 int 형식 변수 100개를 배열이름 array 아래에 선언하고 싶으면, 다음과 같이 쓰면 된다.
int[] array = new int[100];
다음과 같이 하면100개의 int 변수의 용량을 메모리에 잡아 놓을 수 있다. 이제 선언한 데이터의 배열에 데이터를 저장해야 할 것이다. 만약 1, 2, 3, 4, 5를 정수형 배열에 저장하고 싶으면 아예 변수를 선언할 때부터 다음과 같이 선언할 수 있다.
int[] array1 = { 1, 2, 3, 4, 5 };
아니면, new로 선언해서 먼저 메모리를 잡아 놓은 뒤에 그 메모리에 데이터를 집어 넣을 수도 있다. 만약에, 전전에서 선언한 array라는 배열에 첫 번째 원소로 1을 집어넣고 싶다면 다음과 같이 써야 한다.
array[0] = 1;
대괄호 사이에 들어가는 것이 원소의 순서를 의미한다. 여기서는 첫 번째 원소여서 대괄호 사이에 1이 들어가야 할 것이라고 생각할 수 있으나, 1이 아니라 그보다 1 작은 0이 들어가야 한다. 그리고 array의 n번째 원소에 m이라는 정수를 저장하려면 다음과 같이 써야 할 것이다.
array[n-1] = m;
이렇게 대괄호 안에 있는 인덱스(index)는 0부터 시작한다.
사실 이렇게 배열을 여러 개 설정하다 보면 이것을 가지고 표를 만들고 싶어하는 욕구도 생긴다. 행렬처럼, 2차원으로 원소를 나열해서 정리하는 것이다. 다음과 같은 행렬을 matrix라는 2차원 배열에 저장한다고 해 보자.
우선 메모리에 예약을 해 놓는다.
int[,] matrix = new int[2,2];
그리고 다음과 같이 데이터를 집어넣을 수 있다.
matrix[0,0] = 1;
matrix[0,1] = 2;
matrix[1,0] = 3;
matrix[1,1] = 4;
또는 다음과 같이 짧게 쓸 수 있다.
int[,] matrix = { { 1, 2 }, { 3, 4 } };
이보다 다차원의 배열을 설정할 수 있다. 다만, 이렇게 배열을 선언하면 2차원 배열의 어떤 행에는 다섯 개의 요소를, 다른 행에서는 세 개의 요소를 발견하는 일 없이 모두 같은 개수의 요소를 발견할 수밖에 없을 것이다. 하지만, 이렇게 쓰면 그렇게 할 수 있다.
데이터형식[][] 배열이름 = new 데이터형식[가변배열의 용량][];
int 형식의 배열을 설정하고자 한다면 다음과 같이 쓸 수도 있다.
int[][] jagged = new int[3][];
jagged[0] = { 1, 2, 3, 4, 5 };
jagged[1] = { 1, 2, 3 };
jagged[2] = { 1, 2 };
이와 같이 쓸 수 있는 배열을 가변 배열이라고 한다.
3. 리스트
이번엔 행의 개수를 마음대로 조절할 수 있는 것이 등장하는데, 그것을 리스트라고 한다. 리스트에는 원소를 더하는 함수를 쓸 수도 있고, 원소를 제거하는 함수를 쓸 수도 있다. 다음은 정수인 원소를 리스트에 더하고 제거하는 코드를 보인 것이다.
using System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
namespace
HelloWorld
{
class Program
{
static void Main(string[] args)
{
//1
List<int>
list = new List<int>();
list.Add(0);
list.Add(1);
list.Add(2);
//2
list.Remove(2);
//3
list.Add(2);
list.RemoveAt(1);
//4
list.Insert(1, 2);
}
}
}
|
//1 아래의 파트를 살펴보자. 우선 이름이 list인 정수형 원소를 저장하는 리스트가 선언되었다. 위와 같이 List<데이터형식>을 써서 리스트를 선언한다. 그리고, 리스트 산하에 있는 리스트이름.Add(원소) 함수를 써서 list에 차례차례 더해간다. 그러면 리스트에 있는 데이터는 다음과 같을 것이다.
0 1 2
//2 아래의 파트에서는 리스트이름.Remove(원소) 함수를 썼다. 이 함수는 괄호 안에 있는 것과 같은 원소를 찾아내 해당 리스트에서 삭제하는 역할을 하는 함수이다. 그러면 결과는 다음과 같을 것이다.
0 1
//3 아래의 파트에서는 먼저 방금 지웠던 원소 2를 다시 더한 뒤, RemoveAt 함수를 쓴다. 여기서는 RemoveAt(1)이라고 쓰여 있는데, 그러면 리스트 중 인덱스가 1인 원소, 정수 1을 리스트에서 삭제하게 된다. 그럼 결과는 다음과 같을 것이다.
0 2
//4 아래의 파트에서는 Insert 함수가 등장한다. 여기서는 Insert(1,2)라고 쓰여 있는데, 그럼 리스트의 인덱스 1에 해당하는 자리에 정수 2를 집어넣고, 그 뒤의 원소들은 한 자리 씩 뒤로 밀어버리는 작업을 함수가 하게 된다. 이것이 실행된 후 리스트는 다음과 같을 것이다.
0 2 2