# 선택문:
if(condition){
if condition is true this block of statements will be executed
} else if(condition){
if condition is true this block of statements will be executed
} else{
if none of condition is true, then this block of statements will be executed
}
switch문 표현식은 byte,short,int,long,enum 유형 ,String 및 Byte, Short, Int 및 Long과 같은 일부 Wrapper 유형일 수 있다.(단 switch 표현식에서만 wrapper를 허용하고, case에는 Wrapper를 허용하지 않는다.) switch() 대괄호 사이에는 변수 또는 표현식만 넣을수있다.
케이스값은 리터럴 또는 상수여야한다.
각 케이스는 고유해야한다. 중복 케이스 값을 생성하면 컴파일타임 오류가 발생한다.
각 케이스에는 선택적인 break문이 있다. switch 내부에서 명령문 시퀀스를 종료하고 switch 표현식 다음의 컨트롤로 점프하는데 사용된다.
어떤 경우에도 break문을 사용하지 않으면 break문에 도달할때까지 다음 case로 실행이 된다.
swtich case에 해당하는 경우가 없으면 default가 실행된다.
switch(조건식):{
case 값1:
실행코드
break;
case 값2:
실행코드
break;
case 값3:
실행코드
break;
default: case에 해당하는 값이 없을때 실행할 코드
break;
}
조건이 거짓이 될떄까지 블록을 반복적으로 실행한다.
1. for문: 사용자가 코드 블록을 여러번 실행하려는 경우 사용한다.
for(initialization;condition;increment/decremetn){
//body of for loop
}
while(condition){
// body of while loop
}
Iterable<E>
를 상속받은 객체 또한가능 하다.for(변수타입 변수명: 루프를 돌릴 객체){
// 실행코드
}
String[] tmp ={"귤","감","토마토"}
for(String e: tmp){
System.out.println(e);
}
JUnit은 Java 에코 시스템에서 가장 인기있는 단위 테스트 프레임 워크 중 하나이다.
JUnit5 버전에는 Java 8 이상의 새로운 기능을 지원하고 다양한 스타일의 테스트를 가능하게 해준다.
JUnit 5는 세가지 하위 프로젝트(junit platform + junit jupiter + junit vintage)의 여러 모듈로 구성된다.
Junit 4가 단일 jar였던 것에 반해, Junit5는 junit platform,junit jupiter,junit vintage 모듈 세가지로 구성되어 있다.
junit platform:
junit jupiter:
junit vintage:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class CalculatorTest {
private final Calculator calculator = new Calculator();
@Test
void addition() {
assertEquals(2,calculator.add(1,1));
}
}
Junit5에서 제공하는 org.junit.jupiter.api 패키지 내의 어노테이션을 설명합니다.
@Test:
@Test
void test(){
//...
}
@BeforeEach:
@AfterEach:
@BeforeAll:
@AfterAll:
@ExtendWith:
@Disabled:
@ParameterizedTest:
@ParameterizedTest
@ValueSource(Strings={"gildong})
void test(String name){
//...
}
@RepeatedTest(3)
void test(){
//...
}
@TestFactory
Collection<DynamicTest> dynamicTestsFromCollection() {
return Arrays.asList(dynamicTest("1st dynamic test", () -> assertEquals(6, 3 * 2)),
dynamicTest("2nd dynamic test", () -> assertEquals(4, 2 * 2)));
}
@TestMethodOrder:
@DisplayName:
@DisplayNameGeneration :
테스트 클래스에 사용자 지정 표기 이름을 명시.
예시:
import org.junit.jupiter.api.*;
public class HelloJavaTest {
@BeforeAll
static void beforeAll(){
System.out.println("beforeAll");
}
@AfterAll
static void afterAll(){
System.out.println("afterAll");
}
@BeforeEach
void beforeEach() {
System.out.println("beforeEach");
}
@AfterEach
void afterEach() {
System.out.println("afterEach");
}
@Test
void test1() {
System.out.println("test1");
}
@Test
void test2() {
System.out.println("test2");
}
@Test
void test3() {
System.out.println("test3");
}
}
JUnit 4와JUnit5는 일부 어노테이션에서도 차이가 있다.
이전에 junit4 기반으로 작성된 파일들은 위에서 설명했던 것과 같이 junit4-vingtage-engine이 있다면 자동으로 Junit Platform 런처에서 Junit3,4기반 테스트 코드를 선택한다. 이미 만들어진 junit 4 파일을 5버전으로 수정할 필요는 없다.
의존성추가:
출처:링크텍스트
통신 확인
연결코드:
import org.kohsuke.github.GitHub;
import org.kohsuke.github.GitHubBuilder;
import java.io.IOException;
public class Application {
public void connectGithub(String token) throws IOException{
GitHub github = new GitHubBuilder().withOAuthToken(token).build();
github.checkApiUrlValidity();
}
}
테스트 코드 :
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class ApplicationTest {
Application githubApi = new Application();
@Test
void test(){
String token = "<Personal Access Token>";
try{
githubApi.connectGithub(token);
}catch (Exception e) {
fail();
}
}
}
테스트코드를 실행해보면 실패라고 나온다. token에 깃허브에서 직접 생성한 토큰을 넣자.
좌측하단에 developer settings를 클릭하자.
Personal access tokens 클릭.
Persional access token > Generate new token.
repo에 대한 권한만 있으면 될것같으니 repo만 체크하고 생성
생성한 토큰을 복사하여 token 변수에 세팅한 뒤 테스트 통과
package javaStudy;
import org.apache.commons.lang3.tuple.Pair;
import org.kohsuke.github.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;
public class GithubApi {
public List<Pair<String,Double>> getParticipationRates(String token,String repoName) throws IOException{
GitHub gitHub = new GitHubBuilder().withOAuthToken(token).build(); // 1
gitHub.checkApiUrlValidity();
GHRepository repo = gitHub.getRepository(repoName); // 2
List<GHIssue> issues = repo.getIssues(GHIssueState.ALL); // 3
// key==name, value=cnt
Map<String,Integer> memberCnts = new HashMap<>();
for(GHIssue issue : issues){
// get participants name
List<String> participantsNames = issue.getComments().stream().map(comment ->{
try{
return comment.getUser().getName();
}catch (IOException e){
throw new RuntimeException(e);
}
}).distinct().collect(toList());
participantsNames.forEach(name -> memberCnts.merge(name,1,Integer::sum));
}
int issueCnt = issues.size();
List<Pair<String,Double>> participationRate = new ArrayList<>();
for(String key: memberCnts.keySet()){
participationRate.add(Pair.of(key,(double)memberCnts.get(key)/ issueCnt * 100));
}
return participationRate;
}
}
사용한함수:
참고: 링크텍스트
테스트클래스:
package javaStudy;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class GithubApiTest {
GithubApi githubApi = new GithubApi();
@Test
void githubConnetTest() {
String token = "<Personal token>";
String repoName = "whiteship/live-study";
List<Pair<String, Double>> rates = new ArrayList<>();
try {
rates = githubApi.getParticipationRates(token, repoName);
} catch (Exception e) {
fail();
}
rates.forEach(rate -> System.out.println(rate.getLeft()+ ":" + rate.getRight()));
}
}
결과창:
package me.whiteship.livestudy.Review4;
public class LinkedList {
private ListNode head;
private ListNode tail;
private int size = 0;
public class ListNode{
private int data;
private ListNode nextNode;
public ListNode(int data) {
this.data = data;
nextNode = null;
}
@Override
public String toString() {
return String.valueOf(this.data);
}
}
public void addFirst(int data){
ListNode newNode = new ListNode(data);
newNode.nextNode = head;
head = newNode;
size++;
if(newNode.nextNode==null){
tail = head;
}
}
public void addLast(int data){
ListNode newNode = new ListNode(data);
if(size == 0 ){
addFirst(data);
}else{
tail.nextNode=newNode;
tail = newNode;
size ++;
}
}
public ListNode listNode(int index){
ListNode x = head;
for (int i = 0; i < index; i++) {
x = x.nextNode;
}
return x;
}
public void add(int index,int data){
if(index==0){
addFirst(data);
} else{
ListNode tmp1 = listNode(index-1);
ListNode tmp2 = tmp1.nextNode;
ListNode newNode = new ListNode(data);
tmp1.nextNode = newNode;
newNode.nextNode= tmp2;
size++;
if(newNode.nextNode==null){
tail = newNode;
}
}
}
public String toString(){
if(head==null)
return " ";
ListNode tmp = head;
String str ="";
while(tmp.nextNode!=null){
str += tmp.toString() + ",";
tmp = tmp.nextNode;
}
str += tmp.toString();
return str+" ";
}
public int removeFirst(){
ListNode tmp = head;
head = tmp.nextNode;
int deleteData = tmp.data;
tmp = null;
size--;
return deleteData;
}
public int remove(int index){
if(index == 0) {
return removeFirst();
}
ListNode tmp = listNode(index-1);
ListNode toDoDelete = tmp.nextNode;
tmp.nextNode = toDoDelete.nextNode;
int deleteData = toDoDelete.data;
if(toDoDelete == tail){
tail = tmp;
}
toDoDelete = null;
size--;
return deleteData;
}
public int contain(int data){
int index = -1;
ListNode tmp = head;
for (int i = 0; i < size; i++) {
if(tmp.data==data){
return i;
}
tmp = tmp.nextNode;
}
return index;
}
public static void main(String[] args) {
LinkedList numbers = new LinkedList();
numbers.addFirst(1);
numbers.addLast(3);
numbers.add(1,2);
numbers.addLast(4);
System.out.println("삽입완료");
System.out.println(numbers.toString());
System.out.println();
System.out.println("첫번째원소삭제");
numbers.removeFirst();
System.out.println(numbers.toString());
System.out.println();
System.out.println("1번 인덱스 원소삭제");
numbers.remove(1);
System.out.println(numbers.toString());
System.out.println();
System.out.println("0번 인덱스 원소삭제");
numbers.remove(0);
System.out.println(numbers.toString());
}
}
package me.whiteship.livestudy.Review4;
public interface stack {
public void printStack();
public boolean isFull();
public boolean isEmpty();
public void pop();
public void push(int data);
}
package me.whiteship.livestudy.Review4;
public class ArrayStack implements stack {
private int size;
private int topIndex;
private int[] arr;
public ArrayStack(int size) {
this.size = size;
topIndex = -1;
arr = new int[size];
}
@Override
public void printStack() {
int index = topIndex;
while(index!=-1){
System.out.print(arr[index] + " ");
index--;
}
System.out.println();
}
@Override
public boolean isFull() {
if(topIndex == size-1){
return true;
}else{
return false;
}
}
@Override
public boolean isEmpty() {
if(topIndex==-1){
return true;
}
else{
return false;
}
}
@Override
public void pop() {
if(isEmpty()){
System.out.println("Stack Empty");
return;
}
arr[topIndex]=0;
topIndex--;
}
@Override
public void push(int data) {
if(isFull()){
System.out.println("Stack full");
return;
}
arr[++topIndex] = data;
}
public static void main(String[] args) {
ArrayStack array = new ArrayStack(10);
System.out.println("1번째");
System.out.println(array.isEmpty());
System.out.println(array.isFull());
System.out.println();
System.out.println("2번째");
array.push(1);
array.push(2);
array.push(3);
array.printStack();
System.out.println("3번째");
array.push(1);
array.push(2);
array.push(3);
array.pop();
array.printStack();
}
}
package me.whiteship.livestudy.Review4;
public class LinkedListStack extends LinkedList implements stack {
public LinkedListStack() {
}
@Override
public void printStack() {
System.out.println(this.toString());
}
@Override
public boolean isFull() {
return false;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public void pop() {
this.removeFirst();
}
@Override
public void push(int data) {
this.addFirst(data);
}
public static void main(String[] args) {
LinkedListStack linkedListStack = new LinkedListStack();
linkedListStack.push(1);
linkedListStack.push(2);
linkedListStack.push(3);
linkedListStack.printStack();
linkedListStack.pop();
linkedListStack.pop();
linkedListStack.printStack();
System.out.println(linkedListStack.tail.toString());
}
}
package me.whiteship.livestudy.Review4;
public interface queue {
boolean isEmpty();
boolean isFull();
void push(int data);
Object offer();
Object remove();
String toString();
}
package me.whiteship.livestudy.Review4;
public class ArrayQueue implements queue{
private int front;
private int rear;
private int max;
private int[] arr;
public ArrayQueue(int max) {
this.max = max;
this.front=0;
this.rear= 0;
arr = new int[this.max];
}
@Override
public boolean isEmpty() {
return (front>rear);
}
@Override
public boolean isFull() {
return (rear==(max-1));
}
@Override
public void offer(int data) {
if(isFull()) throw new ArrayIndexOutOfBoundsException();
arr[rear++] = data;
}
@Override
public Object peek() {
if(isEmpty()) throw new ArrayIndexOutOfBoundsException();
return arr[front];
}
@Override
public Object remove() {
Object item = peek();
front++;
return item;
}
public String toString(){
String str="";
int first = front;
int last = rear;
while(first<last){
str += arr[first] + " ";
++first;
}
return str;
}
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(10);
queue.offer(1);
queue.offer(2);
queue.offer(3);
queue.offer(4);
String r = queue.toString();
System.out.println(r);
queue.remove();
queue.remove();
r = queue.toString();
System.out.println(r);
queue.remove();
r = queue.toString();
System.out.println(r);
}
}
package me.whiteship.livestudy.Review4;
public class LinkedListQueue extends LinkedList implements queue {
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean isFull() {
return false;
}
@Override
public void offer(int data) {
this.addLast(data);
}
@Override
public Object peek() {
return this.head.toString();
}
@Override
public Object remove() {
int deleteValue = removeFirst();
return deleteValue;
}
public static void main(String[] args) {
LinkedListQueue linkedListQueue = new LinkedListQueue();
linkedListQueue.offer(1);
linkedListQueue.offer(3);
linkedListQueue.offer(5);
linkedListQueue.offer(2);
linkedListQueue.offer(4);
System.out.println(linkedListQueue.toString());
linkedListQueue.remove();
linkedListQueue.remove();
linkedListQueue.remove();
System.out.println(linkedListQueue.toString());
System.out.println(linkedListQueue.peek());
}
}
큐 샘플:
package week4;
import java.util.LinkedList;
import java.util.Queue;
public class QueueSample {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(1); // Queue의 사이즈가 찼을때, null값 리턴
queue.add(1); // Queue의 사이즈가 찼을때, exception 리턴
queue.peek();// Queue의 사이즈가 비어있을때 , null값 리턴
queue.remove(); // Queue의 사이즈가 비어있을때 , exception 리턴
}
}