Post

[Java] 조건식 연산자 제어문

이번시간에는 조건식과 몇가지의 연산자와 제어문을 알아보겠습니다.

*조건식

참 또는 거짓 둘 중 하나가 나오는 식입니다.

다른 언어에서의 참, 거짓 값

참 : 1

거짓 : 0

C언어에서는 거짓은 0, 나머지 모든 숫자는 참을 의미 했습니다. 자바는 조금 다릅니다.

JAVA에서의 참, 거짓 값

참: true

거짓: false

자바는 아예 true, false로 정해버립니다. 읽기엔 편하겠네요

true, false를 담을 수 있는 자료형

자료형 type byte 값 초기값

논리형 oolean 1 true,false false

1
boolean isTrue = 10>11;

이런 식으로 boolean이란 타입의 itTrue라는 변수를 만들었습니다. 용량은 1byte인데 사실 참,거짓 2가지만 있으면 되기 때문에 컴퓨터가 사용할 수 있는 최소한의 용량을 가져갑니다.

*관계 연산자

== : 같다

!= : 같지 않다

>,< : 초과, 미만

>=,<= : 이상, 이하

많이 익숙하죠? C언어에서와 같습니다 ㅎㅎ 여전히 주의할 점은 대입연산자 =와 관계연산자 ==를 잘 구분해야 하는 것입니다.

*논리 연산자

&&, and : A && B -> A와 B조건식 모두 참일 때 참

 , or : A B -> A와 B 조건식 둘 중 하나가 참일 때 참

역시 마찬가지입니다.

*단항 연산자

!, NOT : true는 false로, false는 true로 변경

1
System.out.println(!(10>11 &&10!=11));

!(10>11 &&10!=11) 에서 괄호를 친 이유는 !라는 단항 연산자는 연산자 우선순위에서 상대적으로 나머지 연산자보다 높기 때문에 괄호 처리를 하지 않으면 그냥 !10이 되버리는 겁니다. 따라서 10>11 &&10!=11는 거짓이 나오겠죠? 이 전체를 단항 연산을 하면 참이 나오겠네요 ^^

*삼항 연산자

? :

조건식 ? 참 : 거짓

C언어와 같습니다. 조건식을 ? 전에 기입하고 참과 거짓을 각 조건식의 결과에 따라 실행합니다. 그렇다면 두 정수를 입력받고 큰 값을 출력하는 것은 어떻게 할까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.Scanner;

public class OperTest2 {
	public static void main(String[] args) {
		//두 정수 입력받기
		String result ="";
		Scanner sc = new Scanner(System.in);
		System.out.println("첫번째 정수를 입력하세요.");
		int num1 = sc.nextInt();
		System.out.println("두번째 정수를 입력하세요.");
		int num2 = sc.nextInt();
		
		
		result = num1>num2 ? "큰 값 :"+num1 : num1==num2?  "두 수는 같습니다" : "큰 값: "+num2;
		
		System.out.println(result);
	}
}

만들어 봤습니다! result라는 문자열을 만들고 초기화를 했습니다. 그래서 정수 2개를 입력하고 그 밑에 삼항 연산자로 두 숫자 중 더 큰 수를 찾아 출력하죠 처음엔 num1>num2 로 시작하고 참이면 큰 값: num1을 출력하는군요. 근데 중요한것은 여기서 거짓이라 해서 num2를 바로 큰수로 이해하기엔 성급합니다. 왜냐하면 두 수가 같을 수도 있기 때문이죠. 따라서 거짓이라면 두수가 같은지 한번 더 물어봅니다. 그리고 또 그 조건식에서 참 거짓을 나누어 코드를 실행합니다.

이제 다른것도 해보죠 혈액형을 숫자로 입력받아 그 혈액형의 특징을 출력하고 싶습니다. 한번 만들어 볼까요?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public static void main(String[] args) {
		// 혈액형별 성격
		//당신의 혈액형은?
		//1.A
		//2.B
		//3.O
		//4.AB
		//A : 꼼꼼하고 세심하다. 
		//B : 추진력이 좋다.
		//C : 사교성이 좋다.
		//AB : 착하다.
		
		String qMsg = "당신의 혈액형은? "
				+"\n1. A"
				+"\n2. B"
				+"\n3. O"
				+"\n4. AB";
		String aMsg = "꼼꼼하고 세심하다.",
		 bMsg = "추진력이 좋다.",
		 oMsg = "사교성이 좋다.",
		 abMsg = "착하다.";
		
		String result="";
		
		int 	aBlood =1,
				bBlood =2,
				oBlood =3,
				abBlood =4;
		
		int 	choice =0;
		
		System.out.println(qMsg);
		Scanner sc = new Scanner(System.in);
		
		choice = sc.nextInt();
		
		result = choice ==aBlood?  aMsg : choice ==bBlood? bMsg :
			choice ==oBlood? oMsg : choice ==abBlood? abMsg : "잘못입력하셨습니다.";
		System.out.println(result);
	}

