티스토리 뷰

이번엔 텍스트박스, 리스트박스에 대해 정리하겠다. 어렵지 않으니 빠르게 훑어보자!

 

[텍스트박스(TextBox)]

텍스트박스는 사용자가 문자를 입력할 수 있는 박스이다.

using System;
using System.Windows.Forms;

class Sample : Form
{
    Label lb;
    TextBox tb;

    public static void Main()
    {
        Application.Run(new Sample());
    }
    public Sample()
    {
        this.Text = "샘플";
        this.Width = 300; this.Height = 200;

        Label lb = new Label();
        lb.Text = "당신의 이름은 무엇인가요?";
        lb.AutoSize = true;
        lb.Dock = DockStyle.Top;

        tb = new TextBox();
        tb.Dock = DockStyle.Bottom;

        lb.Parent = this;
        tb.Parent = this;

        tb.KeyDown += (sender, e) =>
        {
            TextBox tmp = (TextBox)sender;

            if (e.KeyCode == Keys.Enter)
            {
                lb.Text = tmp.Text + "(으)로 하시겠습니까?";
                tmp.Text = String.Empty;
            }
        };
    }
}

 

다른 컨트롤과 사용법이 크게 다르지 않아 아주 쉽다. 텍스트박스 tb의 KeyDown 이벤트를 다뤘는데, 입력후 엔터를 쳤을 때 값을 보내도록 한 것이다. 그리고 낯선 코드가 있다. 바로 String.Empty; 인데 이것은 빈문자열로 ""와 같다. 텍스트박스에서 엔터를 치고 박스를 비우고 싶어서 찾아다니다가 알게 된 건데, 사실 ""라고 해도 상관은 없다. 그냥 이런게 있다는 걸 스스로 기억하라고 적어본다.

 

실행결과

 

 

[리스트박스(ListBox)]

리스트박스는 여러 개 항목 중 원하는 항목을 선택할 수 있는 박스이다.

using System;
using System.Windows.Forms;

class Sample : Form
{
    Label lb;
    ListBox lbx;

    public static void Main()
    {
        Application.Run(new Sample());
    }
    public Sample()
    {
        string[] str = {"깅검","깅활","깅창","깅총","깅패","깅채","깅투구","깅갑주","깅각반","깅부츠" };

        this.Text = "샘플";
        this.Width = 300; this.Height = 200;

        lb = new Label();
        lb.Text = "아무거나 선택하세요.";
        lb.AutoSize = true;
        lb.Dock = DockStyle.Top;

        lbx = new ListBox();
        lbx.Top = lb.Height + 10;

        for(int i = 0; i < str.Length; i++)
        {
            lbx.Items.Add(str[i]);
        }

        lb.Parent = this;
        lbx.Parent = this;

        lbx.SelectedIndexChanged += (sender, e) =>
        {
            ListBox tmp = (ListBox)sender;
            lb.Text = tmp.Text + "(을)를 선택하셨습니다.";
        };
    }
}

 

리스트박스의 항목은 Items로 다룬다. 미리 만들어둔 string 배열을 반복문으로 꺼내면서 리스트박스 항목에 더해주었다. 리스트박스 항목의 선택변경 이벤트는 SelectedIndexChanged로 다룬다.

 

실행결과

 

 

 

★한글 받침에 따라 메세지 출력하기★

책을 보며 열심히 따라하던 와중 나를 불편하게 한 것이 있었다.

바로 이것....!!!

 

한글은 받침에 따라 조사가 달라져 늘 저렇게 괄호쳐서 다른 경우의 조사를 집어넣곤 한다. 받침여부에 따라 알아서 바뀔 순 없을까? 라고 생각하다가 지금까지 배운 거에 추가로 좀 알아보면 가능하겠는데? 싶어서 해보았다. 그랬더니 아주 잘되어서 이걸 꼭 포스팅해야겠다고 마음 먹었다.

 

자, 그럼 한글 받침에 따라 메세지를 출력하는 프로그램 일명 "PropMessage"를 만들어보자!

 

 

1.한글 무받침 모음

