앞서 우리는 if문에 대해 배워보았습니다.

[C#] 프로그래밍의 꽃 if문

if문에서는 어떤 상황을 가정하며 상황에 맞는 결과를 출력 혹은 행동할 수 있게끔 프로그램을 이끌어가는 하나의 흐름으로 볼 수 있습니다.

switch문 또한 if문과는 조금 다른 형태의 흐름을 제어하는 제어문이라 볼 수 있습니다. 

 


switch문의 기본 형태

switch (조건의 대상이 되는 변수)
{
	case 조건값1 :
    	조건값1이 참일 경우 실행;
        break;
    case 조건값2 :
    	조건값1이 참일 경우 실행;
        break;
    case 조건값3 :
    	조건값1이 참일 경우 실행;
        break;
    case 조건값4 :
    	조건값1이 참일 경우 실행;
        break;
    default :
    	위의 조건값에 해당하지 않는 경우에 실행;
        break;	
}

의 기본 형태로 진행하고 있습니다. 조건은 꼭 조건4까지만 있는 것이 아닌 원하는 만큼 넣어도 됩니다.

 

  1. switch문은 case 별로 나누어서
  2. case에 해당하는 조건을 찾아간 다음, 그에 해당하는 행동요건을 실행합니다. 
  3. 그리고 중지! (break) 하는 형태를 이루고 있습니다.
  4. 위에서 원하는 조건(case)를 찾지 못한다면, 기본값(default)을 찾아서 실행하는 것이지요.

 

예시를 들어보도록 하겠습니다.

[1부터 5까지의 숫자를 한 개 입력받아서 실행하면 그에 따른 결과값을 출력하는 예제입니다.]

using System;

namespace MyFirstApp
{
	class Program
    {
    	static void Main(String[] args)
        {
        	int input = 0;
            
            Console.Write("1~5까지의 숫자를 입력하세요 : ");
            input = Convert.ToInt32(Console.ReadLine());
            
            switch(input)
            {
            	case 1:
                Console.WriteLine("1을 입력하셨군요!");
                break;
                case 2:
                Console.WriteLine("2를 입력하셨군요!");
                break;
                case 3:
                Console.WriteLine("3을 입력하셨군요!");
                break;
                case 4:
                Console.WriteLine("4를 입력하셨군요!");
                break;
                case 5:
                Console.WriteLine("5를 입력하셨군요!");
                break;
                default:
                Console.WriteLine("1 ~ 5 외의 숫자를 입력하셨습니다!");
                break;
            }
        }
    }
}


 

실제 입력을 해서 확인해보면, 3을 입력하면 -> 3을 입력하셨군요! 라는 문장이 나오게 됩니다. 

 

여기서는 지금까지와 다른 한 문장이 추가되었는데, 바로 Convert.ToInt32(Console.ReadLine()); 입니다.

C#은 프로그래머가 쓰기 좋게 만들어져서 이러한 형태처럼 해석을 하기 편하게 만들어져 있습니다. 처음보면 당황할 수 있지만, 조금만 익숙해진다면 그 무엇보다 편하게 쓸 수 있습니다.

Convert.ToInt32(Console.ReadLine()) 하나씩 해석해보도록 하겠습니다.

 

  1. 괄호에서 제일 안쪽, 오른쪽부터 해석합니다. 
  2. Console.ReadLine() -> 한 줄을 읽겠다. (Console에 들어있는 기능 중 하나인 REadLine 기능을 쓰려고 한다.)
  3. 2번에서 읽어들인 것을 ToInt32 (Int 형으로, 즉 정수형으로), Convert (변환하겠다.) // Convert.ToInt32 를 한번에 해석해서 변환하려고 하는데, To Int32인 정수형으로 변환하고자 합니다. 정도로 해석할 수 있겠습니다.

앞으로 볼 내용들도 대부분 이러한 형태를 가지게 됩니다. 복잡한 형태라도 대부분이 이러한 형태를 가지고 있는데, 이 부분은 나중에 다시 설명하도록 하겠습니다. 지금은 입력받는 것은 문자열이지만, 입력받는 것은 정수형으로 받아야하므로 바뀐다는 사실만 알아두시면 됩니다. 

 


그렇다면 만약에 break문을 안쓰게 되면 어떻게 될까요?

using System;

namespace MyFirstApp
{
	class Program
    {
    	static void Main(String[] args)
        {
        	int input = 0;
            
            Console.Write("1~5까지의 숫자를 입력하세요 : ");
            input = Convert.ToInt32(Console.ReadLine());
            
            switch(input)
            {
            	case 1:
                Console.WriteLine("1을 입력하셨군요!");
                break;
                case 2:
                Console.WriteLine("2를 입력하셨군요!");
                
                case 3:
                Console.WriteLine("3을 입력하셨군요!");
                
                case 4:
                Console.WriteLine("4를 입력하셨군요!");
                
                case 5:
                Console.WriteLine("5를 입력하셨군요!");
                
                default:
                Console.WriteLine("1 ~ 5 외의 숫자를 입력하셨습니다!");
                break;
            }
        }
    }
}

이러한 형태로 말이죠.

여기에 3을 입력한다면, 결과는 

3을 입력하셨군요!

4를 입력하셨군요!

5를 입력하셨군요!

1 ~ 5 외의 숫자를 입력하셨습니다. 

가 나오게 될 것입니다.

 

여기서 우리는 break가 특정 case에 따른, 결과값을 break해준다는 사실을 볼 수 있습니다.

 


위와 같은 결과를 활용하면 이러한 형태를 만들 수도 있습니다.

 

using System;

namespace MyFirstApp
{
	class Program
    {
    	static void Main(String[] args)
        {
        	int input = 83;
            
            Console.WriteLine("당신의 성적은 ");
            switch(input)
            {
            	case 100: case 99: case 98: case 97: case 96: case 95: case 94: case 93:
                case 92: case 91:
                Console.WriteLine("A입니다.");
                break;
                case 90: case 89: case 88: case 87: case 86: case 85: case 84:
                case 83: case 82: case 81:
                Console.WriteLine("B입니다.");
                break;
                case 80: case 79: case 78: case 77: case 76: case 75: case 74: case 73:
                case 72: case 71:
                Console.WriteLine("C입니다.");
                break;
                case 70: case 69: case 68: case 67: case 66: case 65: case 64: case 63:
                case 62: case 61:
                Console.WriteLine("D입니다.");
                break;                
                default:
                Console.WriteLine("F입니다.");
                break;
            }
        }
    }
}

다양한 case를 활용해서 성적처리 프로그램을 만들었습니다. 단점은 너무 코드를 쓸 양이 많아진다는 점과 실수를 처리하기에는 부적절할 수도 있습니다. 그래서 위와 같은 코드는 if절로 처리하는 것이 더 효율적입니다.  <조금 더 정확하게는 간단한 상수값을 통한 비교라면 switch문이 효율적이지만, 복합적인 상황 혹은 여러 가지 조합을 이용한 비교라면 if문이 유리합니다.>

 

using System;

namespace MyFirstApp
{
	class Program
    {
    	static void Main(String[] args)
        {
        	int input = 83;
            
            Console.WriteLine("당신의 성적은 ");
            
            if ( input > 90 || input <= 100)
            {
                Console.WriteLine("A입니다.");
            }
            else if ( input > 80 || input <= 90)
            {
            	Console.WriteLine("B입니다.");
            }
            else if ( input > 70 || input <= 80 )
            {
            	Console.WriteLine("C입니다.");
            }
            else if ( input > 60 || input <= 70)
            {
            	Console.WriteLine("D입니다.");
            }
            else 
            {
            	Console.WriteLine("F입니다.");
            }
                        
        }
    }
}

switch문으로 일일히 쓰는 것보다 if문을 활용한 범위를 쓰는 것이 더 깔끔합니다. 물론 더 다양한 형태로 사용할 수도 있습니다. 위의 코드는 하나의 예시일 뿐입니다. 

if문과 switch문의 차이는 위와 같은 차이점이 있으며 보통 정수 혹은 딱딱 떨어지는 스위치를 누르는 것과 비슷하게 적용한다면 switch문이 유리하며, 특정 범위와 같은 범주라면 if문이 유리합니다. 

이는 프로그래머의 성향일 뿐 정해진 답은 없습니다. 

다만 좋은 프로그래밍은 누가보더라도 '가독성'이 좋은 코드입니다. 한 눈에 읽히는 것이 가장 좋습니다.

 

항상 중요한 것은 실습을 통해 둘 사이의 차이점을 이해하고 적절한 상황에 적절한 도구를 사용하는 것이겠죠?

우리가 프로그래밍을 구현함에 있어서 가장 중요한 점 중 하나는 특정 상황에 따라 맞는 행동을 해주는 것입니다. 그럴 때 사용하는 것이 바로 if문입니다.

if 문은 영어의 뜻 그대로 "만약 ~ 한다면" 이라는 의미를 가지고 있습니다.

하나를 예로 들어보도록 하죠.

- 만약에 인터넷을 더블클릭 한다면 -> 인터넷이 시작될 것이다.

- 만약에 키보드 엔터 버튼을 누른다면 -> 다음 줄로 넘어갈 것이다.

이러한 형태로 만약 ~한다면, ~할 것이다. 라는 형태를 이루고 있습니다. 

 

우리가 사용하고 있는 대부분의 프로그램 또한 무언가를 클릭하면 무언가가 선택이 되거나 그에 맞는 행동을 하기 마련입니다. 

 

if 문의 일반적인 사용 방법

if ( 우리가 원하는 조건, 10보다 큰 숫자라면 )
{
	10보다 큰 숫자가 왔을 때의 행동
	Console.WriteLine("나는 10보다 크다!");
}

의 형태처럼 사용할 수 있습니다. 

위의 코드를 조금 더 자세한 코드로 바꾸어서 이야기하자면, 

if ( num > 10 ) 
{
	Console.WriteLine("10보다 큰 숫자입니다!");
}

num이라는 숫자가 10보다 크다면, { } 안의 코드가 실행되는 형태입니다. 만약에 num > 10 이 거짓이라면 { } 안의 코드는 실행되지 않습니다. 

 

자 그래서 if 문의 기본 형태는 

if ( 참(true)인지 거짓(false)) 
{
	참이면 실행되는 명령
}

의 형태를 이루고 있습니다. 여기서 용어의 통일을 위해서 우리는 { } 괄호 안의 감싸져 있는

코드를 '코드 블럭(Code Block)'이라고 부릅니다.

 

그리고 if ( 이곳에 있는 문장을 '조건식' ) 이라 합니다. 

 

if문의 형태는 기본적으로 조건식을 검사한 뒤에, 나머지 코드 블럭에 있는 문장을 실행하는 형태로 코드를 진행하고 있습니다. 

 


간단한 실습

자 그럼 위에서 배운 대로 간단한 실습을 해보도록 하겠습니다.

 

using System;

namespace MyFirstApp
{
	class Program
    {
    	static void Main(string[] args)
        {
        	int num = 10;
            
            if ( num == 8 ) 
            {
            	Console.WriteLine("이곳은 출력되지 않는 공간입니다.");
            }
        }
    }
}

위의 코드는 if문을 활용하는 하나의 코드 형태입니다. if문 안에 있는 코드블럭은 실행되지 않습니다. 

조건식에 들어있는 문장이 false(거짓)이기 때문이죠.

 

위의 코드를 같은 의미이지만 다른 형태로 바꾸어보면 이렇게 바꾸어 볼 수도 있습니다.

using System;

namespace MyFirstApp
{
	class Program
    {
    	static void Main(string[] args)
        {
        	int num = 10;
            
            if ( false ) 
            {
            	Console.WriteLine("이곳은 출력되지 않는 공간입니다.");
            }
        }
    }
}

조건식 안에 있는 문장 자체를 false로 바꾸어주었습니다. 

 

원래 num == 8 (여기서 == 는 두 개의 값이 같은지 틀린지를 확인한 뒤에, true와 false를 반환해줍니다.) 에서 false를 반환받아서 최종적으로는

if ( false )의 형태가 됩니다.  

 

if문은 중첩해서 사용할 수 있으므로 if문의 코드블럭 안에 다시 if문을 무한정으로 할 수 있다는 장점이 있습니다. 초반에 프로그래밍에 잘 모를 때는 여러가지 방법을 이용해서 나에게 주어진 문제를 풀어보면서 프로그래밍을 익혀나가야 하기에, 효율적인 프로그래밍 보다는 여러 방식으로 도전해보는 것을 추천드립니다.

 


if와 else if 그리고 else

자 그렇다면, 사람이 조건식을 판단할 때는, 단순하게 만약에 ~ 하다면 -> 하지만 그렇지 않다면 ~ 할거다.

라는 논리를 이야기합니다. 이러한 논리적 흐름을 C#에서도 마찬가지로 구현해두었습니다.

 

그것이 바로 if와 else if 그리고 else문 입니다.

 

먼저, if와 else

if와 else문은 조건식이 참이라면, if 문 안에 있는 코드블럭을 실행하고, 그렇지 않다면 else문을 실행하는 형태입니다. 둘 중에 하나는 무조건 실행되는 구조라 생각할 수 있습니다. 

 

if (조건식)
{
	실행할 코드
}
else 
{ 
	실행할 코드
}

이러한 기본 형태로 사용합니다.

 - if문이 실행안되면, else문이 실행되며

 - if문이 실행되면, else문은 실행이 되지 않는 구조입니다. 

 

if 가 참(true)이면 if문을 실행한다. / if문이 거짓이라면 else 문을 실행한다. 

의 형태로 진행되는 것이지요. 그래서 else문에는 조건식이 없습니다. if문이 아니라면 실행될 뿐인거죠.

 


if - else if - else

우리의 현실 세계는 if - else 문 만으로는 표현할 수 없습니다. 조금 더 복잡한 조건을 표현할 녀석이 필요한 것이지요. 그래서 존재하는 것이 if - else if - else 입니다.

 

먼저, 예제 코드부터 보도록 하겠습니다.

int number = 75;

if ( number > 90)
{
	Console.WriteLine("A입니다.");
}
else if ( number < 90 && number >= 80 )
{
	Console.WriteLine("B입니다.");
}
else if ( number < 80 && number >= 70 )
{
	Console.WriteLine("C입니다.");
}
else if ( number < 70 && number >= 60 )
{
	Console.WriteLine("D입니다.");
}
else 
{
	Console.WriteLine("F입니다.");
}

입력된 성적을 바탕으로 성적을 산출하는 프로그램입니다.  현재 성적은 75점으로 if문을 거쳐서 else if문을 계속해서 체크하며 C 성적까지 가고 있습니다.

 

여기서 조건식은 number < 80 && number >=70 는 80점 미만, 70점 이상을 의미하며, 

부등식으로 사용되었던, 70 <= number < 80을 의미합니다. 고등학교 1학년 때 배운, 부등식을 말로 표현한 형태입니다. 주로 사이에 있는 값은 && (그리고 혹은 and)값으로 표현해서 나타냅니다.

 

만약, number > 80 || number < 70 이면 (여기서 작대기처럼 보이는( || ) 것은 or(또는)을 의미합니다.

80보다 크고, 70보다 작다를 의미합니다. 

 

else if문은 if문이 실행안되면, else if문에 있는 조건식을 체크하고 -> 참이면 코드블럭을 실행, 거짓이면 다음 else if문의 조건식을 확인하는 형태로 진행하고 있습니다. 

모든 조건식이 거짓을 가리키고 있으면 기본으로 else문에 있는 코드블럭을 실행하는 형태인 것이죠.

 

 

 

이렇게 기본 형태를 가질 수 있는 것이죠. 여기서 if - else if - else 문은 당연히 중첩된 구조를 가질 수 있으며 다양한 형태로 활용이 가능합니다.

다음 시간에는 switch문의 활용에 대해 살펴보도록 하겠습니다. 감사합니다.

 

지난번에는 visual studio에서 설정하는 것만 확인했다.

[OpenCV]OpenCV란 무엇인가? 그리고 설치

 

[OpenCV]OpenCV란 무엇인가? 그리고 설치

1. OpenCV OpenCV는 Open Source Computer Vision의 약자로 영상 처리에 사용할 수 있는 오픈 소스 라이브러리 입니다. 컴퓨터가 사람의 눈처럼 인식할 수 있게 처리해주는 역할을 하기도 하며, 우리가 많이

studium-anywhere.tistory.com

이러한 방식은 간단하게 설정하고 하나의 프로젝트에서 써먹기 좋다. 하지만 여러 프로젝트를 진행해야 하는 상황이라면 지속적으로 lib를 복사해야 하는 귀찮음이 있을 수 있다. (물론 위에서 제시한 방법도 진행해보고 환경변수 설정을 활용한 방법도 진행해봄으로써 실제 상용 프로그램을 만들 때 필요한 프로그램이 무엇인가를 아는 것도 중요하다.)

 


시스템 환경변수 설정

  컴퓨터 시스템은 스스로 할 수 있는 일이 별로 없다. 그래서 우리가 하나하나 알려줘야 한다. "어? 지금까지는 컴퓨터가 알아서 해줬는데요?" 그것은 다른 프로그래머가 하나하나 설정해준 것이므로 이제 우리도 하나하나 할 때가 되었다. 

  무언가를 시작할 때, 어디에 있는지 알아야 시작하지 않겠는가? 그것이 바로 환경 변수이다. 이름이 환경변수인 이유는 영어를 직역해서 그렇다. (Environment variable)

 

윈도우10 기준으로 제어판 -> 시스템으로 들어가자.

그곳에서 시스템 정보를 클릭

 

이렇게 생긴 모습이 나올 것이며, 거기서 고급 시스템 설정을 눌러주자.

 

딱 대놓고 환경 변수라고 나와있다.

 

  하나의 계정에다가만 만들 것이 아니라 시스템 자체에 추가하려고 하니 '시스템 변수'에다가 추가하도록 하겠다. (위, 아래 칸 두 개가 있다고 당황하지 말자, 위에는 특정 사용자에 해당하는 변수 설정이며, 아래에는 시스템 전체에 해당하는 변수이다. 위에다가 해도 상관없지만, 윈도우 계정 로그아웃 시 환경변수 설정을 다시 해야 한다.)  새로 만들기를 눌러준다.

 

앞으로의 세 개를 연달아 입력해준다. 다만 필자는 C에다가 압축해제를 해두었으므로 C:\opencv를 놓은 것이니 만약에 D라면 D:\opencv로 진행하도록 하자. 혹은 폴더에 두는 사람도 있는데 

D:\opencv\opencv의 형태가 있을 수도 있다. 본인의 상황에 맞는 것으로 하자.

 

필자의 상황은 이러하다. C:\opencv 가 바로 있다.

각각의 변수에다가 폴더의 경로를 저장해주는 형태이다. 

 


그 다음으로 시스템 변수 - path를 더블 클릭하자.

 

그리고서 아까 저장한 OPENCV_DIR 를 아래 처럼 입력해도록 하자. 

아까 우리는 OPENCV_DIR = C:\opencv를 저장해두었으니, 아래에 경로명에는 

C:\opencv\build\x64\vc15\bin 의 경로가 생성되는 것이다.

우리는 컴퓨터에게 친절하게 알려줄 필요가 있다. 엄마! 내 OO 어딨어!?

 

확인을 누르고 나면 기본적인 환경설정은 마무리가 되었다.

 

이제 제대로 설정이 되었는가를 확인하기 위해 CMD (명령 프롬프트)를 켜도록 하자. 윈도우 10이라면 아래에 검색에서 cmd라고 치면 나온다.

 

제대로 설치가 되었다면 버전이 나온다. 그렇지 않다면 찾을 수 없다는 메시지가 나올 것이다.

 


Visual Studio 설정하기

프로젝트 -> [프로젝트 이름] 의 속성으로 가보자

*필자는 프로젝트 이름을 opencv_project라 지은 것이다.

 


1. 

창이 열리고 나면, C/C++ → 일반 탭에서 

추가 포함 디렉터리에다가 $(OPENCV_INC)

아까 시스템 변수에 저장된 값을 지정해주도록 해야 합니다.

 

 

2. 

그 다음으로 링커 → 일반에서 추가 라이브러리 디렉터리에

$(OPENCV_LIB)

를 입력하도록 합니다. 이 변수도 위에서 시스템 변수에서 적용한 값이죠.

 

3. 마지막으로 링커 → 입력에서 추가 종속성을 입력해주도록 합니다.

 

추가 종속성

lib를 연결해주는 역할을 합니다. 여기서 주의하실 점은 opencv의 버전에 따라 이름이 조금씩 다릅니다.

C:\opencv\build\x64\vc15\lib

저의 설치 경로는 이렇게 설치했으며, 직접 가셔서 확인해보는 것이 가장 좋습니다.

두 개가 있으며, d가 붙은 버전과 아닌 버전이 있는데, d가 붙어있으면 debug이며, 안 붙어있는 lib는 release 모드에서 사용됩니다. 둘 다 입력해주도록 합니다.

 

이렇게 확인을 누르면 완료가 됩니다.

 

 

+ Recent posts