Java 26

모듈간 예외 처리 전략

모듈화 된 시스템은 각 모듈이 독립적으로 기능을 수행할 수 있도록 만들어 준다. 그리고 각 모듈에서 발생하는 예외는 어떻게 관리하고 전달할지에 대한 고민이 필요하다.    평소에 예외 처리 전략을 공통으로 발생하는 예외와 모듈에서 발생할 수 있는 예외 이렇게 구분해서 사용하고 있었다. 아래 영상을 보면서  "모듈로 구성할 때, 해당 모듈에서 발행하는 예외는 그 모듈 내에 두어야 한다." 를 알게 되었다.  https://www.youtube.com/watch?v=bjaiaEEllMI     모듈화 된 시스템의 원칙 중 하나는 모듈은 스스로 독립적일 수 있어야 한다.    즉, 모듈은 다른 시스템에 의존하지 않고, 독립적으로 기능을 수행할 수 있어야 한다.      그래서 예외 처리할 때는 모듈에서 발생하..

Java/Java 2025.02.09

[알고리즘] 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)

그래프를 탐색하는 방법에는 깊이 우선 탐색(DFS)과 너비 우선 탬색(BFS)가 있습니다.   1. 깊이 우선 탐색(DFS) Root Node 혹은 다른 임의의 Node에서 최대한 깊이 내려간 뒤, 더 이상 깊이 갈 곳이 없을 경우 옆 Branch로 이동하는 탐색 방법입니다.  즉, 해당 분기를 완벽하게 탐색하는 방법입니다.   특징모든 노드를 방문하고자 하는 경우(완전 탐색)미로 찾기, 퍼즐 문제검색 속도는 너비 우선 탐색(BFS)에 비해서 느림모든 경로를 한 번에 탐색하지 않기 때문에 너비 우선 탐색(BFS)보다 메모리 사용량이 적을 수 있음   Java 코드 (Stack을 사용해서 구현)class Graph { private int V; // Number of vertices privat..

CS/알고리즘 2024.08.04

[자료구조] Set (Java) & HashSet이 정렬이 되는 이유

Set (Java)   Set 이란? Set은 수학적 집합을 표현한 중복되지 않은 요소들의 집합이다.이를 통해 교집합, 합집합, 차집합 등을 구현할 수 있다.     Set 특징- 입력된 데이터의 순서를 보장하지 않는다.- 데이터의 중복을 허용하지 않는다.- 인덱스가 없기 때문에 Iterator를 사용해서 조회한다.    Set은 언제 사용하는지? 1) 중복된 데이터 제거 2) 특정 값이 존재 여부 확인    - HashTable로 구현되어있기 때문에, 특정 값이 존재하는지 여부를 빠르게 조회할 수 있습니다. 3) 집합 연산    - 합집합, 교집합, 차집합 등의 연산이 가능합니다.     Java - Set 인터페이스 구현 클래스 1) HashSet- 입력 순서를 보장하지 않으며, 데이터 중복을 허용하..

CS/자료구조 2024.07.27

[Java] 자주 사용하는 Stream 정리

1. 정렬(sort) 1) 다중 조건 정렬 list .stream() .sorted(Comparator.comparing(ChangeBean::getLocation) .thenComparing(ChangeBean::getTarget)) .collect(Collectors.toList()); 2) 데이터 비교 후 정렬 (람다식 사용) List lineData = list.stream() .sorted((o1, o2) -> o2.get("name").toString().compareTo(o1.get("name").toString())) .collect(Collectors.toList()); 3) 정렬시 nullable 할 경우 null 처리 //기존 list.stream().sorted(Comparator...

Java/Java 2024.03.15

[자료구조] Array / ArrayList / LinkedList 특징

