22.12.19. (월) - C# 문자열

김도익·2022년 12월 19일
0

C#

목록 보기
2/29

<22.12.19. (월)>

▶문자열
프로그램에서 문장을 문자열(string)이라고 합니다.
모든 문자열 끝에는 null값이 들어갑니다.

▶숫자 0과 null값은 전혀 다르다.
숫자 0은 아스키코드로 보면 48의 값을 가집니다.

▶string은 변하지 않는 값입니다.

▶string의 기본값은 string.Empty;

▶string message = ""; 이것은 null값이 아니다.
컴퓨터 내부에는 값은 들어가있습니다. 콘솔창에만 보이지 않을뿐.

▶""랑 string.Empty는 같지 않습니다.

▶문자 타입은 char => 2byte, 정수 승격은 일어나지 않습니다.
문자타입 배열 char[]는 int로 형변환이 불가능합니다.

인덱스[]를 사용하면 특정 문자의 접근이 가능합니다.
string message = "Hello";
[H][e][l][l][o]
System.Console.WriteLine(message[0]); // H
System.Console.WriteLine(message[1]); // e
System.Console.WriteLine(message[2]); // l
System.Console.WriteLine(message[3]); // l
System.Console.WriteLine(message[4]); // o
☞문자열("")은 문자('')가 연속해서 있는 것을 말합니다.
그러니 message[0] = 'H'가 들어있고, message[1] = 'e'가 들어 있습니다.
이 개념을 정확하게 이해해야합니다. 예제를 통해 이해력을 높이겠습니다.

  • 문제(8958) : 백준 OX퀴즈
    "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
    "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
    OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

        int input = int.Parse(Console.ReadLine());
    
        for(int i = 0; i < input; i++)
        {
         
            string Quiz = Console.ReadLine(); // OX를 입력 받을 문자열을 생성
    
            int score = 0; // 합산 점수 객체 생성 및 개행 될때마다 합산 값을 0으로 초기화
    
            int up = 0; // O일때마다 점수가 올라가는 객체 생성 및 개행 될때마다 점수를 0으로 초기화
    
            for (int k = 0; k < Quiz.Length; k++) // 입력받은 Quiz(문자열)의 길이만큼 반복을 해준다.
            {
                if (Quiz[k] == 'O') // 문자열은 문자가 연속적으로 되어있는 친구다. 
                					//특정 문자에 접근하고 싶다면 인덱스[]를 사용해서 접근이 가능하다.
                {
                    up++;
                    score += up;
                }
                else if(Quiz[k] == 'X')
                {
                    up = 0;
                }
            }
            Console.WriteLine(score);
        }

▶인덱스는 [] 0부터 시작합니다.

▶이스케이프 시퀀스
(역슬래쉬)는 소스코드상에서는 특별한 문자다. 그래서 (역슬래쉬)를 사용하고 싶다면 \앞에 \를 붙여주면 된다.

string myProjectPath = "C:\Project\sandbox"; // C:Projectsandbox 출력
string myProjectPath = "C:\\Project\\sandbox"; // 콘솔창에서 C:\Project\sandbox로 출력됩니다.

\t : tab키 누른 것 처럼 뛰어쓰기 들어감
\n : 개행 시킨다. (칸 띄어쓰기) //WriteLine과 같은거라고 보면 됩니다.
\0 : 널값

이스케이프 시퀀스를 일일이 적어주는게 귀찮다면 @를 붙여주면 됩니다.
string myProjectPath = @"C:\Project\sandbox";
단, C#에서만 존재합니다.

▶컴퓨터가 문자, 문자열을 만들어가는 과정

  • 저장되어 있는 2진수 값을 확인.

  • 2진수 값을 디코드(URL, ASCII, UTF-8)를 해서 어떤 문자인지 확인.
    //디코드에 따라 같은 문자라도 전혀 다른 값이 나올 수 있다.

  • 폰트를 이용해서 문자를 그려준다.
    폰트에 해당되는 문자가 없다면 □, ?? 등 표시로 나온다. 아이폰에서 쓰는 이모티콘을 갤럭시를 사용하는 나한테 보내면 나한테는 이모티콘 대신 □안에 x로 처져있던 그림처럼 보내졌던 것을 생각하면 이해하기 쉬울 것 같다.

    폰트마다 그려주는 문자도 다르고 이모티콘도 다르다.

    콘솔 창에서는 이모티콘이 나오지 않는다. 콘솔창이 이모티콘을 읽어주지 못하는 것이다.

