분류 전체보기 383

[Java] 31. HashSet

HashSet#Java이전 챕터에 처음 정의했던 Set의 성능을 해시 알고리즘을 통해 평균 O(1)으로 개선해보자.MyHashSetV1단순히 해시 인덱스를 다음과 같은 방법으로 구한다.public class MyHashSetV1 { static final int DEFAULT_INITIAL_CAPACITY = 16; LinkedList[] buckets; private int size = 0; private int capacity = DEFAULT_INITIAL_CAPACITY; public MyHashSetV1() { initBuckets(); } public MyHashSetV1(int capacity) { this.capacity = capacity; initBuckets(); } privat..

[Java] 30. Hash

Hash#JavaSet이란?세트(셋)는 유일한 요소들의 컬렉션특징중복된 요소가 존재하지 않음순서를 보장하지 않는다.빠른 검색: 요소의 유무를 빠르게 확인할 수 있도록 최적화되어 있다.용도: 중복을 허용하지 않고, 요소의 유무만 중요한 경우에 사용예시:List: 장바구니 목록, 순서가 중요한 일련의 이벤트 목록.Set: 회원 ID 집합, 고유한 항목의 집합.셋 직접 구현하기단순히 배열에다가 추가하는 방식을 생각해보자.메서드add(value) : 셋에 중복된 값이 있는지 체크하고, 중복된 값이 있으면 false 를 반환한다. 중복된 값이 없으면 값을 저장하고 true 를 반환한다.contains(value) : 셋에 값이 있는지 확인한다. 값이 있으면 true 를 반환하고, 값이 없으면 false 를 반환한..

[Java] 29. 컬렉션- ArrayList, LinkedList, List

컬렉션- ArrayList, LinkedList, List#JavaC 스타일 배열데이터 조회배열의 인덱스 사용: O(1)배열의 순차 검색: O(n)데이터 추가배열의 첫번째 위치에 추가배열의 첫번째 위치를 찾는데는 인덱스를 사용하므로 O(1)이 걸린다.모든 데이터를 배열의 크기만큼 한 칸씩 이동해야 한다. 따라서 O(n) 만큼의 연산이 걸린다.O(1 + n) O(n)이 된다.배열의 중간 위치에 추가배열의 위치를 찾는데는 O(1)이 걸린다.index의 오른쪽에 있는 데이터를 모두 한 칸씩 이동해야 한다. 따라서 평균 연산은 O(n/2)이 된다.O(1 + n/2) O(n)이 된다.배열의 마지막 위치에 추가이 경우 배열이 이동하지 않고 배열의 길이를 사용하면 마지막 인덱스에 바로 접근할 수 있으므로 한번..

[Spring/MVC] 12. Bean Validation

12. Bean Validaiton정리이전 챕터에서 검증 로직을 스프링 Validator를 구현하여 처리하는 방법까지 살펴봤다. 그런데, 매 번 코드로 검증 로직을 작성하는 것은 상당히 번거롭다. 특히 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다.이런 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것이 바로 Bean Validation 이다.public class Item { private Long id; @NotBlank(message = "공백 X") // 이런 식으로 메시지를 지정할 수도 있다. private String itemName; @NotNull @Range(min = 1000, max = 10000..

Spring/MVC 2025.01.19

[Spring/MVC] 11. Validation

11. Validation주의) 이번 챕터의 정리 글은 매우 깁니다~정리폼 입력 시 숫자를 문자로 작성하거나 해서 검증 오류가 발생하면 오류 화면으로 바로 이동한다. 이렇게 되면 사용자는 처음부터 해당 폼으로 다시 이동해서 입력을 해야 한다. 웹 서비스는 폼 입력 시 오류가 발생하면, 고객이 입력한 데이터를 유지한 상태로 어떤 오류가 발생했는지 친절하게 알려주어야 한다.참고: 클라이언트 검증, 서버 검증클라이언트 검증은 조작할 수 있으므로 보안에 취약하다.서버만으로 검증하면, 즉각적인 고객 사용성이 부족해진다.둘을 적절히 섞어서 사용하되, 최종적으로 서버 검증은 필수API 방식을 사용하면 API 스펙을 잘 정의해서 검증 오류를 API 응답 결과에 잘 남겨주어야 함상품 저장 Validation 실패사용자가..

