1. For문

1. for문 기본실행

public static void main(String[] args) {
		int sum = 0;
		for(int i=1; i<=100; i++) {
			sum += i;
		}
		System.out.println(sum);
	}

* for문은 연속하는 수의 합을 구할 때도 많이 사용한다.

=> 이럴 때는 += 등의 증감연산자를 사용할 수 있다.

 

2. for문 안에서 정의된 변수는 로컬 변수(local variable)로, for문 밖으로 값을 갖고 나올 수 없다.

오류 예시!

public static void main(String[] args) {
		for(int i=1; i<=100; i++) {
			sum += i;
		}
		System.out.println(sum);
	}

* 이 코드는 실행시키면 오류가 난다.

: b/c sum 변수는 for문 안에서 정의되었는데, for문 바깥에서 사용하려고 하면 sum변수 값을 불러올 수 없다.

=> sum변수를 for문 밖에서도 사용하고 싶다면, for문이 시작하기 이전에, 즉 for문 밖에서 정의를 먼저 해 주면 된다.

 

3. for문 : 초기화식, 조건식, 증감식에 각각 두 개 이상의 변수 넣기

public static void main(String[] args) {
		int sum = 0;
		for(int i=1, j=100; i<=100 && j>=50 ; i++, j--) {
			sum = sum + i * j;
		}
		System.out.println(sum);
	}

* for문의 ()안에는 여러 변수들의 초기화식, 조건식, 증감식이 들어갈 수 있다.

* for (변수1 초기화식, 변수2 초기화식 ; 변수1 조건식 (&&/|) 변수2 조건식 ; 변수1 증감식, 변수2 증감식) 이렇게!

 

4. for문 변수로 float타입을 사용하지 않는 게 좋다.

그 이유는?

public static void main(String[] args) {
		for (float k = 0.1f ; k<=1 ; k+=0.1f) {
			System.out.println(k);
		}
	}

: 이론상 초기화식에서 k=0.1이고 0.1씩 더해서 1까지 실행하므로 10번을 실행하는 게 맞다.

하지만 for문은 9번 실행되었는데, 그 이유는 float는 부동 소수점을 사용하기 때문에 0.1을 정확하게 표현하지 못하고, 실제로는 0.1보다 조금 큰 값을 k에 더하게 된다. 그래서 9번만 실행된다.

 

5. 중첩 for문

: for문 안에 또 다른 for문을 쓸 수 있다. 중첩에 대해서 개수 제한은 없는 듯 하다.

중첩 for문을 이용해서 구구단을 작성해 보았다.

public static void main(String[] args) {
		for(int m=2 ; m<=9 ; m++) {
			System.out.println("*** " + m + "단 ***");
			for (int n=1 ; n<=9 ; n++) {
				System.out.println(m + "x" + n + "=" + (m*n));
			}
		}
	}

 

2. while문

while문과 for문은 기본적으로 같은 반복문이라서 for문으로 작성할 수 있는 코드는 while문으로도 작성할 수 있다.

다만 for문은 반복할 횟수만큼 반복시키는 경우가 많고, while문은 특정 조건에 해당할 때만 코드를 실행한다는 점에서 차이가 있다.

1. while문으로도 for문처럼 연속되는 숫자의 합을 구할 수 있다.

public static void main(String[] args) {
		int i=1; int sum = 0;
		while (i<=10) {
			sum += i;
			System.out.println(sum);
			i++;
		}
	}

 

2. while문은 해당 조건을 만족하면 실행문이 무한히 실행되어 루프가 발생할 수 있다. -> 주의!

public static void main(String[] args) {
		int i=3; int sum = 0;
		while (i>=2) {
			sum += i;
			System.out.println(sum);
			i++;
		}
	}

* i>=2 를 만족하면 while문은 계속 실행된다. 그런데 초기값이 i=3이고, i++으로 계속 i가 증가하므로 계속 이 조건을 만족하게 된다.

