simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 참조타입
  • 참조변수
  • 자바프로그램
  • 컨트롤러
  • JVM메모리구조
  • null
  • scanner #next() #nextLine()
  • 자바
  • 자바프로그래밍
  • 스프링
  • 자바메모리구조
  • controllerTest
  • 404

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

[자바_복습] 제어문 예시 - 조건문과 반복문 각각
Language/Java

[자바_복습] 제어문 예시 - 조건문과 반복문 각각

2022. 3. 8. 00:06

▼ 제어문은 예제 위주로 정리하려 한다..

 

----------------------------------------------------------------------------------------------------------------------

 

[제어문의 종류]

- 제어문이란? Control Statement, 프로그램의 흐름(fow)을 바꾸어주는 명령문

제어문 코드 내용
조건문

if, if-else 제한을 두거나 범위를 지정하여 선택
switch-case 다차원 선택 (조건식에 따라 여러개의 결과값으로 이동, 명령 수행)
반복문
(Loop)
for 반복 횟수를 알 때 주로 사용
while 반복 횟수를 모를 때 (화일 처리/키보드입력)
do while 반복 횟수를 모르고, 특정 명령 수행 후 지속여부 확인 후 반복 시 사용
기타 break switch-case 또는 반복문에서 종료 역할. //제어문 밖으로 
continue 반복문에서만 사용 가능 //반복문의 끝으로 이동
return  

* 객체지향에서 다루는 제어자(motifier)와는 다르다.

* printf의 제어문자 \n, \r... 는 다른 말로 이스케이프라고 하고, 위 제어문과 다르다.

  (프로그래밍 문법을 번역할 때 '제어'를 붙이는 경우가 참 많은 것 같은데... ;; 그럴 땐 원어를 보면 될 것 같다.)

 

1. 조건문 - if, switch

 조건문은 말 그대로 알고리즘 내에 [조건]을 걸어 선택을 할 때 사용
 - if문, if-else
 - switch : 다차원 선택

 

1) If문

 

(1) if문 예제_명령프롬프트에서 받은 숫자 확인

package practice;

public class PromptTest {

	public static void main(String[] args) {
		String input = args[0];
		int num = Integer.parseInt(input);
		
		if(num == 0) {
			System.out.println("입력한 숫자는 0입니다.");
		}
		
		if(num != 0) {
			System.out.println("입력한 숫자는 0이 아닙니다.");
		}
		
	}

}

>> 결과 (argument : 3)

입력한 숫자는 0이 아닙니다.

 

(2) if - else문

- 자바는 자바스크립트와 달리 else if문이 없다.

- if - else문 안에 중첩된 if-else문이 마치 else if문처럼 보이는 것.. 

package mymain;

import java.util.Scanner;

public class _02_Ex_if4 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int kor; //나의 국어점수
		String grade = "F"; //결과(나의 등급)
		System.out.print("국어 : ");
		kor = scanner.nextInt();
		
		//등급 세분
		
		if(kor>=0 && kor<=100) 
		{
			if(kor>=96) grade = "A+";
			else if(kor>=93) grade = "A";
			else if(kor>=90) grade = "A0";
			else if(kor>=86) grade = "B+";
			else if(kor>=83) grade = "B";
			else if(kor>=80) grade = "B0";
			else if(kor>=76) grade = "C+";
			else if(kor>=73) grade = "C";
			else if(kor>=70) grade = "C0";
			else if(kor>=66) grade = "D+";
			else if(kor>=63) grade = "D";
			else if(kor>=60) grade = "D0";
			else if(kor>=56) grade = "F+";
			else if(kor>=53) grade = "F";
			else if(kor>=50) grade = "F0";
		}
		else
		{
			System.out.printf("입력된 점수 [%d]는 유효하지 않습니다.",kor);
		}
		
		System.out.printf("국어점수 : %d(점) --> 등급 : %s\n",kor,grade);
		
		scanner.close();
	}

}

 

▼ 위 코드는 사실상

    1) if(kor >= 96) else 가 있을 때

                       2) else안에 : if(kor>=93), if(kor>=90)......이 들어있는 것과 같음.

 

(3) 중첩 if문에서 코드를 간결히 하기 _ 위의 원리를 알면 아래와 같이 &&로 일일히 범위 지정을 하지 않을 수 있다.

