자바 웹 개발 중 공통적으로 처리 해야하는 부분이 생긴다.

 

이 때 각 페이지에서 같은 처리를 지속적으로 해주는 소모 행위를 줄여줄 수 있는 요소가

Filter, Interceptor, AOP 의 개념이다.

 

1. Filter(필터):

  • Servlet에서 요청과 응답을 가로채는 역할
  • 주로 웹 애플리케이션의 보안, 인증, 로깅 등과 같은 전반적인 관심사를 처리하는 데 사용
  • 일반적으로 Servlet API에서 제공하는 javax.servlet.Filter 인터페이스를 구현하여 사용

2. Interceptor(인터셉터):

  • Spring MVC와 같은 프레임워크에서 제공하는 기능 중 하나로, 컨트롤러의 처리 전/후에 특정 로직을 추가하고자 할 때 사용
  • 주로 로깅, 트랜잭션 관리, 권한 검사 등에 활용
  • Spring MVC에서는 HandlerInterceptor 인터페이스를 구현하여 사용

3. AOP(관점 지향 프로그래밍):

  • 관심사를 분리하기 위한 프로그래밍 패러다임 중 하나로, 메소드 실행이나 객체 생성 등과 같은 런타임에 발생하는 특정 시점에 관심 있는 기능을 삽입하는 것을 의미
  • 주로 로깅, 트랜잭션 관리, 보안 등의 관심사를 분리하여 코드 중복을 줄이고 모듈성을 향상시키는 데 사용
  • Spring 프레임워크에서는 AOP를 구현하기 위해 AspectJ와 같은 라이브러리를 사용하거나, Spring AOP 모듈을 통해 구현 가능

Filter, Interceptor, AOP는 모두 애플리케이션의 다양한 부분에 관심사를 적용하고 중복을 줄이며, 유연성을 높이는 데 사용된다. 

Heap 이란?

우선순위큐(Priority Queue)를 구현하기 위한 자료구조이다.

 

우선순위큐

- 특정 우선순위를 정해두고 그 기준으로 만든 큐를 의미한다.
(기존의 큐는 FIFO이지만, 우선순위를 가장 큰 값 또는 가장 작은 값으로 정해놓는 큐를 의미한다.)

우선순위큐는 이진트리(Binary Tree) 형태의 자료구조이다.

그림과 같이 이진트리형태는 왼쪽 위로 차있는 형태이다.

 

이진트리

Max Heap의 Binary Tree

- 부모 노드가 자식 노드보다 작은 값을 가지는 최소 힙(Min Heep)과, 부모 노드가 자식 노드보다 큰 값을 가지는 최대 힙(Max Heap)으로 나눌 수 있다.
- 각 노드는 최대 두 개의 자식 노드를 갖는다.
- 새로운 원소는 일반적으로 힙의 맨 끝에 추가되고, 이후 힙의 성질을 유지하기 위해 적절한 위치로 재배치 된다.
- 최소힙에서는 최소값을, 최대힙에서는 최대값을 추출하는 동작이 빠르다.
- Heap에 쓰이는 이진트리는 느슨한 정렬상태를 유지한다.

 

Heap의 배열 Index 계산법

Heap의 삽입과 삭제

 

'Java > 개념 정리' 카테고리의 다른 글

var 키워드에 대하여  (0) 2024.02.28
JWT(Json Web Token)의 구조  (0) 2024.02.22
연결리스트(LinkedList)  (0) 2023.10.21
HashMap 이란?  (0) 2023.10.20
컬렉션 프레임워크와 주요 인터페이스  (0) 2023.10.09
연결리스트란?

배열의 단점을 보완 시킨 형태.

배열은 크기를 변경할 수 없고 비순차적 데이터의 추가 및 삭제가 어려운 단점이 있다.

(배열은 순차적(연속적) 데이터의 관리에 용이함)

이를 보완하기 위해 고안된 형태가 연결리스트(LinkedList)라고 볼 수 있다.

 

이 둘을 그림으로 비교해 보면,

비연속적 특징을 띄는 LinkedList

연결리스트의 포함요소

배열은 그림과 같이 데이터만을 담고 연속성을 띄고 있는데

연결리스트는 두개의 칸으로 나뉘어 노드로 표현 돼 있는걸 볼 수 있다.

 

노드란 ? 
비연속성의 띄는 연결리스트에서 다음의 데이터가 어디있는지를 알려주는 요소이다.
(배열과 같이 연속성을 띄는 형태에선 자신의 옆이 바로 다음의 요소인걸 알기에 노드가 필요치 않다.)

