💡BE/JAVA

반복문(for, 향상 for, forEach(), while, do-while)

뇌 리셋은 기본이지 2023. 11. 10. 03:20

반복문

반복문에는 for문, while문이 있다. 반복문은 어떤 작업을 반복적으로 실행하고 싶을 때 사용하여 제어문 처음으로 되돌아가 반복 실행하는데 이것을 루핑(looping)이라고 한다.

for문

for문은 주어진 횟수만큼 반복하고 싶을 때 사용한다.

초기화식은 데이터 타입 변수 = 값
조건식은 boolean = 조건

초기화식

반복문에 사용될 변수를 초기화하는 부분이며 처음에 한 번만 수행된다. JAVA에서 for문 초기화식에서 항상 초기화 값을 0으로 하는데, 그 이유는 for 대부분 배열 데이터를 처리하는데 사용하기 때문이다(배열의 인덱스는 0부터 시작한다). 하지만 굳이 초기화식을 0부터 시작해야하는 것은 아니다.

조건식

조건식의 값이 참일동안 반복을 계속하고, 거짓이면 반복을 중단해 for문을 벗어난다.

증감식

초기화 식에 선언한 변수를 이용해서 증감식을 사용한다. 증감식 연산자는 전위, 후위, ++, --, 배수 무엇이든 사용 가능합니다.  문장이 한 번 실행될 때 마다 변수의 값이 증감되어 나중에 조건식이 거짓이 되어 for문을 벗어난다.

 

세 가지 요소들은 쉼표를 이용해서 두 문장 이상을 하나로 연결해서 쓸 수 있다. 또한 이 요소들은 필요하지 않으면 생략할 수 있으며, 모두 생락도 가능하다. 단, 생략할 시 상황에 따라 무한 반복문( for( ; ; ) { } )이 된다.

예시

  • 예시 1
//Hello Java를 다섯번 출력하는 for문

for(int i = 0 ; i < 5 ; i++) {
	System.out.println("Hello Java");
};
  • 예시 2
// 1 ~ 10 출력하는 for문

for(int i = 1 ; i <= 10 ; i++) {
	System.out.println(i);
}
  • 그 외 예시
 

영수증 / 25304

정보 분류 : 반복문 문제 문제링크 풀이 import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int x = sc.nextInt(); //영수증에 적힌 총 금액 int n = sc.nextInt(); //영수

eun-developer.tistory.com

 

A+B - 3 / 10950

