[C#] .ini 파일 읽기 - GetPrivateProfileString 사용법
자주 변경되는 값들은 .ini 파일에 저장해두고 관리한다. 예를들어, 스크래핑 하는 사이트의 자주 변경되는 xPath 라든지, 공인인증서의 id, pw 라든지. PC별 식별 ID 등을 말이다. 이번 글에서는 그렇
120ne.xyz
C#은 아직 익숙하지 않아서 사용할 때 종종 궁금한 것이 생겼다. 그 중 하나는 다음과 같은 형태의 코드이다.
IniInfo.GetPrivateProfileString("UserInfo", "LoginID", empty, sb, 256, CommonData.PathINI);
CommonData.LoginID = sb.ToString();
sb.Remove(0, sb.Length);
어째서 문자열을 함수에서 바로 반환하지 않고, StringBuilder 버퍼에 문자 단위로 채워 넣는 방식을 사용하는 것인가? 게다가 매번 결과를 꺼내고, 다시 초기화하는 작업을 반복해야 한다는 점이 비효율적이라는 생각이 들었다.
나의 ChatGPT에게 물어보았고, 다음과 같은 답변을 내주었다.
왜 직접 문자열을 반환하지 않고 버퍼를 사용하는가?
✅ 장점
1. C 언어와의 호환성
- C 기반 API는 반환값 대신, 출력 버퍼를 통해 결과를 전달하는 방식이 일반적이다.
- C에서 문자열은 char*이고, 메모리를 직접 관리해야 하기 때문에 이 방식이 더 안전하고 명확하다.
2. 메모리 관리 주체 명확
- 호출자가 버퍼 크기를 지정하여, 메모리 제어 주체가 명확해지고,
API 내부에서 불필요한 동적 할당이 발생하지 않는다.
3. 성능 측면에서 유리
- 문자열을 반환하면 힙 메모리를 새로 할당해야 하지만,
StringBuilder는 한 번 만든 버퍼를 재사용할 수 있어 성능상 유리하다.
예를 들어, 설정값을 반복해서 여러 개 읽을 때 효율적이다.
4. 버퍼 크기 기반 오류 제어 가능
- 버퍼가 작을 경우 잘림이 발생할 수 있고, 결과 길이를 통해 문제가 있는지 판단할 수 있다.
❌ 단점
1. 직관성이 떨어짐
- 초보자 입장에서는 왜 굳이 StringBuilder를 써야 하는지,
왜 ToString()을 따로 호출해야 하는지 직관적이지 않다.
2. 반복 작업 필요
- 버퍼를 초기화(Remove)하고 결과를 꺼내는 작업이 반복된다.
3. 버퍼 크기 실수 가능
- 버퍼가 너무 작으면 값이 잘리고, 너무 크면 메모리가 낭비된다.
- 적절한 크기 판단이 필요하다.
✅ 요약 비교
방식 | 장점 | 단점 |
출력 버퍼 사용 | 성능 우수, 재사용 가능, C 호환성 좋음 | 사용 복잡, 버퍼 관리 필요 |
문자열 반환 방식 | 간단하고 직관적 | 반복 호출 시 성능 저하, 메모리 낭비 가능 |
결론
- C 기반 API는 버퍼 기반 방식이 표준이다.
- 메모리 제어, 성능, 호환성 측면에서 유리하다.
- 불편하더라도 Interop에서는 표준처럼 받아들여야 한다.
결론은 내가 몰랐던 건 C언어 스타일의 설계 방식이었다. C언어 기반의 API에선 문자열을 함수에서 직접 만들어 반환하는 방식이 아닌 이렇게 함수 바깥에서 미리 만들어 둔 버퍼에 결과를 채우는 방식을 많이 사용한다.
직접 문자열을 만들어서 반환하는 방식이 아니라 속도도 빠르고, 하나의 버퍼를 여러 번 재사용할 수 있으니 성능에도 유리하다. 그러니 C기반 WinAPI와 연동할 때는 이런 방식에 익숙해지는 방법 밖에 없겠다.
- WinAPI ?
Windows 시스템의 기능을 직접 제어할 수 있게 해주는 공식 API의 집합
역시 C는.. 나랑 안 맞는다
'개발일지 > C#' 카테고리의 다른 글
[ VS2022 / C# / Git ] 프로젝트 정리 1 - 깃 설치 후 Visual Studio 2022 깃 연결 (3) | 2025.06.06 |
---|---|
[C#] Random.Next()로 1/5 확률 선택하기 – 퍼센트(%) 조건 제어 (0) | 2025.05.28 |
[C#] 클린코드 - SQL 문자열 가독성 개선하기 (0) | 2025.05.28 |
[C#] .ini 파일 읽기 - GetPrivateProfileString 사용법 (0) | 2025.05.25 |
[C#] WebDriverManager - 크롤링 프로그램 제작시 chromedriver 자동 설치 (0) | 2025.05.02 |