자바 기본 배우기 -조건문-

1. 제어문

 

컴퓨터 프로그램의 기본은 위에서부터 아래로 순차적으로 수행됨

 

하지만 때에 따라서는 아래에 있는 코드를 먼저 수행하고 위로 올라가고 싶을 때가 있는데

 

그런 경우 사용하는 문법이 제어문이다

 

제어문에는 조건문과 반복문이 있다

 

그리고 조건문에는 if문과 switch문이 있다.

 

 

2. if문

 

조건식의 결과에 따라 블록 실행 여부가 결정

 

조건식에는 true/false 값을 산출할 수 있는 연산식 또는 boolean 타입 변수가 올 수 있다

 

기본 형태는

 

if(조건식){
    실행할 문장 1;
    실행할 문장 2;
    ...
}

 

true/false를 산출할 수 있는 연산식은 비교연산이나 논리연산 등등

 

조건식 부분이 참이면 block {}안의 실행할 문장들을 모두 수행하고, 거짓이면 수행하지 않고 아래로 넘어간다

 

그리고 실행할 문장이 1개라면 {}를 생략할 수 있다고 함

 

package java04.control;

public class IF01 {
	public static void main(String[] args) {
		//if(조건식) {} 조건식이 참일 경우 블록 내부를 수행
		
		int n = 5;
		
		if(n < 10) {
			System.out.println("해당 문장을 수행1");
			System.out.println("해당 문장을 수행2");
		}
		
		//{} 내부 문장이 하나인 경우 중괄호는 생략 가능하다
		if(n < 6)
			System.out.println("해당 문장을 수행");
	}

}

해당 문장을 수행1
해당 문장을 수행2
해당 문장을 수행

 

중괄호 생략에서 주의할 점이 다음과 같이 작성하면 어떨까

 

    //중괄호 생략에서 주의할 점
    //그냥 들여쓰기 해도 이해하나보네 자바는??;

    if (n < 7)
        System.out.println("이건 조건문 아래");
        System.out.println("이건 어떨까"); //얘는 조건문과 상관없이 그냥 들여쓰기 된거라네
}

 

위와 같이 써도 둘 다 출력을 해줌

 

이건 조건문 아래

이건 어떨까

 

System.out.println("이건 어떨까") 이 친구는 조건문이랑 상관없이 그냥 들여쓰기 된거라네

 

그래도 이해를 하나보네 자바는??

 

만약에 다음과 같이 쓴다면?

 

if (n > 10)
    System.out.println("조건문 아래"); //조건문의 블록에 해당
    System.out.println("조건문과 무관");

 

이러면 두번째 문장만 출력된다

 

조건문과 무관

 

 

아무튼 진짜 고수가 아니면 되도록이면 중괄호는 생략하지 않는게 좋다

 

 

3. if - else문

 

조건식의 결과에 따라 실행할 블록을 결정

 

기본 형태는

 

if(조건식){
    실행할 문장1;
    실행할 문장2;
    ...
} else {
    실행할 문장a;
    실행할 문장b;
    ...
}

 

 조건식이 참이면 if 블록의 "실행할 문장1", "실행할 문장2",...를 수행

 

거짓이면 else 블록의 "실행할 문장a", "실행할 문장b",...를 수행

 

마찬가지로 실행할 문장이 하나라면 중괄호 생략 가능하다

 

package java04.control;

public class IF02 {
	public static void main(String[] args) {
		//if(조건식) {} else {} 조건식이 참일 경우 if 내부 블록,
		//거짓이면 else 내부 블록 수행
		
		int age = 17;
		
		if (age < 20) {
			System.out.println("음료수를 먹어야 합니다.");
		}else {
			System.out.println("맥주를 마실 수 있습니다.");
		}
	}

}

음료수를 먹어야 합니다.

 

 

 중괄호 생략하고 수행해보면 실제로 수행이 된다

 

//문장이 하나라면 중괄호 생략 가능하다

if (age > 20)
    System.out.println("음료수 싫어");
else
    System.out.println("맥주 좋아");

맥주 좋아

 

 3-1) 주의할점

 

다음과 같이 작성하면 왜 에러가 날까

 

//왜 안될까

int num;

if (age < 20) {
    num = 10;
}

System.out.println(num);

 

 이런 경우 num이 초기화되어 있지 않다고 에러남

 

 

 근데 age < 20 안의 조건문에 num = 10으로 초기화 했잖아

 

심지어 age = 17로 조건식은 참인데?

 

근데 자바는 혹시나 조건식이 수행되지 않을 수도 있다는 점을 염려하고 있다

 

그래서 else로 다음과 같이 어떤 경우에도 조건식이 수행된다면 실제로 에러가 안남

 

int num;

if (age < 20) {
    num = 10;
}else {
    num = 20;
}

System.out.println(num);

10

 

 4. 중첩 if문

 

조건문 안에 조건문을 사용하는 경우

 

if(조건식A){
    if(조건식B) {
        조건식 A,B가 모두 참인 경우 수행;
    } else {
        조건식 A는 참, B는 거짓인 경우 수행;
    }
} else {
    //당연히 여기에도 if문 중첩 가능
    
    조건식 A가 거짓인 경우 수행;
}

 

 당연히 else 안에도 조건문 중첩 가능하다

 

조건문 중첩 횟수에는 제한이 없다

 

package java04.control;

public class IF03 {
	public static void main(String[] args) {
		int score = 87;
		
		//90점 이상일 경우 A
		//80점 이상 90점 미만이면 B
		//70점 이상 80점 미만이면 C
		//그 외 F
		if(score >= 90) {
			System.out.println("A");
		}else {
			if(score >= 80 && score < 90) {
				System.out.println("B");
			}else {
				if (score >= 70 && score < 80) {
					System.out.println("C");
				}else {
					System.out.println("F");
				}
			}
		}
	}

}

