수업내용/Java

[2022.09.07.수] switch문, 반복문

주니어주니 2022. 9. 7. 22:39

 

 

0. 문자열의 비교 (어제꺼 복습)

 

  • str1.equals("str4의 문자열")

: str1이 바라보는 객체의 내용과 str4가 바라보는 객체의 내용 비교

 

 

package day5;

public class StringDemo {
	
	public static void main(String[] args) {
		/*
		 * 문자열의 정의 방식에 따른 비교값의 차이 확인하기
		 */
		
		String str1 = "안녕하세요";
		String str2 = "안녕하세요";
		String str3 = new String("안녕하세요");  //원래는 String도 객체니까 객체를 만들어야 하는데, string만은 그냥 할 수 있다. 
		String str4 = new String("안녕하세요");
		
		// == 연산자는 참조변수에 대해서 변수의 주소값을 비교한다. 
		System.out.println(str1 == str2);	//true. 같은 주소값을 가지고 있다. 
		System.out.println(str3 == str4);	//false. 서로 다른 주소값을 가지고 있다.
		System.out.println(str1 == str3);	//false. 서로 다른 주소값을 가지고 있다. 
		System.out.println(str2 == str4);	//false. 서로 다른 주소값을 가지고 있다.
		
		// String객체의 equals(other) 메소드는 참조변수가 참조하는 String객체가 포함하고 있는 문자열의 내용을 비교한다.
		System.out.println(str1.equals(str2));	//true. 내용이 동일한 문자열을 포함하고 있다.
		System.out.println(str3.equals(str4));	//true. 내용이 동일한 문자열을 포함하고 있다.  
		System.out.println(str1.equals(str3));	//true. 내용이 동일한 문자열을 포함하고 있다. 
		System.out.println(str2.equals(str4));	//true. 내용이 동일한 문자열을 포함하고 있다. 
		
	}
}
true
false
false
false
true
true
true
true

 

 

1. 조건문

 

1-1. switch문

 

package day5;

public class SwitchDemo1 {

	public static void main(String[] args) {
		/*
		 * switch문 
		 * 	형식
		 * 	switch(비교값) { 
		 * 		case 값1: 
		 * 			수행문1;
		 * 			수행문2;
		 * 			break;
		 * 		case 값2: 
		 * 			수행문3;
		 * 			수행문4;
		 * 			break;
		 * 		default:
		 * 			수행문5;
		 * 			수행문6;
		 * 		}
		 * 		* 비교값의 타입은 정수, 문자, 문자열만 가능하다.
		 * 		* 각각의 case마다 수행문의 맨 마지막에 break문이 필요하다.
		 * 		* 비교값이 값1과 일치하면 수행문1, 수행문2가 실행되고, break문을 만나서 switch문을 빠져나간다.
		 * 		* default는 비교값이 값1, 값2와 모두 일치하지 않을 때 실행할 수행문을 정의한다.
		 */
		
		String grade = "실버";
		int orderPrice = 300000;
		
		int point = 0;
		switch(grade) {
			case "골드": 
				System.out.println("골드등급 고객의 포인트를 계산 중.");
				point = (int)(orderPrice*0.03); 
				break;
			case "실버":
				System.out.println("실버등급 고객의 포인트를 계산 중.");
				point = (int)(orderPrice*0.02);
				break;
			case "브론즈":
				System.out.println("브론즈등급 고객의 포인트를 계산 중.");
				point = (int)(orderPrice*0.01);
				break;
			default: 
				System.out.println("등급이 없는 고객의 포인트를 계산 중");
				point = (int)(orderPrice*0.005);
		}
		
		System.out.println("============================");
		System.out.println("고객등급: "+grade);
		System.out.println("구매금액: "+orderPrice);
		System.out.println("적립포인트: "+point);
		System.out.println("============================");
	}
}
실버등급 고객의 포인트를 계산 중.
============================
고객등급: 실버
구매금액: 300000
적립포인트: 6000
============================

 

 

 

2. 반복문

 

