자바[JAVA] - 조건문과 반복문

허다람·2022년 3월 8일
0

자바의 정석

목록 보기
1/2
post-thumbnail

조건문 : if, switch

조건문은 if문과 switch문 두 가지가 있으며 주로 if문을 많이 사용한다. 처리할 경우의 수가 많을 때는 if문보다 switch문이 효율적이지만, switch문은 if문보다 제약이 많다.

if문

if문은 가장 기본적인 조건문이며 만일(if) 조건이 참(true)이면 괄호{} 안의 문장들을 수행하라. 하는 의미로 이해하면 된다.

if(조건식) {
	// 조건식이 참(true)일 때 수행될 문장들을 적는다.
}

블럭

괄호{}를 이용해서 여러 문장을 단위로 묶는 것을 블럭(block)이라고 한다.
블러 안의 문장이 하나뿐일 경우엔 괄호{}는 생략 가능하다.

if (score > 60)
{ // 블럭의 시작
	System.out.printlnl("합격입니다.")
} // 블럭의 끝

if-else문

if문의 변형인 if-else문의 구조는 다음과 같다.

if (조건식) {
	// 조건식이 참(true) 일 때 수행될 문장들을 적는다.
} else {
	// 조건식이 거짓(false) 일 때 수행될 문장들을 적는다.
}

if문에 else블럭이 더 추가된 형태이다. else의 뜻이 '그 밖의 다른'이므로 조건식의 결과가 참이 아닐 때, 즉 거짓일 때 else블럭의 문장을 수행하라는 뜻이다.

if-else if문

if-else문은 두 가지 경우 중 하나가 수행되는 구조이다. 그렇다면 처리해야할 경우의 수가 셋 이상인 경우에는 if-else if문을 사용하면 된다.

if (조건식1) {
	// 조건식1의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식2) {
	// 조건식2의 연산결과가 참일 때 수행될 문장들을 적는다.
} else if (조건식3) { // 여러 개의 else if를 사용할 수 있다.
	// 조건식3의 연산결과가 참일 때 수행될 문장들을 적는다.
} else { // 마지막에는 보통 else블럭으로 끝나며, else블럭은 생략가능하다.
	// 위의 어느 조건식도 만족하지 않을 때 수행될 문장들을 적는다.
}

중첩 if문

if문의 블럭 내에 또 다른 if문을 포함시키는 것은 중첩 if문이라고 부른다. 중첩의 횟수에는 거의 제한이 없다.

if (조건문1) {
	// 조건식1의 연산결과가 true일 때 수행될 문장들을 적는다.
    if (조건식2) {
    	// 조건식1과 조건식2가 모두 true일 때 수행될 문장들
    } else {
		// 조건식1일 true이고, 조건식2가 false일 때 수행되는 문장들
	}
} else {
	// 조건식1이 false일 때 수행되는 문장들
}

switch문

단 하나의 조건식으로 많은 경우의 수를 처리할 때 switch문을 사용한다. 다만 switch문은 제약조건이 있기 때문에, 경우의 수가 많아도 어쩔 수 없이 if문으로 작성해야 하는 경우가 있다.

switch문 실행순서

  1. 조건식을 계산한다
  2. 조건식의 결과와 일치하는 case문으로 이동한다.
  3. 이후의 문장들을 수행한다.
  4. break문이나 switch문의 끝을 만나면 switch문 전체를 빠져나간다.

switch문의 제약조건

1. switch문의 조건식 결과는 정수 또는 문자열이어야 한다.
2. case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.

반복문 : for, while, do-while

반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용된다.

for문

for문은 반복 횟수를 알고 있을 때 적합하다. 구조가 조금 복잡하지만 직관적이라 오히려 이해하기 편하다. 아래의 for문은 블럭{} 내의 문장 "I can do it."을 5번 반복한다.

for(int i = 1; i <= 5; i++) {
	System.out.println("I can do it.");
}

for문의 구조와 수행순서

for문은 '초기화', '조건식', '증감식', '블럭{}', 모두 4부분으로 이루어져 있다. 조건식이 참인 동안 블럭{} 내의 문장들을 반복하다 거짓이 되면 반복문을 벗어난다.

for(초기화; 조건식; 증감식) {
	// 조건식이 참일 때 수행될 문장들을 적는다.
}

초기화

반복문에 사용될 변수를 초기화 하는 부분이며 처음 한 번만 수행된다.
둘 이상의 변수가 필요할 때는 콤마 ','를 구분자로 변수를 초기화 하면 된다. 이때 두 변수의 타입은 같아야 한다.

for(int i=1; i<=10; i++) {...}  // 변수 i의 값을 1로 초기화 한다.
for(int i=1, j=0; i<=10; i++) {...}  // int타입의 변수 i와 j를 선언하고 초기화

조건식

조선식이 참(true)이면 반복을 계속하고, 거짓(false)이면 반복을 중단하고, for문을 벗어난다.

for(int i=1; i<=10; i++) {...} // i<=10일동안 블럭{}안의 문장들을 반복

증감식

반복문을 제어하는 변수의 값을 증가 또는 감소시키는 식이다.
매 반복마다 변수의 값이 증감식에 의해서 점진적으로 변하다가 결국 조건식이 거짓이 되어 for문을 벗어나게 된다.

