코딩 공부/C, C++

4. 조건문

갬성꿈돌이 2024. 1. 17. 17:50
반응형
반응형

목차

     

     

    if문

     

     

    if문은 조건에 따라 실행이 될 때도 있고 안될 때도 있는 가변적 상황에서 사용되는 경우가 많기 때문에 다른 조건문에 비해 적게 사용되지만 의미가 없는게 아니다.

     

    예를 들면, A버튼을 누르면 게임이 시작, B버튼을 누르면 나가기, A와 B를 동시에 누르면 설정창이 뜬다. 그 키들을 입력할 때에는 True값을 내뱉지만 실제 게임 중에는 C버튼만을 사용하고 계속 A버튼을 누르고 있거나 B버튼을 누르는 사람은 없으니 평소에는 False값이 나온다.)

     

    아래는 단순한 논리연산자를 통해 if문을 실행을 시킨 예시이다.

    #include<stdio.h>
    
    int main() {
    	
    	int data = 0;
    
    	if (100 && 200)
    	{
    			
    		data = 100;
    		
    		printf("data = %d으로, 위의 if 구문은 참이다!\n", data);
    
    	}
    	return 0;
    }

    if구문의 예제

     

    * 만약 if가 무슨 짓을 해도 False 값이 나와 작동되지 않게 되어있으면 컴파일러가 알아서 삭제함. 조심하기.

     

      

     

     

    if-else문

     

     

    if-else문은 else if를 통해 조건을 무한정으로 늘릴 수 있으며 함께 묶여있는 조건들의 True/False를 위에서 아래로 순차적으로 판단해 하나의 조건을 충족하는 순간 거기서 True를 하며 코드를 끝내버린다.

    만약 하나라도 조건을 충족할 경우에 else를 쓰지 않으면 그냥 넘어가지만(어차피 True인 조건을 수행하고 아래는 무시하니까), 모든 조건을 충족하지 못했는데 else를 쓰지 않으면 무조건 오류가 뜬다(?)는 사람이 있던데 강사님께서는 else를 안써도 그냥 아무것도 실행되지 않고 넘어간다고 한다... 누구 말이 맞는거지... 우선 스스로 해봤을 때는 else를 안써도 문제는 없었다.

     

    if (조건1) {실행할 코드;}

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

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

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

    else 실행할코드 ; //(위의 조건들이 모두 False일 경우 실행)

     

     

    * 그렇기 때문에 캐릭터의 움직임(w a s d)를 if else문으로 만들면 방향키가 앞으로 가다가 오른쪽 키를 누르면 오른쪽 대각선 전진으로 움직여야하는데 먼저 눌린 것만 입력이 되어 계속 앞으로만 가서 큰일난다.

     

     

    예제

    #include <stdio.h>
    
    int main() {
    
    	int a;
    	printf("숫자를 입력하시오 : ");
    	scanf_s("%d", &a);
    
    	if (a > 0) { printf("\n%d의 값은 양수입니다.\n", a); }
    	else if (a == 0) { printf("\n%d의 값은 0입니다.\n", a); }
    	else printf("\n%d의 값은 음수입니다.\n", a);
    
    
    	return 0;
    }

    실행 결과

     

     

     

     

    switch-case문

     

     

    if_esle문 보다 switch-case문이 코드가 더 간결하게 잘 보여서 많이 선호한다. 물론 특정 상황에 따라 더 편안하거나 좋은 방법이 있으니 둘 다 쓰기는 하지만 보통은 switch 문으로 작성하는 것이 좋을 것 같다.

     

    주의점은 각 case 뒤에 break를 빼먹으면 그 다음 break를 만날 때 코드가 끝난다. 이게 의도적으로 다양한 case가 중복실행되면서 break를 한번에 시키고 싶을 때에는 빼먹을 때가 있기 때문에 문법 오류로 판단하지 않는다. 그렇기 때문에 break를 주의하자!

     

    switch(10)
    {
    case 10;
    	break;
       
    case 20;
    	break;
        
    default;
    	break;
    
    }

     

     

     

    if-else문을 어느 정도 쓸 때 switch문이 유리한지, 굳이 switch문으로 바꿔서 써야 하나 라는 궁금증이 생길 것이다.

     

    경우의 수(if-else)가 많아지면 if-else문 대신 switch문으로 작성하는 것이 더 효율적으로 동작하고 가독성이 좋아지며, 많은 구현체들이 switch문을 jump table로 구현하기 때문에 switch문이 더 좋은 성능을 나타낼 때가 많다고 한다. 컴파일러 최적화의 경우, 코드 상황에 따라 다르지만 옛날에는 조건이 3개 이상일 때 if-else문보다는 switch-case문을 사용하는 것이 더 효율적이었다고 한다.

     

    사실 과거에는 if-else /  switch 성능을 따졌지만 현재 컴퓨터의 발전으로 성능 자체를 따지는 것이 의미가 없어졌다. 그렇지만 이왕 쓰는거 switch를 더 자주 쓰도록 하자.

     

     

    주의할 점은 switch문에는 제약조건이 있다.

     

    첫째, switch의 조건식 결과는 정수 또는 문자열만 가능하다

    둘째, case의 뒤에는 정수,상수(문자 포함), 문자열만 가능하며, 중복되지 않아야 한다.

    * 변수나 실수는 안되며 조건식 등도 들어갈 수 없다.

     

    그래서 지속적으로 조건을 비교하는 위의 if-else문의 예제를 동일하게 switch-case문으로 바꾸려면 생각보다 까다롭다.

     

    //switch-case문 잘못된 예제
    
    
    #include <stdio.h>
    
    int main() {
    
    	int a;
    	printf("숫자를 입력하시오 : ");
    	scanf_s("%d", &a);
    
    	switch(a){
    		
    		case a > 0 :
    			printf("\n%d의 값은 양수입니다.\n", a);
    		break;
    	
    
    		case a == 0 :
    			printf("\n%d의 값은 0입니다.\n", a);
    		break;
    
    
    		default :
    			printf("\n%d의 값은 음수입니다.\n", a);
    		break;
    			}
    
    	return 0;
    
    }

    case 뒤에 상수가 와야하기 때문에 이렇게 하면 안된다...

     

     

    제대로 된 예제

    <코드 만들고 넣기>

    <실행 결과 넣기>

     

     

     

    삼항연산자

     

     

    위에서 배운 if-else문처럼 이런 경우에는 이걸 수행하고 저런 경우에는 저걸 수행하라는 말을 최소한의 코드로 만드는 연산자이다. 하지만 가독성이 너무 좋지 않고 일반적이지 않기 때문에 진짜 코드를 무조건 줄여야만한다는 상황이 아니면 쓰지 않는 것을 추천한다.

     

    사진 속 삼항연산자와 아래의 if-else구문은 결과적으로는 같은 내용을 담고 있다.

     

    반응형

    '코딩 공부 > C, C++' 카테고리의 다른 글

    6. 함수와 변수  (1) 2024.01.23
    5. define과 비트연산자  (0) 2024.01.19
    3. 연산자  (0) 2024.01.17
    2. 자료형  (0) 2024.01.17
    1. C언어 기초  (0) 2024.01.16