정보 분류 : 반복문 문제 문제링크 풀이 import java.util.*; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); for(int i = 1 ; i

eun-developer.tistory.com

주의사항

  • 자바에서는 for 키워드를 JVM이 보면 for 키워드 뒤에 ()가 있으면 무조건 반복 수행한다.
for (int i = 0 ; ; ) {
	System.out.println("---");
}

위의 코드와 같이 실행하면 무제한으로 ---이 출력된다. 이럴 땐 Ctrl + c를 눌러서 무제한으로 실행되는 것을 멈추면 된다.

  • for문 소괄호 안에서 선언 후 0을 대입한 뒤 for 블럭 밖에서 출력
for(int i = 0 ; i < 3 ; i++) {
	System.out.println( "(" + i + " < 3 ) >>> : " + ( i + 3 ) );
    System.out.println( "for {} 블럭 내부 ::: i >>> : " + i );
}

System.out.println("for {} 블럭 외부 ::: i >>> : " + i );

// Error!!

javac 명령어로 컴파일 과정에서부터 에러가 난다. 

 

"error : cannot find symbol"

 

 for문 블럭 밖에서 i를 출력시키면 for문을 제외한 함수 블럭내에서 아무리 i를 찾아봐도 변수를 선언한 적이 없기 때문에 symbol을 찾을 수 없다는 에러가 출력된다.

 

아래는 for문 소괄호 밖에서 선언 후 for문 블럭 밖에서 출력하는 올바른 방법이다.

int i;

for(i = 0 ; i < 3 ; i++) {
	System.out.println( "(" + i + " < 3 ) >>> : " + ( i + 3 ) );
    System.out.println( "for {} 블럭 내부 ::: i >>> : " + i );
}

System.out.println("for {} 블럭 외부 ::: i >>> : " + i );

/*	결과
    (0 < 3) >>> : true
    for {} 블럭 내부 ::: i >>> : 0
    
    (1 < 3) >>> : true
    for {} 블럭 내부 ::: i >>> : 1
    
    (2 < 3) >>> : true
    for {} 블럭 내부 ::: i >>> : 2
    
    for {} 블럭 외부 ::: i >>> : 3
*/

for문 안에선 0, 1, 2 까지만 출력된다. 그 이유는 i가 3이 된 후 조건식에서 3 > 3이라는 조건을 맞닥뜨리는데 이는 반복 될 수 없는 false 조건이기 때문에 2까지만 출력된 후 for문이 종료된다. 그렇다면 i의 변수엔 3이 저장되어 있으므로 전역 변수의 값은 3이 된다.

중첩 for문

바깥쪽 for문이 한 번 수행될 때 안쪽 for문이 지정된 획수만큼 수행된 후 다시 바깥쪽 for문이 돌아간다.

예시

 

구구단 / 2739

정보 분류 : 반복문 문제 문제링크 풀이 import java.util.*; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); for(int i = n ; i

eun-developer.tistory.com

확장 for문(향상for문)

JDK1.5 이상부터 배열과 컬렉션에 저장된 요소에 기준 for문보다 접근하기 편리한 방법으로 처리할 수 있도록 새롭게 추가되었다.

for(타입 변수명 : 배열 또는 컬렉션) {
    /*	배열 또는 컬렉션에 저장된 값이
        매 반복마다 하나씩 순서대로 읽혀져 변수가 저장된다.
    */
}

확장 for문의 구조는 위와 같으며, 세미콜론(;)이 아닌 콜론(:)으로 구분한다. 변수명 : 배열명으로 선언한 뒤, 변수명을 출력하면 해당 인덱스대로 배열 원소 값이 출력된다. 확장 for문은 일반적인 for문과 달리 배열과 컬렉션에 저장된 요소들을 읽어오는 용도로만 사용할 수 있다.

예시

  • 예시 1
// 1
for( int k : score ) {
	System.out.println( k + " " );
}

// 2
int sum = 0;

for( int k : score ) {
	sum += k;
}

System.out.println( "총 점수 : >>> " + sum );

향상 for문에 k 변수를 선언하고 score 배열에 대한 원소값을 출력하는 확장 for문이다. 또는 sum 변수를 선언하고 sum += k;문장을 추가해 socre 변수의 원소 값을 누적 합들로 구할 수 있다.

  • 예시 2
String[] names = {"Choi", "Mi", "Na"};
String rev = " ";

// 향상 for문 출력
for(String str : names) {
	rev = str + rev;
	System.out.print( str + " " );
}

System.out.println( "\n" + rev );

/*  결과
    Choi Mi Na 
    NaMiChoi 
*/

위의 예제를 보면 str 변수를 선언하고 names 배열에 대한 원소 값을 출력하는 확장 for문이다.

추가로 rev 변수를 선언하고 rev = str + rev; 문장으로 원소 값들을 꺼꾸러 출력하게 할 수 있다. print(str + " ");에서 배열 원소 값 그대로 "Choi Mi Na"가 출력되며, println("\n" + rev);에서는 배열 원소 값이 꺼꾸러 출력되어 "NaMiChoi"가 출력된다.

forEach()

forEach() 메서드는 Java8에서 추가된 Iterable 인터페이스의 기본 메서드이다. 기준 for문과 비슷하게 조금 더 쉽게 Loop를 가능하게 해주는 메서드이다.

Java는 Consumer이라는 인터페이스를 전달받아 내부적으로 accept라는 메서드를 실행하도록 구조가 되어있다.

Consumer 인터페이스는 함수형 인터페이스(Functional Interface)의 한종류로 아래와 같이 선언되어 있다.
@FunctionalInterface
public interface Consumer<T> {
	void accept(T t);
	...
}

예시

  • 익명 클래스를 이용한 인터페이스(Consumer) 구현
// 예제에 사용될 list 생성 후 값을 넣어주었음
List<String> list = new ArrayList<>();
list.add("나는1번");
list.add("나는2번");
list.add("나는3번");

// 익명 클래스로 Consumer 인터페이스 구현
list.forEach(new Consumer<String>() {
    @Override
    public void accept(String str) {
        System.out.println(str);
    }
});

while문

조건식 true일 경우에 계속 반복한다. 조건식에는 주로 논리 연산식이 온다. false일 경우 반복을 멈추고 while 블록을 종료한다.

예시

  • 예시 1
int treeHit = 0;

while (treeHit < 10) {
    // treeHit += 1 로도 표현 가능
    treeHit++;
    
    System.out.println("나무를  " + treeHit + "번 찍었습니다.");
    
    if (treeHit == 10) {
        System.out.println("나무 넘어갑니다.");
    }
}
나무를  1번 찍었습니다.
나무를  2번 찍었습니다.
나무를  3번 찍었습니다.
나무를  4번 찍었습니다.
나무를  5번 찍었습니다.
나무를  6번 찍었습니다.
나무를  7번 찍었습니다.
나무를  8번 찍었습니다.
나무를  9번 찍었습니다.
나무를  10번 찍었습니다.
나무 넘어갑니다.

while의 조건문은 treeHit < 10이다. 즉, treeHit가 10보다 작은 동안에는 while문 안의 문장을 계속 수행한다. while 문 안의 문장을 보면 제일 먼저 treeHit++로 treeHit 값이 계속 1씩 증가한다. 그리고 나무를 treeHit번만큼 찍엇음을 알리는 문장을 출력하고 treeHit가 10이 되면 '나무가 넘어갑니다'라는 문장을 출력하고 이제 조건문은 거짓이 되어 while문을 빠져 나가게 된다.

  • 1 ~ 20 사이의 2의 배수만 출력
int i = 0;

while( i <= 20 ) {
    if( i % 2 == 0) {
        System.out.println(i);
    }
    i++;
}
0
2
...
18
20

do-while문

while문과 유사하나 조건을 나중에 검사한다. 블록 내부 실행문을 우선 실행하고 그 결과에 따라 반복 실행 여부를 결정한다.

while() 뒤에는 반드시 세미콜론(;)이 붙어야 한다.

실행구조

실행문이 우선 실행된 후 조건식을 검사한다. 조건식이 true이면 실행문을 반복 수행하고, false면 do-while문을 종료한다.

break문

반복문(for, while, do-while)의 실행을 중지할 때 사용된다. 또한 swich문에서도 종료 용도로 쓰이고 있다. 주로 if문과 함께 사용하며, if 문과 함께 조건식에 따라 while, for문을 종료한다.

 

반복문이 중첩되어있을 경우 break문은 가장 가까운 반복문만 종료한다. 만약 중첩된 반복문에서 바깥쪽 반복문까지 종료시키려면 바깥쪽 반복문에 이름(라벨)을 붙인다.

예시

  • 주사위 6이 나오면 while문 종료
while(true) {   // 무한루프
    int num = (int)(Math.random() * 6) + 1;
    System.out.println(num);

    if (num == 6) {
        break;      // 6이 나오면 종료
    }
}

System.out.println("System Off");
  • 이중for문 / 이름을 활용한 break문(break-label)
// 이름 : for
Outter:for (char upper = 'A'; upper <= 'Z'; upper++) {

    for (char lower = 'a'; lower <= 'z'; lower++) {
    
        System.out.println(upper + " - " + lower);
        
        if (lower == 'g') {
            break Outter;
        }
        
    }
}

System.out.println("System Off");
A - a
A - b
A - c
A - d
A - e
A - f
A - g
System Off

continue문

반복문(for, while, do-while)에서만 사용된다. continue문을 만나면 바로 조건식으로 이동한다. 주로 if문과 함께 사용한다.

break문은 반복문을 아예 종료하지만, continue문은 종료하지 않고 다시 조건식으로 이동한다(반복문은 계속 수행된다). 특정 조건을 만족하는 경우, continue문을 사용해서 이후 문장을 실행하지 않고 다음 반복으로 넘어간다.

예시

  • 홀수를 출력하는 for문
for(int i = 0 ; i <= 10 ; i++) {
    if(i % 2 == 0) { // 짝수
    	// 짝수의 값은 패스하고 다음 반복문을 실행해라.
        continue; 
    }
    
    // 짝수에 해당되지 않으면 i의 값을 출력
    System.out.println(i);
}
1
3
5
7
9

reference

혼자공부하는자바

https://velog.io/@yunyoseob/JAVA-%EB%B0%98%EB%B3%B5%EB%AC%B8for%EB%AC%B8

https://wikidocs.net/212

https://backendcode.tistory.com/221

https://kephilab.tistory.com/34

https://developer-yeony.tistory.com/84

https://pool-cover-73b.notion.site/7d8104a4ee2b46f985f7a61b470c5e46?pvs=4

'💡BE > JAVA' 카테고리의 다른 글

자바의 기본 문법  (2) 2023.11.10