for(int i =1; i <=10; i++){ ... } // 1부터 10까지 1씩 증가
for(int i =10; i >=1; i--){ ... } // 10부터 1까지 1씩 감소
for(int i =1; i <=10; i+=2){ ... } // 1부터 10까지 2씩 증가
for(int i =1; i <=10; i*=3){ ... } // 1부터 10까지 3배씩 증가

증감식도 쉼표','를 이용하여 두 문장 이상을 하나로 연결해서 쓸 수 있다.

for(int i=1, j=10; i<=10; i++, j--) {...} 
// i는 1부터 10까지 1씩 증가하고
// j는 10부터 1까지 1씩 감소한다.

중첩 for문

for문 또한 for문 안에 또 다른 for문을 포함시키는 것이 가능하다.

for(int i = 1; i <= 5; i++) {
	for(int j = 1; j <= 10; j++) {
    	System.out.print("*");
    }
    System.out.print();
}

향상된 for문

for문의 새로운 문법으로 배열과 컬렉션에 저장된 요소에 접근할 때 기존보다 편리한 방법이다.

for (타입 변수명 : 배열 또는 컬렉션) {
	// 반복할 문장
}

위의 문장에서 타입은 배열 또는 컬렉션의 요소의 타입이어야 한다.
배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽혀서 변수에 저장된다. 그리고 반복문의 괄호{}내에서는 이 변수를 사용해서 코드를 작성한다.

int[] arr = {10,20,30,40,50};

배열 arr을 위와 같이 선언했을 때, 이 배열의 모든 요소를 출력하는 for문은 두가지있다.

<일반적인 for>
for(int i=0; i<arr.length; i++) {
	System.out.println(arr[i]);
}
<향상된 for>
for(int tmp : arr) {
	System.out.println(tmp);
}

두 for문은 동등하며, 향상된 for문이 더 간결하다. 그러나 향상된 for문은 일반적인 for문과 달리 배열이나 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다는 제약이 있다.

<향상된 for문 예시>

public static void main(Stringp[ args) {
	int[] arr = {10,20,30,40,50};
    int sum = 0;
    
    for(int i=0; i<arr.length; i++)
    	System.out.printf("%d ", arr[i]);
    System.out.println();
    
    for(int tmp : arr) {
    	System.out.printf("%d ", tmp);
        sum += tmp;
    }
    System.out.println();
    System.out.println("sum="+sum);
}

while문

while문은 for문에 비해 구조가 간단하다. if문처럼 조건식과 블럭{}만으로 이루어져 있다.
다만 if문과 달리 while문은 조건식이 참(true)인 동안, 즉 조건식이 거짓이 될 때까지 블럭{} 내의 문장을 반복한다.

while (조건식) {
	// 조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}

do-while문

while문의 변형으로 기본적인 구조는 while문과 같으나 조건식과 블럭{}의 순서를 바꿔놓은 것이다.
그래서 while문과 반대로 블럭{}을 먼저 수행한 후에 조건식을 평가한다.
while문은 조건식의 결과에 따라 블럭{}이 한 번도 수행되지 않을 수 있지만, do-while문은 최소 한 번은 수행될 것을 보장한다.

do {
	// 조건식의 연산결과가 참일 때 수행될 문장들을 적는다.
} while (조건식); // 끝에 ';'를 꼭 붙이자!

<do-while 예시>

int i=0;
do {
	System.out.println("do-while 반복문 "+i);
    i = i+1;
} while (i != 5;)

<실행결과>

do-while 반복문 0
do-while 반복문 1
do-while 반복문 2
do-while 반복문 3
do-while 반복문 4

break문

break문은 자신이 포함된 가장 가까운 반복문을 벗어난다. 주로 if문과 함께 사용되어 특정 조건을 만족하면 반복문을 벗어나도록 한다.

while(true) {
	if(sum > 100)
    	break;
    ++i;
    sum += i;
}

continue문

continue문은 반복문 내에서만 사용될 수 있다. 반복이 진행되는 도중에 continue문을 만나면 반복문의 끝으로 이동하여 다음 반복으로 넘어간다.

for(int i = 0; i <= 10; i++) {
	if (i%3==0)
    	continue; // 블럭의 끝으로 이동
        // break문과 달리 반복문을 벗어나지 않는다.
    System.out.println(i);
}

<실행결과>

1
2
4
5
7
8
10

이름 붙은 반복문

break문은 근접한 단 하나의 반복문만 벗어날 수 있길 때문에, 여러 개의 반복문이 중첩된 경우에는 break문으로 중첩 반복문을 완전히 벗어날 수 없다. 이때는 중첩 반복문 앞에 이름을 붙이고 break문과 continue문에 이름을 지정해 줌으로써 하나 이상의 반복문을 벗어나거나 반복을 건널뛸 수 있다.

public class LoofTest
{
    public static void main(String[] args)
    {
        Loop1 : for(int i=2; i<=9; i++) {
        // for문에 Loop1이라는 이름 사용
        	for(int j=1; j<=9; j++) {
            	if(j==5)
                	break Loop1;
                    // break;
                    // continue Loop1;
                    // continue;
                System.out.println(i+"*"+j+"="+i*j);    
             }
             System.out.println();
         }
    }
}

<실행결과>

2*1=2
2*2=4
2*3=6
2*4=8
profile
나 java봐라

0개의 댓글