1. 조건문

1-1. IF문

1) 해당 조건에 대한 실행할 실행문이 하나라면 {}를 생략해도 좋지만, 그 이외에는 다 {}를 넣어야 한다.

	public static void main(String[] args) {
		int score = 91;
		
		if (score >=90) {
			System.out.println("You are Level A.");
			System.out.println("Congratulations!");
		}
		if (score <80) 
			System.out.println("You are Level B."); System.out.println("Keep up the good work");
			System.out.println("Try a little harder!");
	}

이렇게 if문 바로 아래 줄에, 같은 줄에 실행문을 두 개 이상 적는다고 해도, {}가 없으면 if문은 맨 앞의 실행문만 if문에 적용시킨다.

2) IF문으로 성적이 나오는 프로세스를 비슷하게 따라 해 보았다.

import java.util.Scanner;

public class chapter_4 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("What's your midterm score?");
		int midterm = scanner.nextInt();
		System.out.println("What's your assignment score?");
		int assignment = scanner.nextInt();
		System.out.println("What's your team project score?");
		int team_project = scanner.nextInt();
		System.out.println("What's your final exam score?");
		int final_exam = scanner.nextInt();
		double score = midterm*0.3 + assignment + team_project*0.3 + final_exam*0.3;
		
		System.out.println("Your entire score is " + score);
		
		if (score >=90) {
			String grade = "A";
			System.out.println("Your grade is " + grade);
		}else if (score >=80){
			String grade = "B";
			System.out.println("Your grade is " + grade);
		}else if (score >=70) {
			String grade = "C";
			System.out.println("Your grade is " + grade);
		}else if (score >=60) {
			String grade = "D";
			System.out.println("Your grade is " + grade);
		}else {
			String grade = "F";
			System.out.println("Your grade is " + grade);
		}
		scanner.close();
	}

}

* 갑자기 생각나서 써봄

: printf()에서 여러 개의 형식과 여러 출력을 한꺼번에 지정할 때는 버전 오류가 난다!

Java se 11 이전 버전에서는 잘 작동하는지 궁금했지만 Oracle 회원가입을 해서 깔아야 한다니 참으로 귀찮은 일이 아닐 수 없다.

그래서 printf 함수는 사용을 안 하기로 했다. 어차피 백준에서는 Java se 11에 맞게 코드가 잘 작동된다고 한다.

 

3) 아쉽지만 printf 대신 println으로 로또번호 출력기를 만들어 봄

public static void main(String[] args) {
		int num1 = (int) (Math.random()*45 +1);
		int num2 = (int) (Math.random()*45 +1);
		int num3 = (int) (Math.random()*45 +1);
		int num4 = (int) (Math.random()*45 +1);
		int num5 = (int) (Math.random()*45 +1);
		int num6 = (int) (Math.random()*45 +1);
		
		System.out.println(num1);
		System.out.println(num2);
		System.out.println(num3);
		System.out.println(num4);
		System.out.println(num5);
		System.out.println(num6);
	}
}

: Math.random() <- 대문자 필수!

얘는 double 타입의 0부터 1 사이에 있는 난수를 발생시키는데, *45를 하고 1을 더해준 다음 강제로 int 타입으로 변환시킨다. 그러면 1부터 45사이에 값을 갖는 로또 번호 랜덤 생성기가 된다.

4) 치밀하게 설계하면 주사위 게임도 가능한 듯.

public static void main(String[] args) {
		int dice = (int)(Math.random()*6 +1);
		if(dice == 1) {
			System.out.println("1칸 전진하시오.");
		}else if(dice == 2) {
			System.out.println("무인도입니다. 한 턴 쉬어가세요.");
		}else if(dice == 3) {
			System.out.println("상대편의 말을 잡았습니다. 한번 더 굴리세요.");
		}else if(dice == 4) {
			System.out.println("통행료로 100,000원을 제출하세요.");
		}else if(dice == 5) {
			System.out.println("해당 영토의 건물을 살 수 있습니다. 구매하시겠습니까?");
		}else{
			System.out.println("결승점에 도착했습니다. 게임이 끝납니다.");
		}
	}

1-2. Switch문

똑같은 주사위 게임을 Switch문을 이용해서 만들 수 있다.

public static void main(String[] args) {
		int dice = (int)(Math.random()*6 +1);	
		switch(dice) {
		case 1:
			System.out.println("1칸 전진하시오.");
			break;
		case 2:
			System.out.println("무인도입니다. 한 턴 쉬어가세요.");
			break;
		case 3:
			System.out.println("상대편의 말을 잡았습니다. 한 턴 더 굴리세요.");
			break;
		case 4:
			System.out.println("통행료로 100,000원을 제출하세요.");
			break;
		case 5:
			System.out.println("해당 영토의 건물을 살 수 있습니다. 구매하시겠습니까?");
			break;
		default:
			System.out.println("결승점에 도착했습니다. 게임이 끝납니다.");
			break;
		}
	}

오히려 Switch문은 숫자 형태의 값을 갖는 변수를 사용하므로, 코드가 더 간단하게 작성될 수 있다.

+ 복잡하게 실행하면 진짜 주사위 게임도 가능할 듯.

+ 미연시 게임?처럼 대답에 따라서 스토리가 달라지는 게임도 가능할 듯.

 

Switch문의 대상인 변수의 값에 따라 출력되는 결과를 다르게 하고 싶다면, 

반드시 각 case마다 break; 문을 작성해야 한다!!

그렇지 않으면 이렇게 된다. ↓

