상세 컨텐츠

본문 제목

3. 프로그래밍의 꽃 Java 제어문 Part 2 (반복문)

How To Java/Java Tutorial

by 카페코더 2020. 2. 19. 20:18

본문

반응형

취업 준비를 하며 복습한다는 마음으로, 이것을 보는 누군가에게 도움이 되었으면 하는 마음으로
Java-Tutoral을 작성해 봅니다. 입문서와 순서가 잘못되었을 수 있고, 제가 아는 정보가 틀렸을 수 있습니다.
이 글에 대한 잘못된 정보나, 오탈자 등 수정해야 할 항목 혹은 추가해야 할 항목은 댓글로 알려주시면 감사하겠습니다.

이 자료가 올라가는 저장소 :
https://github.com/hwk0911/Java-tutorial

 

hwk0911/Java-tutorial

Java tutorial. Contribute to hwk0911/Java-tutorial development by creating an account on GitHub.

github.com

개인적인 생각으로 제어문은 프로그래밍의 꽃이라 생각한다. (+ 포인터)

이번 포스팅은 Java의 제어문을 알아보려 한다.
Part 1, Part 2로 나누어 조건문, 반복문으로 진행하려 한다.

이번 포스팅부터는 진행 한 항목의 내용에 맞는 문제를 Beakjoon Online Judge(BOJ)에서 찾아 같이 포스팅하려 한다.
(문제 + 해설)

1. 반복문

프로그래밍에서 많은 논리적 처리와, 개발자의 귀찮음을 줄여 준 아주 고마운 문법이다.

반복문은 크게 두 가지로 나뉘며, 각 각 두 개로 세분화하여 나눌 수 있다.

1.1 for

포 또는 포 루프로 불린다. 우선 구조부터 살펴보자.

for문법이 실행되고, 내부의 조건식에 의해 반복할지, 빠져나갈지 결정한다. 

코드로 살펴보자.

public class Main {
    public static void main(String[] args) {
        for(int index = 0, size = 10 ; index < size ; ++index){
            System.out.println(index);
        }
    }
}
/*
결과 :
0
1
2
3
4
5
6
7
8
9

Process finished with exit code 0
 */

아~주 아주 간단한 0부터 9까지 출력하는 반복문을 선언해봤다. 
for문법의 기본 형태는 for(초기식 ; 조건식 ; 변화식) { 실행문 }이다.

위 코드의 for문 내부를 살펴보면 다음과 같다.

  1. 조건식의 기준이 될 index와 size 변수를 초기식으로 선언한다.
  2. ( index < size ) == true 인 경우에 실행문을 실행한다.
  3. index는 1씩 증가한다.
    (후위 증감 연산자가 아닌, 전위 증감 연산자를 사용 한 이유는 성능적 이점 때문이다. (자바의 연산자)의 1.3.1 참조)

그렇다면 for문의 실행 순서를 알아보자.

  1. for문이 실행된다.
  2. 초기식을 설정한다.
  3. 조건식이 true인지 확인한다.
    1. false 인 경우 내부의 실행문의 실행 없이 for문이 종료된다.
    2. true 인 경우 내부의 실행문을 실행한다.
  4. 내부의 실행문을 완료한 후, 변화식을 통하여 값 변경
  5. 3번 ~ 4번 반복

for문은 가장 기본적인 반복문이라 할 수 있다. 
그럼 for문의 파생인 for-each문법을 살펴보자.

1.2 for-each

for문과 비슷하게 생겼으나, 상황에 따라 훨씬 간단하게 표현할 수 있어 자주 사용된다.
배열이나 ArrayList 같은 리스트 형태를 검색할 때 아주 유용하다!

지금까지 와 마찬가지로 for each의 구조부터 살펴보자!

for each문 구조

list의 사이즈가 1 이상일 때 작동하며, 다음 원소가 존재하지 않을 때 반복문을 빠져나온다.

코드로 살펴보자.

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(9);
        list.add(11);

        for(int var : list){
            System.out.println(var);
        }
    }
}
/*
결과 :
1
3
5
7
9
11

Process finished with exit code 0
 */

for each의 단순 구조는 list의 원소를 가장 앞 인덱스부터 참조하여 var에 저장한 뒤, 내부 실행문을 실행한다.

코드의 작동 순서를 보면,

  1. List <Integer> list 선언
  2. 1, 3, 5, 7, 9, 11 순으로 list에 추가
  3. int형 var변수 선언
  4. list.hasNext()
    1. false : for each종료
    2. true : var = list.next()
  5. for each내부 실행문 실행
  6. 4 ~ 5번 반복

list 검사에 한해 정말 간단한 검사가 가능하다!

더보기
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(9);
        list.add(11);

        list.forEach(var2 -> System.out.println(var2));
    }
}
/*
결과 :
1
3
5
7
9
11

Process finished with exit code 0
 */