class Node {
        Node    next;  // 다음 요소의 주소를 저장
        Object obj;     // 데이터를 저장

간단하게 위의 그림에서 연결리스트의 한칸 한칸이 노드이며 그중 위에 있는 부분은 포인터로 불리며 다음 노드를 가르키는 주소가, 아래칸은 요소(데이터)가 담겨 있다.
연결리스트의 장점

얼핏 보면 배열 처럼 연속성의 띄는 형태가 데이터 관리를 더 편하게 할 수 있을 것 같지만,

(배열은 크기가 정해져 있어 추가 작업을 하려면 새로 만들어야한다)

데이터의 추가 및 삭제는 비연속성을 띄는 연결리스트가 더 편리하다.

데이터의 삭제
데이터의 추가

배열과 달리 연결리스트의 크기는 정해져있지 않기에 이와같은 동작이 가능하다.

 

연결리스트의 메서드

- 연결리스트 객체 생성방법

LinkedList list = new LinkedList();

 

1. 값 추가 메서드

- list.addFirst() :  가장 앞에 데이터 추가

- list.addLast() :  가장 뒤에 데이터 추가

- list.add(index, data) : index 위치에 데이터 추가(index 미표기시 가장 뒤에 데이터 추가)

 

2. 값 삭제 메서드

- list.removeFirst() : 가장 앞의 데이터 제거- list.removeLast() : 가장 뒤의 데이터 제거- list.remove(index) : index 위치의 데이터 제거(index 미표기시 가장 앞의 데이터 제거)

- list.clear() : 모든 데이터 제거

 

3. 값 출력

- list.get(index) : index의 데이터 얻기

'Java > 개념 정리' 카테고리의 다른 글

JWT(Json Web Token)의 구조  (0) 2024.02.22
Heap 이란?  (1) 2023.10.22
HashMap 이란?  (0) 2023.10.20
컬렉션 프레임워크와 주요 인터페이스  (0) 2023.10.09
try-catch문의 변수 사용 용도  (0) 2023.10.09
HashMap 이란?

HashMap은 map 인터페이스를 구현한 클래스로 key 와 value 값을 갖는다.

1. Key는 고유한 식별자로 사용되며 HashMap 내에서 value에 접근하는 데 사용 된다.

중복이 불가하며 문자열, 정수등의 자료형으로 저장 된다.

2. value는 key와 연관된 데이터 또는 정보를 저장한다. key를 통해 해당 value에 접근이 가능하며,

중복이 가능하다.

HashMap 순서 X 중복(키X, 값O)

key가 해시함수를 통해 value를 찾아가는 방법

key 값을 해시함수에 넣으면 해시코드를 알려준다(배열의 index). 해당 index로 해당 배열에 접근하여 
찾고자 하는 value를 얻어낸다.
HashMap의 객체 생성 방법
HashMap hashmap = new HashMap();
HashMap의 대표 메서드

1. put(key, value) : key-value 쌍을 추가 한다. 해당 key가 이미 존재한다면 해당 key의 value 값을 새로운 값으로 바꾼다.

2. get(key) : 해당 key에 해당 되는 value를 반환한다. (key가 없는 경우 null 반환)

3. remove(key) : HashMap에서 주어진 key와 연관된 value를 제거 한다.

4. containsKey(key) : key의 존재 여부를 boolean 형식으로 반환

해싱(hashing) 기법으로 데이터를 저장해 데이터가 많아도 검색이 빠르다.
- 많은 데이터를 저장하고 불러오는 작업을 해야할 때 유용하다.

'Java > 개념 정리' 카테고리의 다른 글

Heap 이란?  (1) 2023.10.22
연결리스트(LinkedList)  (0) 2023.10.21
컬렉션 프레임워크와 주요 인터페이스  (0) 2023.10.09
try-catch문의 변수 사용 용도  (0) 2023.10.09
FileWriter와 PrintWriter의 이어 쓰기 방법  (0) 2023.10.09
컬렉션 프레임워크란?


자바에서 데이터를 저장, 관리, 조작하는 데 사용되는 클래스인터페이스의 집합.

데이터를 효율적으로 다루고, 코드의 재사용성을 높이며 프로그램의 성능을 최적화하는 데 도움을 준다.

말 그대로 대표 인터페이스가 구현 돼 있고(추상 메서드와 상수들) 그 인터페이스를 구현하는 클래스들의 집합체라고 이해하면 될 듯. 
대표 인터페이스 및 클래스


1. List 인터페이스

- 순서가 있는 데이터의 집합 (원소들의 순서가 존재하기 때문에 index 관련 메서드를 사용하여 접근 가능)

- 데이터의 중복 허용 (같은 값의 원소의 공존이 허용됨)

- 대표 구현 클래스

