본문 바로가기
Java/Java Basic

[Java Basic] 6. 루프(Loop)문 - for, while 문

by Rosmary 2022. 6. 27.
728x90
반응형

 

 

 

 

이번 포스팅에서는 Java의 루프문에 대해 알아보려 한다. 루프(Loop)라는 이름에서 알 수 있듯이 이 문법은 대부분의 프로그래밍에서 반복작업을 할 때 사용한다. 가장 유명한 루프문으로는  for문과 while 문이 있다. 프로그래밍 입문 시 구구단 출력 예제에서 골머리를 아프게 만드는 초급 빌런(?) 역할을 하고 있다. 

 

뻘소리 좀 했다. 바로 시작해보자.

 

 

1. for 문

 

이전의 Java 포스팅에서도 계속해서 언급하는 내용이지만, Java는 C언어를 기반으로 만들어진 언어라 C와 유사한 형태를 띈다. 그래서 Python의 for 문에 익숙한 분들이라면 Java의 for 문이 매우 낯설게 느껴질 수 있다. Java에서의 for 문은 아래의 형태로 사용한다.

 

for (통제변수선언; 통제변수에 대한 조건; 통제변수증감식)

{

    변수에 대한 조건이 참인 경우 실행할 코드

}

 

Java를 사용하여 1부터 10까지의 숫자를 출력하는 코드를 작성한다고 해보자. 지금까지의 포스팅 내용으로는 아마 아래와 같이 코드를 구성할 수 있을 것이다.

 

 

하지만 출력 숫자가 100, 혹은 1000 처럼 일일이 코드를 입력할 수 없는 경우 문제가 생긴다. 이렇게 단순히 반복되는 작업이 진행되어야 하는 경우, 동일한 결과가 출력되도록 for 문을 사용하여 아래와 같이 코드를 작성할 수 있다.

 

for문을 사용함으로써 20줄 짜리 코드가 14줄로 줄었다.

 

for 문의 소괄호() 내에 첫 번째 인자는 for문을 통제할 변수를 지정하는 부분이다. 반복 코드를 N회 수행하는 것을 가정하기 때문에 이곳에 선언되는 통제변수는 int 자료형을 가지게 된다. 두 번째 인자는 for 문을 수행하는 조건을 기재하는 부분이다. var 값이 10보다 작거나 같은 경우, var 값을 화면에 출력한다. 세 번째 인자는 var 값의 증감을 나타내는 식이다. for 문에서는 이 증감식이 매우 중요한데 이 식이 부재한다면 var 값이 계속 1로 정의되기 때문에 콘솔에는 1이 멈추지 않고 찍힌다(무한루프라고 한다). 

 

앞서 보았던 if문이나 switch와 마찬가지로, for 문 역시 중첩하여 사용하는 것이 가능하다. for 문을 중첩 사용하면, 구구단 2~9단을 한 번에 출력하는 프로그램도 쉽게 만들 수 있다.

 

 

마지막  * 9 출력 결과에 쉼표를 제거하고 싶다면, switch 문을 통해 아래와 같이 코드를 수정하면 된다.

 

 

 

for 문은 단순 반복 작업 외에도 동일 변수형 타입의 집합인 배열의 활용 시에도 유용하게 사용된다. 아직 배열에 대해 포스팅을 진행한 상태가 아니기 때문에, for 문을 사용하여 배열을 다룰 수 있다는 것 정도만 우선 알아두면 된다. 관련 내용은 포스팅이 완료되면 바로 링크를 연결할 예정이다.

 

 

 

 

2. while 문

 

while 문 역시 for 문과 마찬가지로 반복 작업을 위한 프로그래밍 문법이다. while문은 아래와 같이 사용한다.

 

while ( 조건식 )

{

    조건식이 참인 경우 실행할 코드

}

 

for 문과 마찬가지로 1부터 10까지의 숫자를 출력하는 코드를 while 문으로 작성하면 아래와 같이 나타낼 수 있다.

 

 

while 문은 for 문과 달리 인자가 작성되는 소괄호() 내에서 통제 변수가 선언되는 것이 아니라, 미리 선언된 변수 값을 사용한다. 또한 통제 변수의 증감도 while 문 내에 위치한다는 특징을 가진다. 만약 통제변수에 대한 증감식을 잘못 작성하거나 혹은 조건식이 참일 수 밖에 없는 상황이 주어진다면 while 문 역시 무한루프에 빠질 수 있다. 아래의 코드를 보자.

 

while (true)

{

    System.out.println("Hello World");

}

 