public static void main(String[] args) {
		int dice = 2;
		
		switch(dice) { 
		case 1:
			System.out.println("1칸 전진하시오.");
		case 2:
			System.out.println("무인도입니다. 한 턴 쉬어가세요.");			
		case 3:
			System.out.println("상대편의 말을 잡았습니다. 한 턴 더 굴리세요.");		
		case 4:
			System.out.println("통행료로 100,000원을 제출하세요.");			
		case 5:
			System.out.println("해당 영토의 건물을 살 수 있습니다. 구매하시겠습니까?");			
		default:
			System.out.println("결승점에 도착했습니다. 게임이 끝납니다.");
		
		}
	}

: switch문의 변수인 dice는 2이다. 그런데 switch문의 case 사이마다 변수가 없어서, 각 case가 구분되지 않고 위에서부터 아래로 차례대로 코드가 실행되어서 이처럼 여러 경우에 해당하는 결과들이 다 같이 나오고 있다.

 

1) switch문의 변수 : char 타입의 입력 받기

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);

char alphabet = alphabet.next().charAt(0);

+ char타입은 nextInt 등의 기능이 없다. 그래서 next() 다음에 charAt()을 입력한다.

+ 그런데 charAt(0) 에서 0의 의미가 무엇인지는 잘 모르겠다.

import java.util.Scanner;

public class chapter_4 {

	public static void main(String[] args) {
		System.out.println("What's your code?");
		Scanner scanner = new Scanner(System.in);
		char alphabet = scanner.next().charAt(0);
		
		switch(alphabet) { 
		case 'a':
			System.out.println("1칸 전진하시오.");
			break;
		case 'b':
			System.out.println("무인도입니다. 한 턴 쉬어가세요.");
			break;
		case 'c':
			System.out.println("상대편의 말을 잡았습니다. 한 턴 더 굴리세요.");
			break;
		case 'd':
			System.out.println("통행료로 100,000원을 제출하세요.");
			break;
		case 'e':
			System.out.println("해당 영토의 건물을 살 수 있습니다. 구매하시겠습니까?");
			break;
		default:
			System.out.println("결승점에 도착했습니다. 게임이 끝납니다.");
			
		}
	}
}

2) Switch문의 변수 : String 타입의 입력 받기

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);

String str = scanner.nextLine();

+ 그런데 nextLine 코드를 사용할 때, 공백을 인식/인식하지 못해서 생기는 불편함에 대해서는 나중에 알아보자.

import java.util.Scanner;

public class chapter_4 {

	public static void main(String[] args) {
		System.out.println("What's your code?");
		Scanner scanner = new Scanner(System.in);
		String code = scanner.nextLine();
		
		switch(code) { 
		case "Apple":
			System.out.println("1칸 전진하시오.");
			break;
		case "Banana":
			System.out.println("무인도입니다. 한 턴 쉬어가세요.");
			break;
		case "Carrot":
			System.out.println("상대편의 말을 잡았습니다. 한 턴 더 굴리세요.");
			break;
		case "Daisy":
			System.out.println("통행료로 100,000원을 제출하세요.");
			break;
		case "Egg":
			System.out.println("해당 영토의 건물을 살 수 있습니다. 구매하시겠습니까?");
			break;
		default:
			System.out.println("결승점에 도착했습니다. 게임이 끝납니다.");
			
		}
	}
}

공백을 잘 인식하는지를 보기 위해서, String 변수의 각 case값을 2어절 이상의 단어로 설정했다.

import java.util.Scanner;

public class chapter_4 {

	public static void main(String[] args) {
		System.out.println("What's your code?");
		Scanner scanner = new Scanner(System.in);
		String code = scanner.nextLine();
		
		switch(code) { 
		case "Apple Juice":
			System.out.println("1칸 전진하시오.");
			break;
		case "Banana Smoothie":
			System.out.println("무인도입니다. 한 턴 쉬어가세요.");
			break;
		case "Carrot Cake":
			System.out.println("상대편의 말을 잡았습니다. 한 턴 더 굴리세요.");
			break;
		case "Daisy Tea":
			System.out.println("통행료로 100,000원을 제출하세요.");
			break;
		case "Egg Tart":
			System.out.println("해당 영토의 건물을 살 수 있습니다. 구매하시겠습니까?");
			break;
		default:
			System.out.println("결승점에 도착했습니다. 게임이 끝납니다.");
			
		}
	}
}

공백은 잘 인식하는 것 같다. 그리고 String 타입의 경우 정확한 string을 입력해야 한다! 대소문자도 구분한다!

ex) 'Egg Tart'를 대소문자 구분, 정확히 입력해야지만 해당 결과가 나온다

-> egg tart (X) , Egg Tart (O)

 

+ Scanner에는 여러 method가 있다.

ex) int 타입 변수 입력 시에는 nextInt 를 쓰는 것처럼!

=> String 타입 변수 입력시에는 .next 또는 .nextLine 를 사용하는데, 둘 사이에 차이가 있다.

1) scanner.next();

띄어쓰기 이후의 입력은 받아들이지 않는다.

각 입력의 구분 단위가 \n처럼 띄어쓰기인 것 같다.

import java.util.Scanner;

public class chapter_4 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String data = input.next();
		System.out.println(data);
		input.close();
	}
}

2) scanner.nextLine();

띄어쓰기 이후의 입력을 받아들인다.

각 입력의 구분 단위가 enter 즉 줄바꿈인 것 같다.

 

'server-side > JAVA' 카테고리의 다른 글

Chapter 4-2  (0) 2021.05.05

+ Recent posts