  - ArrayList

  - LinkedList

  - Vector

 

2. Set 인터페이스

- 순서가 없는 데이터의 집합 (원소들의 순서가 존재하지 않기 때문에 index 관련 메서드 사용 불가)

- 데이터의 중복 허용 X (같은 값의 원소를 추가시킬 시 한 가지만 인정됨)

- 대표 구현 클래스

  - HashSet

  - TreeSet


3. Map 인터페이스

- 키와 값의 쌍으로 이루어진 데이터 집합

- 순서의 유지 X (키와 값의 쌍이기에 넣는 순서와 무관)

- 대표 구현 클래스

  - HashMap

  - TreeMap

대표 인터페이스의 추상 메서드들이 있고(추상 메서드니까 구현부가 없음) 그 인터페이스를 구현하는 클래스들 마다 메서드의 구현부가 달라진다.
예를 들어 List 인터페이스의 LinkedList 클래스는 addFirst 메서드부가 오버로딩 돼 구현돼 있지만, ArrayList 클래스엔 addFirst 메서드가 구현부 없는 메서드(추상메서드 형태로)로 남아있다.

위의 특징으로 더 나아가 List(String) myList = new LinkedList <>(); 이와 같이 LinkedList 객체를 갖는 List 타입 변수 myList를 만들면 LinkedList 클래스에 구현 돼 있는 메서드를 사용하면서 List 인터페이스에 있는 추상 메서드를 내 방식대로 구현해 함께 사용할 수 있는 장점이 있다.

 

클래스별 사용 용도


List 인터페이스

 

1. ArrayList 클래스

- 수정 작업에 용이, index로의 직접 액세스가 가능해 해당 index 값의 수정이 빠름

- 검색 작업에 용이, index의 직접 액세스 기능으로 검색 속도가 빠름

- 추가 및 삭제가 느림 (LinkedList를 사용해야 하는 이유)

 

2. LinkedList 클래스

- 추가 및 삭제에 용이, LinkedList는 요소들이 노드로 연결돼 있기 때문에 중간에 요소를 추가하거나 삭제하는 게 빠름

노드(Node)의 구성 요소 : 
1. 데이터 요소 : 노드가 저장하는 실제 데이터 값
2. 다음 노드에 대한 링크(참조) : 다음 노드의 위치(주소)를 저장하는 링크
(LinkedList 이름의 유래)

- 수정이 느림, 수정작업을 시행할 때 해당 요소를 처음부터 순회해야 하므로 (노드의 특징) 속도가 늦음

- 검색이 느림, 수정이 느린 이유와 같음

(ArrayList를 사용해야 하는 경우)

결국 해당 요소의 수정 작업ArrayList
기존 요소의 삭제 및 타요소 추가 작업LinkedList

* LinkedList도 index로 접근이 가능하다. 하지만 ArrayList는 해당 요소로 직접 액세스 되는 반면
  LinkedList는 노드를 타고 액세스 되기 때문에 비교적 느리다.

Set 인터페이스

 

1. HashSet 클래스

- 빠른 검색 및 삽입 : 해시 테이블을 기반으로 구현되어 검색 및 요소 삽입이 빠름

해시 테이블이란?
데이터를 저장하고 검색하는 데 사용되는 자료 구조 중 하나
데이터와 데이터에 대한 키(key)를 연관시키는 방식으로 동작한다. (key - value)

데이터의 요소가 키 값이 되며 키 값 > 해시 함수 > 해시 코드 생성 > 해당 코드의 위치에 데이터 저장의 순으로 작업이 이루어진다.
(배열에서 index를 통해 해당 요소를 불러오듯 키값으로 해당 데이터를 불러오기 때문에 속도가 빠름)

- 순서가 없음 : 순서가 중요하지 않은 경우에 적합

- 중복 요소 처리 : 중복된 요소를 효율적으로 처리할 수 있다. 중복된 요소가 추가될 경우 자동으로 하나로 압축 됨

 

2. TreeSet 클래스

- 정렬된 요소 : 이진 검색 트리를 기반으로 구현되어 내부적으로 요소를 정렬한다.

이진 검색 트리란? (Binary Search Tree, BST)
이진 트리의 한 종류로 각 노드가 최대 두 개의 자식 노드를 갖는다.
1. 루트 노트(root node) : 트리의 최상위 노드로써, 모든 다른 노드는 이 루트 노드를 기준으로 왼쪽 서브트리와 오른쪽 서브트리로 나뉜다.
2. 왼쪽 서브트리(Left Subtree) : 루트 노드의 키보다 작은 값들을 가진 노드들로 이루어진 서브트리.
3. 오른쪽 서브트리(Right Subtree) : 루트 노드의 키보다 큰 값들을 가진 노드들로 이루어진 서브 트리.

- 범위 검색 및 순회 : TreeSet은 범위 검색(예:최솟값부터 최댓값까지) 및 순회에 특히 유용. 범위 내의 요소를 검색하거나 반복적으로 처리하기에 용이하다.