1. Array / ArrauyList / LinkedList 특징 요약   ArrayArrayListLinkedList공통점1. 원소의 중복을 허용하고 순서를 유지한다.2. 인덱스를 이용해 원소들을 관리한다.차이점1. Array의 length와 data type을 함께 선언한다. (고정적)2. length를 미리 설정했기 때문에 해당 인덱스에 값을 넣지 않을 경우 타입별로 선언된 default 값으로 return 한다. (아래 결과값 참고)1. 데이터 조회(get())-> Index로 조회를 해서 속도가 빠르다.2. 데이터 삽입(add())과 삭제(remove())-> 원하는 index에 add()와 remove()를 할 수 있지만, index를 지정을 하면 나머지 원소들이 움직여야한다. (데이터 양이..

CS/자료구조 2023.03.31

[이펙티브 자바] Item 79 과도한 동기화는 피하라.

핵심 정리 교착상태와 데이터 훼손을 피하려면 동기화 영역 안에서 외계인 메서드를 절대 호출하지 말자. 일반화해 이야기하면, 동기화 영역 안에서의 작업은 최소한으로 줄이자. 가변 클래스를 설계할 때는 스스로 동기화해야 할지 고민하자. 멀티코어 세상인 지금은 과도한 동기화를 피하는 게 과거 어느 때보다 중요하다. 합당한 이유가 있을 때만 내부에서 동기화하고, 동기화했는지 여부를 문서에 명확히 밝히자. 이번 아이템에서는 과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고, 심지어 예측할 수 없는 동작을 낳기도 한다. 응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대로 클라이언트에 양도하면 안 된다. 예를 들어 동기화된 영역 안에서는 재정의할 수 있는 메서드는 호출하면 안 ..

[이펙티브 자바]Item 73 추상화 수준에 맞는 예외를 던지라.

핵심 정리 아래 계층의 예외를 예방하거나 스스로 처리할 수 없고, 그 예외를 상위 계층에 그대로 노출하기 곤란하다면 예외 번역을 사용하라. 이때 예외 연쇄를 이용하면 상위 계층에는 맥락에 어울리는 고수준 예외를 던지면서 근본 원인도 함께 알려주어 오류를 분석하기에 좋다. 메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버릴 때 발생하는 일 1. 수행하려는 일과 관련 없어 보이는 예외가 발생 2. 내부 구현 방식을 드러내어 윗 레벨 API를 오염 3. 구현 방식을 바꾸면 다른 예외가 튀어나와 기존 클라이언트 프로그램을 깨지게함 예외 번역(exception translation) 상위 계층에서 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던지는 것이다. /** * 이 리스트 안의 지정한 위..

[이펙티브 자바] Item 72 표준 예외를 사용하라.

핵심 정리 더 많은 정보를 제공하고 싶은 경우에는 표준 예외를 확장해도 좋다. 하지만 예외는 직렬화할 수 있는데, 직렬화에는 많은 부담이 따르므로 예외를 새로 만들지 않는 것을 권장된다. (자바 라이브러리는 대부분 API에서 쓰기에 충분한 수의 예외를 제공한다.) 표준 예외를 재사용시 장점 1. 자신의 API가 다른 사람이 익히고 사용하기 쉬워진다. 많은 프로그래머에게 이미 익숙해진 규약을 그대로 따르기 때문이다. 2. 자신의 API를 사용한 프로그램도 낯선 예외를 사용하지 않게 되어 읽기 쉽다. 3. 예외 클래스 수가 적을수록 메모리 사용량도 줄고 클래스를 적재하는 시간도 적게 걸린다. 예외 예외 주요 쓰임 예시 IllegalArgumentException 허용하지 않는 값이 인수로 건네졌을 때(nul..

[이펙티브 자바] Item 61 박싱된 기본 타입보다는 기본 타입을 사용하라.

핵심 정리 기본 타입과 박싱된 기본 타입 중 하나를 선택해야 한다면 가능하면 기본 타입을 사용하라. 기본 타입은 간단하고 빠르다. 박싱된 기본 타입을 써야 한다면 주의를 기울이자. 오토박싱이 박싱된 기본 타입을 사용할 때의 번거러움을 줄여주지만, 그 위험까지 없애주지 않는다. 두 박싱된 기본 타입을 == 연산자로 비교한다면 식별성 비교가 이뤄지는데, 이는 여러분이 원한 게 아닐 가능성이 크다. 같은 연산에서 기본 타입과 박싱된 기본 타입을 혼용하면 언박싱이 이뤄지며, 언박싱 과정에서 NullPointerException을 던질 수 있다. 마지막으로, 기본 타입을 박싱하는 작업은 필요 없는 객체를 생성하는 부작용을 나을 수 있다. 자바의 데이터 타입은 크게 두가지로 나눌 수 있다. 바로 int, doubl..