🏃♂️ 들어가기 앞서..
본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕
*해당 교재의 목차 순서와 구성 내용을 기준으로 작성하며
부족할 수 있는 내용은 추가적인 검색을 통해 채워나갈 예정입니다.
원래 앞선 조건문과 한 게시글에 정리해보려 했으나
하다보니 내용이 너무 길어질 것 같아
이렇게 조건문, 반복문 2개의 게시물로 나누게 되었습니다!
조건문 게시글은 링크로 달아두고
지금부터 반복문 부분 시작하도록 하겠습니다
반복문은 말 그대로 " 어떤 작업이 반복적으로 수행되도록 하는 명령문 "이다.
이번에 Java에서의 반복문을 배워보니 참 괜찮다는 생각이 든 것 같다.
이전에 배웠던 Python 얘기가 빠질 수 없는데
Python에서는 for문과 while문 이 두 가지만 사용했었는데
우선 입력 매개변수에서의 차이도 있었을 뿐더러
Java에서는 do ~while
이라는 신선한 반복문을 접했다.
이 신선함을 품은 반복문은 뒤에 차차 정리하도록하고
우선 익숙한 for문과 while문에 대해 정리해보자면
두 반복문의 구조와 기능이 유사해서
서로 변환이 용이한데
for문은 반복횟수를 알고 있을 때
while문은 횟수를 정확히 알지 못할 때 사용한다고 생각하면 된다.
이 반복문을 다룰 때 증감 연산자를 굉장이 많이 사용하게 되는데
해당 내용에 대한 게시물은 연산자 게시물을 참고하길 바란다.
for
문
- [첫번째 매개변수] '초기화' : "~부터"라는 의미로 이해하면 쉽다. 횟수의 용도로 사용할 변수의 시작값을 지정해주는 것
- [두번째 매개변수] '조건식' : (python의 while문 조건식이라고 생각하면 좋다..) 변수가 언제까지 반복할지 작성해주는 것
- [세번째 매개변수] '증감식' : 연산자들을 활용해서 반복할 때마다 어떻게 연산할지 작성해주는 것
for (초기화 ; 조건식 ; 증감식) { // 조건식이 참(true)인 동안 수행될 문장들을 적는다. _ 조건식 부분이 Python 입문자였던 필자에게 꽤 신선했던 부분 } // "Just Do It!" 5번 출력하기 for (int i = 1; i <= 5 ; i++) { System.out.println("Just Do IT!") ; }
맨 앞에 위치해 있는 초기화는 반복문을 최초로 시작할 때만 실행되고
이후에는 < 실행 - 증감식 - 조건식 확인 - 실행/종료 >의 패턴으로 반복된다.
천천히 하나하나씩 정리해보자.
: 앞서 설명했듯이 최초 실행 시에만 실행되는 부분으로
반복 제어 변수와 그 값을 선언해준다.
보통 변수 하나로 for문을 제어하지만
만약 둘 이상의 변수가 필요한 경우에는 ,
(콤마)를 구분자로
변수를 선언해주면 된다
for(int i=1;i<=10;i++){...}
for(int i=1, k=2;i<=10;i++){...}
(단, 이 경우에는 두 변수의 타입이 같아야 한다.)
: 다시 반복을 시작하기 전에 변수의 값을 확인해
반복의 여부를 확인하는 부분으로 참(true)/거짓(false)의 값을 통해 실행/종료를 결정한다.
: 반복 제어 변수의 값을 증감시키는 식으로
매 반복마다 해당 변수에 적용시키는 식인데 주로 증감 연산자를 사용하지만
다양한 연산자로도 증감식 작성이 가능하니 잘 활용해야 한다.
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, k=10;i<=10;i++,k--){...}
→ "i가 10이될 때까지 i는 1씩 증가 & k는 1씩 감소"
💡 꿀팁(?)
방금 for문의 구조에 대해 알아보았는데
이 매개변수들을 생략해도 오류가 발생하지 않고
심지어 이를 활용할 수 있다.
for(;;){...} // 모두 생략 : 조건식이 항상 참(true)이 되는 반복문
특히, 조건문이 생략된 경우,
참으로 간주되서 무한 반복문이 된다.
블럭 내부 실행코드에서 if문을 활용해
한계없이 반복을 하다가 특정 조건 만족 시, 종료되게끔 사용할 수 있다.
while(true) { // 무한 반복문
...
for(;;) { // 무한 반복문
...
if (조건식 1) //특정 조건으로 'for(;;)' 무한 반복문 종료
break;
}
if (조건식 2)
break; // 특정 조건으로 'while(true)' 무한 반복문 종료
}
for
문보통 알고리즘 처음 공부할 때,
유명한 구구단 알고리즘이나 정삼각형 별찍기 알고리즘 같은 문제를 만나는데
위 두 문제가 바로
중첩 for문을 적용시켜 풀 수 있는 알고리즘이라
꽤 친숙할 것이다.
간단한 별찍기로 예시를 들어보자.
// 별찍기
for (int a = 1; a<=11;a++) { //1차 반복 : 총 층수
for (int b = 1; b <= 11-a; b++){ // 왼쪽(절반)의 공백 출력만 신경쓰면 된다. : 내려갈수록 한쪽 당 1개의 별이 줄어듦
System.out.print(" ");
}
for (int s = 1; s <= a*2-1;s++) { // 공백출력하고 별만 순차적으로 증가 시키기(1-3-5-7 : (1*2-1) - (2*2-1)...)
System.out.print("*");
}
System.out.println();
}
*
***
*****
*******
*********
***********
*************
***************
*****************
*******************
*********************
이렇게 이중 중첩 for문으로 별찍기를 해보았는데
위 코드와 같이 단순한 방법으로 중첩시키는 것이다.
while
문
- for문에 비해 간단한 구조로 if문처럼 조건식과 블럭
{}
만으로 구성되어 있다.- 조건식이 참(true)인 동안, 즉 거짓이 될 때까지 블럭 내 문장을 반복한다.
while (조건식) { // 조건식의 연산결과가 참인 동안, 거짓이 될 때까지 반복될 문장들 }
for문
비교처음 부분에 for문과 while문은 서로 변환에 용이하다고 언급했다.
실제로 이 두 반복문이 필요로 하는 요소 구성
즉, 초기화 / 조건식 / 증감식이 동일하다.
예시를 살펴보자.
// for문
for (int i = 1; i <= 10; i++) {
...
}
// while문
int i = 1 ;
while (i <= 10) {
...
i++;
}
위 두 코드의 결과값들이 완전히 동일하다.
쉽게 보면 while문과 다르게
for문은 이 요소들을 한 번에 묶어서 작성했을 뿐인 것이다.
단, while문도 묶어서 작성할 수 있다는 점을 알아둬야 한다.
예를 들어,
/* EX 1 */
int i = 1 ;
while (i <= 10) {
i++;
...
}
// 조건식 부분에 증감식 묶어서 작성
// 위 식이 후위형이기 때문에 i++로 작성
int i = 1 ;
while (i++ <= 10) {
...
}
/* EX 2 */
while (i--!=0) {
...
}
while (i <= 10) {
i--;
...
}
/* EX 3 */
while (--i!=0) {
...
}
--i;
while (i <= 10) {
...
i--; //--i도 동일
}
물론 반복 기준 변수가
" 기존 블럭 내에서 어떤 위치에 있느냐 "에 따라
후위형인지 전위형인지 주의해서 작성해야한다.
do~while
문앞서 배운 while문의 변형으로
기본적인 구조는 while문과 같지만
조건식과 블럭의 순서가 바뀐 구조이다.
그리 자주 쓰이는 반복문은 아니지만
" 반복적으로 사용자의 입력을 받아 비교 및 처리할 때 " 주로 사용된다.
do {
... // "처음 한 번"은 무조건 실행됨.
} while (조건식) ; // ';' 필수이니 꼭 기억해야한다.
반복 여부를 결정할 조건식이 뒤에 위치하기 때문에
최소 한 번의 실행은 보장되어 있다.
또한 while (조건식)
이후에 ;
(세미콜론)을 잊지 않도록 주의해야한다.
- break문 : 자신이 포함된 가장 가까운 반복문을 벗어나게 한다. (주로 조건문 if문과 함께 특정 조건 종료 명령에 쓰임 )
- continue 문 : (반복문 내에서만 사용 O) 진행 중인던 반복을 끝내고 다음 반복으로 넘어가게 한다.
(전체 반복 중 '특정 조건 만족 경우'를 제외할 때 쓰임 )
바로 위에 보이는 break문...
별 다른 설정을 하지 않고 사용한다면
안타깝게도 근접한 단 하나의 반복문만 벗어날 수 있다.
만약 여러 개의 반복문이 중첩되있다면
하나씩 하나씩 다 정성스레 break문을 작성하면 되..ㄴ.
중첩 반복문 앞에 이름을 붙여주고
break문이나 continue문에 그 이름을 지정해서
특정 반복문을 한 방에 처리할 수 있다.
Loop1 : for (int i=2; i <= 9 ; i++) {
for (int j=1; j <= 9 ; j++) {
if (j==5)
break Loop1 ; -> 구구단 2단 *4까지만 출력하고 전체 Loop1 밖으로 이동
//break ; ->구구단 *4까지
//continue Loop1 ; -> continue도 이름 활용 : 구구단 2단 *4까지만 출력하고 Loop1 '끝'으로 이동
//continue ; -> 구구단 *5만 빼고 반복
System.out.println(i + "*" + j + "=" + i*j );
}
System.out.println();
} //( continue Loop1 이 오는 지점)
/*---------------------------------< Loop1 지역 >----------------------------------*/
//( break Loop1 이 오는 지점)