for each문 대신 함수형 forEach를 사용하여 출력한 결과다.

list의 원소를 처음부터 끝까지 var2에 대입하여 출력하는 방식이다.
코드도 훨씬 간소화되었고, 가독성도 좋다.

하지만 람다는 객체 지향 프로그래밍이 아닌 함수형 프로그래밍이다.

1.3 while

while은 for문에 비해 간단한 표현으로 루프를 실행할 수 있는 문법이다.

간단하긴 하지만, for문법 보다 확실한 예외처리를 통해 사용해야 한다.
while(true) or while(false)와 같은 사용을 최대한 지양해야 한다.

while의 구조를 살펴보자.

while의 구조

for문법과 동일한 구조를 갖는다.

하지만, 무한루프를 빠져나오기 위한 증 감식 같은 조건문의 상태를 바꿀 수 있는 실행문이 포함되어야 한다.

코드로 살펴보자.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(9);
        list.add(11);

        Iterator<Integer> itr = list.iterator();

        while(itr.hasNext()){
            System.out.println(itr.next());
        }
    }
}
/*
결과 :
1
3
5
7
9
11

Process finished with exit code 0
 */
  1. list 선언
  2. list에 element 추가
  3. Iterator를 list의 원소들로 초기화하여 선언
  4. 조건문 : itr이 다음 원소를 갖고 있는가?
    1. true : Iterator에 저장된 list의 원소 출력
    2. false : break;
  5. 4번 반복

1.4 do-while

do-while문법이다. while의 다른 형태라 볼 수 있다. 가장 큰 특징은 우선 한 번은 무조건 실행한다는 점이다.
즉 조건의 검사를 실행문이 끝난 뒤 한다. 

구조를 살펴보자.

do-while 구조

내부 실행문이 먼저 실행된 뒤, 조건문을 확인하여 반복 여부를 결정한다.

코드를 살펴보자.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(9);
        list.add(11);

        Iterator<Integer> itr = list.iterator();

        do{
            System.out.println(itr.next());
        }while(false);
    }
}
/*
결과 :
1

Process finished with exit code 0
 */

위에서 while(false)와 같은 사용을 지양해야 한다 했지만, 극단적인 예시를 위해 사용하였다.

  1. list 선언
  2. list에 element추가
  3. Iterator를 list의 원소들로 초기화하여 선언
  4. 반복문의 실행문 실행
  5. 조건문 확인
    1. true : Iterator에 저장된 list의 원소 출력
    2. false : break;
  6. 5번 반복

for, for-each, while과는 사용법이 많이 다르다.
무조건 한 번은 실행해야 하는 경우 사용하면 좋다.

 

반복문 문제 (for)

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 83578 50591 44083 62.221%

문제

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력 1

5

예제 출력 1

*
**
***
****
*****

출처

알고리즘 분류

문제 풀이 1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BOJ_for문_2438_별찍기1 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        String[] strStar = new String[N];
        strStar[0] = "*";

        for (int index = 1; index < N; ++index) {
            strStar[index] = strStar[index - 1] + "*";
        }

        for (String str : strStar) {
            System.out.println(str);
        }
    }
}
  1. N을 입력받는다.
  2. String배열 strStar를 N만큼의 칸으로 선언한다.
  3. strStar[0] 은 "*" 로 초기화
  4. strStar의 다음 원소가 이전 원소 + "*" 로 초기화
  5. strStar의 원소 모두 출력

 

반복문 문제 (while)

 

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 55850 20079 17357 37.759%

문제

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력

각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1

1 1
2 3
3 4
9 8
5 2

예제 출력 1

2
5
7
17
7

출처

문제 풀이 2
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BOJ_while문_10951_AsumB_4 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] strBuffer;

        do{
            strBuffer = br.readLine().split(" ");

            System.out.println(Integer.parseInt(strBuffer[0]) + Integer.parseInt(strBuffer[1]));
        }while(br.ready());
    }
}
  1. 값을 입력받을 BufferedReader 클래스 객체 br 선언
  2. 값 두개를 저장 할 String배열 strBuffer 선언
  3. do-while문으로 한번은 실행되도록 하여 루프 실행
  4. 한번에 여러줄의 입력을 받는다.
  5. 반복하여 각 줄마다 " "을 기준으로 split 하여 배열로 저장
  6. strBuffer의 0번과 1번의 배열을 Integer.parseInt 함수를 통해 정수형으로 변환
  7. 두 값을 더하여 출력한다.
  8. Buffer에 새로운 값을 받을 수 있는 상태를 확인한다. (다음 입력이 있는지 없는지)
    br.ready() 는 Buffer에 값이 있을때 true를 반환한다.
    1. true : 5 ~ 7번 반복
    2. false : break;
 

 

반응형

관련글 더보기

GitHub 댓글

댓글 영역