▶문자열 합치기 : Concat();
단, 뺄셈은 없다.
더하기 연산자로 문자열을 합칠 수 있다.
string firstName = "Kim";
string lastName = "doik";
string fullname = firstName + lastName;
System.Console.WriteLine(fullname); //kimdoik

다른 방법은 Concat을 사용하는 것이다.
string fullname = string.Concat(firstName, lastName);

string num1 = "123";
string num2 = "456";
string number = string.Concat(num1, num2); // 123456 출력

정말 중요한 팁입니다. 숫자는 당연히 더해야한다는 고정관념으로인해 문자열 더하기를 망각하고 코드를 작성할 수 있습니다. 기억하십쇼! 숫자를 문자열로 더한다면 정수형식으로 계산되는 것이 아닌 string형식으로 더해진다는 것을!!

만약 string에서 더해야하는 양이 많아지거나, 변경해야되는 양이 많아지면 StringBuilder를 사용하는 것이 매우 효과적입니다. 자세한 내용은 StringBuilder.Velog에 써놓았으니 확인바랍니다.

Tip. 코드를 작성할때는 어떻게 결과값이 나올지 예상하면서 작성을 해야한다.

▶Format() 사용법

  1. {}를 사용해서("{0}, {1}"을 사용해서) 문자를 넣을 수 있다.

<예제>

ⓐFormat 정석대로 풀기

  • string message = string.Format("{0}", "Hello");
    Console.WriteLine(message); // Hello 출력

  • string message = string.Format("{0} {0}", "Hello");
    Console.WriteLine(message); // Hello Hello 출력

ⓑWriteLine 만으로 출력하기

  • System.Console.WriteLine(string.Format("{0} {1}!", "Hello", "world"));
    // Hellow world!
  • System.Console.WriteLine(string.Format("{0} {1} {0}!", "Hello", "world"));
    // Hellow world Hello!
  • System.Console.WriteLine(string.Format("{1} {1} {1} {0}!", "Hello", "world"));
    // world world world Hello!

ⓒWriteLine만 사용하면서 string.Format도 생략하기

  • System.Console.WriteLine("{0} {1}!", "Hello", "world");
    // Hello world!
  • System.Console.WriteLine("{0} {1} {1}!", "Hello", "world");
    // Hello world world!
  • System.Console.WriteLine("{1} {0}!", "Hello", "world");
    // world Hello!
    ->string.Formant을 생략해도 되는 것은 WriteLine만 가능한 모션이다.
  1. "{0, 숫자}" 사용하기
  • ⓓWriteLine만 사용하면서 string.Format도 생략하면서 내가 원하는 만큼 칸을 지정하고 글자 출력하기가 가능하다.

  • 콤마(,)를 이용해 출력할 문자열의 최소 길이를 지정할 수 있다.

  • {0, 숫자}는 오른쪽 정렬

  • {0, -숫자}는 왼쪽 정렬

    Tip. {0, 숫자}에서 0은? 위에 예제를 자세히 보아라. 0은 출력한 문자의 순서를 말한다는 것을 알 수 있다. {1, 숫자}면 2번째 대기열에서 기달리는 문자열이 출력되는 것도 알 수 있다.

  • 예제
    System.Console.WriteLine("{0, 12}", "Hello");
    // "Hello"의 실제 길이는 5의 길이지만 공백을 추가하면 12만큼의 길이로 출력하게 된다.
    실제 출력은 콘솔창에서 7칸 뛰어진 상태로 Hello로출력된다. 왜냐면 Hello가 5글자니까!! 12 -5 = 7

    System.Console.WriteLine("{0, 8}", "Hello"); // 이것은 3칸 뛰어진 상태로 Hello가 출력된다.

  • 콜론(:)을 붙여 같은 데이터를 서로 다른 형식으로 출력해줄 수 있다.

    	<예제>

int someValue = -27;
Console.WriteLine("{0, 10:G}, {0, 10:X}", someValue);
//{0, 10:G} : 최대 10칸에서 7칸 공백 주고 -27출력
//{0, 10 :X} : 16진수로 표기

double someValue2 = 1234.5678;
Console.WriteLine("{0, 10:F} {0, 10:E2}", someValue2);

//{0, 10:F} : 앞에 3칸 띄고 소수점 7을 반올림한다. 1234.57이 출력된다. 출력되는 이유는?
1234.57 == 최대 10칸으로 지정하고 우측으로 정렬하겠다고 명령을 줬다면 출력할 수 있는 글자의 수는 7개만 가능하다. 그래서 소수점 6뒤에 7을 반올림해서 출력해주는 것이다.