package mymain;

import java.util.Scanner;

public class _02_Ex_if3 {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int kor; //나의 국어점수
		//String grade="ABCDF"; //등급
		char result = 'F'; //결과(나의 등급)
		System.out.print("국어 : ");
		kor = scanner.nextInt();
		
		//효율적 코드 
		//방법 1)
		/*
		if(kor>=90 && kor <= 100) 
			result = grade.charAt(0);
		else if(kor>=80 && kor <90) 
			result = grade.charAt(1);
		else if(kor>=70 && kor <80) 
			result = grade.charAt(2);
		else if(kor>=60 && kor <70) 
			result = grade.charAt(3);	
		*/
		//방법 2)
		//유효범위를 먼저 체크(0~100)
		if(kor>=0 && kor<=100) 
		{
			if(kor>=90) result = 'A';
			else if(kor>=80) result = 'B';
			else if(kor>=70) result = 'C';
			else if(kor>=60) result = 'D';
			//else grade = 'F';
		}
		else
		{
			System.out.printf("입력된 점수 [%d]는 유효하지 않습니다.",kor);
		}
		
		System.out.printf("국어점수 : %d(점) --> 등급 : %c\n",kor,result);
		
		scanner.close();
	}

}

 

2) switch문

 - 다차원 선택
 - break를 걸지 않으면 내 case의 명령 이후에, 다음 case의 명령, 그 다음 case의 명령.... 수행

- 로그인한 사용자의 등급을 체크하여 권한을 부여하는 코드

//break를 안 쓰면 grantDelete()부터 아래까지 명령 하나씩 실행
//level 2면, grantWrite(), grantRead() 실행

switch(level){
	case 3 : grantDelete();
    case 2 : grantWrite();
    case 1 : grantRead();
}

- 계절 예제

package mymain;

import java.util.Scanner;

public class _04_Ex_switch2_계절구하기 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int month;
		String season = "";
		
		System.out.print("월 : ");
		month = scanner.nextInt();
		
		//유효성 검사
		if(month >= 1 && month <= 12) {
			//계절 구하기__방법1
			switch(month) 
			{
				case 3: case 4:  case 5: season="봄";     break;
				case 6: case 7:  case 8: season="여름";   break;
				case 9: case 10: case 11: season= "가을"; break;
				default : season="겨울";
			}
		}else {
			System.out.println("월은 1~12사이 값을 입력하세요.");
		}
		
		System.out.printf("[%d월]의 계절은 [%s]입니다.",month,season);
		
		scanner.close();
	}

}

 

- 학점 내기 예제_ switch의 조건식에서 연산자 /를 통해 몫을 구함

package mymain;

import java.util.Scanner;

public class _05_Ex_switch3_문제 {

	public static void main(String[] args) {
		//1.국어점수 입력받는다.
		//2. switch문을 이용해서 등급을 산출하세요.(ABCDF)--수식활용(10배)
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("국어 점수 : ");
		int score = scanner.nextInt();
		char grade = 'F';
		
		//유효성 확인
		if(score>=0 && score<=100) {
			//등급내기
			switch(score/10) 
			{
				case 10 : 
				case  9 : grade = 'A'; break;
				case  8 : grade = 'B'; break;
				case  7 : grade = 'C'; break;
				case  6 : grade = 'D'; break;
				default : grade = 'F';
			}
			
			System.out.printf("[%d]점일 때, 등급은 [%c]입니다.",score,grade);
			
		}else {
			System.out.println("유효하지 않은 값입니다.(0~100사이)");
		}
		
		scanner.close();
	}

}

 

- 가위바위보 예제

package practice;

import java.util.Scanner;

public class SwitchTest {