2-1. for문

 

 

  • for문 개념
package day5;

public class ForDemo1 {
	
	public static void main(String[] args) {
		/* 
		 * for문
		 * 	형식
		 * 		for (초기식; 조건식; 증감식;) {
		 * 			수행문;
		 * 			수행문;
		 *  	} 
		 *  	
		 *  	* 초기식은 한번만 실행
		 *  	* 조건식은 연산결과가 boolean 타입이어야 한다.
		 *  	* 조건식이 true일 때 블록 내의 수행문 실행
		 *  	* 증감식은 수행문이 실행된 후에 실행. 증감식이 실행된 다음에는 조건식이 실행되고
		 *  	  조건식의 연산결과가 true인지 false인지 확인해서 true로 판정되면 수행문을 실행하고,
		 *  	  조건식의 연산결과가 false이면 for문을 빠져나간다. 
		 *  	* 실행 순서
		 *  	  초기식 -> [조건식 -> 수행문 -> 증감식] -> [조건식 -> 수행문 -> 증감식] -> ...
		 *  
		 *  	* for문은 값을 여러개 저장할 수 있는 배열객체, 콜렉션객체(자바의 자료구조 구현객체)를 다룰 때 사용한다. 
		 */
       }
  }

 

 

 

  • for문의 초기식, 조건식, 증감식
package day5;

public class ForDemo2 {
	
	public static void main(String[] args) {
		
		/*
		 * for문의 초기식에서 생성한 변수는 조건식, 증감식, for문의 코드블록 안에서만 사용가능하다.
		 * for문의 닫는 괄호를 만나는 순간 전부 삭제된다.
		 */
		for (int x = 1; x <= 10; x ++) { 
			System.out.println(x);
		}
		
		/*
		 * for문의 초기식, 조건식, 증감식은 모두 생략가능한 문법요소다.
		 */
		int index = 0;
		for (; index < 10; ) { 
			System.out.println("인덱스값: "+index);
			index++;
		}
		System.out.println("인덱스값을 외부에서 사용하기: "+index);  //for문 밖에서 index값 선언
		
		// 초기식, 조건식, 증감식을 모두 생략하면 무한반복문 
		int number = 1; 
		for ( ; ; ) { 
			System.out.println(number);
			number++;
		}
	}

}
1
2
3
4
5
6
7
8
9
10
인덱스값: 0
인덱스값: 1
인덱스값: 2
인덱스값: 3
인덱스값: 4
인덱스값: 5
인덱스값: 6
인덱스값: 7
인덱스값: 8
인덱스값: 9
인덱스값을 외부에서 사용하기: 10

 

 

 

  • 1부터 10까지의 숫자 합 구하기 
package day5;

public class ForDemo3 {
	
	public static void main(String[] args) {

		// total은 1~10까지 숫자의 합을 저장하는 변수다. 
		int total=0;
		for (int i=1; i<=10000; i++) {
			total+=i;
		}
		System.out.println(total);
		
	}

}
50005000

 

 

 

  • 짝수의 합계와 홀수의 합계
package day5;

public class ForDemo4 {
	
	public static void main(String[] args) {
		/*
		 * for문과 if문 사용하기
		 */
		/* 1~10까지의 정수 중에서 짝수의 합계를 계산하기
		 * evenNumberTotal	i<=10		evenNumberTotal = evenNumberTotal + i		i++
		 * 0			1								2
		 * 0			2			evenNumberTotal = 0 + 2 		3
		 * 2			3								4
		 * 2			4			evenNumberTotal = 2 + 4			5
		 * 6			5								6
		 */
		int evenNumberTotal = 0;
		int oddNumberTotal = 0;
		for (int i=1; i<=10; i++) {
			if (i%2==0) {
			evenNumberTotal += i;
			} else { 
				oddNumberTotal += i;
			}
		}
		System.out.println("짝수의 합계: "+evenNumberTotal);
		System.out.println("홀수의 합계: "+oddNumberTotal);
	}
}
짝수의 합계: 30
홀수의 합계: 25

 

 

 

  •  정수 2개를 입력받아서 첫번째 정수부터 두번째 정수까지의 합계를 계산하기