받침 여부에 따라 메세지를 바꾸는 기능을 만들려면 뭐가 먼저 필요할까? 라는 고민의 답은 간단했다. 받침 여부를 판단할 수 있는 자료, 데이터가 필요하다. 처음에는 한글 문자들 중 받침 있는 것을 가져오려고 했는데 그걸 따로 모아둔 글은 못찾았고 한글 문자 집합 문서 밖에 찾을 수 없었다. 결국 이걸 쓰지 않았지만 혹시나 도움이 될까 해서 링크 첨부하겠다.

 

현대 한글 11172자/28자씩/국가 표준 완성형 통합

노랑: 국가 표준 완성형 대조표의 4308자

charset.fandom.com

링크의 제목을 보면 알겠지만 한글 전체 문자는 11172자이다. 여기서 받침있는 문자를 반복문으로 하나하나 대조하려고 문서를 정리하는데 그게 가능하겠는가.. 문득 "야이 바보야. 받침있는 것보다 없는 걸 정리해야지." 라는 생각이 들었다.

 

받침이 있는 문자를 쓰는 것이 아니라, 받침이 있느냐 없느냐 여부가 중요하기 때문에 굳이 받침 문자를 다 정리할 필요가 없는 것이였다. 그래서 무받침 모음을 텍스트로 정리했다.

한글 문자 무받침 모음.txt
0.00MB

 

파일을 보면 글자 사이를 , 으로 나누었는데 그 이유는 조금 있다가 나온다.

+ 직접 쓴거라 오타가 있을 수 있습니다. 만일 밑에 코드를 써서 했는데 맞지 않는 조사가 출력된다면 텍스트 파일에 오타가 있을 확률이 높습니다. ㅠㅠ 일단 수정할 건 웬만함 했슴다

 

 

2.텍스트 파일 읽기

한글 문자 무받침 모음.txt를 다운받았으면 이제 C#에서 텍스트 파일을 읽을 수 있게 해줘야한다. 나는 혹시나 텍스트파일을 삭제할지 모르는 상황을 대비해 파일을 프로젝트가 있는 곳에 복사해주었다.

파일 복사하고 폴더가 아니라 솔루션 탐색기에 직접 붙여넣음.

파일을 읽기 전 파일 경로를 지정하기 위해 솔루션 탐색기의 경로를 확인한다. 확인하는 법은 탐색기 툴바에 있는 속성(Alt+Enter) 아이콘을 클릭하면 전체경로가 나온다.

string 변수 하나 만들어 넣어두고 경로를 넣은 뒤 파일을 읽을 때 변수를 사용해주면 파일 읽기는 완료다.

파일을 읽을 때 쓰는 메서드는 File 클래스의 ReadAllText()이다. 참고로 System.IO는 생략가능하다.

 

 

3.각 문자들을 배열에 담기

그 다음 텍스트 안에 있는 문자들을 하나씩 떼어 배열에 담는다. 코드 한 줄만 추가하면 된다.

        string[] letter = txt.Split(',');

 

Split 메서드는 ()안에 넣은 문자 값을 기준으로 문자열을 나누어서 배열에 넣어준다. 이 Split를 쓰려고 문자에 , 을 넣은 것이였다.

 

 

4.사용자가 입력한 문자의 마지막 글자 추출하기

무받침 글자를 가져와 배열에 담았으니 본격적으로 기능을 만들어보자.

    public bool ContrastLetter(string str)
    {
        string str_last = str.Substring(str.Length - 1);
    }

 

사용자가 입력한 문자의 끝과 무받침 글자를 대조한다는 의미에서 메서드 명을 ContrastLetter 라고 했다. 반환값의 형은 bool로, 만일 받침이 있는 문자라면 true를 반환하고 받침이 없다면 false를 반환할 것이다.

 

입력한 문자의 끝을 지정하기 위해 Substring을 이용했다. Substring은 문자열을 슬라이싱하는 메서드이다. 만일 "123456" 문자열에 Substring(3)을 쓰면 "456"이 출력될 것이다. 인덱스는 0부터 시작하기 때문에 3이 네번째 문자인 것이다. 그래서 str.Length에 1을 빼 마지막 글자를 지정했다.

 

 

5.반복문으로 대조하기

        for (int i = 0; i < letter.Length; i++)
        {
            if (letter[i] == str_last)
            {
                return false;
            }
        }

        return true;

 

무받침 글자들과 사용자가 입력한 값의 마지막 문자를 하나씩 대조해서 일치하면 false를 반환하게끔 했다. 그리고 for문 밖에 true를 반환했는데 이것은 반환값을 지정한 메서드는 어느 상황에서든 무조건 값을 반환해줘야하기 때문이다.

 