	public static void main(String[] args) {
		//가위(1) 바위(2) 보(3)
		
		String[] optArr = {"","가위","바위","보"};
		
		Scanner scanner = new Scanner(System.in);
		System.out.print("가위(1), 바위(2), 보(3) 중 하나 선택 : ");
		int user_num = scanner.nextInt();
		
		int comp_num = (int)(Math.random()*3)+1;
		
		if(user_num==1 || user_num==2 || user_num ==3) {
			switch(user_num - comp_num) {
				case -2 : case 1 : 
					System.out.printf("당신 : [%s] vs 컴퓨터 : [%s] = 당신의 승!\n", optArr[user_num], optArr[comp_num]);
					break;
				case -1 : case 2 :
					System.out.printf("당신 : [%s] vs 컴퓨터 : [%s] = 비겼네요.\n", optArr[user_num], optArr[comp_num]);
					break;
				default :
					System.out.printf("당신 : [%s] vs 컴퓨터 : [%s] = 졌네요.ㅠㅠ\n", optArr[user_num], optArr[comp_num]);
			}
		}else {
			System.out.println("잘못 입력했습니다.");
		}
		
		scanner.close();
	}

}

>> 결과

가위(1), 바위(2), 보(3) 중 하나 선택 : 3
당신 : [보] vs 컴퓨터 : [가위] = 졌네요.ㅠㅠ

 

2. for/while/do-while

 - for    문 : 반복횟수를 알 때
 - while 문 : 반복횟수를 모를 때(화일처리/키보드입력)
      pf. 파일 처리의 경우
      --> 사용자가 file을 선택하여 읽을 것
      --> 개발자는 file에 몇개의 글자수가 있을지 모른다. 
      --> 이럴 경우, while문으로 file의 끝까지 읽어라 명령

 

1) for문

 for문은 반복횟수를 알고 있을 때 사용하기 용이하다.

 

(1) for문

 

- 양의 정수의 합 구하기 : 1+2+3+...+num

package practice;

public class SumTest {

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

}

>> 결과

sum : 55

 

- 짝수의 합 구하기 : 2+4+...+num / 1+3+...+num

package practice;

public class EvenOdd {

	public static void main(String[] args) {
		
		int num = 20;
		int sum = 0;
		
		//짝수의 합 구하기
		
		//방법1 _ if문 활용 
		//두번째 차례만 출력 : 1 (2) 3 (4) 5 (6)
		
		for(int i = 0; i <= num; i++)
		{
			if(i % 2 == 0)
			{
				sum += i;
			}
		}
		System.out.println("sum : "+sum);
		
		sum = 0;
		
		//방법2 _ for문 내 증감식 활용
		//증감을 +2씩 : 2 4 6 8 10 
		
		for(int i = 0; i <= num; i+=2)
		{
			sum += i;
		}
		System.out.println("sum : "+sum);
	}

}

>> 결과

sum : 110
sum : 110

 

- 'A'부터 'Z'까지 문자 출력하기 

(1) ASCII 코드 A : 65, Z : 90, a : 97임을 활용 
    pf. int ch = 'A'; 가 가능한 이유는? char은 JAVA에서 2byte이며, int는 4byte. 더 큰 타입으로는 자동 형변환
(2) System.out.printf의 형식지정자(formatter) %c 활용
    - System.out.printf("%c",65);  의 결과는 'A' 
    - System.out.printf("%d",'A'); 는 안 됨
      **why? 그렇게 메서드가 정의되어 있음. (외울 때 Tip. 출력은 디코딩이니 'A' -> %d는 안되는 걸로)
package practice;

public class CharTest {

	public static void main(String[] args) {
		//A부터 Z까지 출력
		//Ascii에서 A : 65, Z : 90, a : 97
		
		//방법1_아스키 10진수 직접 입력
		for(int i = 65; i <= 90; i++) {
			System.out.printf("%c",i);
		}
		System.out.println();
		
		//방법2_Char to Int 자동 형변환
		for(int i = 'A'; i <= 'Z'; i++) {
			System.out.printf("%c",i);
		}
		System.out.println();
	}

}

>> 결과

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ

 

- 'A'부터 'Z'까지 중 3번째 차례 뒤에 구분문자(delim) 넣기

package practice;

public class CharTest2 {