package day5;

import utils.KeyboardReader;

public class ForDemo5 {

	public static void main(String[] args) {
		/*
		 * for문과 if문 사용하기
		 */
		
		// 정수 2개를 입력받아서 첫번째 정수부터 두번째 정수까지의 합계를 계산하기
		// 단, 첫번째 숫자가 두번째 숫자보다 작을 때만 합계를 구한다.
		
		KeyboardReader reader = new KeyboardReader();
		
		System.out.print("첫번째 숫자를 입력하세요.");
		int firstNumber = reader.getInt();
		System.out.print("두번째 숫자를 입력하세요.");
		int secondNumber = reader.getInt();
		
		// if~else 버전
		if(firstNumber<secondNumber) {
			int sum=0;
			for(int i=firstNumber; i<=secondNumber; i++) { 
				sum+=i;
			}
			System.out.println("["+firstNumber+"] ~ ["+secondNumber+"] 합계: "+sum);
		} else {
			System.out.println("숫자 범위가 올바르지 않습니다.");
		}
		
		
		//빠른종료 버전
		if (firstNumber>=secondNumber) {
			System.out.println("숫자 범위가 올바르지 않습니다.");
			return;
		}
		int sum=0;
		for(int i=firstNumber; i<=secondNumber; i++) { 
			sum+=i;
		}
		System.out.println("["+firstNumber+"] ~ ["+secondNumber+"] 합계: "+sum);
		
	}
}
첫번째 숫자를 입력하세요. 400
두번째 숫자를 입력하세요. 500
[400] ~ [500] 합계: 45450

 

 

  • for문 안의 for문 

예) 

영화 1개당 배우 n명을 나타낼 때

 

package day5;

public class ForDemo6 {
	
	public static void main(String[] args) {
		/*
		 * 다중 for문
		 * : for문 내부에 for문을 포함하고 있는 구문
		 * 
		 * 	형식
		 * 	for (int i=1; i<=3; i++) {		// 3회 반복
		 * 		수행문1; 
		 * 		for (int j=1; j>=5; j++) {	// 5회 반복 
		 * 			수행문2;
		 * 		} 
		 * 	}
		 * 	* 수행문1은 3번 실행된다.
		 * 	* 수행문2는 15번 실행된다.
		 * 	* 안쪽 for문이 3번 실행될 때마다 j는 1로 초기화된다.
		 */
		
		for (int i=1; i<=3; i++) {
			System.out.println("수행문1");
			for (int j=1; j<=5; j++) {
				System.out.println("수행문2 : ("+i+", "+j+")");
			}
		}
	}

}
수행문1
수행문2 : (1, 1)
수행문2 : (1, 2)
수행문2 : (1, 3)
수행문2 : (1, 4)
수행문2 : (1, 5)
수행문1
수행문2 : (2, 1)
수행문2 : (2, 2)
수행문2 : (2, 3)
수행문2 : (2, 4)
수행문2 : (2, 5)
수행문1
수행문2 : (3, 1)
수행문2 : (3, 2)
수행문2 : (3, 3)
수행문2 : (3, 4)
수행문2 : (3, 5)

 

 

 

  • break문, continue문

break문 : 반복문을 돌리다가 내가 원하는 조건에 만족하는 것을 찾았을 때 거기서 멈추고 for문을 빠져나오기

continue문 : 원하는 조건을 만족하지 않으면, 수행하지 않고 다음반복으로 넘어간다. 

package day5;

public class ForDemo7 {

