[Java] 조건분기와 반복

JTI·2022년 10월 1일
1

☕️  Java

목록 보기
1/59
post-thumbnail

우리는 매일 조건에 대한 행동의 분기나 반복을 하고 있다.

예를 들어,
"만약 일기예보가 비라면 우산을 가지고 간다" 라는 분기나,
"정답일 때 까지 몇 번이라도 문제를 푼다" 라는 반복이다.
프로그램도 이것과 같은 조건분기와 반복을 수행하며 처리를 진행해 나간다.

🧐 프로그램의 흐름

코드를 실행시키는 순서를 "제어구조"라고 한다.

대표적인 것으로는
'순차' / '분기' / '반복' 이 3가지가 있다.

순차 = 위에서 부터 순차적으로 한줄씩 진행

아무리 복잡한 프로그램이라도, 순차 / 분기 / 반복의 3가지 제어구조를 조합하면
만들 수 있다.

💡 분기문


만약 내일이 맑으면 세탁하고 산책을 하자.
하지만, 내일 비가 온다면, 집에서 영화를 보자.


public class Clear {

	public static void main(String[] args) {

		boolean clear = true;
		
		if (clear == true) { // 분기조건
			System.out.println("세탁을 합니다");
			System.out.println("산책을 합니다");
			
		} else {
			System.out.println("영화를 봅니다");
			
		}
			
	}

}
  • if 라는 명령어를 사용하면 "분기"를 할 수 있다.
  • if 의 뒤에는 () 안에 "맑은가"에 대한 "분기조건"을 쓴다.
  • 변수 clear가 true인지 아닌지를 체크를 할 때에는 "=="을 사용한다.
  • 분기조건이 성립한다면, ()의 직후에 있는 블록의 안쪽 코드가 실행된다.
  • 분기조건이 성립하지 않는다면, else의 뒤에 있는 블록의 안쪽 코드가 실행된다.

✏️ 블록의 작성 방법

블록이란 복수의 문장을 하나로 묶는 역할을 하기 위한 것

블록 작성에는 2가지 룰이 있음.

  1. 중괄호의 생략
    내용이 1행 밖에 없을 때는 중괄호를 생략해도 됨.
    하지만 에러의 방지를 위해 중괄호를 웬만하면 써 줘야함.
  1. 블록 내에 선언한 변수의 수명
    블록 안에서 선언한 변수는 그 블록의 종료와 동시에 소멸한다.

✏️ 조건식 작성 방법

if (clear == true) {}
if (age > 18) {}

조건식 안에 사용되는 == / > / < 등의 기호를 관계연산자 라고 한다.

✏️ 수학의 표현과 Java 조건식의 표현

수학적 표현: x는 10보다 크고, 20보다 작다 ➡️ 10 < x < 20

Java 표현: 따로따로 식을 입력해야 함.

