학습할 것 (필수)

선택문
반복문

과제 (옵션)

과제 0. JUnit 5 학습하세요.

  • 인텔리J, 이클립스, VS Code에서 JUnit 5로 테스트 코드 작성하는 방법에 익숙해 질 것.
  • 이미 JUnit 알고 계신분들은 다른 것 아무거나!
  • 더 자바, 테스트강의도 있으니 참고하세요~

과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.

  • 깃헙 이슈 1번부터 18번까지 댓글을 순회하며 댓글을 남긴 사용자를 체크 할 것.
  • 참여율을 계산하세요. 총 18회에 중에 몇 %를 참여했는지 소숫점 두자리가지 보여줄 것.
  • Github 자바 라이브러리를 사용하면 편리합니다.
  • 깃헙 API를 익명으로 호출하는데 제한이 있기 때문에 본인의 깃헙 프로젝트에 이슈를 만들고 테스트를 하시면 더 자주 테스트할 수 있습니다.

과제 2. LinkedList를 구현하세요.

  • LinkedList에 대해 공부하세요.
  • 정수를 저장하는 ListNode 클래스를 구현하세요.
  • ListNode add(ListNode head, ListNode nodeToAdd, int position)를 구현하세요.
  • ListNode remove(ListNode head, int positionToRemove)를 구현하세요.
  • boolean contains(ListNode head, ListNode nodeTocheck)를 구현하세요.

과제 3. Stack을 구현하세요.

  • int 배열을 사용해서 정수를 저장하는 Stack을 구현하세요.
  • void push(int data)를 구현하세요.
  • int pop()을 구현하세요.

과제 4. 앞서 만든 ListNode를 사용해서 Stack을 구현하세요.

  • ListNode head를 가지고 있는 ListNodeStack 클래스를 구현하세요.
  • void push(int data)를 구현하세요.
  • int pop()을 구현하세요.

과제 5. Queue를 구현하세요.

  • 배열을 사용해서 한번

공부 내용

1. 선택문

IF 문

자바는 선택논리의 제공을 위해 if, switch문을 제공한다.
쉽게 말해서 조건 분기를 통해서 워크플로우를 내 입맛대로 변경할 수 있게 도와주는 문법이다.

먼저 if문의 문법은 아래와 같다.

if ( 조건 - 참이면 아래 구문 적용) {
    // if가 참일때 적용되는 구문

} else if ( 조건 - 참이면 아래 구문 적용) {
    // If가 참이 아니고 else if 구문이 참일 때 적용되는 구문, 생략 가능하다 (if else로 구성 가능)

} else { 
    // 그 외 다른 경우 else 문 실행

}

IF문 흐름

If 문을 통해 간단한 홀수 짝수를 판별하는 프로그램을 구현해 보았다.
로직은 간단하다.
if 조건문 안에서 입력한 숫자를 2로 나눈 나머지가 0이면 (즉 True면) if 조건식 아래에 있는 구문이 실행되고 아니면 else 구문이 실행된다.

간단한 짝수 홀수 판별기, input을 10을 했을 때 짝수라는 결과를 볼 수 있다.

참고로 위의 if문은 아래와 같이 표현 가능하다.

if (input % 2 == 0 ) System.out.println("짝수");
else System.out.println("홀수");

각 조건절의 구문이 한줄이면 중괄호를 사용하지 않아도 된다.
개인적으로는 한줄이라도 중괄호 사용하는 것을 좋아한다.

Switch 문
Switch 문은 if 조건에 대한 선택지가 많을 때 활용할 수 있다.
일단 왜 필요한지 고민해 봤는데 예를 들어 input을 받아 요일을 판별하는 프로그램을 작성한다고 치자.
(프로그램 자체가 이상하긴 하지만 예시를 든 것이기 때문에 넘어가자)
if문으로 작성하면 아래와 같이 구성될 것이다.

public class Test {
    public static void main(String[] args) {

        String input = "월요일";

        if(input.equals("월요일")) {
            System.out.println("월요일 입니다.");
        
        } else if(input.equals("화요일")){
            System.out.println("화요일 입니다.");
        
        } else if(input.equals("수요일")){
            System.out.println("수요일 입니다.");
        
        } else if(input.equals("목요일")){
            System.out.println("목요일 입니다.");
        }
        else if(input.equals("금요일")){
            System.out.println("금요일 입니다.");
       
       } else if(input.equals("토요일")){
            System.out.println("토요일 입니다.");
        
        } else if(input.equals("일요일")){
            System.out.println("일요일 입니다.");
        
        } else {
            System.out.println("입력이 잘못되었습니다.");
        }

    }
}

