본문 바로가기
Program/C# .NET

[WPF / C#] 프로그램 설정 파일 한번에 불러오기 / ini파일 한번에 읽기 / 제네릭T 함수

by 냠만 2024. 4. 2.

[ini 설정파일]

프로그램을 짜다 보면 설정값을 UI에서 수정하면 별도로 저장해야 하는 파일을 관리해야 하는 경우가 많습니다. 그 외에 프로그램을 빌드하지 않아도 프로그램을 재시작하면 설정파일을 적용해야 되는 경우도 다반사고, UI에서 사용자가 제어하면 위험하지만 개발자나 관리자급에서만 컨트롤할 수 있도록 설정파일을 밖으로 빼는 경우가 있습니다.

 

대부분 설정파일은 .ini 확장자로 저장하게 되는데 일반 텍스트로 구성하게 되면 섹션이 구분되어 있지 않기 때문에 유지보수가 어렵습니다. ini 파일은 섹션과 키값에 따라 설정파일 내부 내용을 설정할 수 있는 큰 장점이 있습니다.

 

ini 파일을 읽는 방법에도 여러 가지가 존재하는데 물론 가장 간단한 방법은 섹션과 키값을 읽어오는 함수를 만들고 이를 읽어오는 작업을 진행하는 것입니다.

(섹션과 키값을 참조하여 ini 파일 읽어오기 링크)

 

다만 불러와야 하는 변수가 많은 경우 중복함수가 많아지기 때문에 프로그램이 지저분해집니다. 클래스를 나눌 필요 없이 전역변수로 컨트롤하는 간단한 프로그램의 경우 위의 방법이 더 간단하겠지만 몸집이 커지면 커질수록 유지보수 용이성도 확보해야 하기 때문에 필수로 알아야 되는 스킬이라 할 수 있습니다.

[제네릭 T 함수]

일단 작업에 들어가기 앞서 제네릭함수에 대해 알아봐야 하는데 해당 함수는 객체지향 프로그래밍에서 알아두면 소스를 깔끔하게 관리할 수 있는 스킬이기 때문에 공부를 해야 합니다.

자세한 내용은 추가 포스팅을 작성할 예정이기 때문에 추후에는 링크를 작성하도록 하겠습니다.

 

간단하게 설명하면 잘못된 타입이 사용되는 걸 방지하고 불필요한 타입변환을 제거하는 기능입니다.

쉬운 예를 들면 List를 들 수 있는데, List 선언 시 <Type>을 선언하여 객체를 만드는 것과 동일한 이치입니다.

일반 리스트에 String을 대입하면 값을 참조할 때 String타입으로 불필요한 컨버팅을 해야 합니다. 하지만 애초에 String으로 리스트를 만들어 놓으면 컨버팅 작업이 필요 없어지므로 프로그램 성능이 향상됩니다.

 

 

[설정파일 읽어오기]

파일을 읽어오는 부분입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public static object Read<T>()
{
    var item = Activator.CreateInstance(typeof(T));
 
    foreach (var prop in item.GetType().GetProperties())
    {
        //read key , value;
        var read = ReadData(_path, "Section", prop.Name, true);
        var readdata = Convert.ChangeType(read, prop.PropertyType);
        prop.SetValue(item, readdata);
    }
 
    return item;
}
 
public static string ReadData(string path, string section, string key, bool isnumbberic = false)
{
    StringBuilder Strings = new StringBuilder();
    var Errors = GetPrivateProfileString(section, key, "", Strings, 4096, path);
 
    if (Strings.ToString() == "")
    {
        if (isnumbberic == true)
        {
            return "0";
        }
    }
    return Strings.ToString();
}
cs

 

 

함수 구조는 제네릭 타입 T에 item class 객체를 받고 해당 객체에 모든 변수의 이름을 참조해서 Key값과 대조하고 해당되는 값을 가져오는 구조입니다.

풀어서 해석하면 순서는 아래와 같습니다.

1. item 객체 생성

2. Read<T> 함수에 item 객체 참조

3. 객체에 존재하는 변수 타입 및 이름을 Key값과 대조

4. Key값에 매칭되는 Value를 item class 객체에 대입

클래스 함수는 이렇게 구성하시면 되고 ini파일에서 불러오고자 하는 변수를 선언해 주시면 됩니다.

하여 함수를 실행하면 아래와 같은 결과를 얻을 수 있습니다.

 

 

 

 

 

일반적으로 item 객체는 빈 객체로 클래스를 참조하여 만들어졌습니다. Read 함수에 제네릭타입 item 객체를 전달하여 함수를 실행하면 ini파일에 순서 로직에 따라 변수를 읽어오고, class 객체를 구성합니다. 

 

이 방법을 사용하면 위에서도 언급했 듯 유지보수가 편해집니다. 사용자도 설정파일에 접근해서 수정을 해야 되는 값에 대해 섹션과 키값으로 구분되어 있으니 접근하기가 편해질 수 있습니다.