B

 

 근데 조건문을 잘 읽어보면

 

90점 이상이면 System.out.println("A");

 

90점 미만이면 else로 들어가서...

 

score가 80점 이상인지 90점 미만인지 조건식에서 검사

 

근데 보면 여기 else로 들어오면.. 당연히 90점 미만이다

 

 

당연히 90점 미만인데 score < 90으로 굳이 또 검사를 해야하나?

 

그 아래도 마찬가지다

 

80점 밑이면 else로 들어갈건데..

 

거기서 70점 이상인지 80점 미만인지 검사하고 있다

 

근데 당연히 여기서는 score < 80인데 조건식에 score < 80을 써야하나?

 

//논리적으로 필요없는 부분을 제거

if(score >= 90) {
    System.out.println("A");
}else {
    if (score >= 80) {
        System.out.println("B");
    }else {
        if (score >= 70) {
            System.out.println("C");
        }else {
            System.out.println("F");
        }
    }
}

B

 

여기서 더 줄일 수 있을까?

 

 

5. if - else if - else문

 

조건식의 결과에 따라 실행할 블록을 결정

 

기본 형태는..

 

if(조건식1){
    실행할 문장1;
    ...
} else if (조건식2){
    실행할 문장a;
    ...
} ... {
} else {
    실행할 문장A;
    ...
}

 

조건식 1이 참이라면... if문 블록 "실행할 문장1"만 수행하고 그 밑은 수행하지 않는다

 

조건식 1이 거짓이라면... 이제는 조건식 2를 확인하게 된다

 

조건식 2가 참이라면.. "실행할 문장2"만 수행하고 그 밑은 수행하지 않는다

 

조건식 2가 거짓이라면.. 그 밑을 확인해보고... 반복

 

당연히 else if 부분은 제한 없이 작성 가능

 

조건식이 참일 경우 해당 블록 문장 실행하고 그 밑은 확인하지 않는다

 

거짓일 경우에만 다음 조건식을 확인한다

 

 

5-1) 주의할 점

 

if - else if와 if - if는 무슨 차이가 있을까?

 

 

둘의 차이는 첫번째 if문의 조건식은 참인지 거짓인지 확인을 함

 

그런데 첫번째 if문의 조건식이 참이라면...

 

1번 if - else if문은.. else if문의 조건식은 확인하지 않고 넘어간다

 

하지만 2번 if - if문은 두번째 if문의 조건식도 확인하게 된다

 

//if - elseif문
if (score >= 90) {
    System.out.println("A");
} else if (score >= 80) {
    System.out.println("B");
} else if (score >= 70) {
    System.out.println("C");
} else {
    System.out.println("F");
}

B

 

 

6. switch문

 

인자로 선택변수를 받아 변수의 값에 따라 실행문이 결정된다

 

기본 형태는..

 

switch(수식) {
    case 값1:
        실행문A;
        break;
    case 값2:
        실행문B;
        break;
    default:
        실행문C;
}

 

수식 부분에 올 수 있는 것들이 다음과 같다고 함

 

 

마지막 default는 if - else문에서 else와 역할이 동일함

 

중간 중간에 break가 있는데 이 역할이 무엇인가??

 

break 안써도 상관없긴함

 

근데 차이가 무엇이냐?

 

수식에 의해 값1을 얻게 된다면... case 값1:에 의해 실행문 A;를 수행한다

 

여기서 break가 존재한다면 그냥 끝이다

 

 

근데 case 값1:에 break를 안쓰면 무슨 일이 일어나느냐

 

실행문 A를 수행하고 나서 case 값2:에 있는 실행문 B도 값2와는 상관없이 수행해버리고 break를 거기서 만나서 끝남

 

 

 

그러면 마지막 default에 break를 안쓰는 이유는 알겠지

 

어차피 default에서 끝나니까 굳이 break를 쓸 필요는 없겠지

 

아무튼 논리적인 코딩을 위해서 기본적으로는 break를 각각 case마다 써주는게 맞는데..

 

안쓸때 편한 경우가 분명히 있긴하다??

 

package java04.control;

public class SwitchTest {
	public static void main(String[] args) {
		
		//달을 확인해서 해당 달이 31일인지, 30일인지?
		//2월은 예외
		
		int month = 12;
		
		switch(month) {
		case 1:
			System.out.println("31일");
			break;
		case 2:
			//윤년인지 아닌지 판단해야함
			System.out.println("28일");
			break;
		case 3:
			System.out.println("31일");
			break;
		case 4:
			System.out.println("30일");
			break;
		case 5:
			System.out.println("31일");
			break;
		case 6:
			System.out.println("30일");
			break;
		case 7:
			System.out.println("31일");
			break;
		case 8:
			System.out.println("31일");
			break;
		case 9:
			System.out.println("30일");
			break;
		case 10:
			System.out.println("31일");
			break;
		case 11:
			System.out.println("30일");
			break;
		case 12:
			System.out.println("31일");
			break;
		default:
			System.out.println("그런 달은 없어");
		}
		
	}

}

31일

 

위 코드는 month가 30일인지 31일인지 판단하는 코드

 

근데 중복이 상당히 많다

 

중간에 break를 제거한다면 다음과 같이 쓸수도 있다

 

//break를 중간에 제거한다면...

switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
    System.out.println("31일");
    break;
case 4:
case 6:
case 9:
case 11:
    System.out.println("30일");
    break;
case 2:
    //윤년인지 아닌지 판단해야함
    System.out.println("28일");
    break;
default:
    System.out.println("그러한 달은 없다");

}

31일
TAGS.

Comments