목록전체 글 (31)
LALA's blog
인터셉터란? DispatcherServlet 이 받아온 클라이언트 요청을 Controller 로 넘기기 전에 (Controller 의 Handler 를 호출하기 전에) 혹은 Handler 가 실행된 후 가로채서 개발자가 원하는 추가적인 작업을 수행하도록 하는 모듈이다. 정리하자면 2가지 역할을 해준다. Handler에 요청을 전달하기 전/후로 추가적인 작업이 가능하다. View 렌더링이 된 후 클라이언트에게 Reponse를 전달하기 전에 추가적인 작업이 가능하다. Filter 와의 차이 Filter -> DispactcherServlet -> Interceptor 순서로 요청이 전달된다. 즉 Filter가 Interceptor보다 클라이언트의 요청을 먼저 받아들인다. 정답은 아니지만Spring과 관련된 ..
Exception 상속 구조 예외는 진짜 예외 상황에만 사용해라 예외는 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여선 안 된다. try { int i = 0; while (true) { range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { } 코드를 try-catch 블록 안에 넣으면 JVM 이 적용할 수 있는 최적화가 제한된다. 예외를 사용한 경우 표준 관용구보다 훨씬 느리다. 또한 어떤 문제가 있을 수 있을까? 반복문 안에 버그가 숨어 있다면 흐름제어로 사용된 예외가 이 버그를 잡고 숨기게 되어 디버깅을 어렵게 만든다. 만약 climb() 내부 어딘가에서 관련없는 배열을 사용하다 ArrayIndexOutOfB..
미션을 수행하면서 객체가 가지고 있는 Collection 을 get 해오는 경우가 종종 있었다. 그 경우 원본 Collection 의 참조값을 넘겨주면 어떻게 될까? 복사본의 Collection 을 add() 혹은 remove() 를 통해 컬렉션 요소를 변경시킬 경우 어떤 문제가 발생할까? 복사본은 원본 Collection 과 동일한 참조값을 가지고 있기 때문에 원본 Collection 의 요소들도 변경되게 된다. 이는 객체지향의 캡슐화를 완벽히 무너뜨리는 방법이므로 주의해야할 점이다. (getter 를 안 쓰도록 해야 하지만..) 1. 방어적 복사 생성자를 통해 초기화하거나 내부의 객체를 반환할 때, 새로운 객체로 감싸서 복사해주는 방법이다. 외부와 내부에서 주소 값을 공유하는 인스턴스의 관계를 끊어주..
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable { ... } Map 인터페이스의 구현체이다. AbstractMap 을 상속받는다. HashMap 는 순서가 아닌 수행 시간의 가장 큰 장점을 가지고 있다. add, remove, find 에 평균 O(1) 의 속도를 발휘한다. (TreeMap 은 O(logN) 이다.) HashMap 은 외부에서 볼 때 항상 같은 형태를 띨 것 같지만, capacity 와 load factor 를 통해 동적으로 변화한다. capacity 는 해시테이블의 버킷 수이다. load factor 는 해시 테이블의 용량이 자동으로 증가하기 전에 해시 테이블이 얼마나 가득 차도록 허용되는..
equals와 hashCode는 모든 Java 객체의 부모 객체인 Object 클래스에 정의되어 있다. 그렇기 때문에 Java의 모든 객체는 Object 클래스에 정의된 equals와 hashCode 함수를 상속받고 있다. equals() boolean equals(Object obj)로 정의된 equals 메소드는 2개의 객체가 동일한지 검사하기 위해 사용된다. eqauls가 구현된 방법은 2개의 객체가 참조하는 것이 동일한지를 확인하는 것이다. 즉, 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다. 모든 객체는 equals 메서드를 재정의하여 사용할 수 있다. equals 로 동치관계를 구현하는데, 이를 정의하기 위한 규칙이 있다. 반사성 : 객체는 자기 자신과 같아야 ..
public class ProfitResult { private final ParticipantProfit dealerResult; private final List playersResult; public ProfitResult(List players, Dealer dealer) { players = new ArrayList(players); List playersResult = calculatePlayersResult(players, dealer); this.dealerResult = calculateDealerResult(playersResult, dealer); this.playersResult = playersResult; } private List calculatePlayersResult(Lis..
프리코스 때부터 많이 듣던 피드백 매직 넘버를 사용하지 말아라. 값을 하드 코딩하지 말아라. 상수로 치환해서 사용해라. 이 피드백을 받고부터는 " 왠지.. 모든 매직 넘버나 출력/에러 메세지는 상수로 관리해야 할 것만 같아...! " 이런 고정관념을 가지고 있었다. 그래서 이번 로또 미션 1단계까지도 모든 매직 넘버나 출력/에러 메세지를 집착하듯 상수로 빼서 관리했었다. private static final String REQUEST_MESSAGE_INPUT_PURCHASE_MONEY = "구입금액을 입력해 주세요."; private static final String ERROR_MESSAGE_TYPE_OF_MONEY = "금액은 숫자가 아닐 수 없습니다."; private static final Str..
java.util.List Interface - 자바는 배열과 같은 데이터를 효과적으로 관리하기 위해 배열 대신 List 를 제공한다. - List 는 ArrayList, LinkedList 두 가지 종류가 있다. - 일반적으로 ArrayList 를 가장 많이 사용한다. - List 는 배열에서 지원하지 않는 많은 기능을 제공한다. - 지금까지 배열을 사용했다면 배열 대신 List를 사용한다. ArrayList - 배열을 감싸서 사용할 수 있도록 기능을 제공해준다. - Object[] - 일급 컬렉션이라고 볼 수 있다. - 사이즈도 동적으로 늘린다. - 인덱스로 접근할 수 있다. O(n) LinkedList - Node 들을 가지고 있다. - 앞 뒤가 연결되어 있다. - 연결만 하면 되기 때문에 사이즈를..
문자와 문자열 - 문자열(String) 은 자바 프로그램이 실행되는 동안 가장 많이 생성되는 객체이다. - 문자열은 객체이지만 각각의 문자의 나열로 구성된다. char capitalA = 'A'; // 문자 Strinng a = "abc"; // 문자열 == 문자의 배열 String b = new String("abc"); // 이와 같이 구현하지 마라. String 은 가장 많이 사용되는 객체이기 때문에 가장 최적화가 잘 되어있다. 🤔. 문자열들은 어디서 관리되는 될까? - Constant Pool 에 저장이 돼서 계속 재사용할 수 있게 된다. - 아래의 두 문자열은 같은 객체를 바라보고 있다. String string1 = "string"; String string2 = "string"; String..
1단계 자동차 경주 미션을 수행하면서 Layer 간 데이터를 주고받기 위한 DTO를 사용해보았다. 이번에 알게 된 DTO와 관련된 개념들을 정리해보려 한다! DTO 란? DTO(Data Transfer Object)로서 계층(Layer) 간 데이터 교환을 위해 사용하는 객체이다. 데이터 교환만을 위해 사용하므로 로직을 갖지 않고, getter/setter 메소드만 갖는다. 로직은 없고, 데이터를 담고, 꺼내는 getter/setter 메소드만 담는다. 이런 단순한 개념이면 너무 쉽겠지만..? 우리는 메타인지를 해야하니깐 😙 DTO를 사용했을 때 어떤 장점을 가지고 있는지, 어떻게 사용하는지 알아보도록 하자! 먼저 DTO를 사용하지 않고 직접 Model 객체를 전달했을 경우를 살펴보자. // Car.jav..