아까와 같이 만들었지만 조금 다른점이라면 하단 부분의 코드에는 대부분 미리 선언된 변수를 적는 방식으로 되어있습니다. 이 부분에서 개발자의 능력이 갈린다고 생각합니다. 만약 나중에 저 코드를 변경할 경우 고쳐야할 코드들이 너무나도 많아지기 때문에 일괄적으로 관리하기 쉬운 변수를 만들어 버리는게 좋죠.

이제 여러분은 어떤 것을 느끼고 계시죠? 네 통했네요 ㅎㅎ

삼항연산자를 사용하면너무 코드가 길어지고 사용하는데 한계가 느껴짐을 알 수있습니다.

그럴 땐 If연산자를 사용하면됩니다.

-if 문

if(조건식){

실행할 문장;

}

if(조건식){

}

if(조건식){

}

else if(조건식){

}

else{

}

C언어와 같습니다 . if 는 위의 조건문과는 상관없이 독립적으로 실행됩니다. 반면 else if 와 else는 기본적으로 위의 조건식이 거짓이었을때 코드를 일단 실행하는 문장입니다. else는 모든 조건식이 거짓이어야 실행이 됩니다. 이 것을 이용해서 아까 만든 큰값 구하기를 if문으로 만들어보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void main(String[] args) {
		// 두 정수 입력받기
		String result = "";
		Scanner sc = new Scanner(System.in);
		System.out.println("첫번째 정수를 입력하세요.");
		int num1 = sc.nextInt();
		System.out.println("두번째 정수를 입력하세요.");
		int num2 = sc.nextInt();

		if(num1>num2) {
			result = "큰 값 : "+num1;
		}
		else if(num1<num2) {
			result = "큰 값 : "+num2;
		}
		else {
			result = "두 수는 같습니다.";
		}
		System.out.println(result);
	}

밑에 삼항 연산자부분을 if 로 하니까 편하죠? 코드가 복잡해질수록 제어문이 더 쓰기 좋습니다! result 에 각각의 조건문에서 나오는 값이 다르겠지요? 마찬가지로 두 수가 같을땐 else를 주어서 해결합니다. 이제는 아까 만든 혈액형에서 if 문을 사용해보겠습니다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static void main(String[] args) {
		String qMsg = "당신의 혈액형은?"
	            + "\n1. A"
	            + "\n2. B"
	            + "\n3. O"
	            + "\n4. AB";
	      
	      int choice = 0;
	      Scanner sc = new Scanner(System.in);
	      
	      String aMsg = "꼼꼼하고 세심하다.";
	      String bMsg = "추진력이 좋다.";
	      String oMsg = "사교성이 좋다.";
	      String abMsg = "착하다.";
	      String errMsg = "다시 시도해주세요~";
	      
	      String result  = "";
	      
	      System.out.println(qMsg);
	      choice = sc.nextInt();
	      
	      if(choice ==1) {
	    	  result =aMsg;
	      }
	      else if(choice ==2) {
	    	  result =bMsg;
	      }
	      else if(choice ==3) {
	    	  result =oMsg;
	      }
	      else if(choice ==4) {
	    	  result =abMsg;
	      }
	      else {
	    	  result=errMsg;
	      }

만들었습니다. 원리는 같네요 ㅎㅎ 그런데 if 문마다 choice == ? 를 넣는게 슬슬 귀찮아지기 시작합니다. 그럴 때 필요한게 switch입니다.

-switch문

switch(변수명){

case 값1:

실행할 문장;

case 값2:

실행할 문장;

case 값3:

실행할 문장;

default:

실행할 문장;

}

각 케이스에 변수명에서 가져온 값으로 그 케이스를 실행하면 됩니다. 이제 저것을 switch으로 해볼게요1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public static void main(String[] args) {
		String qMsg = "당신의 혈액형은?"
	            + "\n1. A"
	            + "\n2. B"
	            + "\n3. O"
	            + "\n4. AB";
	      
	      int choice = 0;
	      Scanner sc = new Scanner(System.in);
	      
	      String aMsg = "꼼꼼하고 세심하다.";
	      String bMsg = "추진력이 좋다.";
	      String oMsg = "사교성이 좋다.";
	      String abMsg = "착하다.";
	      String errMsg = "다시 시도해주세요~";
	      
	      String result  = "";
	      
	      System.out.println(qMsg);
	      choice = sc.nextInt();
	      
	      if(choice ==1) {
	    	  result =aMsg;
	      }
	      else if(choice ==2) {
	    	  result =bMsg;
	      }
	      else if(choice ==3) {
	    	  result =oMsg;
	      }
	      else if(choice ==4) {
	    	  result =abMsg;
	      }
	      else {
	    	  result=errMsg;
	      }

switch(choice){
case 1:
	result =aMsg;
	break;
case 2:
	result =bMsg;
	break;
case 3:
	result =oMsg;
	break;
case 4:
	result =abMsg;
	break;
default:
	result =errMsg;
	

}
	      System.out.println(result);

	}

}

아까와 초반에는 비슷한 코드를 썼지만 지금은 switch 문으로 더 단순하게 할 수 있을 것 같습니다. ^^

이번시간에는 여기까지 하겠습니다!

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.