CASE 문

모든 명령어에는 조건문이 있다. SQL에서는 IF, CASE문이 그 예인데, 가장 사용을 많이하는 조건문은 CASE문이다.

 

 

 

사용 구문

CASE 
    WHEN [조건절] THEN [TRUE일때값]
    ELSE [FALSE일때값] 
END

 

 

 

 

사용 예시

ID NAME SCORE
1 손흥민 95
2 이강인 85
3 김민재 75
4 황희찬 65

STUDENT 테이블에 담긴 데이터이다.

 

 

 

SELECT ID, NAME, SCORE,
    CASE 
        WHEN SCORE >= 90 THEN 'A'
        WHEN SCORE BETWEEN 80 AND 89 THEN 'B'
        WHEN SCORE BETWEEN 70 AND 79 THEN 'C' 
        WHEN SCORE BETWEEN 60 AND 69 THEN 'D'
        ELSE 'F'
    END AS GRADE
FROM STUDENT

 

GRADE 라는 등급을 나타내기 위해, SCORE 컬럼을 이용한다. WHEN 문에 조건절을 적고, THEN으로 해당 조건이 맞을 경우 반환하는 반환값을 작성한다. ELSE는 위에서 적은 모든 조건문에 해당하는게 없을 경우 반환할 값을 적는다. END로 CASE문의 끝이란 걸 알린다. 그리고 AS로 쓰고 싶은 해당 컬럼의 이름을 작성하면 된다. (GRADE)

 

 

ID NAME SCORE GRADE
1 손흥민 95 A
2 이강인 85 B
3 김민재 75 C
4 황희찬 65 D

 

쿼리 실행결과, CASE 조건문으로 설정한 대로 반환된 GRADE 컬럼을 볼 수 있다.

'DBMS' 카테고리의 다른 글

[Database] DDL, DML, DCL  (0) 2025.01.09
[SQL] 종류별 JOIN  (0) 2023.06.11
[MySQL] 서브쿼리  (0) 2023.05.30
[MySQL] LIMIT 와 LIKE  (0) 2023.05.27
[MySQL] auto_increment  (0) 2023.05.25

Java Collections Framework

Java에서 컬렉션이란 데이터의 집합, 그룹을 의미하며, JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.

 

Java 컬렉션 프레임워크의 상속 구조, Map의 경우 Collection 인터페이스를 상속받지 않지만 Collection으로 분류된다.

 

각 인터페이스 별 설명.

 

 

 

 

 

1. Set 인터페이스

순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.

 

HashSet

- 가장빠른 임의 접근 속도

- 순서 예측 할 수 없음

        HashSet<String> hs = new HashSet<String>();

        hs.add("고양이");
        hs.add("참새");
        hs.add("물고기");

        for(String e : hs) {
            System.out.print(e + ", ");
        }
        // 고양이, 물고기, 참새

 

 

 

TreeSet

- 순서 예측 할 수 없음

- 정렬 방법 지정 가능

        TreeSet<String> ts = new TreeSet<String>();

        ts.add("고양이");
        ts.add("참새");
        ts.add("물고기");

        System.out.println(ts);
        // [고양이, 물고기, 참새]
        ts.remove("참새");      // 참새 삭제
        System.out.println(ts);
        // [고양이, 물고기]
        ts.clear();             // 전체 삭제
        System.out.println(ts);
        // Comparator.reverseOrder()로 내림차순 정렬
        TreeSet<String> ts = new TreeSet<String>(Comparator.reverseOrder());

        ts.add("고양이");
        ts.add("참새");
        ts.add("물고기");

        System.out.println(ts);
        // [참새, 물고기, 고양이]

 

 

 

 

 

 

2. List 인터페이스

순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.

 

LinkedList

- 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치 정보만 수정하면 되기에 유용

- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임

        // 타입설정 int 타입만 적재 가능
        LinkedList<Integer> list = new LinkedList<>();

        // 생성시 초기값 설정
        LinkedList<Integer> list2 = new LinkedList<Integer>(Arrays.asList(1,2));
        LinkedList<String> list = new LinkedList<String>(Arrays.asList("A","B","C"));

        // 가장 앞에 데이터 추가
        list.addFirst("new");
        // 가장 뒤에 데이터 추가
        list.addLast("last");
        System.out.println(list);
        // [new, A, B, C, last]
        // 인덱스 1에 데이터 new 추가
        list.add(1,"new");
        System.out.println(list);
        // [A, new, B, C]

LinkedList 요소 삭제

 

 

 

 

Vector

과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음

 

 

 

 

ArrayList

- 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남

- 일반적인 배열은 처음 선언한 배열의 크기(길이)를 변경할 수 없다. 이를 정적 할당(static allocation)이라고 한다.

- 그러나 ArrayList는 리스트의 길이가 가변적이다. 이를 동적 할당(dynamic allocation)이라고 한다.

        ArrayList<String> list = new ArrayList<>(8); 
        
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        
        // 2번째 인덱스 자리의 요소 삭제
        list.remove(2);
        
        System.out.println(list); // [1, 2, 4, 5]
        
        // list의 데이터를 모두 비운다.
        list.clear();
        
        System.out.println(list); // []

 

 

 

 

 

 

3. Map 인터페이스

키(Key), 값(Value)의 쌍으로 이루어진 데이터의 집합으로, 순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나, 값(Value)의 중복은 허용한다.

 

Hashtable

- HashMap 보다는 느리지만 동기화 지원

