
public class WsJavaLiveStudy | |
{ | |
public static final GITHUB_URL = "https://github.com/whiteship/live-study"; | |
public static final YOUTUBE_URL = "https://www.youtube.com/user/whiteship2000"; | |
public static void main(String[] args) | |
{ | |
System.out.println("아래 내용은 백기선님과 함께하는 Java 라이브 스터디 과제 내용입니다."); | |
System.out.println("Github 에서 주차별 과제 내용을 확인하실 수 있으며, 매주 토요일 오후 10시30분 Youtube에서 라이브로 피드백 받고있습니다."); | |
System.out.println("깃허브 주소 : %s", GITHUB_URL); | |
System.out.println("유튜브 주소 : %s", YOUTUBE_URL); | |
} | |
} |
목표
자바가 제공하는 제어문을 학습하세요.
학습할 것
선택문
반복문
과제
과제 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()을 구현하세요.
(optional) 과제 5. Queue를 구현하세요.
- 배열을 사용해서 한번
- ListNode를 사용해서 한번.
선택문
표현식의 값에 따라 수행할 코드의 위치를 변경하는 문장을 선택문이라고 하며, Java에서는 switch-case문이 제공된다.
switch문의 기본 구조
switch(조건식) { case 값1 : // 조건식의 결과가 값1과 동일한 경우 수행되는 코드들 break; case 값2 : // 조건식의 결과가 값2과 동일한 경우 수행되는 코드들 break; default : // 조건식의 결과와 일치하는 case문이 없을 때 수행되는 코드들 }
switch문은 조건식을 먼저 연산하고 그 결과와 일치하는 case문으로 이동한다. 만약 break문을 사용하지 않으면, 위 구조에서 조건식의 결과가 값1일 때, 첫번째 case문이 수행되고 그 이후의 모든 case문을 수행한다.
switch문에는 제약조건이 2개 있는데, 아래와 같다.
- switch문의 조건식 결과는 정수이거나 문자열이어야 한다.
- case문의 값은 정수 상수만 가능하며, 중복되지 않아야 한다.
위 제약조건을 코드로 한 번 확인해보자.
public class Switch { public static void main(String[] args) { int a = 10; final int B = 3; String c = "TEST"; final String D = "HI"; int condition = 0; switch (condition) { case 1 : break; // O : 정수 상수이므로 가능 case a : break; // X : 상수가 아니어서 불가능 case '1' : break; // O : 문자 상수->정수 상수 49이므로 가능 case B : break; // O : 정수 상수이므로 가능 case c : break; // X : 문자열이므로 불가능 } String strCondition = ""; switch (strCondition) { case '1' : break; // X : char 타입이어서 불가능 case c : break; // X : 상수가 아니어서 불가능 case D : break; // O : 문자열 상수이므로 가능 case "TEST" : break;// O : 문자열 상수이므로 가능 } } }
간단히 예제를 만들어봤다.
public class Switch { public static void main(String[] args) { int random = (int)((Math.random()*10000)%10); switch (random) { case 1: case 2: case 3: System.out.printf("1 ~ 3 사이의 값이에요. -> %d", random); break; case 4: case 5: case 6: System.out.printf("4 ~ 6 사이의 값이에요. -> %d", random); break; default: System.out.printf("그 외의 값이에요. -> %d", random); } } }
4 ~ 6 사이의 값이에요. -> 5
반복문
반복문은 어떤 작업이 반복적으로 수행되도록 할 때 사용된다.
- for 문
- while 문
- do-while 문
for문이나 while문과 달리, do-while문은 조건과는 별개로 무조건 최소한 한 번은 수행되는 것이 보장된다.
for 문
for 문은 반복 횟수를 알고 있을 때 적합하다. 그 이유는 아래 for 문의 예제를 보면 알 수 있다.
for(int idx = 0; idx < 5; idx++) { System.out.printf("idx is %d%n", idx); }
위 for 문은 블럭({}) 내의 문장을 idx 변수가 0부터 4가 될때 까지, 총 5회 수행한다.
- int idx = 0; -> 정수형 자료형 변수 idx를 선언 및 0으로 초기화 한다.
- idx < 5; -> idx가 5 이상일 경우 거짓이 되어 반복을 종료한다.
- idx++ -> 1회 반복시 마다 idx 값에 1을 더한다.
for 문은 초기화, 조건식, 증감식, 블럭 4부분으로 이루어져있으며, 조건식이 참인 동안 블럭 내 코드가 수행되고, 조건식이 거짓이 되면 반복을 종료한다.
for(초기화; 조건식; 증감식) { // 블럭 }
그리고 동작 순서는 아래와 같다.
- 초기화
- 조건식
- (조건식이 참일 경우) 블럭 내 코드
- (조건식이 참일 경우) 증감식
- for 문 밖 다음 라인 코드
초기화
반복문에 사용되는 변수를 초기화할 수 있으며, 처음 한 번만 수행된다. 대부분 하나의 변수를 사용하나, 두 개 이상의 변수도 사용 가능하다. 하지만 이 경우에는 변수들의 타입이 모두 같아야한다.
public class ForExample { public static void main(String[] args) { for(int foo = 0, bar = 10; foo < 5 && bar > 0; foo++, bar-=3) { System.out.printf("foo is %d%n", foo); System.out.printf("bar is %d%n", bar); } } }
foo is 0 bar is 10 foo is 1 bar is 7 foo is 2 bar is 4 foo is 3 bar is 1
위 예제 코드와 같이 사용할 수 있다. 단, 가독성이 (개인적으로) 매우 떨어지기 때문에 이렇게 사용하는 것은 지양하도록 하자.
조건식
조건식은 결과가 참(true)일 경우 반복을 계속하고, 거짓(false)일 경우 반복을 중단시켜준다. 조건식을 잘못 작성하면 무한루프에 빠질 수 있으므로, 주의하자.
증감식
초기화에서 선언, 초기화한 변수의 값을 증감시켜준다. 보통 ++ 이나 -- 를 많이 사용한다.
중첩 for 문
for 문안에 for 문을 작성하는 것을 중첩 for 문이라고 한다. 횟수 제한은 없다.
예제로 구구단 3단까지를 중첩 for 문으로 작성해보자.
public class MultiTable { public static void main(String[] args) { for(int idx = 1; idx <= 3; idx++) { for(int mtl = 1; mtl <= 9; mtl++) { System.out.printf("%d * %d = %d%n", idx, mtl, idx * mtl); } } } }
1 * 1 = 1 1 * 2 = 2 1 * 3 = 3 1 * 4 = 4 1 * 5 = 5 1 * 6 = 6 1 * 7 = 7 1 * 8 = 8 1 * 9 = 9 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 3 * 1 = 3 3 * 2 = 6 3 * 3 = 9 3 * 4 = 12 3 * 5 = 15 3 * 6 = 18 3 * 7 = 21 3 * 8 = 24 3 * 9 = 27
유명한 별찍기도 한 번 해보자.
public class StarTree { public static void main(String[] args) { for(int idx = 0; idx < 5; idx++) { for(int idx2 = 0; idx2 <= idx; idx2++) { System.out.print("*"); } System.out.println(""); } } }
* ** *** **** *****
향상된 for 문
JDK 1.5 부터 배열이나 컬렉션 내 요소에 접근할 때 좀 더 편리한 방법으로 접근할 수 있는 문법이 추가되었다.
for(요소타입 변수명 : 컬렉션) { // 로직 수행 }
컬렉션의 길이만큼 반복문이 수행되고, 수행 차수에 해당하는 순서의 요소를 변수에 담아 제공한다. 아래 예제로 기존 for 문과 향상된 for 문을 비교해보자.
public class BetterFor { public static void main(String[] args) { String[] strArr = {"가", "나", "다", "라"}; // 기존 for 문 for(int idx = 0; idx < strArr.length; idx++) { System.out.println(strArr[idx]); } // 향상된 for 문 for (String str : strArr) { System.out.println(str); } } }
수행 시 결과는 둘 다 동일하다. 향상된 for 문을 사용하면 코드가 좀 더 간결해지고 컬렉션 내 요소를 간편히 사용할 수 있지만, 배열 또는 컬렉션에만 사용할 수 있다는 제약이 있다.
while 문
while 문은 for 문보다 구조가 더 간단하다.
while(조건식) { // 로직 }
조건식의 결과가 참인 동안 블럭 내 코드가 계속해서 반복되며, 조건식은 생략할 수 없다.
예제 코드로 for 문과 비교해보자.
public class ForWhile { public static void main(String[] args) { // for 문 for(int idx = 0; idx < 10; idx++) { System.out.println(idx); } // while 문 int idx = 0; while(idx < 10) { System.out.println(idx); idx++; } } }
do-while 문
do-while 문은 while 문의 변형으로, 기본 구조는 while 문과 동일하며, 조건식과 블럭의 순서를 바꾼 것이다.
때문에 while 문과 반대로 블럭을 먼저 수행한 뒤에 조건식을 평가해 반복 여부를 체크한다.
이것은 조건식의 결과가 거짓이어도 최소한 한 번의 수행은 보장하는 것을 의미한다.
do { // 로직 } while(조건식);
예제 코드를 보자.
public class DoWhile { public static void main(String[] args) { do { System.out.println("hello world"); } while(false); } }
hello world
과제
과제 0. JUnit5 학습하세요.
과제 1. live-study 대시 보드를 만드는 코드를 작성하세요.
사전 준비 : Github 계정에 Personal access token 생성
- Github에 로그인해 계정 세팅 페이지로 이동한다.
- Developer settings 메뉴를 선택한다.
- Personal access token 메뉴를 선택한다.
- Generate new token 버튼을 클릭한다.
- Note 란에 원하는 이름을 작성하고, repo 체크박스를 체크한 뒤 Generate Token 버튼을 클릭한다.
- 생성된 토큰 값을 복사해두고 사용한다.

과제 결과
https://github.com/ParkIlHoon/whiteship-study/tree/master/src/main/java/com/example/week4/task1
과제 2. LinkedList를 구현하세요.
과제 결과
https://github.com/ParkIlHoon/whiteship-study/tree/master/src/main/java/com/example/week4/task2
과제 3. Stack을 구현하세요.
과제 4. 앞서 만든 ListNode를 사용해서 Stack을 구현하세요.
(optional) 과제 5. Queue를 구현하세요.
'☕️ JAVA > WhiteShip Java LIVE Study' 카테고리의 다른 글
[WhiteShip Java LIVE Study] 6주차 : 상속 (0) | 2021.02.17 |
---|---|
[WhiteShip Java LIVE Study] 5주차 : 클래스 (2) | 2020.12.25 |
[WhiteShip Java LIVE Study] 3주차 : 연산자 (0) | 2020.11.30 |
[WhiteShip Java LIVE Study] 2주차 : 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.20 |
[WhiteShip Java LIVE Study] 1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) | 2020.11.15 |