 - 정렬된 순서 요구 : 요소들이 정렬된 순서로 피요한 경우 유용

HashSet은 검색 및 삽입 성능이 우수하며 순서가 중요하지 않은 경우에 적합
TreeSet은 정렬과 범위 검색이 필요한 경우 적합

Map 인터페이스

 

1. HashMap 클래스

- 빠른 검색 및 삽입 : HashSet과 같이 해시 함수를 사용하여 데이터 액세스가 빠르다.

- 데이터 순서에 관계없음 : 데이터의 순서와 관계없이 저장되기 때문에 순서가 중요하지 않은 경우 적합.

- 중복 키 처리 : 중복된 키를 허용하지 않기에 같은 키에 대한 새로운 값을 할당하면 이전 값이 대체됨. (해시 함수의 특징)

 

2. TreeMap 클래스

- 데이터 정렬 : 데이커가 키(Key)의 자연 순서 또는 지정된 비교자(Comparator)에 따라 정렬되어 저장된다.

(Map 인터페이스는 기본적으로 순서를 유지하지 않는 특징을 갖지만 TreeMap 클래스는 별개로 순서를 유지함)

- 범위 검색 : TreeMap은 데이터를 정렬하므로 범위에 따라 데이터를 검색하는 데 효율적.

- 검색 및 삽입 속도 느림 : 데이터 정렬을 위해 트리 구조가 사용되다 보니 HashMap 보다 속도가 늦다.

 

데이터를 정렬하여 저장하고 검색해야 하는 경우는 TreeMap
순서 중요  X 및 빠른 데이터 액세스가 필요한 경우는 HashMap

 

'Java > 개념 정리' 카테고리의 다른 글

연결리스트(LinkedList)  (0) 2023.10.21
HashMap 이란?  (0) 2023.10.20
try-catch문의 변수 사용 용도  (0) 2023.10.09
FileWriter와 PrintWriter의 이어 쓰기 방법  (0) 2023.10.09
FileWriter와 PrintWriter의 사용 용도 차이  (0) 2023.10.09

try-catch문을 사용할 때 Exception 이름 옆에 변수를 사용해 주는 것이 일반적이다.

변수의 이름은 정해진 것은 없지만 관례적으로 Excetption의 첫자를 본떠 'e'를 사용한다.

 

예시 1

 

변수 'e'가 선언 돼 있는 모습

위 예제는 변수 e가 선언 됐지만 실제 사용 되고 있진 않다. 즉, 변수 e의 선언이 필수는 아니지만 가독성(나는 아직 모르지만 관례적으로는 사용된다니까)을 위해 사용하는 것이 좋다.

 

예시 2

 

변수 'e'의 선언 후 사용되는 모습

이 예시에서 변수 'e'는 ArithmeticException 예외를 참조하며 'getMessage()' 메소드를 통해 예외 메시지를 출력하고,

'printStackTrace()' 메소드를 호출해 스택 트레이스를 출력한다. 이와 같이 변수를 선언 후 사용해 예외에 대한 자세한 정보를 출력할 수 있다.

 

printStackTrace() 메소드를 사용했을 때 알게 되는 정보

try-catch 문의 Excetption 메시지 옆 변수는 내가 지정할 수 있지만, 관례적으로 'e'를 쓰는 게 보통이다.
사용을 안해도 문제가 되지 않지만 가독성을 위해 사용 해주는 것이 좋다.
해당 변수를 이용해 사용 되는 메서드들이 존재하며 메서드를 이용해 오류에 대한 보다 정확한 정보를 파악할 수 있다.

+ Recent posts