뭔가 상당히 복잡해 보이고 가독성이 좋지 않다.
해당 프로그램을 Switch 문으로 바꾸면 아래와 같이 된다.

public class Test {
    public static void main(String[] args) {

        String input = "화요일";


        switch (input) {
            case "월요일" :
                System.out.println("월요일 입니다.");
                break;

            case "화요일" :
                System.out.println("화요일 입니다.");
                break;

            case "수요일" :
                System.out.println("수요일 입니다.");
                break;

            case "목요일" :
                System.out.println("목요일 입니다.");
                break;

            case "금요일" :
                System.out.println("금요일 입니다.");
                break;

            case "토요일" :
                System.out.println("토요일 입니다.");
                break;

            case "일요일" :
                System.out.println("일요일 입니다.");
                break;
                
            default:
                System.out.println("잘못된 입력입니다.");
        }

    }
}

훨씬 가독성이 좋아졌다.

if 문으로도 제어문을 구성할 수 있지만 코드를 본인만 보는 것이 아니기 때문에 되도록이면 가독성 있는 코드를 작성하는 습관을 가지는게 좋을 것 같다.
결과를 보면 화요일이라는 결과를 확인해 볼 수 있다.

 

Switch문에 대한 문법을 설명하지 않고 바로 코드로 갔는데 Switch문은 아래와 같은 문법으로 동작한다.

        switch (input) {
            case "월요일" :
                // 구문
                System.out.println("월요일");
                break; // break가 없다면 해당 라벨부터 쭈욱 실행된다.

            case "화요일" :
                // 구문
                System.out.println("화요일");
                break;

            default:
                // default는 모든 case에 들어맞지 않을때, 즉 if문의 else와 같은 역할이다.
                System.out.println("디폴트");
        }
  • case 와 default를 레이블이라고 하며 input이 해당 레이블과 일치하면 해당 구문부터 아래로 쭈욱 실행된다.
  • 예를 들어 위에서 input이 월요일이면 case 월요일에 있는 구문부터 아래로 쭈욱 실행되는 것이다.
    만약 break문이 없고 input이 월요일이었으면 "월요일", "화요일", "디폴트"가 모두 출력되었을 것이다.
  • break 문은 switch문을 빠져나갔다는 의미다. 즉, input과 동일한 case 영역만 실행하고 빠져나가고 싶을 때 사용한다.
    (case + break가 일반적인 사용법임)  
  • input에는 정수 또는 문자열만 올 수 있다. (강조!)

2. 반복문

반복문도 필요한 이유를 짚고 가자.
월요일부터 금요일까지 출력하는 프로그램을 작성하고 싶을때 반복문을 배우지 않았다면 아래와 같이 사용할 수 있다.

public class Test {
    public static void main(String[] args) {

        System.out.println("월요일 입니다.");
        System.out.println("화요일 입니다.");
        System.out.println("수요일 입니다.");
        System.out.println("목요일 입니다.");
        System.out.println("금요일 입니다.");
        
    }
}

음... 뭐 나쁘지 않다. 몇줄 안되니까 이렇게 하면 되지... 그런데 이런 반복이 수십, 수백번이 된다면? 수동으로 print문을 두드려야 할까?
이럴때 사용할 수 있는 문법이 반복문이다.


반복문을 사용하면 아래와 같이 표현할 수 있다.

public class Test {
    public static void main(String[] args) {
		
        // 배열로 선언
        final String dayArray[] = {"월", "화", "수", "목", "금"};

		// 반복문을 통해서 출력한다. 심플!
        for (int i=0; i<dayArray.length; i++) {
            System.out.println(dayArray[i] + "요일 입니다.");
        }
    }
}

 

반복문은 while, do while, for, for each 문이 있는데 하나씩 살펴보자.

while 문

while문은 아래와 같이 표현할 수 있다.

        while (True or False) {
            // 구문
            // 구문안에 증감 및 종료 조건이 꼭 필요하다!
        }
  • while 문 안에 조건식을 입력해서 해당 값이 True일 경우 실행하고 아니면 while문을 건너 뛴다.
  • 구문을 실행하고 다시 While 조건문을 확인하는 반복 과정을 계속 한다.
    그! 래! 서! 증감 또는 종료 조건을 가질 수 있도록 while문을 구성해야 한다.
  • 위에서 공부한 break문을 써서 while문을 벗어날 수 있다. 또는 값을 증감을 통해 while 조건식이 False가 되도록 유도할 수 있다.

