[Revit API]01-5_C#Basic_조건문

JakkeLab·2023년 11월 5일

Revit API

목록 보기
6/9
post-thumbnail

1. 조건문

주어진 조건의 결과를 통해 실행할 동작을 나누는 것을 의미합니다.

조건문에는 조건을 판별할 대상, 그리고 판별하기 위한 식이 필요합니다.

위와 같이 고속도로에서 차량의 높이에 따라 통행할 수 있는 도로를 구분하는 "높이제한"이 이와같은 구성이 잘 되어있다고 볼 수 있습니다.
차량의 높이인 Height가 판별할 대상이 되며, Go Gate "Under 4.5m" 과 같이 어느 게이트로 갈 지 정해주어서 가도록(Go) 지시하는
것이 실행할 동작이 됩니다.

C#에서는 조건문을 사용하기 위한 구문으로 크게 if-else, switch-case의 2가지 형태로 제공하고 있습니다.

1) If-else

가장 기본적인 형태의 조건문입니다. 사용법은 아래와 같습니다.

if(조건)
{
	//조건이 참일때 실행할 동작
}
else 
{
	//조건이 거짓일때 실행할 동작
}

기본적으로 if문의 괄호 안에는 조건이 나오는데, 조건은 그 결과가 true 또는 false로 나오는 것만 가능합니다. 예를들어 자동차의 높이를 H라 가정하고, 자동차 객체를 car 이라고 하면, 자동차의 높이는 car.Height가 됩니다. 그런데 이 값 만으로는 조건이 될 수 없고, 이 값이 무엇과 같은지, 혹은 무엇보다 크거나 작은지를 묻는 문장이 되어야 합니다.

따라서 car.H만 쓰지않고, car.Height == 5 혹은 car.Height < 5 와 같이 ==, <과 같은 연산자와 맨뒤의 비교값 까지 포함하여 '조건' 이라 합니다. 여기서 ==, < 과 같은 것을 '비교연산자' 라고 합니다.

이때 아래와 같은 비교연산자들이 있습니다.

각 연산자들의 의미는 아래와 같습니다.

== : 왼쪽이 오른쪽과 같은 경우
!= : 왼쪽이 오른쪽과 다른 경우
<= : 왼쪽이 오른쪽보다 작거나 같은 경우
< : 왼쪽이 오른쪽보다 작은 경우
>= : 왼쪽이 오른쪽보다 크거나 같은 경우
> : 왼쪽이 오른쪽보다 큰 경우

한편, 결과가 true 또는 false가 나온다 라는 말에 집중해보면
Car.Height == 4 자체가 값을 반환한다고 생각할 수 있습니다. 맞습니다. C#에서는 아래와같이 작성하면

bool isCarHeight = car.H == 4;
// 오른쪽의 조건이 참이면 isCarHeight 은 true가 됨.
// 오른쪽의 조건이 참이면 isCarHeight 은 false가 됨.

이렇게 true나 false가 변수에 저장됩니다. 그래서

isCarHeight = car.H == 4;
if(isCarHeight)

으로 써도 됩니다.

그리고 if문은 조건의 결과에 따라 분기를 2개로만 나누지않고, 첫 번째 분기가 거짓인경우 다음 분기에서 또 조건을 걸어서 분기를 나눌 수 있습니다.

if(조건1)
{
	//조건 1이 참일 때 수행
}
else if (조건2)
{
	//조건 1은 거짓인데 2는 참일 때 수행
}
else if (조건3)
{
	//조건 1, 2는 거짓인데 3은 참일 때 수행
}else
{
	//모든 조건이 거짓일때
}

여기서 조건1을 만족하지 않으면, 다음 분기인 조건2를 판별하게 됩니다. 여기서 통과되면 조건2의 코드를, 그렇지않으면 다음 분기인 조건3을 판별합니다. 이런식으로 판별을 하다가 모든 조건을 만족하지 않으면 맨 아래에 있는 else의 행위를 실행하게 됩니다. 이때, if-else 문의 경우 else if없이 if 한개만으로도 사용할 수 있으며,
else없이 if와 else if 로만 구성해도 사용할 수 있습니다.



**예제1)** 문자열 1개를 입력받고, "기둥" 이면 "기둥입니다", "계단"이면 계단입니다, 둘다 아니면 "기둥이나 계단이 아닙니다"를 출력하는 코드를 작성하시오. (문자열 입력받기 : string a = Console.ReadLine();)

답안

using System;

namespace Part1_5_1_ifElse
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //문자열 입력받기
            Console.Write("문자열 1개 입력 : ");
            string input = Console.ReadLine();

            //조건문
            if(input == "기둥")
            {
                Console.WriteLine("기둥입니다.");
            }
            else if (input == "계단")
            {
                Console.WriteLine("계단입니다.");
            }
            else
            {
                Console.WriteLine("기둥이나 계단이 아닙니다");
            }

            //종료 방지용
            Console.Write("------\n");
            Console.Write("문자열 입력 시 종료 : ");
            Console.ReadLine();
        }
    }
}

그다음으로 볼 것이 다중조건입니다.

조건1 && 조건2 : 조건1과 조건2가 모두 true이면 true
조건1 || 조건2 : 조건1과 조건2 중 하나이상 true이면 true

