티스토리 뷰
앞서, Day 9에서 콘솔창 UI를 다루는 방법에 대하여 서술한 바 있다.
[Day 9 [콘솔창 UI 작업에 관하여] - URL: https://lsu0503.tistory.com/58]
오늘은 이 사항에 대해서 추가로 알게된 부분이 있어, 간략하게 작성하고자 한다.
[관련 사항은 Day 9에도 적용이 되어 있다.]
손쉽게 글자를 정렬하는 법
day 9에서 콘솔창의 글자는 전각과 반각 모두 1칸으로 적용되기에, 전각과 반각이 같이 쓰일 경우, 혹은 띄어 쓰기에 의해서 동일 좌표에 대한 커서 위치가 불명확하다고 언급한 바 있다.
때문에 콘솔창에서 우측 정렬을 하기 위해서는 전각 글자의 개수를 일일히 세어서 추가로 빼거나, 혹은 숫자나 영어가 아니면 추가로 감소시키는 방법을 제시했었다.
금일은 조금 다른 방법을 소개할 예정이다. 바로 '바이트'를 기반으로 정렬하는 것.
기본적으로 반각 글자인 숫자와 영어는 1바이트 문자고, 전각 글자인 한글은 2바이트 이상을 사용한다는 것에서 착안한 방법으로, 영어와 숫자, 한글 만 쓴다는 가정 하에 사전 작업만 마쳐 둔다면 손쉽게 정렬을 할 수 있다.
사전작업
현재 콘솔창의 인코딩 방식과, 그에 따른 바이트 배정을 파악하고 있어야 한다.
대표적인 문자 인코딩 방식인 UTF-8과 EUC-kr을 예시로 작성하겠다.
영어 바이트 수 | 숫자 바이트 수 | 한글 바이트 수 | |
UTF-8 | 1 | 1 | 2 |
EUC-kr | 1 | 1 | 3 |
이렇듯, 인코딩 방식에 따라서 글자에 할당된 바이트 양이 달라진다. 따라서 이를 확실하게 인지한 상태로 진행해야 한다.
정렬 방법
간단하다. 전체 바이트의 수를 구한 뒤, 그것을 문자열 길이로 빼고 영어와 한글의 바이트 수의 차로 나누면 전각 글자의 개수가 나온다. 여기에 전체 문자열의 길이를 더하면 된다.
간단하게 코드로 알아보자.
int stringLengthByte = Encoding.Default.GetByteCount(string);
int fullwidthLength = (stringLengthByte - string.Length) / 2;
int stringLengthCursor = fullwidthLength + string.Length; // ← 전체 문자열의 화면 상 길이
이 방법을 쓰면 해당 문자열의 정확한 화면 상의 길이를 계산할 수 있으며, 이와 Console.Position을 통해서 글자 정렬 알고리즘을 작성할 수가 있다.
마치며
사실 콘솔창에서 쓰이는 방법이고, 콘솔창 이외에서는 쓸 수 없는 방법이기에, 그렇게 크게 도움이 되는 요소는 아니라고 생각합니다.
그래도 알게 된 정보(문자 인코딩 방식에 따라서 같은 문자의 용량이 달라진다)가 있고, 이를 통해서 무언가를 할 수 있다고 생각하면 괜시리 가슴이 뛰는 거 같다.
'스파르타 내일배움캠프 > Today I Learned' 카테고리의 다른 글
Today I Learned - Day 15 [JSON, CSV, XML] (1) | 2024.10.02 |
---|---|
Today I Learned - Day 14 [사전(Dictionary) 구조에 대하여] (3) | 2024.10.01 |
Today I Learned - Day 12 [제너릭] (0) | 2024.09.27 |
Today I Learned - Day 11 [델리게이트] (0) | 2024.09.26 |
Today I Learned - Day 10 [Json파일 입출력] (0) | 2024.09.25 |