[자바 스터디] 조건문 - 4단원

Jifrozen·2022년 6월 1일
0

자바 스터디

목록 보기
4/14

조건문

1. if

if(조건식) {
    // 조건식이 true일 때 수행될 문장들
}

else 혼용

if(조건식1){
    //조건식1이 true일 때 수행될 문장들
}else if(조건식2){
    //조건식2가 true일 때 수행될 문장들
}else if(조건식3){
    //조건식3이 true일 때 수행될 문장들
}else{
    //위의 모든 조건식들이 false일 때 수행될 문장들
}
  • 위에서부터 순서대로 조건을 검사하다 참인 조건식을 만나면, 해당 블럭{}만 수행하고, 전체 if-else문을 빠져나온다.

2. switch

// 하나의 조건식으로 여러 경우의 수를 처리할 수 있고, if문에 비해 처리시간이 더 짧다.
switch(조건식){
    case1:
        //조건식의 결과가 값1과 일치할 경우 수행될 문장들
        break;
    case2:
        //조건식의 결과가 값2와 일치할 경우 수행될 문장들
        break;
    default:
        //조건식의 결과와 일치하는 case문이 없을 때 수행될 문장들
}
  • break 문이 없으면 참이 된 case부터 모든 case를 모두 수행한다.

향상된 switch - case

JVM 13부터 기존 switch - case 의 문제점을 해결하기 위해 몇가지 개선점이 추가된 switch - case 를 사용할 수 있게 되었습니다.

  • 다중값을 가진 case
  • 반환값을 위한 yield
  • 화살표 연산자( )
  • 코드 블럭
//이전 방식
switch(score){
	case 10 :
	case 9 :
	case 8 :
		System.out.println("A");
		break;
	case 7 :
	case 6 :
	case 5 :
		System.out.println("B");
		break;
	default :
		System.out.println("C");
}

//JVM 13
switch(score){
	case 10, 9, 8 :
		System.out.println("A");
		break;
	case 7, 6, 5 :
		System.out.println("B");
		break;
	default :
		System.out.println("C");
}

yield

switch 문 내에 사용하여 switch 문의 반환값을 갖게 합니다. 따라서 switch 문을 표현식으로 사용할 수 있습니다.

System.out.println(
	switch(score){
		case 10, 9, 8 :
			yield "A";
		case 7, 6, 5 :
			yield "B";
		default :
			yield "C";
	});

String str =
	switch(score){
		case 10, 9, 8 :
			yield "A";
		case 7, 6, 5 :
			yield "B";
		default :
			yield "C";
	}

코드 블럭

case 내에 코드블럭을 사용할 수 있습니다.

화살표

화살표 연산자로 case 를 표현하여 표현식, 구문, 코드 블럭을 사용합니다.

String grade;
switch(score){
	case 10, 9, 8 -> grade = "A";
	case 7, 6, 5 -> grade = "B";
	default -> grade = "C";
}

참고

https://docs.oracle.com/en/java/javase/13/language/switch-expressions.html

반복문

1. for

for(초기화;조건식;증감식){
    // 조건식이 참일 경우 수행될 문장들
}

// example.
for(int i=0;i<10;i++){
    System.out.print(i+" ");
}
// result.
// 0 1 2 3 4 5 6 7 8 9
  • 향상된 for
    • JDK 1.5부터 배열과 컬렉션에 저장된 요소에 접근할 때 더 편리한 방법을 사용할 수 있다.
    • for( 타입 레퍼런스 : Iterable 구현체)
for(타입 변수명 : 배열 또는 컬렉션) {
    // 반복할 문장
}

// example.
int[] nums = {1,2,3,4,5};
for (int num : nums){
    System.out.print(num+" ");
}
// result.
// 1 2 3 4 5

2. while

while(조건식){
    // 조건식이 참일 경우 수행될 문장들
}

do-while

  • while문과 반대로 블럭 {}을 먼저 수행한 후에 조건식을 평가한다. (최소 한 번은 실행된다.)
do {
    // 조건식이 참일 경우 수행될 문장들
} while (조건식);
  • for문과 while문은 서로 변환이 가능하다. 하지만 for문과 달리 while문의 조건식은 생략할 수 없다.
for( ; ; ){ // 항상 true
    // 수행할 코드
}
while() { // 조건식이 없으므로 에러 발생
    // 수행할 코드
}

cf. break문과 continue문의 사용법

  • break문은 자신이 포함된 가장 가까운 반복문을 벗어난다.
  • continue문은 아래의 수행문을 더 이상 수행하지 않고 다음 반복으로 넘어간다.

이름 붙은 반복문

반복문과 break, continue에 이름을 붙여 하나 이상의 반복문을 벗어날 수 있다.