if(a > 5 && a < 10) : a가 5보다 크고 10보다 작을 때 true
if(str == "기둥" || str == "계단) : str이 "기둥"이거나 "계단일 때" true

이렇게 조건 여러개를 한 조건문 안에 묶을 수 있습니다.

예제2) 문자열 1개를 입력받고, "기둥" 이나 "계단"이면, "구조"를 출력하고 둘다 아니면 "구조가 아님"을 출력하는 코드를 작성하시오. (문자열 입력받기 : string a = Console.ReadLine();)

using System;

namespace Part1_5_2_MultipleCondition
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //문자열 입력받기
            Console.Write("문자열 1개 입력 : ");
            string input = Console.ReadLine();

            //조건문
            if (input == "기둥" || input == "계단")
            {
                Console.WriteLine("구조");
            }
            else
            {
                Console.WriteLine("구조가 아님");
            }

            //종료 방지용
            Console.Write("------\n");
            Console.Write("문자열 입력 시 종료 : ");
            Console.ReadLine();
        }
    }
}

예제3) 임의의 정수를 하나 입력받고, 0 이하이거나 1000이상이면 "범위 초과"를 출력하고, 0보다 크고 1000 이하이면 자릿수를 표현하는 코드를 작성하시오. 이때 입력받은 값이 정수가 아니거나 음수이면 "올바르지 않은 값 입력" 입니다를 출력하도록 하시오.

정수인지 검사하는 코드는 아래를 참고하시오.

string input;
int a;
bool result = int.TryParse(input, out a);
//result : 정수로 변환에 성공하면 true를 반환하고 a에 그 값을
//		   정수로 저장하고, 그렇지 않으면 false 를 반환함)

Sol.

using System;

namespace Part1_5_3_MultipleBranch
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //문자열 입력받기
            Console.Write("정수 1개 입력 : ");
            string input = Console.ReadLine();

            //정수인지 검사
            int a;
            bool isInt = int.TryParse(input, out a);
            if(isInt)
            {
                if (0 < a && a < 10)
                {
                    Console.WriteLine("자릿수 : 1");
                }
                else if (10 <= a && a < 100)
                {
                    Console.WriteLine("자릿수 : 2");
                }
                else if (100 <= a && a < 1000)
                {
                    Console.WriteLine("자릿수 : 3");
                }
                else
                {
                    Console.WriteLine("범위 초과");
                }
            }
            else
            {
                Console.WriteLine("올바르지 않은 값 입력");
            }

            //종료 방지용
            Console.Write("------\n");
            Console.Write("문자열 입력 시 종료 : ");
            Console.ReadLine();
        }
    }
}

2). Switch-case
특정 값 자체를 비교하는 것으로, 조건 대신 값을 인자로 받아 해당 값이 어떤값과 같은지를 기준으로 분기를 나누는 구문입니다.

switch (판단할 값) 
{

	case1:
		실행할코드
		break;
	case2:
		실행할코드
		break;default:
		실행할코드
        break;
}

이렇게 해당 값이 무엇인지에 따라 실행할 코드를 분기시킬 때 사용합니다. 단, 각 분기에서 각 분기의 실행을 마칠 수 있도록 break;를 명시해야 합니다. default는 생략을 할 수 있습니다.
(타 언어에서는 break;가 없으면 바로 다음분기로 순차적으로 실행하는 경우가 있지만, C#은 break;를 꼭 모든 분기에서 명시해야 합니다.)

조건문은 상황에 따라 if-else보다 switch-case가 더 적합할 때도 있습니다. 앞서 진행했던 예제1번의 경우 사실 switch-case를 사용할 경우 더 코드가 간결하고 가독성이 좋아집니다.

switch(input)
{
	case "기둥":
		Console.WriteLine("기둥입니다");
		Break;
        
	case "계단":
		Console.WriteLine("계단입니다");
		Break;
        
	default:
		Console.WriteLine("기둥이나 계단이 아닙니다.");
}

if-else와 switch-case는 판단하고자 하는 조건에 맞춰 적절한걸로 선택하여 사용하시면 됩니다.

예제4) 문자열 1개를 입력받았을 때 아래의 종이의 크기를 출력하는 코드를 작성하시오. 단 switch-case문을 이용하여 작성하시오. 아래의 문자열 외(A1, A2, A3, A4가 아닌 경우)의 값을 입력받으면 "잘못된 입력값"을 출력하시오

참고 : 종이크기
1) "A4" : "210x297"
2) "A3" : "297x420"
3) "A2" : "420x594"
4) "A1" : "594x841"


Sol

using System;

namespace Part1_5_5_SwitchCasePractice
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //문자열 입력받기
            Console.Write("종이크기 입력 : ");
            string input = Console.ReadLine();

            //분기설정
            switch (input)
            {
                case "A4":
                    Console.WriteLine("210x297");
                    break;
                case "A3":
                    Console.WriteLine("297x420");
                    break;
                case "A2":
                    Console.WriteLine("420x594");
                    break;
                case "A1":
                    Console.WriteLine("594x841");
                    break;
                default:
                    Console.WriteLine("잘못된 입력값");
                    break;
            }

            //종료 방지용
            Console.Write("------\n");
            Console.Write("문자열 입력 시 종료 : ");
            Console.ReadLine();
        }
    }
}
profile
시간을 설계하는 건축가

0개의 댓글