Spring/MVC 2025.01.19

[Spring/MVC] 10. 메시지 국제화

10. 메시지 국제화정리메시지악덕? 기획자가 화면에 보이는 문구가 마음에 들지 않는다고, 상품명이라는 단어를 모두 상품이름으로 고쳐달라고 한다. “상품명”이라는 메시지가 하드코딩되어 있다면, 여러 HTML 파일에 흩어져있는 “상품명”을 직접 일일히 찾아서 “상품이름”으로 수정해야 할 것이다.이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.예를 들어서 messages.properties라는 메시지 관리용 파일을 만들고item=상품item.id=상품 IDitem.itemName=상품명item.price=가격item.quantity=수량각 HTML들은 다음과 같이 해당 데이터를 key 값으로 불러서 사용하는 것이다.국제화메시지의 기능을 조금 더 확장해서 생각해보면, 메시지 파일을 ..

Spring/MVC 2025.01.19

[Java] 28. 제네릭 - Generic(2)

제네릭 - Generic(2)#Java정리저번 챕터처럼 크게 제네릭 타입, 타입 매개변수를 이용하여 코드를 개선하는 예제를 봐보자.package generic.ex3;public class AnimalHospitalV2 { private T animal; public void set(T animal) { this.animal = animal; } public void checkup() { // T의 타입을 메서드를 정의하는 시점에는 알 수 없다. Object의 기능만 사용 가능 animal.toString(); animal.equals(null); // 컴파일 오류 //System.out.println("동물..

[Java] 27. 제네릭 - Generic(1)

제네릭 - Generic(1)#Java정리제네릭이 필요한 이유코드 재사용을 늘리기 위해 Object와 다형성을 사용하면 타입 안전성이 떨어지는 문제가 발생한다.각각의 타입별로 IntegerBox, StringBox와 같은 클래스를 모두 정의코드 재사용X타입 안전성OObjectBox를 사용해서 다형성으로 하나의 클래스만 정의코드 재사용O타입 안전성X제네릭 적용제네릭을 사용하면 코드 재사용과 타입 안전성이라는 두 마리 토끼를 한 번에 잡을 수 있다.예시package generic.ex1;public class GenericBox { private T value; public void set(T value) { this.value = value; } public T get()..

[Java] 26. 예외 처리 - 실전

예외 처리 - 실전#Java정리이전 챕터에서 해결하지 못했던 문제들을 예외 처리를 이용하여 해결해보자.예외 클래스public class NetworkClientExceptionV2 extends Exception { private String errorCode; public NetworkClientExceptionV2(String errorCode, String message) { super(message); this.errorCode = errorCode; } public String getErrorCode() { return errorCode; }}어떤 종류의 오류가 발생했는지 구분하기 위해 예외 안에 오류 코드를 보관하도록 설계한다.클..

[Java] 25. 예외 처리 - 이론

예외 처리 1 - 이론#Java정리예외 처리를 왜 해야할까?사용자의 입력을 받고, 입력 받은 문자를 외부 서버에 전송하는 프로그램을 생각해보자.NetworkClient : 외부 서버와 연결하고, 데이터를 전송하고, 연결을 종료하는 기능을 제공한다.NetworkService : NetworkClient를 사용해서 데이터를 전송한다. NetworkClient를 사용하려면 연결, 전송, 연결 종료와 같은 복잡한 흐름을 제어해야 하는데, 이런 부분을 NetworkService가 담당한다.Main을 통해 사용자의 입력을 받으면 사용자의 입력을 NetworkService에 전달한다.NetworkService는 NetworkClient를 사용해서 외부 서버에 연결하고, 데이터를 전송하고, 전송이 완료되면 연결을 종료..