똑같은 삽질은 2번 하지 말자

제어문 조건문 본문

STUDY HALLE

제어문 조건문

곽빵 2021. 1. 25. 16:52

목표

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

TodoList

선택문
반복문

과제 (옵션)

과제 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()을 구현하세요.

과제 5. Queue를 구현하세요.

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

 

선택문

조건문이란 주어진 조건에 따라서 프로그램을 다르게 동작하도록 하는것으로

프로그래밍의 핵심 중의 하나이며 조건문에는 Java에는 대표적으로 if, switch가 있다.

 

 

if (조건) {

   실행내용;

}

 

그리고 같이 알아두어야 할 친구들이 else와 else if가 있다.

 

밑은 if 와 else를 이용한 조건문

public class example1 {
	public static void main(String[] args) {

		if (true) {
			System.out.println("1 조건이 true일때 출력");
		} else { // if문의 조건이 불만족시 실행
			System.out.println("1 조건이 false일때 출력");
		}
		
		if (false) {
			System.out.println("2 조건이 true일때 출력");
		} else {
			System.out.println("2 조건이 false일때 출력");
		}
		
	}
}

결과

if와 else if를 이용한 조건문

public class example1 {
	public static void main(String[] args) {

		if (true) { // 첫번째 조건
			System.out.println("첫번째 조건이 true일때 출력 1");
		} else if(true) { // 두번째 조건
			System.out.println("첫번째 조건이 false이며 두번째 조건이 true이면 실행 1");
		} else {
			System.out.println("위의 조건이 다 불만족시 실행 1");
		}
		
		if (false) { // 첫번째 조건
			System.out.println("첫번째 조건이 true일때 출력 2");
		} else if(true) { // 두번째 조건
			System.out.println("첫번째 조건이 false이며 두번째 조건이 true이면 실행 2");
		} else {
			System.out.println("위의 조건이 다 불만족시 실행 2");
		}
		
		if (false) { // 첫번째 조건
			System.out.println("첫번째 조건이 true일때 출력 3");
		} else if(false) { // 두번째 조건
			System.out.println("첫번째 조건이 false이며 두번째 조건이 true이면 실행 3");
		} else {
			System.out.println("위의 조건이 다 불만족시 실행 3");
		}
	}
}

 

 

반복문

반복문은 말 그대로 반복문이다. 

의도한 만큼 특정 실행을 반복시키는 문법으로 Java에서는 대표적으로 for, while 등이 있다.

 

for 문

http://blog.naver.com/PostView.nhn?blogId=kids_power&logNo=221835856600

public class example1 {
	public static void main(String[] args) {

		for (int i = 0; i < 5; i++) {
			System.out.println(i + "번째 실행중..");
		}
		
	}
}

 

for문을 사용하다 보면 break, continue 라는 구문도 만나게 된다.

break는 그 반복문을 그 즉시 종료시키는 것이고, 

continue는 continue의 밑의 코드를 실행시키지 않고 반복문의 제일 상단의 코드로 돌아간다.

 

break문

public class example1 {
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			if (i == 2) {
				break;
			}
			System.out.println(i + "번째 실행중..");
		}
	}
}

continue문

public class example1 {
	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			if (i == 2) {
				continue;
			}
			System.out.println(i + "번째 실행중..");
		}
	}
}

while 문

while문은 조건식이 참 일때, 계속해서 실행된다.

public class example1 {
	public static void main(String[] args) {
		int i = 0;
		while(i < 5) {
			System.out.println(i + "번째 실행중..");
			i++;
		}
	}
}

과제 0. JUnit 5 학습

xUnit이란?

  • 자바만 단위 테스팅 프레임 워크인 JUnit만 있는게 아니다. 다른 언어도 단위 테스트를 위한 프레임워크가 존재하며 보통 이름을 xUnit이라 칭한다.

우선 J는 Java J이고 Unit는 단위를 의미한다.

즉, Java의 단위테스트 프레임워크라고 생각하면 된다.

