[Java] 자바 제어문

Java Control

최근 백기선님의 자바 스터디를 알게되어서, 한번 자바에 대한 개념을 스터디를 통해서 잡고 가면 좋을 듯해서 글에 대해서 정리해보겠습니다. 아래는 4주차 내용입니다.

공부할 내용

  • 선택문
  • 반복문
  • 과제. JUnit 5
  • 과제. live-study dashboad
  • 과제. Linked List
  • 과제. Stack
  • 과제. ListNode Stack
  • 과제. Queue

제어문이란 코드의 실행을 제어하는 구문을 나타냅니다. 대표적으로 선택문과 반복문 등이 있습니다.


선택문

선택문은 일반적으로 if 문과 swtich 문으로 나눠집니다.

If 문

if 문은 다음과 같은 if (조건문) {실행조건}의 형태를 가집니다. 좀 더 자세하게 설명을 하기 위해서는 해당 코드를 보면서 설명하겠습니다.

public static void ifExample(int caseNum){
  if(caseNum == 1){
    System.out.println("One");
  } else if(caseNum == 2){
    System.out.println("Two");
  } else {
    System.out.println("Others");
  }
}

다음의 경우, caseNum 가 1인 경우, One을 출력하고, caseNum가 2인 경우 Two, 그 외의 경우는 모두 Others가 출력됩니다. if문에서 else ifelse 는 없어도 됩니다.

Switch 문

이와 비슷한 예제문으로 Switch 문이 있습니다. 아래와 같은 형태를 가집니다.

public static void switchExample(int caseNum){
  switch (caseNum) {
    case 1:
      System.out.println("One");
      break;    // 해당 라인이 없으면, 출력으로 One \n Two 가 나오게 됩니다.
    case 2:
      System.out.println("Two");
      break;
    default:
      System.out.println("Others");
      break;
  }
}

위의 if문과 같이 기능은 똑같은 코드입니다. 마찬가지로 default는 생략이 가능합니다. break문을 사용하지 않으면, 해당 조건에서 끝나지 않고, 아래의 조건까지 계속 실행됩니다.


반복문

반복문은 일반적으로 for 문while 문으로 나눠집니다.

for 문

다음 코드는 구구단의 9단을 예시로 만든 코드입니다. for문은 다음과 같이 for(initialization; 종료 조건; 반복 수행){}의 형태를 가지고 있습니다. 특히 처음 for문을 배울 때 신경써야하는 부분은 반복 수행은 마지막에 end state가 만족하지 않는 경우 수행됩니댜.

public static void forExample(){
  for(int i=1; i<10; i++){
    System.out.println(i + " * 9 = " + i*9);
  }
}

while 문

while 문도 이전 코드의 기능과 같습니다. while문은 다음과 같이 while(종료 조건){}의 형태를 구성해야합니다. 마찬가지로 조심해야하는 부분으로 종료 조건이 끝나지 않으면 무한 루프가 발생하여 끝나지 않게됩니다.

public static void whileExample(){
  int i=1;
  while(i<10){
    System.out.println(i + " * 9 = " + i*9);
    i++;
  }
}

이와 비슷하게 do {} while(종료 조건)의 형태가 있습니다. while문과 기능은 비슷하지만, 반드시 한번은 수행된다는 점이 다릅니다.


JUnit 5

이에 관련해서는 기존에 Springboot Test 관련으로 공부한 내용이 있어서, 아래의 글을 참고하면 됩니다.


live-study dashboad

요구사항

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

코드는 아래의 링크에 있습니다.


Linked List

요구사항

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

해당 요구사항을 충족시키는 코드입니다.

public class ListNode {
  int data;
  ListNode next;

  public ListNode() {}

  public ListNode(int data) {
    this.data = data;
  }

  static ListNode add(ListNode head, ListNode nodeToAdd, int position) {
    ListNode target = head;
    for (int i = 0; i < position - 1; i++) {
      target = target.next;
    }
    nodeToAdd.next = target.next;
    target.next = nodeToAdd;
    return nodeToAdd;
  }

  static ListNode remove(ListNode head, int positionToRemove) {
    ListNode target = head.next, before = head;
    for (int i = 0; i < positionToRemove - 1; i++) {
      before = target;
      target = target.next;
    }
    before.next = target.next;
    return target;
  }

  static boolean contains(ListNode head, ListNode nodeTocheck) {
    while (head != null) {
      if (head.equals(nodeTocheck)) return true;
        head = head.next;
      }
      return false;
    }
  }
}

Stack

요구사항

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

해당 요구사항을 충족시키는 코드입니다.

public class Stack {
  List<Integer> stack;

  public Stack() {
    this.stack = new ArrayList<>();
  }

  public void push(int data) {
    this.stack.add(data);
  }

  public int pop() {
    int value = this.stack.get(this.stack.size() - 1);
    this.stack.remove(this.stack.size() - 1);
    return value;
  }
}

ListNode Stack

요구사항

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

해당 요구사항을 충족시키는 코드입니다.

public class ListNodeStack {
  ListNode head;

  public ListNodeStack() {
    this.head = new ListNode();
  }

  public void push(int data) {
    ListNode node = new ListNode(data);
    ListNode curNode = this.head;
    while (curNode.next != null) curNode = curNode.next;

    curNode.next = node;
  }

  public int pop() {
    if (this.head.next == null) throw new IndexOutOfBoundsException();

    ListNode curNode = this.head.next, before = this.head;
    while (curNode.next != null) {
      before = curNode;
      curNode = curNode.next;
    }

    before.next = null;
    return curNode.data;
  }
}

Queue

요구사항

  • 배열을 사용해서 한번
  • ListNode를 사용해서 한번.

해당 요구사항을 충족시키는 코드입니다.

  • 배열을 사용한 코드
public class ArrayQueue {
  int[] queue;
  int head, tail;

  public ArrayQueue(int capacity) {
    this.queue = new int[capacity];
    this.head = -1;
    this.tail = 0;
  }

  public void push(int data) {
    this.queue[++this.head] = data;
  }

  public int pop() {
    if (this.tail > this.head) throw new IndexOutOfBoundsException();
    return this.queue[this.tail++];
  }
}
  • ListNode를 사용한 코드
public class ListNodeQueue {
  ListNode head;

  public ListNodeQueue() {
    this.head = new ListNode();
  }

  public void push(int data) {
    ListNode node = new ListNode(data);
    ListNode cur = this.head;
    while (cur.next != null) cur = cur.next;
      cur.next = node;
  }

  public int pop() {
    int data = this.head.next.data;
    this.head = this.head.next;
    return data;
  }
}