	public static void main(String[] args) {
		/*
		 * 반복문에서 break문과 continue의 사용
		 * 	break문
		 * 	: 반복문을 탈출한다.
		 * 	  반복작업을 수행하는 중에 원하는 목적을 이뤘을 때 반복하는 것은 의미가 없으므로 break로 탈출한다. 
		 * 
		 * 	continue문
		 * 	: 수행문이 남아 있어도 반복문의 증감식으로 프로그램 실행 흐름을 이동시킨다.
		 * 	  반복작업을 수행하는 중에 조건에 해당하지 않는 반복작업을 실행하지 않고, 다음번 반복을 수행하러 가기 위해 continue를 사용한다.
		 * 
		 * 	* break나 continue는 반드시 제어문(if문)과 함께 사용해서 특정 조건이 만족될 때 동작하도록 구현해야 한다.
		 * 	* 반복문 안에서 break문이나 continue를 사용하면 코드의 가독성이 나빠진다. 
		 */
		
		// break문
		for(int i=1; i<=10; i++) {
			System.out.println("i값: "+i);
			if (i==6) {
			break;              //탈출
			}
		}
		
		System.out.println();
		
		// continue문
		for(int i=1; i<=10; i++) {
			if (i%3==0) {
				continue;        //증감식으로 이동(다음반복으로)
			}
			System.out.println("i값: "+i);
		}
	}
}
i값: 1
i값: 2
i값: 3
i값: 4
i값: 5
i값: 6

i값: 1
i값: 2
i값: 4
i값: 5
i값: 7
i값: 8
i값: 10

 

 

 

 

  • 목표 금액을 모으면 기부 중단하기
    상수 : 한번 정해진 값을 변경할 수 없는 저장소
package day5;

import utils.KeyboardReader;

public class ForDemo8 {
	
	public static void main(String[] args) {
		
		KeyboardReader reader = new KeyboardReader();
		
		// 상수 선언하기
		// 목표 펀도 자금
		final int MAX_FUND_AMOUNT = 1_000_000_000;
		
		// 현재 적립된 펀드자금을 저장하는 변수
		int currentFundAmount = 0;
		
		for (;;) {	// 반복횟수를 미리 예상할 수 없으므로 무한반복하도록 지정
			// 현재 적립금 펀드 자금이 목표 펀드자금 이상 모금되면 기부를 중단한다.
			if (currentFundAmount >= MAX_FUND_AMOUNT) {
				break; 
			}
			System.out.print("기부액을 적으세요: ");
			int amount = reader.getInt();
			
			currentFundAmount += amount;
		}
		System.out.println("최종 펀드 자금: "+currentFundAmount);
	}

}
기부액을 적으세요: 500000000
기부액을 적으세요: 500000000
최종 펀드 자금: 1000000000

 

 

 

* 미리 그림(표)을 그려볼것 !!  -> 그래야 규칙을 알 수 있다 

 

  • 1. 별 5줄 찍기
		/*
		 * #####
		 * #####
		 * #####
		 * #####
		 * #####
		 */
		for (int i=1; i<=5; i++) {
			for (int j=1; j<=5; j++) {
			System.out.print("#");
			}
			System.out.println();
		}
#####
#####
#####
#####
#####

 

 

  • 2. 트리형 별찍기
		/*			i			j(#)
		 * #			1			1~1개
		 * ##			2			1~2개
		 * ###			3			1~3개
		 * ####			4			1~4개
		 * #####		5			1~5개
		 */
		for (int i=1; i<=5; i++) {
			for (int j=1; j<=i; j++) {
				System.out.print("#");
			}
			System.out.println();
		}
#
##
###
####
#####

 

  • 3. 반대로 별찍기
		/* 			i			j					
		 * #####		1			1~5개 <= (6-i)개
		 * ####			2			1~4개 <= (6-i)개
		 * ###			3			1~3개 <= (6-i)개
		 * ##			4			1~2개 <= (6-i)개
		 * #			5			1~1개 <= (6-i)개
		 */
		 for (int i=1; i<=5; i++) {
			 for (int j=1; j<=(6-i); j++) {		// for(int j=5; j>=i; j--) {} 얘도 같은결과
				 System.out.print("#");
			 }
			 System.out.println();
		 }