자 그럼 간단하게 Service 단위 테스트를 해보고자 한다.

 

TodoListMapper.java(DAO라고 생각하면 된다.)

@Mapper
public interface TodoListMapper {
	List<TodoList>selectTil(String id); // Get TodoList For ID
	
	void insertTil(TodoList til); // Insert TodoList For ID, TITLE, CONTENTS
	
	void updateTil(TodoList til); // Update TodoList For ID, TILNO
	
	void deleteTil(TodoList til); // Delete TodoList For ID, TILNO
}

TodoListServiceImpl.java

@Service
public class TodoListServiceImpl implements TodoListService{
	@Autowired
	private TodoListMapper todoListMapper;
	
	@Override
	public List<TodoList> selectTil(String id) {
		List<TodoList> todoList = todoListMapper.selectTil(id);
		return todoList;
	}
	
	@Override
	public void insertTil(TodoList til) {
		todoListMapper.insertTil(til);
	}
	
	@Override
	public void updateTil(TodoList til) {
		todoListMapper.updateTil(til);
	}
	
	@Override
	public void deleteTil(TodoList til) {
		todoListMapper.deleteTil(til);
	}
	
	@Override
	public HashMap<String, String> pdfOutPut(String id) {
		HashMap<String, String> fileInfoMap = new HashMap<String, String>();
		List<TodoList> todoList = todoListMapper.selectTil(id);
		return null;
	}
}

TodoListServiceTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class TodoListServiceImplTest {
	
	@MockBean
	TodoListMapper todoListMapper;
	
	@InjectMocks
	TodoListServiceImpl todoListService;

	@Before
	public void setMock() {
		/* 테스트 대상 Service에 내가 정의한 Mock들을 주입 */
		MockitoAnnotations.initMocks(this);
		
		List<TodoList>til = new ArrayList<TodoList>();
		til.add(new TodoList("1",1,"1","1","1",1));
		til.add(new TodoList("2",2,"2","2","2",2));
		til.add(new TodoList("3",3,"3","3","3",3));
		til.add(new TodoList("4",4,"4","4","4",4));
		til.add(new TodoList("5",5,"5","5","5",5));
		
		/* Service 단위 테스트를 위해 Mapper에 id1이 주어지면 위의 List를 반환 */
		Mockito.when(todoListMapper.selectTil("id1")).thenReturn(til);
	}
	
	@Test
	public void test_select() {
		/* given */
		String id = "id1";
		
		/* when 
		 * 할 일 몰록 조회 서비스가 요청 됬을때
		 */
		List<TodoList> results = todoListService.selectTil(id);
		
		/* then
		 * 5개의 목록
		 * 내용 비교 */
		assertEquals(
				5, results.size());
		Integer index = 1;
		
		for(TodoList result : results) {
			assertEquals(index.toString(), result.getId());
			assertEquals(index, result.getTilno());
			assertEquals(index.toString(), result.getTitle());
			assertEquals(index.toString(), result.getContents());
			assertEquals(index.toString(), result.getCreatedat());
			assertEquals(index, result.getCompleted());
			
			index++;
		}
	}
}

Test를 할때는

기억해야 하는건 given when then 순으로 구성이 되어지는것!

과제 1. live-study 대시 보드를 만드는 코드를 작성

public class mission_01 {
	
	static final String myToken = "PersonalToken";

	@SuppressWarnings("deprecation")
	public static void main(String[] args) throws IOException{
		/** GitHub API 
		 *  @param Personal Token is required 
		*/
		// GitHub github = new GitHubBuilder().withOAuthToken(myToken).build();
		
		GitHub github = new GitHubBuilder().build();
		GHRepository repo = github.getRepository("whiteship/live-study").getSource();
		List<GHIssue> issueList = repo.getIssues(GHIssueState.ALL);
		Map<String, Integer> participants = new HashMap<String, Integer>();
		
		for (GHIssue issue : issueList) {
			
			List<GHIssueComment> comments = issue.getComments();
			for (GHIssueComment comment : comments ) {
				if (participants.containsKey(comment.getUserName()))
					participants.put(comment.getUserName(), participants.get(comment.getUserName()) + 1);
				else 
					participants.put(comment.getUserName(), 1);
			}
			
			participants.forEach((name ,count) -> {
	            double percent = (double) (count * 100) / issueList.size();
	            System.out.println(name + " : " + String.format("%.2f", percent) + "%");
	        });
			
		}
	}
	
}

