Skip to the content.

목표:자바가 제공하는 제어문을 학습하세요.

학습할 것(필수)

선택문

다중 if문 대신 사용하며,조건문의 일종으로 볼 수 있다.

if문을 여러 개 사용하면 실행 속도가 느려지기때문에 사용한다.

switch함수의 매개변수에 들어오는 값에 따라 로직을 실행한다.

int num = 3;

        switch (num % 2) {

            case 0:
                System.out.println(num + "은(는) 짝수입니다.");
                break;
            case 1:
                System.out.println(num + "은(는) 홀수입니다.");
                break;
        }

추가적으로 while문과 if문,Scanner 클래스를 이용하여 선택문을 작성할 수 있다.

import java.util.Scanner;

public class 응용선택문 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        boolean run = true;
        while (run) {
            System.out.println("숫자를 입력하세요[0~3]");
            int num = scan.nextInt();

            if (num == 0) {
                System.out.println("입력한 숫자는" + num);
            } else if (num == 1) {
                System.out.println("입력한 숫자는" + num);
            } else if (num == 2) {
                System.out.println("입력한 숫자는" + num);
            } else {
                System.out.println("입력한 숫자는" + num);
            }
        }
    }
}

반복문

말그대로 특정구간에 반복문을 위치하여 그 구간의 코드만 자도으로 반복시켜주는 것이다.

종류로는 for문과 while(do while)문이 있다.

for문

for (int i = 0; i < 10; i++) {
            System.out.print(i);
            if (i != 9) {
                System.out.print(',');
            }
        }
        설명
        int i = 0//처음에 시작을 정하는 코드
        i<10//몇번까지 돌리는지 정하는 코드
        i++//차례대로 1씩 증가시킨다는 코드 != i--
        그다음 i로 숫자를 카운팅하여 출력하되,
        만약  숫자가 9 아니면 ',' 찍을  있게 하는 코드
        //결과
        0,1,2,3,4,5,6,7,8,9

while문

for문과 거의 비슷하지만 문법은 살짝 다르다.

        int i = 0;
        while (i < 10) {
            System.out.print(i);
            if (i != 9) {
                System.out.print(',');
            }
            i++;
        }
        //결과
        0,1,2,3,4,5,6,7,8,9

do while문

        int i = 0;
        do {
            System.out.println("Java");//조건식이 참(true)일 때 출력되는 문장
        } while (i == 5);
        //해석
        조건식(i==5) 결과가 거짓인데도 불구하고 최소 한번 실행이되고 반복문이 종료된다.
        int i = 5;
        do {
            System.out.println("Java");//조건식이 참(true)일 때 출력되는 문장
        } while (i == 5);
        //해석
        조건식(i==5) 참이게 되므로 무한 반복이 실행된다.

break문

해당 구간및 조건에 해당된다면 정지 및 종료를 실행한다.

continue문

해당 구간및 조건에 해당된다면 다음 코드로 넘어가게 된다.

과제(옵션)

과제 0.JUnit 5 학습하기

먼저 필자는 뉴비이므로 기초로 접근을 하겠다.(내용출처)

1.테스트할 디렉토리를 만든다

먼저 테스트 디렉토리를 만든다음 오른쪽 마우스를 눌러 모듈설정 열기 클릭을 하면 해당 창이 뜬다.

여기서 테스트 폴더를 선택 후 다음으로 표시:테스트를 클릭하여 해당 디렉토리를 테스트 디렉토리로 만들어준다.

2.테스트할 코드를 작성한다.

public class Multiplier {

    public int Multiply(int a, int b){
        return a * b;
    }

    public int Multiply(int a, int b, int c){
        return a * b * c;
    }
}

해당 코드를 작성 후 커서를 맨 위에 올리고 가만히 있으면

왼쪽에 전구모양이 뜬다.이 버튼 누르고 테스트 생성을 클릭한다.

그러면 이런 창이 뜰 것이다.본인은 이미 JUnit을 다운받았으므로 해당 버튼이 없는데

파일이 없을땐 라이브러리 테스트 항목 밑에 fix또는 설치라는 버튼이 생성되면 최신 버전에 맞춰 JUnit파일을 다운받는다.

그리고 밑에 테스트코드를 위한 메서드들을 체크하여 확인을 눌러준다.