loop1 :
while(true){
	while(true){
		//isTrue()가 true 이면 상위의 반복문으로 이동하여 반복을 계속 진행
		//해당 루프의 출력 1 과 출력 2 모두 continue 됨
		if(isTrue()) continue loop1;
		System.out.println("출력1");
	}
	System.out.println("출력2");
}

Iterartor

Iterator는 Java의 Collection에 저장되어 있는 데이터를 읽어오는 방법을 표준화한 기술 중 하나이다.

hasNext(), next(), remove() 메소드를 이용해 데이터를 뽑아와 사용할 수 있다.

Set<String> set = new HashSet<>();
set.add("안녕");
set.add("hello");
set.add("world");

Iterator<String> it = set.iterator();
while(it.hasNext()){
	//요소 출력 후 다음 요소로 이동
	System.out.println(it.next());

	it.remove(); //요소 삭제
}

LinkedList 알아보기

LinkedList란 Collection 프레임워크의 일부이며 java.util 패키지에 소속되어 있습니다
이 클래스는 데이터가 연속된 위치에 저장되지 않고 모든 데이터가 데이터 부분과 주소 부분을 별도로 가지고 있다.
데이터는 포인터와 주소를 사용하여 연결한다.
ArrayList와 비교하면 각 데이터는 노드라 불리며 배열에서 자주 삽입, 삭제가 이루어지는 경우 빠르고
검색에 있어서는 ArrayList가 더 빠르다. -> LinkedList의 경우 순차탐색으로 진행하기 때문

위의 사진처럼 LinkedList는 데이터부분과 주소부분이 나눠져있어서 선으로 연결된 형태로 이어져있다.

삽입

		@Override
	public ListNode add(ListNode head, ListNode nodeToAdd, int position) {
		ListNode node=head;

		for(int i=0;i<position-1;i++){
			node=node.next;
		}

		nodeToAdd.next=node.next;
		node.next=nodeToAdd;
		return head;

	}
  1. 삽입해야하는 위치까지 순차적으로 node 탐색
  2. 삽입해야하는 위치를 발견하면 다음 nodeToAdd.next 원래 node.next를 넣어줌
  3. 원래 node.next에는 push 하는 node를 넣어준다

삭제

	@Override
	public ListNode remove(ListNode head, int positionToRemove) {
		ListNode node=head;

		if(positionToRemove==0){
			ListNode deleteToNode=node;
			head=node.next;
			deleteToNode.next=null;
			return deleteToNode;
		}
		for(int i=0;i<positionToRemove-1;i++){
			node=node.next;
		}

		ListNode deleteNode=node.next;
		node.next=deleteNode.next;
		deleteNode.next=null;
		return deleteNode;

	}

검색

	@Override
	public boolean contains(ListNode head, ListNode nodeToCheck) {
		ListNode node=head;
		while(node.next!=null){
			if(node.next.data==nodeToCheck.data)
				return true;
			node=node.next;
		}
		return false;
	}

순차적으로 탐색해 값 맞는걸 찾음

Stack

Stack의 특징

  1. 먼저 들어간 자료가 나중에 나옴 LIFO(Last In First Out) 구조
  2. 시스템 해킹에서 버퍼오버플로우 취약점을 이용한 공격을 할 때 스택 메모리의 영역에서 함
  3. 인터럽트처리, 수식의 계산, 서브루틴의 복귀 번지 저장 등에 쓰임
  4. 그래프의 깊이 우선 탐색(DFS)에서 사용
  5. 재귀적(Recursion) 함수를 호출 할 때 사용

배열을 이용한 stack

public class ArrayStack implements Stack{
	int[] stack;
	int top;

	public ArrayStack(int size){
		stack=new int[size];
		top=-1;
	}

	@Override
	public void push(int data) {
		stack[++top]=data;
	}

	@Override
	public int pop() {
		if(top==-1) return top;
		return stack[top--];
	}
}

ListNode를 이용해 Stack

public class ListNodeStack implements Stack{

	int top;
	ListNode listNode;

	public ListNodeStack(){
		top=-1;
		listNode=null;
	}

	@Override
	public void push(int data) {
		ListNode nextNode=new ListNode(data);
		if(listNode==null){
			listNode=new ListNode(data);
			top++;
		}else{
			listNode=listNode.add(listNode,nextNode,++top);
		}
	}

	@Override
	public int pop() {
		if(top==-1){
			return top;
		}
		return listNode.remove(listNode,top--).data;
	}
}

출처

https://github.com/Let-s-Study-Java/EssenceOfJava
https://www.notion.so/Live-Study-4-ca77be1de7674a73b473bf92abc4226a
https://coding-factory.tistory.com/601

https://github.com/whiteship/live-study/issues/4

0개의 댓글