c# 변수를 파일로 읽고 쓰기 – application settings

애플리캐이션을 만들다 보면 많은 변수들이 쓰인다. 변수들 가운데에는 애플리캐이션을 종료한 때 파일로 저장했다가 애플리캐이션을 다시 실행한 때 그대로 불러다 읽어서 써야 하는 것들이 있다. 이 과정은 개념적으로 간단하지만 구현하려면 까다롭고 번거롭다.

일반적으로 변수에는 이름을 붙여서 쓴다. 리스트나 배열의 아이템을 변수로 이용할 수도 있지만 이렇게 하면 이름이 아닌 인덱스로 접근해야 하므로 실수를 할 가능성이 크다.

변수의 이름은 사람에게나 의미가 있지 컴파일러는 관심을 갖지 않는다. 컴파일러는 메모리의 어느 위치에 어떤 값이 있는지만 신경 쓴다.

다양한 타잎의 변수들을 파일로 저장하려면 하나의 객체에 넣은 뒤 직렬화를 한 뒤에야 가능하다. 여러 변수들을 클래스 안에 넣는다면 변수의 이름으로 기능하는 필드의 이름이 저장되지만 변수가 동적으로 추가/삭제되어야 한다면 클래스의 필드를 동적으로 바꿀 수는 없으므로 이 방법은 쓸 수 없다. 여러 변수들을 리스트에 object 타잎으로 넣은 뒤 직렬화를 한다면 변수의 이름은 사라지고 인덱스만 남으므로 역직렬화를 한 뒤 각 아이템을 각 변수로 변환하는 작업을 거쳐야 한다.

비주얼 스투디오의 application settings 기능을 이용하면 변수의 이름, 값, 타잎을 쉽게 파일로 관리할 수 있다. 변수의 이름까지 저장이 되므로 그대로 가져다 쓰면 되지만 느리다. xml 파일의 형태로 저장이 되어서 읽고 쓰는 데에 직렬화와 역직렬화가 필요하기 때문이다.

아래 예제는 int 타잎으로 저장된 정수를 읽는 거와 application settings로 저장된 정수를 읽을 때의 시간 차이를 확인하는 거다. 릴리스 빌드를 하여 워밍 업 실행을 제외하고 걸린 다섯 번씩의 평균 시간은 각각 2,757과 6,089,936이었다.

int Int1 = 1;

private void button1_Click(object sender, EventArgs e)
{
    Stopwatch stopwatch = new();

    stopwatch.Start();

    for (int i = 0; i < 1000000; i++)
    {
        if (i > Int1)
        {

        }
    }

    textBox1.AppendText(stopwatch.ElapsedTicks.ToString("#,##0") + "\r\n");
}

private void button2_Click(object sender, EventArgs e)
{
    Stopwatch stopwatch = new();

    stopwatch.Start();

    for (int i = 0; i < 1000000; i++)
    {
        if (i > Properties.Settings.Default.Integer1)
        {

        }
    }

    textBox2.AppendText(stopwatch.ElapsedTicks.ToString("#,##0") + "\r\n");
}

application settings를 이용하더라도 다시 변수로 바꾸는 작업을 해야 한다.