### Array
- 배열은 일련의 동일한 데이타 타입 요소들로 구성된 데이타 집합으로서, 인덱스를 통하여 개개의 배열요소(Element)를 엑세스할 수 있다. C#에서 배열은 Zero-based Array 즉 첫번째 요소가 인덱스 0을 갖는다.
- 두번째 요소는 인덱스 1, 그 다음 요소들은 인덱스 2, 3, ... 등을 갖는다.
- 배열의 요소는 Sqaure Bracket([ ])안에 인덱스를 넣어 표시한다. 즉, 배열 A의 첫번째 요소는 A[0] 으로 표시한다.
- 모든 C# 배열은 내부적으로 .NET Framework의 System.Array에서 파생된 것이다. 따라서, System.Array의 메서드, 프로퍼티를 사용할 수 있다.
// 1차 배열
string[] players = new string[10];
string[] Regions = { "서울", "경기", "부산" };
// 2차 배열 선언 및 초기화
string[,] Depts = {{"김과장", "경리부"},{"이과장", "총무부"}};
// 3차 배열 선언
string[,,] Cubes;
### Jagged Array
- 가변 배열은 배열의 배열(array of arrays)이라 불리우는데, 첫번째 차원의 크기는 컴파일 타임에 확정되어야 하고, 그 이상 차원은 런타임시 동적으로 서로 다른 크기의 배열로 지정할 수 있다.
- 가변 배열은 각 차원별 배열 요소가 불규칙하여 Rectangular 배열처럼 고정된 크기를 사용하면 메모리의 낭비가 심한 경우에 사용하면 유용하다.
- 다차원 배열에서 각 차원별 배열 요소 크기가 동일한 Rectangular 배열은 C#에서 [,] 와 같이 괄호안에 콤마로 분리하여 (C 언어 스타일) 다차원을 표현한다. 하지만 각 차원별 배열 요소 크기가 가변적인 가변 배열(Jagged Array)의 경우 [][] 와 같이 각 차원마다 괄호를 별도로 사용한다.
//Jagged Array (가변 배열)
//1차 배열 크기(3)는 명시해야
int[][] A = new int[3][];
//각 1차 배열 요소당 서로 다른 크기의 배열 할당 가능
A[0] = new int[2];
A[1] = new int[3] { 1, 2, 3 };
A[2] = new int[4] { 1, 2, 3, 4 };
A[0][0] = 1;
A[0][1] = 2;
### 문자열
- 문자열(string)은 프로그램에서 가장 많이 쓰이는 데이타 타입 중의 하나이다. C#에서 문자열(string)은 이중부호를 사용하여 표현되며, 단일 문자(char)는 단일부호를 사용하여 표현된다.
- C#의 키워드 string은 .NET의 System.String 클래스와 동일하며, 따라서 System.String 클래스의 모든 메서드와 속성(Property)을 사용할 수 있다.
- C# 문자열은 Immutable 즉 한번 문자열이 설정되면, 다시 변경할 수 없다.
using System;
namespace MySystem
{
class Program
{
static void Main(string[] args)
{
// 문자열(string) 변수
string s1 = "C#";
string s2 = "Programming";
// 문자(char) 변수
char c1 = 'A';
char c2 = 'B';
// 문자열 결합
string s3 = s1 + " " + s2;
Console.WriteLine("String: {0}", s3);
// 부분문자열 발췌
string s3substring = s3.Substring(1, 5);
Console.WriteLine("Substring: {0}", s3substring);
}
}
}
### 문자열, 문자, 문자배열
- 문자열(string)은 문자(character)의 집합체이다. 문자열 안에 있는 각 문자를 엑세스하고 싶으면, [인덱스] (square bracket)을 사용하여 문자 요소를 엑세스한다.
using System;
namespace MySystem
{
class Program
{
static void Main(string[] args)
{
string s = "C# Studies";
// 문자열을 배열인덱스로 한문자 엑세스
for (int i = 0; i < s.Length; i++)
{
Console.WriteLine("{0}: {1}", i, s[i]);
}
// 문자열을 문자배열로 변환
string str = "Hello";
char[] charArray = str.ToCharArray();
for (int i = 0; i < charArray.Length; i++)
{
Console.WriteLine(charArray[i]);
}
// 문자배열을 문자열로 변환
char[] charArray2 = { 'A', 'B', 'C', 'D' };
s = new string(charArray2);
Console.WriteLine(s);
// 문자 연산
char c1 = 'A';
char c2 = (char)(c1 + 3);
Console.WriteLine(c2); // D 출력
}
}
}
### StringBuilder 클래스
- 문자열을 다루는데 중요한 클래스 중의 하나는 System.Text.StringBuilder 클래스이다. String 클래스는 위에서 설명한 대로 Immutable이기 때문에, 문자열 갱신을 많이 하는 프로그램에는 적당하지 않다. 반면 Mutable 타입인 StringBuilder 클래스는 문자열 갱신이 많은 곳에서 자주 사용되는데 이는 이 클래스가 별도 메모리를 생성,소멸하지 않고 일정한 버퍼를 갖고 문자열 갱신을 효율적으로 처리하기 때문이다.
- 특히 루프 안에서 계속 문자열을 추가 변경하는 코드에서는 string 대신 StringBuilder를 사용해야 한다.
using System;
using System.Text;
namespace MySystem
{
class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 26; i++)
{
sb.Append(i.ToString());
sb.Append(System.Environment.NewLine);
}
string s = sb.ToString();
Console.WriteLine(s);
}
}
}
### enum (열거형)
- C#의 키워드 enum은 열거형 상수(constant)를 표현하기 위한 것으로 이를 이용하면 상수 숫자들을 보다 의미있는 단어들로 표현할 수 있어서 프로그램을 읽기 쉽게 해준다.
- enum의 각 요소는 별도의 지정없이는 첫번째 요소가 0, 두번째 요소가 1, 세번째 요소가 2 등과 같이 1씩 증가된 값들을 할당받는다. 물론, 개발자가 임의로 의미있는 번호를 지정해 줄 수도 있다.
- enum 타입은 숫자형 타입과 호환가능하다. 만약 enum 타입의 변수를 int로 캐스팅(주: Casting - 한 타입을 다른 타입으로 변경하는 것. 타입 변환이 실패할 수도 있다)하면 해당 enum값의 숫자 값을 얻게 된다. 또한, enum 타입의 변수는 enum 리터럴값과 서로 비교할 수 있다.
class Program
{
enum City
{
Seoul, // 0
Daejun, // 1
Busan = 5, // 5
Jeju = 10 // 10
}
static void Main(string[] args)
{
City myCity;
// enum 타입에 값을 대입하는 방법
myCity = City.Seoul;
// enum을 int로 변환(Casting)하는 방법.
// (int)를 앞에 지정.
int cityValue = (int) myCity;
if (myCity == City.Seoul) // enum 값을 비교하는 방법
{
Console.WriteLine("Welcome to Seoul");
}
}
}
### 플래그(flag) enum
- enum의 각 멤버들은 각 비트별로 구분되는 값들(예: 1,2,4,8,...)을 갖을 수 있는데, 이렇게 enum 타입이 비트 필드를 갖는다는 것을 표시하기 위해 enum 선언문 바로 위에 [Flags] 라는 Attribute (주: Type 혹은 그 멤버를 선언할 때 그 위에 붙이는 특별한 특성값으로 해당 타입 혹은 멤버가 어떤 특성을 갖고 있는지 나타내게 된다)를 지정할 수 있다.
- [Flags] 특성을 갖는 플래그 enum은 OR 연산자를 이용해서 한 enum 변수에 다중값(예: 1+4)을 가질 수 있으며, AND 연산자를 이용하여 enum 변수가 특정 멤버를 포함하고 있는지 체크할 수 있다.
[Flags]
enum Border
{
None = 0,
Top = 1,
Right = 2,
Bottom = 4,
Left = 8
}
static void Main(string[] args)
{
// OR 연산자로 다중 플래그 할당
Border b = Border.Top | Border.Bottom;
// & 연산자로 플래그 체크
if ((b & Border.Top) != 0)
{
//HasFlag()이용 플래그 체크
if (b.HasFlag(Border.Bottom))
{
// "Top, Bottom" 출력
Console.WriteLine(b.ToString());
}
}
}