3.테스트파일 생성후

파일이름Test 라는 파일이 생성되면 해당 코드를 작성한다.

import org.junit.Test;

import static org.junit.Assert.*;

public class MultiplierTest {

    @Test
    public void multiply() {
        Multiplier multiplier = new Multiplier();
        assertEquals(multiplier.Multiply(8,9),72);
    }

    @Test
    public void multiply1() {
        Multiplier multiplier = new Multiplier();
        assertEquals(multiplier.Multiply(2,3,4),20);
    }
}

해당코드는 처음에 작성한 코드의 메서드 오버로딩을 테스트하는 것으로써

assert시리즈를 사용하여 검증을 한다.일단 assertEquals 메서드는 괄호의 양쪽 객체가 일치함을 확인하는 메서드 이다.

   
Assert 메서드 종류 설명
assertArrayEquals(a, b) 배열 a와 b가 일치하는지 확인
assertEquals(a, b) 객체 a와 b가 일치하는지 확인(객체에 정의되어 있는 equals를 통해 비교)
assertSame(a, b) 객체 a와 b가 같은 객체임을 확인(객체 자체를 비교한다.==)
assertTrue(a) 조건 a가 참인지 확인
assertNotNull(a) 객체 a가 null인지 확인

4.실행

마지막인 실행 단계이다.

실행을 하면 첫번째 메스드는 맞으나 두번째 메서드는 실패했다고 알린다.

이유는 왼쪽값과 오른쪽의 값이 다르기 때문이다.(그러므로 수정할땐 오른쪽값을 24로 수정하면 완료)

과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.(추후 추가예정)

###

과제2.LinkedList를 구현하세요.(출처)

먼저 대표적으로 사용하는 Collection중 하나인 ArrayList를 먼저 설명하고 LinkedList 설명으로 넘어가겠다.

ArrayList는 내부적으로 데이터를 배열에서 관리하여 데이터를 추가,삭제를 위해 아래와 같이 임시 배열을 생성해서

데이터를 복사하는 방법으로 동작한다.

ArrayList(출처)

ArrayList list = new ArrayList();//타입 미설정 Object로 선언된다.
ArrayList<Student> members = new ArrayList<Student>();//타입설정 Student객체만 사용가능
ArrayList<Integer> num = new ArrayList<Integer>();//타입설정 int타입만 사용가능
ArrayList<Integer> num2 = new ArrayList<>();//new에서 타입 파라미터 생략가능
ArrayList<Integer> num3 = new ArrayList<Integer>(10);//초기 용량(capacity)지정
ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(1,2,3));//생성시 값추가

LinkedList(선언출처)

LinkedList는 데이터와 그옆의 데이터를 저장하는 주소가 같이 붙어있다고 생각하면 된다.

위에 ArrayList와 같이 데이터 추가,삭제시 불필요한 복사가 없어 데이터의 추가,삭제시에 유리한 반면

데이터의 검색시에는 처음부터 데이터를 순회해야하기 때문에 성능상 떨어진다.

LinkedList list = new LinkedList();//타입 미설정 Object로 선언된다.
LinkedList<Student> members = new LinkedList<Student>();//타입설정 Student객체만 사용가능
LinkedList<Integer> num = new LinkedList<Integer>();//타입설정 int타입만 사용가능
LinkedList<Integer> num2 = new LinkedList<>();//new에서 타입 파라미터 생략가능
LinkedList<Integer> list2 = new LinkedList<Integer>(Arrays.asList(1,2));//생성시 값추가

정수를 저장하는 ListNode 클래스를 구현(코드참조)

import java.util.LinkedList;

class ListNode {
    private Node head;
    private Node tail;
    private int size = 0;

    private class Node {
        private Object data;
        private Node next;

        public Node(Object input) {
            this.data = input;
            this.next = null;
        }
    }

    public void addFirst(Object input) {
        Node newNode = new Node(input);
        newNode.next = head;
        head = newNode;
        size++;
        if (head.next == null) {
            tail = head;
        }
    }

    public void addLast(Object input) {
        Node newNode = new Node(input);
        if (size == 0) {
            addFirst(input);
        } else {
            tail.next = newNode;
            tail = newNode;
            size++;
        }
    }