=> 이 경우 Terminate 버튼을 눌러서 강제 종료하지 않으면 무한히 실행된다.

 

+ while문에 딱히 작성할 조건이 없을 때?

-> while(true) 로 작성하고, 중간에 if() {break;} 를 작성하는 방법도 있다.

 

* for문과의 차이점-1

: while는 for문처럼 초기화식이 없기 때문에, 반복문에 넣을 변수를 while문 전에 미리 선언해 주어야 한다.

public static void main(String[] args) {
		int i=1; int sum = 0;
		while (i<=100) {
			sum += i;
			i++;
		}
		System.out.println(sum);
	}

-결과 : 5050

* for문과의 차이점-2

: while문은 for문처럼 증감식이 없다. 그래서 증감연산자를 어디에 배치하는지에 따라 결과값이 달라질 수 있다.

위의 식과 증감연산자의 위치만 다르게 해 보면, (증감연산자를 위에 배치)

public static void main(String[] args) {
		int i=1; int sum = 0;
		while (i<=100) {
			i++;
			sum += i;
		}
		System.out.println(sum);
	}

-결과 : 5150

* 중간에 i++ 처럼 증감문을 써 주지 않으면, 반복 변수의 값이 동일한 채 무한루프가 발생한다.

흔히 발생하는 실수이므로 주의!!

 

3. 반복문을 멈추는 또 다른 방법 : break;

break ; 는 for, while, do-while, switch문 등 다양한 구문에 사용할 수 있다.

break; 를 사용하면 반복문을 빠져나올 수 있다!

그러나 if() 을 사용해서, 어느 상황에 break;를 실행할지를 명시해 주어야 사용할 수 있다.

ex) 1부터 30까지의 합을 구하는데, 중간에 7과 3의 최소공배수를 만나면 반복문 빠져나오기

public static void main(String[] args) {
		int i=1; int sum=0;
		while(i<=30) {
			sum = sum + i;
			i++;
			if(i == 7*3) {
				break;
			}
		}
		System.out.println(i + " " + sum);
	}

 

4. while문과 비슷한 do-while문

: while문은 () 안의 조건이 참이면 그 다음에 실행문으로 넘어가지만,

do-while문은 do{} 안의 실행문을 먼저 실행하고, 그 다음에 while()의 조건이 맞는지 확인한다.

위와 같은 상황을 do-while문으로 코딩해 보았다.

public static void main(String[] args) {
		int i=1; int sum=0;
		do {
			sum += i;
			i++;
		}while(i!=7*3);
		System.out.println(sum);
	}

* 원래 while문과 비교해 보면,

while 안의 ()와 if() 부분의 조건절 부분은 전부 while 안의 ( ) 로 이동하고,

그 외의 '조건이 맞았을 때'의 실행문은 전부 do 안의 { } 로 이동한다.

 

5. 증감식의 경우, char 타입 변수도 사용 가능하다.

public static void main(String[] args) {
		for(char upper='A'; upper<='Z'; upper++) {
			for(char lower='a'; lower<='z'; lower++) {
				System.out.println(upper + "-" + lower);
			}
		}
	}
}

: for문의 경우, 초기식을 char변수의 알파벳으로 설정하고,

증감식에 ++를 표현했더니 알파벳 순서대로 A,B,C, ..., Z 까지 출력되는 것을 볼 수 있다.

 

6. continue : break;와 반대 역할

: 특정 조건을 만족했을 때만 결과를 실행한다.

public static void main(String[] args) {
		for(int i=1;i<=100;i++) {
			if(i%2 == 0) {
				continue;
			}
			System.out.println(i);
		}
	}

 

위의 경우, i%2!=0 인 경우에는 결과로 출력되지 않는다.

+ continue; 와 break; 모두 if() 안에 조건을 입력해야만 실행할 수 있다.

 

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

Chapter 4  (0) 2021.05.04

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