728x90

배열 : 같은 형식의 여러개의 요소를 가지는 데이터 구조


배열을 선언할 때에는 유형(int, string, float 등) 바로 뒤에 꺽쇠 괄호를 붙인다.

int[] arr1;  // arr1 라는 참조변수는 null 로 설정된다.

 * 배열 선언문은 배열형 변수를 선언하는 것이지, 메모리를 할당하는 것은 아니다.

    배열은 참조형이므로 변수 자체가 실제 데이터를 저장하지 않는다.

arr1 = new int[5];  // 배열은 객체이므로 new 키워드를 써서 배열 객체를 생성

  * 배열 뿐만 아니라 모든 참조형은 new 연산자로 실제 메모리를 할당받아야 한다.


선언문과 할당문을 두 줄로 쓰는 것이 번거롭다면 int[] arr1 = new int[5]; 로 해도 된다.


[5] 꺽쇠 괄호안에 들어가는 숫자를 index 라고 부르며, 배열에서 index 는 0부터 시작한다.

int[] arr1 = new int[] { 1, 2, 3, 4, 5} 처럼 초기값을 할당할 수도 있다.

배열의 길이 5를 생략한 경우로, 이 경우에는 배열의 각 인덱스의 개수는 자동으로 세어준다.


텍스트 파일을 읽어서 Split 키워드를 이용해서 분할하여 배열로 담아야 하는 경우에는 배열의 크기를 알 수가 없는 경우가 대부분이다.

string[] strs = readText.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

줄바꿈(\r\n) 구분자로 분할해서 배열 변수 strs 에 담으라는 의미다. (Android 에서 줄바꿈은 \n )

strs.Lenght ; // 배열의 길이를 반환


문자열을 문자 배열로 만들고 싶을 때에는

string text = "My Array Test";

char[] Text = text.ToCharArray(); // 문자열을 문자 배열로 변경

배열 변수 사용중 초기화가 필요한 시점에서 아래 명령어로 초기화를 해준다.

Array.Clear(strs, 0, strs.Length);  // 배열 초기화

  * 배열은 일부러 해제하지 않아도 닷넷라이브러리에 쓰레기 수집 기능이 있어서

    더 이상 사용하지 않는 배열은 해제된다.

    배열 뿐만 아니라 모든 참조형에 공통적으로 적용되는 사항이다.

  * 배열 초기화를 해주는 이유는 배열을 사용하고 다시 다른 배열로 일부만 복사하여 사용하다보니

    처리속도가 늦어지는 것 같아서 배열을 바로 바로 초기화를 해주었더니 속도가 엄청 빨라졌다.


Array.Reverse(strs); // 배열 인덱스 뒤집기는 Array.Reverse(배열명) 을 사용한다

Array.Sort(strs); // 배열 소팅은 Array.Sort(배열명)을 사용한다.


배열 복사를 하고 싶을 때에는

string[] strs = readText.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

string[] copy_strs = new string[strs.Lenght];

Array.Copy(strs, copy_strs, strs.Length);


그런데 배열 복사의 index 수가 다르고, 갯수를 정확하게 파악하기 어려운 경우라면 어떻게 복사를 해야 할까?

아래 코드는 smi 자막을 파싱하여 읽어들이기 위해 만든 코드이다.

로직 순서는

1. 파일을 끝까지 읽어들인다.

2. 원하는 부분을 Split 으로 잘라낸다.

3. 잘라낸 부분을 배열로 담는다.

4. 배열로 담긴 부분에서 부분적으로 원하는 자료를 추출하기 위해

    StringBuilder 를 이용하여 조건에 맞는 배열을 합쳐서 하나의 파일로 만든다.

5. 다시 원하는 결과를 뽑아내기 위해 Split 으로 분리한다.


string[] bodyseparator = new string[1] { "<SYNC Start=" };
string[] bodyLines = bodyinfo.Split(bodyseparator, StringSplitOptions.RemoveEmptyEntries);
bodyinfo = null;  // 배열로 전달한 값은 초기화

var sb1 = new StringBuilder();
var sb2 = new StringBuilder();

for (int i = 1; i < bodyLines.Length; i++)
{
    if (bodyLines[i].Contains(ClassName1))
    {
        sb1.Append("<SYNC Start=" + bodyLines[i]);
    }

    if (bodyLines[i].Contains(ClassName2))
    {
        sb2.Append("<SYNC Start=" + bodyLines[i]);
    }
}
Array.Clear(bodyLines, 0, bodyLines.Length);  // 배열 초기화


아직 List 개념만 익힌 상태라서 실전 활용을 못해봐서 좀 무식하게 처리했을 수도 있다.

하나씩 기능을 익히면서 최적화된 코드를 만들 수 있는 날이 오겠지.....

728x90
블로그 이미지

Link2Me

,