과제 2. LinkedList를 구현

Node.java

public class Node<T> {
	
	private T data;
	public Node link;
	
	public Node () {}
	
	public Node (T data) {
		this.data = data;
	}
	
	public Node(T data, Node link) {
		this.data = data;
		this.link = link;
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}
	
}

LinkedList.java

public class LinkedList<T> {
	/* 첫번째 노드 */
	private Node<T> head;
	int size;
	
	public LinkedList() {
		head = null;
		size = 0;
	}
	
	/* Node 삽입 (중간)
	 * @param index 위치 정보
	 * @param data 데이터
	 * 직전의 노드의 연결정보를 새로운 노드에 연결
	 * 직전의 노드는 새로운 노드를 바라보게 한다.
	 * */
	public void addNode(int index, T data) { 
		Node<T> node = new Node<T>(data);
		Node<T> preNode = this.head;
		if(index > this.size) return ;
		
		while(index > 1) { // 이전 노드의 정보가 필요하므로  index > 1 로 
			preNode = preNode.link;
			index--;
		}
		node.link = preNode.link;
		
		preNode.link = node;
		
		this.size++;
	}
	
	/* Node 삽입 (마지막)
	 * @param data 데이터
	 * head가 null이 아니라면 제일 마지막의 노드를 찾아 연결
	 */
	public void addLastNode(T data) {
		Node<T> node = new Node<T>(data);
		
		if (head == null) {
			this.head = node;
		} else {
			Node<T> tempNode = head;
			
			while(tempNode.link != null) {
				tempNode = tempNode.link;
			}
			
			tempNode.link = node;
		}
		this.size++;
		
	}
	
	/* Node 삭제(중간)
	 * @param index 위치 정보
	 */
	public void deleteNode(int index) {
		Node<T> preNode = this.head;
		Node<T> curNode = this.head;
		
		if(index > this.size) return ;
		
		while(index > 0) {
			preNode = curNode;
			curNode = preNode.link;
			index--;
		}
		
		if(!Objects.equals(preNode, curNode)) {
			preNode.link = curNode.link;
		} else {
			head = curNode.link;
		}
		
		this.size--;
		
	}
	
	/* Node 삭제(마지막)
	 */
	public void deleteLastNode() {

		if(this.head == null) return;

		Node<T>node = head;
		Node<T>tempNode = null;
		
		if (node.link == null) {
			this.head = null;
		} else {
			while(node.link != null) {
				tempNode = node;
				node = node.link;
			}
			tempNode.link = null;
		}
		
		this.size--;
	}
	
	/* Node 탐색
	 * @param index 위치정보
	 */
	public Node<T> searchNode(int index) {
		Node<T> node = head;
		
		while(index > 0) {
			node = node.link;
			index--;
		}
		return node;
	}
	
	/* 리스트의 노드를 역순
	 */
	public void reverseList() {
		Node<T> preNode = head;
		Node<T> curNode = head;
		Node<T> nextNode = head.link;
		
		while(nextNode != null) {
			preNode = curNode;
			curNode = nextNode;
			nextNode = nextNode.link;
			
			curNode.link = preNode;
		}
		head.link = null;
		head = curNode;
	}
	
	public void printAll() {
		Node<T> node = head;
		
		while(node != null) {
			System.out.println(node.getData());
			node = node.link;
		}
		System.out.println("------------@@@@@-------------");
	}
	
}

'STUDY HALLE' 카테고리의 다른 글

클래스  (0) 2021.01.31
Comments