티스토리 뷰
목표
자바가 제공하는 제어문을 학습하세요.
스터디 목차
- 선택문
- 반복문
- 과제 0. JUnit5 학습
- 과제 1. live-study 대시보드 만드는 코드 작성
- 과제 2. LinkedList 구현
- 과제 3. Stack 구현
- 과제 4. ListNode를 사용해서 Stack 구현
- 과제 5. Queue 구현
1. 선택문
조건문(선택문)은 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문이다.
1) if 문
if 문은 조건식의 결과가 참이면 주어진 명령문을 실행하며, 거짓(false)이면 아무것도 실행하지 않는다.
int a = 0;
if(a < 10){ // a가 10보다 작을경우만 실행한다.
a++;
}
2) if / else 문
if 문과 함께 사용하는 else 문은 if문과는 반대로 주어진 조건식의 결과가 거짓(false)이면 주어진 명령문을 실행한다.
int a = 0;
if(a < 10){
a++;
}
else { // if 문 조건식에 결과가 거짓이 나올경우에 실행됨
a--;
}
3) if / else if / else 문
else if 를 사용하면 조건식을 여러 개 명시할 수 있으므로 중첩된 if 문을 좀 더 간결하게 표현할 수 있다.
int a = 0;
if(a < 10){
a++;
}
else if(a == 15){ // if문에서 거짓인 경우 else if 문에서 조건식 검사한다.
a-=2;
}
else{
a--;
}
4) switch 문
switch 문은 if / else 문과 마찬가지로 주어진 조건 값의 결과에 따라 프로그램이 다른 명령을 수행하도록 하는 조건문이다.
이러한 switch문은 if / else 문보다 가독성이 더 좋으며, 컴파일러가 최적화를 쉽게 할 수 있어 속도 또한 빠른편이다.
int a = 2;
switch (a){
case 1:
System.out.println(1);
break;
case 2:
System.out.println(2);
break;
case 3:
System.out.println(3);
break;
default: // 위에 나열된 case에 해당하지 않을경우에 출력
System.out.println("default");
}
각 case절 및 default 절은 반드시 break 키워드를 포함하고 있어야 한다.
break 키워드는 조건 값에 해당하는 case절이나 default절이 실행된 뒤에 전체 switch문을 빠져나가게 해준다.
만약 break 키워드가 없다면, 조건에 해당하는 switch문의 case절 이후의 모든 case절이 전부 실행 될 것이다.
2. 반복문
반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문이다.
프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로, 가장 많이 사용되는 제어문중 하나이다.
1) while 문
while문은 조건식이 참인지를 판단하여, 참이면 내부의 명령문을 실행하고 내부의 명령문을 전부 실행하고 나면, 다시 조건식으로 돌아와 또 한 번 참인지를 판단하게 된다.
while문 내부에 조건식의 결과를 변경하는 명령문이 존재하지 않을때는 프로그램이 무한반복을 하게 된다.
int a = 0;
while (a < 10){ // 조건식이 false가 날 때 까지 계속 반복한다.
a++; // 이 문장이 없으면 while문은 무한반복을 하게된다.
}
2) do / while 문
while 문은 루프에 진입하기 전에 먼저 조건식부터 검사한다.
하지만 do / while 문은 먼저 루프를 한번 실행한 후에 조건식을 검사한다.
즉, do / while 문은 조건식의 결과와 상관없이 무조건 한 번은 루프를 실행한다.
int a = 0;
do{
a++; // a++ 먼저 수행하고 while 조건식에 들어가게된다.
}while (a < 10); // 조건이 맞으면 위에 실행문 반복
3) for 문
for 문은 while문과는 달리 자체적으로 초기식, 조건식, 증감식을 모두 포함하고 있는 반복문이다.
따라서 while문 보다는 좀 더 간결하게 반복문을 표현할 수 있다.
for(int i=0; i<10; i++){ // 초기식, 조건식, 증감식
System.out.println(i); // i를 0부터 9까지 출력
}
4) Enhanced for 문 (for-each 문)
배열을 for문 보다 간단하게 출력할 수 있다는 장점이 있다.
그런데 for-each 문은 값을 참조할 때만 유용하고 값을 변경할때는 조금 부적절한 모습을 보인다.
int arr[] = {1,2,3,4,5};
for(int num : arr){
System.out.println(num);
}
과제 0. JUnit5 학습
- 인텔리J, 이클립스, VS Code에서 JUnit 5로 테스트 코드 작성하는 방법에 익숙해 질 것.
- 이미 JUnit 알고 계신분들은 다른 것 아무거나!
- 더 자바, 테스트 강의도 있으니 참고하세요~
- JUnit이란?
JUnit은 자바 프로그래밍 언어용 유닛 테스트 프레임워크이다. JUnit은 테스트 주도 개발 면에서 중요하며, SUnit과 함께 시작된 XUnit이라는 이름의 유닛 테스트 프레임워크 계열의 하나이다.
JUnit4 이후부터는 테스트를 지원 어노테이션을 제공한다.(@Test @Before @After 등)
assert 메서드로 테스트 케이스의 수행 결과를 판별한다.(ex. assertEquals(예상값, 실제값))
- 기본 Annotation
@Test
테스트 메서드임을 선언
@BeforeAll
해당 어노테이션이 달린 메서드가 현재 클래스의 모든 테스트 메서드보다 먼저 실행된다.
@BeforeEach
해당 어노테이션이 달린 메서드가 각 테스트 메서드 전에 실행된다.
@DisplayName
테스트 클래스 또는 테스트 메서드의 이름을 정의할 수 있다.
@Disabled
테스트 클래스 또는 메서드를 비활성화 할 수 있다.
@AfterEach
해당 어노테이션이 달린 메서드가 현재 클래스의 모든 테스트 메소드 보다 이후에 실행된다.
@AfterEach
해당 어노테이션이 달린 메서드가 각 테스트 메서드 이후에 실행된다.
- JUnit5 Assertions
assertAll()
구문 오류시 예외를 발생시키지 않으면서 한번에 모든 구문을 확인 할 수 있다.
assertEquals()
실제값과 예상값이 같은지 확인한다.
assertTrue()
다음 조건이 참인지 확인
- IntelliJ, JUnit5 연동하기
Gradle 에 JUnit5를 사용하기 위해서, 의존성을 추가해준다.
과제 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)를 구현하세요.
import org.w3c.dom.Node;
public class LinkedList {
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 String toString(){
// return String.valueOf(this.data);
// }
}
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);
temp1.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 static void main(String[] args){
LinkedList numbers = new LinkedList();
numbers.addFirst(10);
numbers.addLast(20);
numbers.add(1,15);
numbers.remove(1);
System.out.println(numbers); // toString 메소드 안불러줘도 객체를
// print찍으면 자바에서는 알아서 toString메소를 찾아서 출력해준다.
}
}
과제 3. Stack을 구현하세요.
- int 배열을 사용해서 정수를 저장하는 Stack을 구현하세요.
- void push(int data)를 구현하세요.
- int pop()을 구현하세요.
import java.util.Scanner;
public class Stack { // 스택구현
static int stack[] = new int[10000];
static int size;
public static void main(String[] args){
int n;
Scanner sc = new Scanner(System.in);
System.out.println("몇번 입력할것인가");
n = sc.nextInt();
Stack s;
while (true) {
String cmd;
System.out.println("무엇을 진행할 것인가");
cmd = sc.next();
if (cmd.equals("push")) {
int num;
System.out.println("데이터를 입력해주세요");
num = sc.nextInt();
Stack.push(num);
} else if (cmd.equals("top")) {
//System.out.println((Stack.empty() ? -1 : Stack.top()));
if (!Stack.empty()) {
System.out.println(Stack.top());
}
} else if (cmd.equals("size")) {
System.out.println(Stack.size);
} else if (cmd.equals("empty")) {
System.out.println(Stack.empty());
} else if (cmd.equals("pop")) {
//System.out.println((Stack.empty() ? -1 : Stack.top()));
if (!Stack.empty()) {
System.out.println(Stack.pop());
}
}
if(n==0){
break;
}
n--;
}
}
public Stack(){
size = 0;
}
public static void push(int data){
stack[size]=data;
size += 1;
}
public static boolean empty(){
if(size == 0){
return true; //비어있음
}
else
return false;
}
public static int pop(){
if(empty()){
return -1;
}
else {
size -= 1;
return stack[size];
}
}
public static int top(){
if(empty()){
return -1;
}
else {
return stack[size - 1];
}
}
}
과제 4. 앞서 만든 ListNode를 사용해서 Stack을 구현하세요.
- ListNode head를 가지고 있는 ListNodeStack 클래스를 구현하세요.
- void push(int data)를 구현하세요.
- int pop()을 구현하세요.
import java.util.NoSuchElementException;
import java.util.concurrent.ExecutionException;
public class NodeStack<T> { // 노드로 스택 구현
class Node<T>{
private T data;
private Node<T> next;
public Node(T data){
this.data = data;
}
}
private Node<T> top;
public T pop(){
if (top == null){
throw new NoSuchElementException();
}
T item = top.data; // 데이터 백업
top = top.next;
return item;
}
public void push(T item){
Node<T> t = new Node<>(item);
t.next = top;
top = t;
}
public T peek(){
if(top == null){
throw new NoSuchElementException();
}
return top.data;
}
public boolean isEmpty(){
return top == null;
}
public static void main(String[] args) {
NodeStack<Integer> s = new NodeStack<>();
s.push(1);
s.push(2);
s.push(3);
s.push(4);
System.out.println(s.pop());
System.out.println(s.pop());
System.out.println(s.peek());
System.out.println(s.pop());
System.out.println(s.isEmpty());
System.out.println(s.pop());
System.out.println(s.isEmpty());
}
}
과제 5. Queue를 구현하세요.
- 배열을 사용해서 한번
- ListNode를 사용해서 한번.
- 배열 사용
public class Queue {
private Object[] queue;
private int size = 0;
private int rear = -1;
private int front = -1;
Queue(int size) {
this.size = size;
this.queue = new Object[size]; // 사이즈 만큼 큐 생성
}
public void enQueue(Object data) {
// 먼저 큐가 꽉 차있는지를 검사
if(isFull()) {
throw new QueueOverflow();
}
queue[++rear] = data;
}
public Object deQueue() {
// 먼저 큐가 비어있는지를 검사
if(isEmpty()) {
throw new QueueUnderflow();
}
++front;
Object temp = queue[front];
queue[front] = null;
// 비어있다면 다시 원점으로 초기화
if(isEmpty()) {
rear = -1;
front = -1;
}
return temp;
}
public boolean isFull() {
return rear == size - 1 ? true : false;
}
public boolean isEmpty() {
return front == rear ? true : false;
}
public int getSize() {
return size;
}
static class QueueOverflow extends RuntimeException {
}
static class QueueUnderflow extends RuntimeException {
}
}
- ListNode 사용
import java.util.NoSuchElementException;
public class NodeQueue<T> {
class Node <T>{
private T data;
private Node<T> next;
public Node(T data){
this.data = data;
}
}
private Node<T> front; // front에서 삭제가 일어남 front랑 rear랑 같은곳에 있다가 들어올수록 rear는 뒤로 밀림
private Node<T> rear; // rear에서 삽입이 일어남
public void add(T item){
Node<T> t = new Node<T>(item);
if(rear != null){
rear.next = t;
}
rear = t;
if(front == null){
front = rear;
}
}
public T remove(){
if(front == null){
throw new NoSuchElementException();
}
T data = front.data;
front = front.next;
if(front == null){
rear = null;
}
return data;
}
public T peek(){
if(front == null){
throw new NoSuchElementException();
}
return front.data;
}
public boolean isEmpty(){
return front == null;
}
public static void main(String[] args){
NodeQueue<Integer> q = new NodeQueue<>();
q.add(1);
q.add(2);
q.add(3);
q.add(4);
System.out.println(q.remove());
System.out.println(q.remove());
System.out.println(q.peek());
System.out.println(q.remove());
System.out.println(q.isEmpty());
System.out.println(q.remove());
System.out.println(q.isEmpty());
}
}
+
테스트 코드 작성법 공부 테스트 코드 만들어보기
Reference
gmlwjd9405.github.io/2019/11/26/junit5-guide-basic.html
'Live Study' 카테고리의 다른 글
[JAVA 스터디] 6주차 과제 : 상속 (0) | 2020.12.24 |
---|---|
[JAVA 스터디] 5주차 과제 : 클래스 (0) | 2020.12.18 |
[JAVA 스터디] 3주차 과제 : 자바 다양한 연산자 학습 (0) | 2020.11.28 |
[JAVA 스터디] 2주차 과제 : 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.21 |
[JAVA 스터디] 1주차 과제: JVM은 무엇이며 JAVA 코드는 어떻게 실행하는것인가. (0) | 2020.11.15 |