#####
####
###
##
#

 

 

 

  • 4. 공백포함된 별찍기
		 /*				i		j(공백) 		j(#)
		  *     # (공백4 + #1)		1		1~4개 <= 5-i		1 <= i
		  *    ## (공백3 + #2)		2		1~3개 <= 5-i		2 <= i 
		  *   ### (공백2 + #3)		3		1~2개 <= 5-i		3 <= i
		  *  #### (공백1 + #4)		4		1~1개 <= 5-i		4 <= i
		  * ##### (공백0 + #5)		5		1~0개 <= 5-i		5 <= i
		  */
		 for (int i=1; i<=5; i++) {
			 for (int j=1; j<=(5-i); j++) {
				 System.out.print(" ");
			 }
			 for (int j=1; j<=i; j++) {
				 System.out.print("#");
			 }
			 System.out.println();
		 }
    #
   ##
  ###
 ####
#####

 

 

 

  • 5. 공백있는 거꾸로 트리
		 /*			i		j(공백)			j(#)
		  * #####		1		1~0 <- (i-1)	1~5 <- (6-i)
		  *  ####		2		1~1 <- (i-1)	1~4 <- (6-i)
		  *   ###		3		1~2 <- (i-1)	1~3 <- (6-i)
		  *    ##		4		1~3 <- (i-1)	1~2 <- (6-i)
		  *     #		5		1~4 <- (i-1)	1~1 <- (6-i)
		  */
          for (int i=1; i<=5; i++) {
			 for (int j=1; j<=(i-1); j++) {
				 System.out.print(" ");
			 }
			 for (int j=1; j<=(6-i); j++) {
				 System.out.print("#");
			 }
				 System.out.println();
			 }
#####
 ####
  ###
   ##
    #

 

 

 

 

  • 6. 정가운데 트리
		 /*		전체9칸			i		j(공백)			j(#)
		  *     #     (공백:4, #:1, 공백:4)	1		1~4개 <- 5-i		1~1개 <- 9개-(5-i)*2(양쪽)
		  *    ###    (공백:3, #:3, 공백:3)	2		1~3개 <- 5-i		1~3개 <- 9개-(5-i)*2(양쪽)
		  *   #####   (공백:2, #:5, 공백:2)	3		1~2개 <- 5-i		1~5개 <- 9개-(5-i)*2(양쪽)
		  * ########  (공백:1, #:7, 공백:1)	4		1~1개 <- 5-i		1~7개 <- 9개-(5-i)*2(양쪽)
		  *########## (공백:0, #:9, 공백:0)	5		1~0개 <- 5-i		1~9개 <- 9개-(5-i)*2(양쪽)
		  */
          for(int i=1; i<=5; i++) {
			 for(int j=1; j<=(5-i); j++) {
				 System.out.print(" ");
			 }
			 for(int j=1; j<=(9-(5-i)*2); j++) {
				 System.out.print("#");
			 }
			 System.out.println();
		 }
    #
   ###
  #####
 #######
#########

 

 

 

  • 7. 숫자트리 
		 /*		i		j
		  * 1		1		1~i개		
		  * 22		2		1~i개
		  * 333		3		1~i개
		  * 4444	4		1~i개
		  * 55555	5		1~i개
		  */
		 for (int i=1; i<=5; i++) {
			 for (int j=1; j<=i; j++) {
				 System.out.print(i);
			 }
			 System.out.println();
		 }
1
22
333
4444
55555

 

 

 

 

  • 8. 숫자 처음부터 반복트리
		 /*		i		j
		  * 1		1		1~i
		  * 12		2		1~i
		  * 123		3		1~i
		  * 1234	4		1~i
		  * 12345	5		1~i
		  */
		 System.out.println("8.");
		 for(int i=1; i<=5; i++) {
			 for(int j=1; j<=i; j++) {
				 System.out.print(j);
			 }
			 System.out.println();
		 }

 

 

 

  • 9. 0부터 숫자 트리
		 /*		i		j			v
		  * 0		1		1~1개			0
		  * 12		2		1~2개			12
		  * 345		3		1~3개			345
		  * 6789	4		1~4개			6789
		  * 얘는 반복을 해도 초기화가 되지 않고 계속 이어짐
		  */
		 
		 int number = 0;  //처음 숫자로 초기화가 되면 안되니까 for문 밖에서 초기화
		 for(int i=1; i<=4; i++) {
			 for (int j=1; j<=i; j++) {
				 System.out.print(number++); //number가 증가해야함
			 }
			 System.out.println();
		 }

 

 

  • 알파벳 순서트리