월요일부터 금요일까지 출력하는 것을 while문을 통해서 해보자.

public class Test {
    public static void main(String[] args) {

        final String dayArray[] = {"월", "화", "수", "목", "금"};

        int i=0;

        while (i < dayArray.length) {
            System.out.println(dayArray[i] + "요일 입니다.");
            i++; //i 값 증가
        }
    }
}
  • index i 값을 통한 조건을 주었으므로 i의 초기값을 0으로 지정한다.
  • while 조건식에서 i 값이 배열의 크기보다 작다면 while 문을 실행한다.
  • i++ 구문으로 i 값을 증가 시킨다.

 

do while 문

do while 문은 while과 크게 보면 동일하나 딱하나의 차이점이 있다.

do while문은 조건을 검사하는 순서가 마지막이다. 즉 구문을 무조건 한번은 수행하고 조건식을 검사한다.

        do { // 1. 무조건 1번은 수행 
            // 구문
            // 구문안에 증감 및 종료 조건이 꼭 필요하다!
        } while (True or False); // 2. 구문을 수행하고 조건을 확인

 

예를 들어서 사용자에게 요일을 입력받고 요일을 판단하는 프로그램이 있다고 하면 무조건 입력은 받아야 한다.
그럴 때 do while문을 통해서 구현할 수 있다.

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        String input = "N"; // 초기값 종료

        do {
            System.out.println("요일을 입력하세요(N: 종료)");
            input = sc.next();

            switch (input) {
                case "월" :
                    System.out.println("월요일 입니다.");
                    break;
                    
                case "화" :
                    System.out.println("월요일 입니다.");
                    break;
                    
                case "수" :
                    System.out.println("월요일 입니다.");
                    break;
                    
                case "목" :
                    System.out.println("월요일 입니다.");
                    break;
                    
                case "금" :
                    System.out.println("월요일 입니다.");
                    break;

                case "N" :
                    System.out.println("프로그램을 종료합니다.");
                    break;

                default :
                    System.out.println("잘못된 입력 입니다. 월~금 까지 입력하세요.");
                    break;

            }

        } while (!input.equals("N")); // 입력이 N이 아니면 실행, 즉 N이 들어오면 프로그램 종료
    }
}

사용자 입력을 받고 해당 값이 월~금에 속하면 해당 요일을 출력하고 N을 입력받으면 종료하는 프로그램이다.
이렇듯 먼저 입력을 받고 판단해야 하는 경우 do while 문을 활용할 수 있다.

for 문

가장 많이 사용하는 반복문이다. 표현식은 아래와 같다.

        for (초기값; 종료여부; 증감분) {
            // 구문
        }

초기값부분, 종료를 결정하는 부분, 증감부분을 통해서 반복을 한다.

월요일부터 금요일까지 출력하는 예제를 통해서 보자

public class Test {
    public static void main(String[] args) {

        final String dayArray[] = {"월", "화", "수", "목", "금"};

        for (int i = 0; i < dayArray.length; i++) {
            System.out.println(dayArray[i] + "요일 입니다.");
        }
    }
}
  • int i = 0 : 초기값이다.
  • i < dayArray.length : 인덱스(i)가 배열의 크기보다 작은지 확인한다. 작으면 구문을 실행하고 같거나 크면 for문을 종료한다.
  • i++ : 인덱스(i)를 하나씩 증가 시킨다. 

for each

for each는 J2SE 5.0부터 추가되었다고 한다. each라는 구분이 따로 있는게 아니고 표현식이 다른 for 문이라고 생각하면 된다.
위의 월요일부터 금요일까지 출력하는 예제를 for each문을 통해서 구현하면 아래와 같이 된다.

public class Test {
    public static void main(String[] args) {

        final String dayArray[] = {"월", "화", "수", "목", "금"};

        for (String item : dayArray) {
            System.out.println(item + "요일 입니다.");
        }
    }
}

이전의 for 문보다 직관적으로 개발자의 의도를 나타낼 수 있다. (배열에서 하나씩 꺼내가겠다는 의도)

for each문의 문법은 아래와 같다.

for (type var: iterate) {
    body-of-loop
}
  • iterate는 루프를 돌릴 객체(위의 예제에서는 스트링 배열)이고 객체에서 하나씩 var에 대입되어 for문을 수행하게 된다.
  • iterate 부분에 들어갈 수 있는 타입은 배열, ArrayList등이 가능하다.

 

참고자료

  • 난 정말 JAVA를 공부한 적이 없다구요. (책)

+ Recent posts