	public static void main(String[] args) {
		//A~Z사이에 구분문자(delim) 넣기
		//ABC-DEF-....
		
		char delim = '-';
		
		//방법1_012-345... 
		//n번 반복/ n번 중 3의 나머지가 2일 때 delim (출력시 'A'+n)
		
		for(int j = 0; j < 26; j++) {
			if(j % 3 == 2) {
				System.out.printf("%c%c",'A'+j,delim);
			}else {
				System.out.printf("%c",'A'+j);
			}
		}
		System.out.println();
			
		//방법2_65 66 67 - 68 69 70 - ... 
		//n번 반복/'A'부터 'Z'중 3의 나머지가 1일 때 delim
		for(int i = 'A'; i <= 'Z'; i++) {
			if(i % 3 == 1) {
				System.out.printf("%c%c",i,delim);
			}else {
				System.out.printf("%c",i);
			}
		}
		System.out.println();
	}

}

>> 결과

ABC-DEF-GHI-JKL-MNO-PQR-STU-VWX-YZ
ABC-DEF-GHI-JKL-MNO-PQR-STU-VWX-YZ

 

 

(2) 중첩 for문

 

- 5x5 블럭쌓기 

package practice;

public class BlockTest {

	public static void main(String[] args) {
		
		int col = 5;
		int row = 5;
		
		for(int i = 0; i < row; i++) {
			for(int j = 0; j < col; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

}

>> 결과

*****
*****
*****
*****
*****

 

- 반 피라미드 블럭 쌓기

package practice;

public class BlockTest2 {

	public static void main(String[] args) {
		
		int row = 5;
		
		for(int i = 0; i < row; i++) {
			for(int j = 0; j <= i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

}

>> 결과

*
**
***
****
*****

 

2) While문

- 반복횟수 모를 때에(파일 처리/키보드입력)

 

- 파일 읽기

(가정) 프로젝트 폴더에 "test.txt"에 아래와 같이 적었다고 가정

Hello,
my love
package practice;

import java.io.FileReader;
import java.io.IOException;

public class FileTest {

	public static void main(String[] args) throws IOException, InterruptedException {
		//파일을 읽어볼 때
		//io안의 클래스 FileReader
		    //메서드 read() - 파일읽기, close() - 파일닫기 
		FileReader file = new FileReader("test.txt");
		int ch = 0;
		int cnt = 0;
		
		//파일을 문자가 없을 때까지 한 문자씩 반복해서 읽고 출력
		//**몇개의 문자가 있을지 모른다.
		while(true) 
		{
			ch = file.read();
			
			if(ch == -1) break; //문자없을 때 반복문 나가기
			
			System.out.printf("%c",ch);
			Thread.sleep(100);
			
			cnt++;
		}
		System.out.println("\n-----------------------");
		System.out.println("총 문자 수 : "+cnt);
		
		file.close();
	}

}

>> 결과

Hello,
my love
-----------------------
총 문자 수 : 15

**** 총 문자 수가 15가 나온 이유 :

      ','과 공백 포함 보이는 문자는 13개 + Enter(실제 코드 : \r\n)   

                                                       <<--- \r,\n처럼 눈에 안 보이는 문자를 화이트 문자라고 한다.

 

- 키보드 입력

(아래 프로그램 흐름) 

※ 참조 : 키보드 버퍼, https://dogrushdev.tistory.com/39

자바 프로그램   RAM   외부 입력 장치
int ch ← System.in.read() ← 키보드 버퍼 ← 키보드
  (문자 1byte씩 읽고
int형으로 return)
(임시 저장) (사용자가 입력 후 
엔터를 치면 버퍼로 이동)
package practice;

import java.io.IOException;

public class KeyBoardTest {

	public static void main(String[] args) throws IOException, InterruptedException {
		
		int ch;
		int cnt = 0;
		
		//사용자에게 입력 안내
		System.out.println("문자를 입력하세요.(종료 시 : Ctrl + Z)");
		
		//사용자가 Ctrl+Z를 누를 때까지 반복해서 버퍼 내용을 읽기
		while(true)
		{
			ch = System.in.read();
			
			if(ch == -1) break;
			
			System.out.printf("%c",ch);
			
			Thread.sleep(100);
			
			cnt++;
		}
		System.out.println("\n------------------");
		System.out.println("총 문자 수 : "+cnt);
	}

}

 

- 키보드 입력2 

package mymain;

import java.io.IOException;

public class _12_Ex_while3_키보드입력2 {

	public static void main(String[] args) throws IOException {
		//키보드 표준장치명 : System.in (byte씩 입력)
		  //사용자가 언제 끝낼 지 결정 - 개발자는 반복횟수 알 수 없음
		
		int ch;
		int total_count = 0; //총 입력 문자수
		int number_count = 0; //숫자문자 갯수
		int alpha_upper_count = 0; //대문자 갯수
		int alpha_lower_count = 0; //소문자 갯수
		int white_count = 0; //white문자 갯수 : (\r,\n,\t,'')
		int etc_count = 0; //나머지 문자 갯수
		
		System.out.println("값을 입력하세요(종료 : Ctrl + Z)"); 
		//운영체제의 CL(명령 라인)에서 Ctrl+z는 종료의 단축키
		
		while(true)
		{
			ch = System.in.read(); 
			
			if(ch == -1) break; //System.in.read()가 -1반환
			
			//총 입력 갯수 카운트(EOF 제외)
			total_count++;

			//수문자 갯수 카운트
			if(ch >= '0' && ch <= '9') 
				number_count++;
			
			//대문자 갯수 카운트
			else if(ch >= 'A' && ch <= 'Z') 
				alpha_upper_count++;
			
			//소문자 갯수 카운트
			else if(ch >= 'a' && ch <= 'z') 
				alpha_lower_count++;
			
			//白문자 갯수 카운트
			else if(ch == '\r' || ch == '\n' || ch == '\t'  || ch == ' ') 
				white_count++;
			
			//나머지 갯수 카운트
			else
				etc_count++;
			
			System.out.printf("%c",ch);
		}
		System.out.printf("전  체 갯수 : %2d\n",total_count);
		System.out.printf("숫  자 갯수 : %2d\n",number_count);
		System.out.printf("대문자 갯수 : %2d\n",alpha_upper_count);
		System.out.printf("소문자 갯수 : %2d\n",alpha_lower_count);
		System.out.printf("화이트 갯수 : %2d\n",white_count);
		System.out.printf("나머지 갯수 : %2d\n",etc_count);
		System.out.println("-----[END]-----");
		
		
	}

}

 

 

3) do-While문

- 반복횟수 모를 때에 용이
- 특정 명령을 행한 뒤(do), (사용자의 의사에 따라) 지속할 지 확인(confirm) 후 반복할 때 사용.
package practice;

import java.util.Scanner;

public class Dan99Test {

	public static void main(String[] args) {
				
		int dan = 0;
		String yn = "Y";
		Scanner scanner = new Scanner(System.in);
		
		do
		{
			System.out.print("단 입력(2~9단 중 하나) : ");
			dan = scanner.nextInt();
			
			if(dan >= 2 && dan <= 9) {
				for(int i = 1; i <=9; i++) {
					System.out.printf("%d x %d = %2d\n",dan,i,dan*i);
				}
				System.out.print("더 하시겠습니까? (y/n) :");
				yn = scanner.next();
			}else {
				System.out.println("2~9 중 하나를 입력해주세요.");
			}
		}while(yn.equals("Y") || yn.equals("y"));
			
		scanner.close();
	}

}

>> 결과

단 입력(2~9단 중 하나) : 10
2~9 중 하나를 입력해주세요.
단 입력(2~9단 중 하나) : 3
3 x 1 =  3
3 x 2 =  6
3 x 3 =  9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
더 하시겠습니까? (y/n) :n

'Language > Java' 카테고리의 다른 글

[자바_복습] 제어문 활용_최대값/키보드 버퍼 문자 읽기/사칙연산/제곱과 팩토리  (0) 2022.03.12
[자바_복습] 중첩for문 활용_구구단/행렬/별찍기  (0) 2022.03.11
[자바_복습] 연산자 구체적으로 보기  (0) 2022.03.07
[자바_복습] Scanner 입력 메서드 구분  (0) 2022.03.04
[자바의 정석_복습] 객체지향 프로그래밍1(2) - 클래스(생성자, 초기화블럭)  (0) 2022.02.27
    'Language/Java' 카테고리의 다른 글
    • [자바_복습] 제어문 활용_최대값/키보드 버퍼 문자 읽기/사칙연산/제곱과 팩토리
    • [자바_복습] 중첩for문 활용_구구단/행렬/별찍기
    • [자바_복습] 연산자 구체적으로 보기
    • [자바_복습] Scanner 입력 메서드 구분
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바