package day5;

public class StarDemo9 {
	
	public static void main(String[] args) {
		/*		i		j			v
		 * A		1		1~1개<-(i)	65		
		 * BC		2		1~2개<-(i)	6667	
		 * DEF		3		1~3개<-(i)	686970
		 * GHIJ		4		1~4개<-(i)	71727374
		 * KLMNO	5		1~5개<-(i)	7576777879
		 */
		
		int value=65;
		for(int i=1; i<=5; i++) {
			for(int j=1; j<=i; j++) {
				System.out.print((char)value++);				
			}
			System.out.println();
		}
	}

}
A
BC
DEF
GHIJ
KLMNO

- 내가 해본거

char v='A';
		for(int i=1; i<=5; i++) { 
			for(int j=1; j<=i; j++) {
				System.out.print(v++);
			}
			System.out.println();
		}

 

 

 

 

 

  • 알파벳 트리
package day5;

public class StarDemo10 {
	
	public static void main(String[] args) {
		/*			i		j(공백)			v(영어대문자)
		 *     A		1		1~4개<-(5-i)		1개<-(9개-(5-i)*2)
		 *    BCD		2		1~3개<-(5-i)		3개<-(9개-(5-i)*2)
		 *   EFGHI		3		1~2개<-(5-i)		5개<-(9개-(5-i)*2)
		 *  JKLMNOP		4		1~1개<-(5-i)		7개<-(9개-(5-i)*2)
		 * QRSTUVWXY   	 	5		1~0개<-(5-i)		9개<-(9개-(5-i)*2)
		 */
		
		int value=65;
		for(int i=1; i<=5; i++) {
			//공백출력
			for(int j=1; j<=(5-i); j++) {
				System.out.print(" ");
			}
			//영어 대문자 출력
			for(int v=1; v<=(9-(5-i)*2); v++) {
				System.out.print((char)value++);
			}
			System.out.println();
		}
	}

}
    A
   BCD
  EFGHI
 JKLMNOP
QRSTUVWXY

-내가 해본거

		char v='A';
		for(int i=1; i<=5; i++) {
			for(int j=1; j<=(5-i); j++) {	//공백
				System.out.print(" ");	//공백 4321개
			}				//얘가 여기서 안끝나면 공백 한번돌때 다음알파벳반복이 다 돌아버림 
			for(int j=1; j<=9-(5-i)*2; j++) {
				System.out.print(v++);
			}
			System.out.println();
		}

 

 

 

 

 

* 자바의 자료구조

 

변수 

   값 혹은 객체를 한 개 저장하는 저장소다. 

배열

   같은 타입의 값 혹은 객체를 여러 개 저장하는 객체다. 

   한번 저장한 저장 크기를 변경할 수 없다. 

콜렉션

   다양한 타입의 값 혹은 객체를 여러 개 저장하는 객체다.

   저장소의 크기가 가변적이다. (자동으로 크기 조절)

   다양한 자료구조(List, Stack, Queue, LinkedList, Tree, Map, Set)를 구현한 구현 객체다. 

 

 

 

 

 

'수업내용 > Java' 카테고리의 다른 글

[2022.09.13.화] 객체지향(클래스,객체)  (0) 2022.09.13
[2022.09.08.목] 배열  (0) 2022.09.08
[2022.09.06.화] 제어문과 반복문 (if문, for문)  (0) 2022.09.06
[2022.09.05.월] 연산자  (0) 2022.09.05
[2022.09.02. 금] 변수  (0) 2022.09.02