C++ Chapter 5.1 : 조건 분기 (if문, switch-case문)

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


조건분기

if 조건문

  • 한 문장일때는 중괄호 블럭 생략 가능
  • if(true) : 항상 실행
  • if, else 중괄호 블럭 안에서 변수 선언하면 그 블록안에서만 유효한 지역변수
  • else는 가장 가까운 위치의 if와 대응한다.
    • 그러니 항상 같은 짝 if-else 끼리는 중괄호로 묶어주고 위치를 맞추자
      if (x >= 10)
      		**if** (x < 20)
      			cout >> "x is between 10 and 20 " << endl;
      **else**
      	cout >> "... " << endl;
    
    • else 는 이 if 와 연결된다.
  • if ( x = 0)if ( x == 0) 는 다른 점
    • if ( x = 0)if ( 0 ) 과 같다. 0이 x 에 대입되어서 … 무조건 실행이 안되겠지.
    • if ( x == 0) → x 가 0과 같은지 조건식 따짐. x가 0이면 실행되고 0이 아니면 실행 안됨


switch-case문

  • case 하나 걸리면 그 밑의 case들까지 다 실행된다.
    • 따라서 해당되는 case 하나만 실행시키려면 break 넣기

        switch(x)
        {
        	case 0:
        		cout << "Zero";
        	case 1:
        		cout << "One";
        	case 2:
        		cout << "Two";
      
      • 만약 x 가 1이면 case1에 걸리고 밑에있는 case2까지 순차적으로 실행되어
        • “OneTwo” 출력
        switch(x)
        {
        	case 0:
        		cout << "Zero";
        		break;
        	case 1:
        		cout << "One";
        		break;
        	case 2:
        		cout << "Two";
        		break;
      
      • 이제 딱 case 1만 실행되고 빠져나와 “One”만 출력
  • enum (내부적으로 정수값) 과 함께 쓸때

      enum class Colors
      {
      	BLACK,
      	WHITHE,
      	RED,
      	GREEN,
      	BLUE
      };
    
      void printColorName(**Colors color**)
      {
      	switch (color)
      	{
      	case Colors::BLACK:
      		cout << "black";
      		break;
      	case  Colors::WHITHE:
      		cout << "white";
      		break;
      	case  Colors::RED:
      		cout << "red";
      		break;
      	}
      	cout << endl;
      }
    
      int main()
      {
      	printColorName**(**Colors::BLACK);
    
      	return 0; 
       }
    
    • 이렇게 복잡하게 쓰기보다 그냥 case 0:, case1: 이렇게 쓰고 싶다면 아래와 같이 형 변환하기

        enum class Colors
        {
        	BLACK,
        	WHITHE,
        	RED,
        	GREEN,
        	BLUE
        };
      
        void printColorName(**Colors color**)
        {
        	switch (**static_cast<int>(color)**)
        	{
        	case **0:**
        		cout << "black";
        		break;
        	case **1:**
        		cout << "white";
        		break;
        	case **2:**
        		cout << "red";
        		break;
        	}
        	cout << endl;
        }
      
        int main()
        {
        	printColorName(Colors::BLACK);
      
        	return 0; 
         }
      

default :

  • 모든 case에 안걸렸던 것들 처리

주의사항

  • switch에서 한 변수선언은 모든 case에서 사용 가능하다.
  • 단 값 할당, 초기화에서 문제가 있음

      switch(x)
      {
      	int a; // 가능함.
      	int b = 1; // 오류 ! ! **이 공간에선 메모리 할당 안됨.** 즉 변수 선언은 가능하나 초기화는 안된다.
    
      	case 0 :
      		a = 1;  // 가능함. 값 할당은 case 안에서만 ! **a는 case 시작 전 공간에서 선언된 변수** 
      }
    
    • 변수 선언은 switch 어디에서든 가능하다. case안에서도, case 시작 전 공간에도.
      • 어느 case에서 선언된 변수든 모든 case에서 사용 가능하다.
      • 단 값 할당은 case 안에서만 가능하다.
        • case 시작 전 공간에서는 case에 막혀 메모리 할당이 되지 않는다.
        • 해당 case를 벗어나면 메모리 할당 받은것도 사라진다.
          • case0 에서 b=2 했어도 case1 에서는 b=2 메모리 할당받은 값이 사라짐
            • break가 없어서 case0, case1 다 들리더라도 !!
            • 메모리 할당은 해당 case 범위에서만 유지된다.
              • 변수 선언은 전체 switch 유지
      switch(x)
      {
      	int a; // 가능함.
    
      	case 0 :
      		int b;
      		b = 2; // 가능함. 값 할당은 case 안에서만 ! 
      		a = 1;  // 가능함. 값 할당은 case 안에서만 ! 
        	
      	case 1 :
      		cout << b << endl; // case 0 에서 선언된 b를 case1에서도 사용 가능하다.
      }
    
    • 단 case 1에 해당된다면 쓰레기값이 출력될 것이다.
      • 어떤 case에서 선언된 변수든 다 사용가능하므로
        • int b는 실제로 존재하는 변수고 case 1에서도 사용 가능하지만
      • case0에서의 b = 2 값 할당을 만나지 못해 쓰레기 값이 출력되게 되는 것이다.
      { 
      		int b = 2; // 이렇게 switch에서만 사용할 변수를 미리 switch 문 전에 선언해놓는것을 추천
        	
      		switch(x)
      		{
      		int a; // 가능함.
        	
      		case 0 :
      			b = 4; // 가능함. 값 할당은 case 안에서만 ! 
      			a = 1;  // 가능함. 값 할당은 case 안에서만 ! 
        		
      		case 1 :
      			cout << **b** << endl; // case 0 에서 선언된 b를 case1에서도 사용 가능하다.
      		}
      }
    
    • 이제 b는 switch문에서 선언된게 아닌 바깥에서 선언된 b이므로 case1 에서도 쓰레기 값 없이 제대로 된 값 출력가능


🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기