if (x > 10 && x < 20) {
if (10 < x && x < 20) {

💡 관계연산자


  • JTI != false -> JTI == true
  • initial == '오' (오는 char(숫자형)임 // 관계연산자는 String 못씀)

✔️ if 문과 while 문 정리


  • if 문은 조건식의 평가 결과가 true이면 바로 밑 블록을,
    false이면 이후의 블록을 실행
조건식은 반드시 true 또는 false가 나오는 식이어야 함.
  • while 문은 조건식의 평가 결과가 true이면 ,블록을 반복 실행

💡 문자열의 비교


Java에서 String 형의 비교에는 특수한 작성 방법 이 있다.
예를 들어, 변수 s의 내용이 "저녁"이라면 ..."을 코드로 작성하면

if (s == "저녁") {

맞는 것 같지만, Java에서는 문자열의 비교는 "=="을 사용하면 안된다.
이유에 대해서는 나중에 설명함!
일단, 문자열의 비교를 할 때에는 반드시 다음과 같은 방법을 사용해야 함.

if (s.equals ("저녁")) { //문자열 비교는 문자열끼리.
if ("저녁".equals(s)) { // 반대도 가능.

💡 논리 연산자


"나이가 20세 이상이고, 성별이 남성"과 같은 2개 이상의 조건의 조합의 조건식을 사용하고 싶을때에는 논리연산자를 사용한다.

if (age >= 20 && gender == 1) {
if (name.equals("철수") || married == true) {

💡 부정연산자


만약 ~이 아니면 을 조건식에 표현하고 싶으면 식의 앞에 부정연산자 ! 를 붙인다.

💡 분기문의 종류


  1. if - else 문
  2. if 만 있는 문장
  3. if - else if - else (false 일 때, 또 다시 조건으로 분기)

✏️ if - else 문 (기본형)

if (조건식) {
	블록 1
} else {
	블록 2
}

✏️ if 문만 있는 문장

if (조건식) {
	블록 1
}

✏️ if - else if - else 문

if (조건식 1) {
	블록 1
} else if (조건식 2) {
	블록 2
} else {
	최종블록
}

💡 switch 문 활용


✏️ 길고 뭔가 깔끔하지 않은 소스 코드

System.out.println("당신의 운세를 점쳐 드립니다");

int fortune = new java.util.Random().nextInt(4) + 1;

if (fortune == 1) {
	System.out.println("대길");

} else if (fortune == 2) {
	System.out.println("중길");

} else if (fortune == 3) {
	System.out.println("길");

} else {
	System.out.println("흉");
}

이 코드를 switch 문으로 바꿔보면 위 if문 식보다는 깔끔하게 되었다.

switch (fortune) {
	case 1:
    	System.out.println("대길");
        break;
        
    case 2:
    	System.out.println("중길");
        break;
    
    case 3:
    	System.out.println("길");
        break;
   
   	default:
		System.out.println("흉");
        break;
} 
// break; 까먹지 말기!

✏️ break 문을 쓰지 않는 기술 방법

public class Main {

	public static void main(String[] args) {

		System.out.println("당신의 운세를 점쳐 드립니다.");

		int fortune = new java.util.Random().nextInt(5) + 1;
		
		switch (fortune) {
			case 1:
			case 2:
				System.out.println("좋네요!");
				break;
			
			case 3:
				System.out.println("보통입니다.");
				break;
				
			case 4:
			case 5:
				System.out.println("음 ...");
		}
	}
}

이것을 if 문으로 쓰면 복잡하게 변한다.
이럴 때 switch 문을 쓰면 간단명료하게 나타낼 수 있다.

💡 반복문


만약 화장실에 누군가 있다면 "문을 노크하고 1분 기다림"을 반복.

public class Toilet {
	public static void main(String[] args) {
    
    	boolean isDoorClose = true;
    
   		while (isDoorClose == true) {
    		System.out.println("노크한다");
			System.out.println("1분 기다린다");   
		
     	}
    	
        System.out.println("화장실에 들어간다"); // false값일 때 동작.
	}  // 지금은 true로 설정했기 때문에 실행을 하게 되면 무한 반복 루프에 빠진다. 컴퓨터가 멈출수도 ...
}
  • while 을 사용하면 "반복"제어를 행할 수 있다.
  • whil의 뒤에는 ()안에 "문이 닫혔는가"등의 반복하는 조건을 쓴다.
  • 반복 조건이 성립한다면 몇번이라도 블록 안의 코드가 반복 실행 된다.

✔️ 반복문의 종류

  1. while 문
  2. do - while 문
  3. for 문

✏️ while 문

조건을 판단 후 반복

사람이 실수하면 프로그램이 잘못되고 종료되지 않는 그런 점 때문에 그렇게 많이 잘 쓰이진 않는다.

while (조건식) {
	블록 1
}

✏️ do -while 문

1회 실행 후 조건을 보고 반복

do 안에 있는 블록을 먼저 실행 후, 조건에 맞는 코드를 반복한다.
이것도 별로 잘 안쓰임.

do {
	블록 1
} while (조건식)

✏️ for 문 ⭐️⭐️

❗️제일 많이 쓰는 문❗️
1. 루프 변수의 이름은 자유
2. 변수는 블록내에서 이용 가능
3. 블록 밖에서는 이용 불가

public class Main
	public static void main(String[] args) {
    	for (int i = 0; i < 10; i++) {
        	System.out.println("안녕하세요");
        }
    }

❗️ int i = 0 ➡️ 초기화 (for문 안에서 사용할 변수 선언)

❗️ i < 10; ➡️ 조건식
(언제까지 반복할껀지 조건을 써준다.
i가 10보다 작을 때 까지 반복하겠다는 의미.)

❗️ i++ ➡️ 반복 후 처리
(한번 반복이 끝나면 무엇을 수행할건지 써준다.)

💡 제어구조의 네스트 (nest)


분기 안에 분기, 반복문 안에 분기 등 다중구조를 "네스트(nest)"라고 한다.

✏️ for 문의 루프를 2중으로 하여 구구단 출력


public class Clear {

	public static void main(String[] args) {

		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				System.out.print(i * j);
				System.out.print(" ");
			}		
			System.out.println(); // 첫번째 for문 기준 개행
		}	
	}		
}
  1. for (int i = 0; i < 10; i++) {
여기서 10번 다 돌면 바로 밑 for문으로 넘어간다.
0 0 0 0 0 0 0 0 0 0  // 한줄씩 카운팅.
0 1 2 3 4 5 6 7 8 9 
0 2 4 6 8 10 12 14 16 18 
0 3 6 9 12 15 18 21 24 27  ...
  1. for (int j = 0; j < 10; j++) {
    System.out.print(i * j);
    System.out.print(" ");
    }
또 10번 카운팅 하는데, i와 곱해지고 한칸 띄워지면서 카운팅된다. (하나하나 카운팅)
0 3 6 9 12 15 18 21 24 27 // 0, 3, 6, 9같이 하나 옆으로 카운팅된다.

✏️ 반복문의 중단

경우에 따라 반복문 도중에 중단을 하고 싶을 때가 있다.
이럴 경우, Java 에서는 Break 문과 continue 문 2종류의 중단 방법이 준비되어 있다.

❗️break 문
for 문을 종료 (if 문과 자주 쓰인다.)

for (int i = 1; i < 10; i++) {
	if (i == 3) { // 3번째에서 멈춤
    	break;
    }
	System.out.println(i);
}

❗️countiue 문
이번만 중단하고, 계속해서 루프를 진행

for (int i = 1; i < 10; i++) {
	if (i == 3) { // 3을 건너뛰고 진행
    	countinue;
    }
	System.out.println(i);
}

💡 무한 루프


무한루프란, 말 그대로 무한하게 반복하는 제어구조를 말한다.
프로그래밍 초보들은 실수로 무한 루프에 빠지게 되는 경우가 있다.
의도적으로 무한 루프를 만드는 경우 다음 2가지 경우가 일반적이다.

  • while (true) {...}
  • for (;;) {...}

📌 마지막 정리


✔️ 제어구문

  • 순자, 분기, 반복의 3가지 제어구조를 조합하여 어떤 프로그램도 만들 수 있다.
  • 분기와 반복은 "조건문"과 "블록"으로 구성되어 있다.
  • 조건식의 평가결과는 true 또는 false여야 한다.
  • 문자열을 비교 할 때는 "=="이 아니라 "equals"를 사용한다.
  • 블록 안에 정의한 변수는 블록 종료와 함께 소멸한다.
  • 제어구문은 네스트 가능.

✔️ 분기

  • if 문 또는 switch 문을 사용해서 분기를 실현한다.
  • if 문은 "if 만의 구문", "if - else 구문", "if - else 구문"의 3종류.
  • switch 문의 블록은 break 문으로 벗어나는 것이 가능.

✔️ 반복

  • while 문, do - while 문 또는 for 문을 사용하여 반복을 실현.
  • while 문의 블록은 최저 0회 이상, do - while 문의 블록은 최저 1회 이상 실행.
  • for 문은 루프 변수를 이용하여 "~회 반복"하는 경우에 사용.
  • break 문을 실행하면 반복 자페를 중단하고,
    continue 문을 실행하면 이번만 중단하고 다음 반복으로 넘어간다.
profile
Fill in my own colorful colors🎨

0개의 댓글