목록전체 글 (175)
개발 기록
## 제네릭과 가변인수를 함께 쓸 때는 신중하라 ### 가변인수 메서드하나의 메서드가 가변적인 수의 매개변수를 받을 수 있도록 지원 가변인수(Varargs)를 사용하는 메서드를 호출하면 Java 컴파일러가 자동으로 배열을 생성public static void varargsExample(String... args) { // args는 배열로 처리됨 System.out.println("Length: " + args.length);}호출시 아래처럼 컴파일varargsExample(new String[]{"A", "B", "C"}); ### 이 배열은 내부로 감춰져야 하는데, 클라이언트에 공개되면서 문제가 발생할 수 있다. 가변인수 매개변수에 제네릭이나 매개변수화 타입이 포함되면 컴파일 경고 발생wa..

인덱스 유무에 따른 성능 차이select * from customer where first_mname = 'minsoo';first_name에 인덱스가 없다면- full scan (=table scan) 으로 찾음- O(N)first_name에 인덱스가 있다면- full scan보다 빠르게 찾음- O(logN) (B-tree based index일때) 인덱스를 쓰는 이유- 조건을 만족하는 튜플들을 빠르게 조회- 빠르게 정렬, 그룹핑 인덱스 생성 문법- 이미 만들어진 테이블에 생성CREATE INDEX index_name ON table(column)CREATE UNIQUE INDEX index_name ON table(column1, column2) - 테이블 만들때 생성CREATE TABLE tabl..
## 이왕이면 제네릭 타입으로 만들라 클래스 안에 다른 객체들을 담는 역할을 하는 클래스들은 제네릭 타입으로 만들면 유용하다.ex) stack- 제네릭을 사용할때 장점클라이언트 코드에서 형 변환 을 사용하지 않도록 만들 수 있다.또한 형 변환 을 잘못 사용했을 때 발생할 수 있는 ClassCastException 을 미연에 방지 할 수 있다.public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACI..

jwt 검증 필터를 구현하던 중에 저렇게 노란 줄이 떴다.오버라이딩 메서드가 애너테이션으로 명시되지 않은 경우슈퍼클래스의 메서드에 @NotNull 또는 @Nullable 애너테이션이 지정되어 있는데,이를 서브클래스의 오버라이딩 메서드에서 반복하지 않으면 발생하는 문제 OncePerRequestFilter와 @NonNullApiSpring Web에서 OncePerRequestFilter는 org.springframework.web.filter 패키지에 위치.이 패키지에는 @NonNullApi가 패키지 수준에서 적용되어 있었다. 그래서 서브 클래스에도 적용시키라는 뜻이였다.// org.springframework.web.filter.package-info@NonNullApi@NonNullFieldspacka..
## 로 타입은 사용하지 말라 ### 로 타입 : 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않은 것ex) List의 로 타입 : List- 쓰면 안 되는 이유 : 오류를 컴파일할 때가 아닌 런타임시 발견할 수 있다.ex) 실수도 Stamp 대신 Coin을 넣어도 아무 오류 없이 컴파일되고 실행됨.// 제네릭을 지원하기 전엔 컬렉션을 아래와 같이 선언했다.private final Collection stamps = ...;stamps.add(new Coin(...));for (Iterator it = stamps.iterator(); i.hasNext();) { Stamp stamp = (Stamp) i.next(); // ClassCastException stamp.cancel();}// 타입 ..
# 멤버 클래스는 되도록 static으로 만들어라 중첩 클래스 : 다른 클래스 안에 정의된 클래스중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야한다. 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야한다.종류정적 멤버 클래스(비정적) 멤버 클래스익명 클래스지역 클래스1. 정적 멤버 클래스- 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버 에도 접근할 수 있음 (일반 클래스와의 차이점)- 일반 클래스처럼 독립적으로 동작할 수 있으며, 바깥 클래스의 인스턴스 없이도 생성 가능.- 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스로 만들자.public class OuterClass { // private 멤버 private final..
## 21 인터페이스는 구현하는 쪽을 생각해 설계하라 ### 기존 인터페이스에 디폴트 메서드 구현을 추가하는 것은 위험한 일이다.1. 디폴트 메서드는 구현 클래스에 대해 아무것도 모른 채 합의 없이 무작정 '삽입' 될 뿐이다. - 디폴트 메서드 : 인터페이스에 있는 구현 메서드 (메서드 앞에 default 예약어. 구현부 {} 가 있다.)- - 기본 메서드는 이미 구현되어 있기 때문에 호출하여 사용할 수 있다.public interface MyInterface { // 추상 메서드 void abstractMethod(); // 기본 메서드 default void defaultMethod() { // 기본 구현 코드 System.out.println("This..
(18) 상속보다는 컴포지션을 사용하라 - 여기서 말하는 상속은 인터페이스 상속이 아닌 (클래스가 다른 클래스를 확장하는) 구현 상속을 말함- 구현 상속 (서브클래싱): 코드를 재사용하기 위해 부모 클래스를 상속받는 것.부모 클래스의 기능을 그대로 물려받아 재사용하거나, 필요한 부분만 수정하여 사용하는 방식- 인터페이스 상속 (서브타이핑): 다형성을 위해 부모 클래스와 자식 클래스가 동일한 인터페이스를 공유하도록 하는 것.부모 클래스에서 정의된 메서드를 자식 클래스가 반드시 구현 ### 상속의 문제점1. 캡슐화를 해친다.- 상위 클래스의 구현이 바뀌면 하위 클래스의 동작에 이상이 생길수 있다.- self-use 패턴 ( 한 메소드가 같은 클래스 내의 다른 메서드를 사용하는 패턴 ) 사용시,- 상위 ..