필자가 필자 컴퓨터를 괴롭히기 싫어 이 코드를 실행하지 않는데, 만약 실행한다면 Eclipse 콘솔 창에 Hello World가 셀 수도 없을만큼 많이, 지속적으로 출력된다. 궁금하신 분들은 해봐도 된다. 멈추고 싶으면 콘솔 창 우측 위의 중단 버튼(빨간 네모)을 클릭하면 된다.

 

while 문도 중첩을 통해 구구단을 출력하는 것이 가능하다.

 

 

while 문은 인자에 조건밖에 입력되지 않기 때문에 루프문 작성 시 고려해야 할 것이 많다. 예를 들면, 위의 구구단 예제에서도 피연산값인 j는 1~9를 i 값마다 반복해야하기 때문에 첫 while 문이 마무리되는 시점 또는 두 while 문이 시작되기 전에 반드시 1로 초기화되어야 한다. 또한 각 통제 변수가 while 문 내에서 증감이 이루어지기 때문에 추후 루프문에서 수정사항이 발생하는 경우 코드 파악이 빠르게 이루어지기도 힘든 구조다. 주석을 달아서 잘 표시해두었다면 상관없겠지만 말이다.

 

 

 

3. continue, break

 

필자가 루프문인 for, while에 대해 설명하다가 뜬금없이 continue와 break라는 단어를 꺼내 의아하신 분들이 있을텐데, 이 두 단어는 루프문을 제어하는 또다른 예약어다. 

 

먼저 continue부터 보자. continue는 루프문 내 조건식에 존재해야하는 단어로, 해당 단어가 실행된 이후의 모든 루프문 내 코드는 실행되지 않고 건너뛰기가 된다.

 

 

위의 예시에서 i가 3인 경우 continue 문을 실행하게 되는데, 이 경우 continue 아래에 위치한 "Nice to meet you" 출력 구문은 무시하고 루프를 계속 돌게 된다. 

 

만약, i가 3인 경우, 모든 루프문을 중지하고 싶다면 continue 대신 break 문을 사용하면 된다.

 

 

break문은 continue와 동일하게 루프문의 break 아랫부분에 위치한 코드를 실행하지 않는다. 하지만 continue와 달리 루프문의 조건이 참임에도 불구하고 루프문을 강제 종료한다. 그렇기 때문에 break문의 경우 무한루프를 사용해야 하는 프로그래밍에서 자주 사용된다. 흔히 옛날 DOS나 PC 통신에서 하던 명령어 환경을 프로그램으로 작성할 때 주로 사용한다.

 

문자열 입력에 대한 내용은 추후 포스팅 예정이다. while 문으로 이런 종류의 프로그래밍도 가능하다는 것을 알고 있으면 된다.

 

 

 

4. 루프문에 이름 지정하기

 

Java는 여러 루프문이 중첩된 경우, 각 루프문에 고유의 이름을 붙일 수 있고, 루프에 부여한 이름으로 continue와 break를 걸음으로써 루프문을 제어할 수 있다. 루프문에 이름을 지정하는 것은 아래와 같이 진행한다.

 

for 루프문 이름:  for (통제변수 선언; 통제변수 조건식; 통제변수 증감식)

{

    for문 통제변수 조건식이 참인경우 실행할 코드

}

 

while 루프문 이름: while (통제변수 조건식)

{

    while문 통제변수 조건식이 참인경우 실행할 코드

}

 

 

특정 루프문을 continue와 break 문으로 제어할 경우, continue 및 break 코드 뒤에 명명한 루프문 이름을 추가해주면 된다.

 

 

 

위의 코드를 보자. 곱셈 피연산자 변수인 j가 3인 경우 gop 루프문을 한 번 건너뛰게 되어 있는데, 이 때문에 출력되는 모든 구구단에서 x 3 결과가 출력되지 않음을 확인할 수 있다. else if 구문을 보면 i == 3 && j == 5 식의 경우 dan 루프문을 건너뛰게 되어 있다. 따라서 3단의 경우 3 x 4 = 12까지만 출력되고 4단으로 넘어가는 것이다.

 

while문의 명명도 동일한 방식으로 사용하면 된다.

 

루프문이 여러 개 중첩되는 경우 각 루프문을 관리하기 위한 코드를 작성하는 것이 매우 번거로운데 - 필자는 Bash의 중첩 루프문을 여러 개 사용할 때 돌아버리는 줄 알았다 - Java는 각 루프문에 이름을 지정하여 효율적으로 관리할 수 있다. 필자 개인적으로는 상당히 유용한 기능이라 생각한다.

 

 


 

다음 포스팅에서는 Java의 배열 및 문자열에 대한 내용을 다뤄보려 한다.

 

 

 

Fin.

 

반응형

댓글