    Node node(int index) {//위치찾기
        Node x = head;
        for (int i = 0; i < index; i++) {
            x = x.next;
        }
        return x;
    }

    public void add(int k,Object input) {
        if (k == 0) {
            addFirst(input);
        } else {
            Node temp1 = node(k - 1);
            Node temp2 = temp1.next;
            Node newNode = new Node(input);
            temp2.next = newNode;
            newNode.next = temp2;
            size++;
            if (newNode.next == null) {
                tail = newNode;
            }
        }
    }

    public String toString() {
        if (head == null) {
            return "[]";
        }
        Node temp = head;
        String str = "[";
        while (temp.next != null) {
            str += temp.data + ",";
            temp = temp.next;
        }
        str += temp.data;
        return str + "]";
    }

    public Object removeFirst() {
        Node temp = head;
        head = head.next;
        Object returnData = temp.data;
        temp = null;
        size--;
        return returnData;
    }

    public Object remove(int k) {
        if (k == 0) {
            return removeFirst();
        }
        Node temp = node(k - 1);
        Node todoDeleted = temp.next;
        temp.next = temp.next.next;
        Object returnData = todoDeleted.data;
        if (todoDeleted == tail) {
            tail = temp;
        }
        todoDeleted = null;
        size--;
        return returnData;
    }

    public Object removeLast() {
        return remove(size - 1);
    }
}

public class Ex1 {
    public static void main(String[] args) {
        LinkedList numbers = new LinkedList();
        numbers.addFirst(10);
        numbers.add(1, 15);
        numbers.addLast(20);
        numbers.remove(1);
        System.out.println(numbers);
    }
}

과제 3. Stack을 구현하세요.(참조)

stack의 특징

1.먼저 들어간 자료가 나중에 나오는 LIFO(Last in First Out) 구조

2.시스템 해킹ㅇ[서 버퍼오버플로우 취약점을 이용한 공격을 할 때 스택 메모리의 영역에서 한다.

3.인터럽트처리,수식의 계산,서브루틴의 복귀 번지 저장 등에 쓰인다.

4.그래프의 깊이 우선 탐색(DFS)에서 사용

5.재귀 함수를 호출 할 때 사용

선언법

 Stack<Integer> stack = new Stack<>();//int형 스택 선언
 Stack<String> stack = new Stack<>();//char형 스택 선언

Stack을 구현하세요.(추후 추가예정)

과제 4. 앞서 만든 ListNode를 사용해서 Stack을 구현하세요.(추후 추가예정)

과제 5. Queue를 구현하세요.(참조)(추후 추가예정)

Queue의 사전적 의미는 무엇을 기다리는 사람,차량 등의 줄 혹은 줄을 서서 기다리는 것을 의미하는데

처럼 지어 순서대로 처리되는 큐라는 자료구조이다.

큐는 데이터를 일시적으로 쌓아두기 위한 자료구조로 스택과는 다르게 FIFO(First In First Out)의 형태를 가진다

FIFO 형태는 뜻 그대로 먼저 들어온 테이터가 가장 먼저 나가는 구조를 말한다.

Enqueue:큐 맨 뒤에 데이터 추가

Dequeue:큐 맨 앞쪽의 데이터 삭제

Queue의 특징

1.먼저 들어간 자료가 먼저 나오는 구조

2.큐는 한 쪽 끝은 front로 정하여 삭제 연산만 수행

3.다른 한 쪽 끝은 rear로 정하여 삽입 연산만 수행

4.그래프의 넓이 우선 탐색에서 사용

5.컴퓨터 버퍼에서 주로 사용,마구 입력이 되었으나 처리를 하지 못할 때,버퍼(큐)를 만들어 대기 시킴

선언법

import java.util.LinkedList; //import
import java.util.Queue; //import
Queue<Integer> stack = new LinkedList<>(); //int형 queue 선언, linkedlist 이용
Queue<String> stack = new LinkedList<>(); //String형 queue 선언, linkedlist 이용

자바에서 큐는 LinkedList를 활용하여 생성해야 한다. 그렇기에 Queue와 LinkedList가 다 import되어 있어야 사용이 가능하다.Queue queue = new LinkedList<>()와 같이 선언해주면 된다.