- null 불가

 

 

 

HashMap

- 중복과 순서가 허용되지 않으며 null 값이 올 수 있다.

        HashMap<Integer, String> hmap = new HashMap<Integer, String>();

        hmap.put(0,"사과");
        hmap.put(11, "바나나");
        hmap.put(23, "고양이");
        hmap.put(5, "가방");

        System.out.println("키 11의 값 = " + hmap.get(11));
        // 키 11의 값 = 바나나
        
        // 요소 제거 - remove(key)
        hmap.remove(5);

        System.out.println(hmap);
        // {0=사과, 23=고양이, 11=바나나}

 

 

 

TreeMap

- 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름

'자바' 카테고리의 다른 글

[Java] JSON 변환하기 : json-simple  (0) 2024.12.03
[eclipse] 이클립스 셋팅  (0) 2024.01.27
[Java] DB 연결  (0) 2023.07.19
[Java] 익명객체  (0) 2023.07.18
[JAVA] HashMap  (0) 2023.05.17

Automatic Batching

- Batching은 여러가지 작업을 한번에 처리하는 것
- 원래는 state 업데이트 할 때마다 재렌더링이 되지만
- Automatic Batching은 업데이트를 묶어서 한번에 처리해서 재렌더링을 한다.

 

 

 

 

Transitions

- 긴급한 업데이트와 긴급하지 않은 업데이트를 구분해서 처리하기 위한 개념

 

긴급한 업데이트

- 사용자와 직접적인 인터랙션이 일어나는 경우

- 예) 글자 입력, 버튼 클릭 등

 

긴급하지 않은 업데이트

- 사용자와 직접적인 인터랙션이 일어나지 않는 경우

- 예) 서버로부터 결과를 받아와서 보여주는 경우

 

 

 

 

Suspense

- 리액트로 컴포넌트를 작성하다보면 웹 사이트 규모가 커지고, 컴포넌트 사이즈 역시 커진다.

- 그래서 웹 브라우저에서 이렇게 큰 컴포넌트를 한번에 로딩하면 시간이 오래 걸린다.

- Code Splitting : 컴포넌트의 코드를 여러 조각으로 분리,

- 분리된 조각을 동적 로딩기법으로 반응 속도 높힌다.

- Suspense의 역할은 하위 컴포넌트(children)가 준비되기 전까지 렌더링을 중단하는 것

OtherComponent가 준비되기 전 까지 fallback 속성 안에 LoadingSpinner 컴포넌트를 보여주고, OtherComponent가 준비되면 그때 화면에 보여준다.

 

 

 

 

클라이언트와 서버 렌더링 API 업데이트

리액트 DOM 클라이언트

기존의 방식
새로운 방식 (리액트 버전 18)

 

이제 앞으로 렌더링을 하기 위해서는 createRoot()를 사용하는게 좋다. 기존 버전도 물론 되지만, 기존 버전 사용시 리액트 18에서 사용할 수 있는 기능들을 사용하지 못한다.

 

 

 

리액트 DOM 서버

renderToPipeableStream : NodeJs 환경에서 스트리밍을 위한 함수

renderToReadableStream : Edge runtime 환경(예: Deno, Cloudflare workers)을 위한 함수

 

 

 

 

새로운 Strict 모드 작동 방식

- Strict Mode : 개발모드일 때 잠재적인 버그를 찾게 해주는 모드

- 리액트 18에서는 Strict의 모드의 동작이 변경되었는데, 컴포넌트를 언마운트(unmount) 시켰다가 다시 마운트(mount)

 

 

 

 

새롭게 추가된 훅들

useId()

- 서버와 클라이언트에서 고유한 ID값을 생성하기 위한 훅

- 다만 리스트를 렌더링 할 때, map 함수 내에서 사용하는 엘리먼트의 키로 사용하지 않음

 

useTransitions()

- 위에서 보여줬던 긴급하지 않은 업데이트를 위한 훅

- 기본적으로 일반적인 상태 업데이트는 긴급한 업데이트로 처리되고,

- useTransitions() 이나 startTransitions() 으로 긴급하지 않은 업데이트들을 모아서 처리할 수 있음

 

useDeferredValue()

- 긴급하지 않은 업데이트를 재렌더링하는 걸 연기할 수 있게하는 훅

- 짧은 시간에 한가지 상태의 업데이트가 여러번 발생하게 되면, 최종 상태값만을 업데이트 하면 된다.

 

useSyncExternalStore()

- 외부 저장소를 구독할 수 있게하는 훅

- 외부 저장소를 React 컴포넌트의 State와 연동해서 사용하고 싶을 때 사용.

- 애플리케이션 코드가 아닌 라이브러리에서 사용하기 위한 것이라 입문자들이 사용할 일은 거의 없음

 

useInsertionEffect()

- CSS인 JS 라이브러리를 위한 훅

- 렌더링 과정에서 style 삽입의 성능 문제를 해결하게 해줌

- 위의 useSyncExternalStore() 훅 처럼 일반적인 리액트 개발자들이 사용할 일은 거의 없음

'React' 카테고리의 다른 글

[React] react-router-dom v6  (0) 2024.08.30
[React] styled-component  (0) 2024.08.23
[React] Context  (0) 2024.08.21
[React] Composition 방법과 Inheritance  (0) 2024.08.20
[React] 실습 : 섭씨온도, 화씨온도 표시하기  (0) 2024.08.19

+ Recent posts