->만약 10:F0를 사용하면 앞에 6칸 띄어지고 1235가 출력 //소수점 첫번째 자리가 반올림

->만약 10:F1를 사용하면 앞에 4칸 띄어지고 1234.6가 출력 //소수점 두번째 자리가 반올림

->만약 10:F2를 사용하면 앞에 3칸 띄어지고 1234.57가 출력 //소수점 세번째 자리가 반올림

문자보간이 편하긴하죠ㅋㅋㅋ?

Tip. 소수점은 반올림 합니다.

//{0, 10:E2} : 지수로 표현됨.

  1. Format()을 사용할 때도 숫자를 기입하는 것에 주의해야한다. 유효하지 않은 범위의 숫자를 넣으면 오류가 발생합니다.
    System.Console.WriteLine("{1, 12}", "Hello"); //오류 발생
    System.Console.WriteLine("{0, 12}{1, 5}", "Hello", "good"); //(7칸 띄어지고)Hello (Hello한테 1칸 띄어지고)good 출력

{0, 숫자}에서 0은 첫 번째로 지정한 문자열을 출력하겠다는 명령어이고, {1, 숫자}에서 1은 두 번째로 지정한 문자열을 출력 하겠다는 명령어입니다. 그런데 하나의 문자열만 존재하는데 1을 사용한다면 두 번째 문자열을 출력하겠다는 명령어가 되므로 오류가 발생하는 것입니다.

단, System.Console.WriteLine("{0, 12}{1, 1}", "Hello", "good");을 사용해도 오류는 발생하지 않습니다. Hellogood으로 딱 붙어서 출력됩니다.

문자열 보간(string Interpolation)

  • Format()보다는 유연하고 가독성이 높기 때문에 문자열 보간을 사용하는 것을 권장하고 있습니다. 하지만 Format()이 더 가독성이 높다면 이것을 사용하면 됩니다.

  • 문자열 보간을 사용하고 싶다면 "" 앞에 달러를 붙이면 됩니다.
    int someValue = -27;
    System.Console.WriteLine($"{someValue}");
    //출력 : -27

  • int someValue = -27;
    System.Console.WriteLine($"{someValue, 10:G},{somevalue, 10:x}");
    //{0, 10:G} : 최대 10칸을준다. 우측으로 기준 7칸 공백 주고 -27출력
    //.......-27 (.(온점)하나당 한칸이라고 생각하고 보면 좋습니다. 가독성을 위해 .으로 표시한 것입니다.)
    //{0, 10 :X} : 16진수로 표기

