상세 컨텐츠

본문 제목

0903 TIL - C# 기초 문법 2

본문

가족 식사 때문에 어제 업로드하는걸 잊어버려서 어제 오늘치 두 개 올라갑니다~

 

입력받은 문자가 숫자인지 문자열인지 판단하기

 

어제 배운 TryParse를 응용해서 만들어보자.

 

다시 복습해보자면

 

TryParse는 숫자나 문자의 형변환에 사용되는 함수로써

 

예시를 보면서 설명해보면

{
    string a = "1000";
    int b = 0;
    int.TryParse(a, out b);
}

문자열 a에는 "1000"이라는 문자가 적혀있고

정수 b에는 0이라는 값이 들어있다.

int.TryParse(a, out b);는 a의 값을 int형으로 b에 적용한다 라고 생각하면 된다.

 

Parse()나 Convert와는 다르게 반환 값이 bool값인데 변환에 성공했는지 실패했는지만 알려준다.

 

즉 위 식에서 int.TryParse(a, out b);를 bool 변수에 집어넣고 실행해보면 true 라는 값이 출력된다.

확인해보자.

True라는 값이 반환된 것을 확인할 수 있다

그럼 이걸로 입력받은 문자가 숫자인지 문자열인지 구분하게 만들어보자

 

중요한 점은 형변환에 성공했을 때 True값을 보낸다는 점이다.

 

그렇다면 우선 문자열을 입력받고

float형으로 TryParse함수를 실행한 뒤

true가 나오면 숫자 false가 나오면 문자형으로 코드를 작성해보자.

 

using System;

{
    string input = Console.ReadLine(); //input 문자열 변수에 값을 입력받음
    bool isSuccess; //TryParse의 반환 값을 넣어줄 bool 변수
    float isNumber = 0; //TryParse의 out값에 들어갈 빈 float 변수
    isSuccess = float.TryParse(input, out isNumber);

    if (isSuccess) Console.WriteLine("숫자입니다.");
    else Console.WriteLine("문자입니다.");
}

실행해보면?

잘 작동되는 것을 볼 수 있다.

 

한 번 더 꼬아서 불리언인지도 확인 할 수 있게 해보자.

using System;

{
    string input = Console.ReadLine(); //input 문자열 변수에 값을 입력받음
    bool isSuccess; //TryParse의 반환 값을 넣어줄 bool 변수
    bool isBool; ////TryParse의 out값에 들어갈 빈 bool 변수
    float isNumber = 0; //TryParse의 out값에 들어갈 빈 float 변수
    isSuccess = float.TryParse(input, out isNumber);
    isBool = bool.TryParse(input, out isBool);

    if (isSuccess) Console.WriteLine("숫자입니다.");
    else if (isBool) Console.WriteLine("불리언입니다.");
    else Console.WriteLine("문자입니다.");
}

참고로 조건문에 isSuccess == true가 들어가야 되는 것 아닌가요? 라고 묻는다면

isSuccess는 이미 bool변수이기 때문에 True나 False값만 가질 수 있다.

즉 isSuccess는 이미 isSuccess == true 또는 isSuccess == false 일 수 밖에 없다.

 

하여튼 실행해보면

잘 작동하는 걸 확인 할 수 있다.

 

다음은 입력받은 데이터가 숫자라면 짝수인지 홀수인지 알려주는 프로그램을 만들어보자

 

우선 숫자가 짝수인지 홀수인지 어떻게 분류 할 수 있을까?

간단하게 표시하자면 n과 2n로 구분할 수 있다

자연수를 쭉 나열해보면 1,2,3,4,5,6,7,8,9,..인데 n과 2n로 분류하면

1, 1*2, 3, 2*2, 5, 3*2, 7, 4*2,...으로 표시할 수 있다

공통점은 짝수는 모두 2로 곱한 수라는 것이다

즉 (짝수 = 2로 나누었을 때 나머지가 없는 수) 라고 생각하면 된다.

위 괄호 안의 내용을 코딩으로 표시한다면 int even%2==0 을 성립하는 수가 짝수일 것이다.

 

코드를 작성해보자.

 

우선 입력받은 문자가 숫자인지 문자인지 구별하고 그 숫자를 %2로 나머지 값이 0이라면 짝수 1이라면 홀수로 구분지으면 될것 같다.

 

using System;

{
    string input = Console.ReadLine();
    int isNumb = 0;
    bool isSuccess;
    isSuccess = int.TryParse(input, out isNumb);

    if ( isSuccess )
    {
        if (isNumb % 2 == 0) Console.WriteLine(input + "은 (는) 짝수 입니다.");
        else Console.WriteLine(input + "은 (는) 홀수 입니다.");
    }
    else Console.WriteLine("숫자가 아닙니다.");
}

절대 귀찮은건 아니고 위에 설명 했으니까 주석은 생략토록 하겠습니다.

 

차례대로 7, 100, abc를 입력해보자

스크린샷 3번 찍기 귀찮아서 for 반복문을 썼는데 다음 시간에 배워볼 것이니 무시하도록 합시다

 

마지막으로 switch case 문이라는 조건문이 있는데

{
    int input = 0; //input 변수 초기화
    input = Convert.ToInt32(Console.ReadLine()); //입력받은 문자열을 숫자로 변경해 input에 저장

    switch (input) //switch문 만약 (input) 이라면
    {
        case 1: Console.WriteLine(""); //(input==1)이라면
            break;

        case 2: Console.WriteLine(""); //(input==2)이라면
            break;

        case 3: Console.WriteLine(""); //(input==3)이라면
            break;
        
        default : Console.WriteLine(""); //위에 해당되는 조건이 없다면
            break;
    }
}

이런 식으로 쓰이게 된다.

 

차이를 보면 if문의 경우 Bool값을 기준으로 참이냐 거짓이냐에 따라 실행되고 안되고가 정해지는 반면

switch의 경우 특정 문자나 숫자의 값이면 해당 구문만 실행한다 처럼 된다

 

예를 들어 텍스트 RPG를 만들었는데

=====================================================

어디로 가야할까? (숫자로 입력해주세요.)

1. 여관 2. 사냥터 3. 훈련소 4. 상점

=====================================================

위 선택지를 하나 만들었다고 했을 때

if 문이라면

if (input ==1)

else if (input ==2)

else if (input ==3)

else if (input ==4)

else

식으로 작성되지만

case 문이라면

 

switch (input)
{
    case 1: 
        break;

    case 2: 
        break;

    case 3:
        break;
    
    default : 
        break;

}

이런 식으로 작성된다

 

아니 둘이 다른게 없지 않나요? 할 수 있는데

데이터를 다룰 때

if문은 branch 형식으로 모든 조건 구문을 하나 씩 읽고 이것이 참인가? 거짓인가?에 대한 판단을 내리는 반면

case문은 jump 형식으로 만족하는 구문으로 뛰어넘어 실행이 된다는 차이점이 있다.

 

아니 그럼 if문 안좋은거 아닌가요? 할 수도 있는데

if문은 반대로 점프를 하지 않기 때문에 점프 테이블이라는 건너뛰기 프로세스를 만드는 과정이 생략되어

조건이 적을 수록 case문에 비해 빠르게 작동하게 된다.

 

관련글 더보기