처음에는 else if 를 써서 반대 상황에 true를 반환하도록 했는데 예외 어쩌구 하면서 오류가 났었다. 그래서 밖으로 꺼내니 잘 되었다. 처음에는 밖에다가 꺼내놓으면 메서드를 호출할 때마다 계속 true를 반환하지 않나? 생각했는데 return은 break처럼 다음 구문을 무시한다는 사실을 떠올렸다.

 

 

6.적용하기

이제 적용만 하면 끝!

using System;
using System.Windows.Forms;

class PropMessage : Form
{
    Label lb;
    TextBox tb;
    PropCheck pck; //만들어둔 기능의 클래스 오브젝트 선언

    public static void Main()
    {
        Application.Run(new PropMessage());
    }
    public PropMessage()
    {
        this.Text = "PropMessage";
        this.Width = 300; this.Height = 200;

        Label lb = new Label();
        lb.Text = "당신의 이름은 무엇인가요?";
        lb.AutoSize = true;
        lb.Dock = DockStyle.Top;

        tb = new TextBox();
        tb.Dock = DockStyle.Bottom;

        lb.Parent = this;
        tb.Parent = this;

        pck = new PropCheck(); //오브젝트 생성 (이 때 파일을 미리 읽어두고 배열을 만듦)

        tb.KeyDown += (sender, e) =>
        {
            TextBox tmp = (TextBox)sender;

            if (e.KeyCode == Keys.Enter)
            {
                bool check = pck.ContrastLetter(tmp.Text); //메서드로 받침 체크!

                if (check == true) //받침이 있으면 다음 실행
                {
                    lb.Text = tmp.Text + "으로 하시겠습니까?";
                    tmp.Text = String.Empty;
                } else if (check == false) //받침이 없으면 다음 실행
                {
                    lb.Text = tmp.Text + "로 하시겠습니까?";
                    tmp.Text = String.Empty;
                }
            }
        };
    }
}

 

위의 텍스트박스 코드를 가져와 이름만 PropMessage로 바꿔 주었다. 참고로 난 PropCheck를 다른 코드 파일에 따로 만들어두었다. 어차피 같은 솔루션 내에 있으면 바로 쓸 수 있고 한 곳에 몰아서 쓰면 괜히 어지러워서 따로 만듦!

실행결과

 

-PropCheck 클래스 전체코드

using System;
using System.IO;
using static System.Net.Mime.MediaTypeNames; //요건 뭔지 모르겠는데 쓰다가 알아서 생겼음.

class PropCheck
{
    string[] letter;

    public PropCheck()
    {
        string file_path = @"D:\1.깅깅\포스팅_깅깅의 C# 독학\PropMessage_re\PropMessage_re\한글 문자 무받침 모음.txt";
        string txt = System.IO.File.ReadAllText(file_path);
        letter = txt.Split(',');
    }

    public bool ContrastLetter(string str)
    {
        if (str == "")
        {
            return true;
        }

        string str_last = str.Substring(str.Length - 1);

        for (int i = 0; i < letter.Length; i++)
        {
            if (letter[i] == str_last)
            {
                return false;
            }
        }

        return true;
    }
}

 

보면 ContrastLetter 메서드에 새로운 코드가 추가되었다. 빈 문자열을 입력하면 오류 나길래 만들어두었다. 따로 메세지를 만들까 하다가 귀찮아서 그냥 true를 반환했다. 중요한 건 받침에 따라 조사를 바꿔 출력할 수 있다는 것! 나중에 이런 섬세한 부분들도 다루고 또 메인에서 if문을 쓰지 않고 입력값 + 조사만 넣어서 출력하게 하면 좋은 기능이 될 것 같다. 그 때는 기능 자체에 PropMessage라는 이름을 써도 될 듯!

 

말 나온 김에 만들어봐야지~! ^0^

 

 

요약


1. 텍스트박스는 사용자의 입력값을 받는다.

2. 리스트박스 선택변환 이벤트는 SelectedIndexChanged

3.파일 읽기는 File.ReadAllText()

4. Split() 로 문자를 나눌 수 있고 Substring()으로 슬라이싱을 할 수 있다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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 30
글 보관함