만약 -10으로 한다면?
{0, -10:G) : 좌측으로 기준 7칸 공백 주고 -27출력
//-27....... (.(온점)하나당 한칸이라고 생각하고 보면 좋습니다. 가독성을 위해 .으로 표시한 것입니다.)

  • double result = 8.1234567;
    System.Console.WriteLine(${result:F3}");
    // 출력: 8.123;

    // 문자보간이 확실히 편합니다.
    // 칸 띄우고 싶다면 {result, 10:F3} 이렇게 써도 됩니다.

▶Trim() : 앞뒤 공백 자른다.
TrimStart() : 앞의 공백만 잘라준다. 뒤는 잘라주지 않는다.
TrimEnd() : 뒤의 공백만 잘라준다. 앞은 잘라주지 않는다.

  • string someStringwithSpace = "공백공백Hello World공백공백"
    Console.WriteLine(someStringWithSpace.Trim());
    ->Hello World

  • Console.WriteLine(someStringWithSpace.TrimStart());
    ->Hello World공백공백

  • Console.WriteLine(someStringWithSpace.TrimEnd());
    ->공백공백Hello World

공백공백이라는 단어를 사용한 것은 가독성을 높이기 위해서 사용했습니다.
또한 velog가 공백처리가 되지 않아서 임의로 공백이라는 단어를 사용했습니다.
실제로는 단어가 아닌 띄어쓰기만 해서 아무런 문자도 없는 공백상태입니다.

▶Replace() : 특정 문자열을 다른 문자열로 대체할 수 있다.

  • string number = "123456";
    string output = number.Replace("456", "");
    Console.WriteLine($"{output}");
    // 123
  • string someString = "Hello World";
    Console.WriteLine(someString.Replace("World","Programming"));
    -> Hello Programming 출력

▶ToLower() : 글자를 다 소문자로 출력, ToUpper() : 글자를 다 대문자로 출력

  • string someString = "Hello World";
    Console.WriteLine(someString.ToLower());
    ->hello world

  • Console.WriteLine(someString.ToUpper());
    ->HELLO WORLD

▶Substring(숫자) : 문자열에서 부분 문자열을 추출 할 수 있다. 즉 내가 원하는 곳부터 원하는 곳 까지 문자열을 뽑을 수 있다.

  • string someString = "Hello World";
    Console.WriteLine(someString.Substring(3));
    //인덱스가 3이기 때문에 앞에서 4번째부터 출력
    <콘솔창>
    lo World

  • Console.WriteLine(someString.Substring(5, 3));
    //인덱스가 5이기 때문에 앞에서 6번째 출력하고, 3번째까지만 출력한다.
    <콘솔창>
    Wo //6번째가 공백이기 때문에 앞에 한칸 뛰고 3번째 출력을 해서 Wo가 출력된다.

인덱스는 0부터 시작한다는 점 잊지말기!

▶ReadLine() : 사용자한테 입력받기! // string 형식만 가능합니다.

  • string input = System.Console.ReadLine();
    Console.WriteLine($"입력된 데이터 : {input}");

    <콘솔창>
    7 //이건 내가 키보드로 직접 입력함
    입력된 데이터 : 7

※프로그래머라면 디버깅이 어떻게 작동하는지 알아야한다. 그래야 오류가 발생했을때 빠르게 오류 해결이 가능하다. 중단점을 설정해 천천히 디버깅을 할 수 있는 방법을 예제와 함께 설명하겠다.

  1. string input = System.Console.ReadLine();에 중단점(F9키)을 누르고 디버그시작(F5)하면 콘솔창은 멈춰있다.
    왜냐면 I/O(입출력)를 받아야하기 때문이다. 이 상태를 bloked 또는 waiting이라고 부른다.
    구글에 process lifecycle blocked검색하고 사진 보면 이해하기 쉽다.
  2. 그 다음 F11키를 누르면 명령어가 하나씩 실행되는 것을 콘솔창 통해서 볼 수 있다.
    단, F11키는 텍스트 에디터에서 눌러야한다. 콘솔창에 눌러봤자 아무 의미없다!!
  • 입력값을 두줄 쓰고 싶을때는?
  1. input += 사용하기
    input += System.Console.ReadLine();
    Console.WriteLine($"입력된 데이터 : {input}");

  2. 하나씩 새롭게 지정하기
    string input = System.Console.ReadLine();
    string input2 = System.Console.ReadLine();
    Console.WriteLine($"입력된 데이터 : {input}, {input2}");

프로그래머는 효율성을 생각해야한다. 그리고 머릿속으로 명령어가 진행되는 것을 생각하면서 코드 작성을 진행해야한다. 그래야지만 안전한 코드를 작성할 수 있다.

▶Convert(), Parse() : 문자열을 숫자로 형변환 시키는 메서드.

  • Convert()
    string input = System.Console.ReadLine();
    int number = Convert.ToInt32(input);
    Console.WriteLine(number);
    <콘솔창>
    516810 // 내가 키보드로 직접 입력
    516810

  • Parse()
    string input = System.Console.ReadLine();
    int number = int.Parse(input);
    Console.WriteLine(number);
    <콘솔창>
    516810 // 내가 키보드로 직접 콘솔창에 입력
    516810

  • char[] 형식은 int.Parse나 Convert로는 형변환이 불가능합니다. 왜냐면 char를 int로 형변환이 안되기 때문입니다. 그래서 만약 하고 싶다면 string타입으로 변환 시켜주거나 하는 등 사용하면 가능합니다. 자세한 내용은 22.12.26.일 수업에 작성해 놓았으니까 한 번 읽어보세세요.

Console.WriteLine($"입력 받은 숫자 값은 {number}"); 으로 사용해도 됩니다~
프로그래머는 다양하게 활용할 줄 알고, 효율적으로 사용할 줄 알아야합니다!

※자 그렇다면 int를 쓰는것이 낫지 왜 굳이 이렇게 쓸까요?
ReadLine();이 가능한 타입은 String뿐입니다. 그래서 숫자 값을 받고 싶다면 형변환을 해줘야하는 것입니다.

▶Length : 문자열의 길이를 알 수 있습니다.

  • string input = System.Console.ReadLine();
    Console.WriteLine($"입력된 데이터{input}의 길이는 {input.Length}");
    <콘솔창>
    Hello //내가 키보드로 직접 콘솔창에 입력
    입력된 데이터 Hello의 길이는 5
profile
고급 개발자가 되고 싶어요!

0개의 댓글