[아이템 39] 명명 패턴보다 애너테이션을 사용하라
전통적인 명명 패턴의 단점
- 오타 발생 시 컴파일러는 메서드를 무시하고 지나칠 수 있어 개발자는 오류가 없다고 인식할 수 있다.
- 올바른 프로그램 요소에 사용하지 않을 경우에 컴파일 오류, 런타임 오류 등 개발자가 인지할 수 있는 수준의 오류가 발생하지 않는다.
- 프로그램 요소를 매개변수로 전달할 방법이 없다.
애너테이션은 명명 패턴의 문제를 해결해주는 개념으로 Junit에도 버전 4부터 전면 도입됐다.
애너테이션 선언에 다는 애너테이션을 메타애너테이션(meta-annotation)이라 한다.
대상 코드의 의미는 그대로 둔 채 그 애너테이션에 관심 있는 도구에서 특별한 처리를 할 기회를 준다.
질문 정리
- '이 코드는 EnumMap이 아닌 고유한 맵 구현체를 사용했기 때문에 EnumMap을 써서 얻은 공간과 성능 이점이 사라진다' 에 대한 설명
EnumMap은 key로 enum객체를 가질 수 있고 enum은 순차적인 정수값(ordinal)를 가지기 때문에 EnumMap은 Array배열에 데이터를 저장하게 된다. 즉, 일반적인 Map과 달리 hashing작업(hash만들고 해싱 충돌 관리 등)을 할 필요가 없고 key값인 enum사이즈 만큼 값을 가지기 때문에 특정 사이즈 이상 커지면 resizing해야하는 Map과 달리 성능성의 이점을 가질 수 있다.
- [item36. 223p가장 맨 밑~ 224p] 정수 상수보다 열거 타입을 선호하는 프로그래머 중에도 상수 집합을 주고 받아야 할 때는 여전히 비트 필드를 사용하기도 한다.
Q. 자바에서 비트 필드를 활용하는 예가 있을까요? 검색하면 C, C++ 에서만 활용하는 예제가 나와서 자바에서 비트필드를 활용하는지 궁금합니다.
보통 비트 단위 작업은 임베디드 시스템, 하드웨어 드라이버, 네트워크 프로토콜, 이진 파일 형식 및 문자 인코딩, 암호화 등 하드웨어 제어 수준에서 사용하여 보통의 프로그래머가 사용할 일은 없습니다.
- [item38. 235p]
자바 라이브러리도 이번 아이템에서 소개한 패턴을 사용한다. 그 예로, java.nio.file.LinkOption 열거 타입은 CopyOption과 OpenOption 인터페이스를 구현했다.
public enum LinkOption implements OpenOption, CopyOption {
/**
* Do not follow symbolic links.
*
* @see Files#getFileAttributeView(Path,Class,LinkOption[])
* @see Files#copy
* @see SecureDirectoryStream#newByteChannel
*/
NOFOLLOW_LINKS;
}
Q. LinkOption 열거 타입에 해당 내용만 있어서,, 어떻게 CopyOption, OpenOption 인터페이스를 구현하여 이번 아이템에서 얘기한 것과 같이 CopyOption, OpenOption이 어떻게 정의되었고, LinkOption이 어떻게 이 인터페이스를 구현하는지 궁금합니다.!
정리
API가 제공하는 기본 연산 외에 사용자 확장 연산을 추가할 수 있도록 열어줘야 할 때가 있다. 열거 타입이 임의의 인터페이스를 구현할 수 있다는 사실을 이용하는 것으로 연산 코드용 인터페이스를 정의하고 열거 타입이 이 인터페이스를 구현하게 하면 된다.
package java.nio.file;
/**
* An object that configures how to copy or move a file.
*
* <p> Objects of this type may be used with the {@link
* Files#copy(Path,Path,CopyOption[]) Files.copy(Path,Path,CopyOption...)},
* {@link Files#copy(java.io.InputStream,Path,CopyOption[])
* Files.copy(InputStream,Path,CopyOption...)} and {@link Files#move
* Files.move(Path,Path,CopyOption...)} methods to configure how a file is
* copied or moved.
*
* <p> The {@link StandardCopyOption} enumeration type defines the
* <i>standard</i> options.
*
* @since 1.7
*/
public interface CopyOption {
}
/*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.nio.file;
/**
* An object that configures how to open or create a file.
*
* <p> Objects of this type are used by methods such as {@link
* Files#newOutputStream(Path,OpenOption[]) newOutputStream}, {@link
* Files#newByteChannel newByteChannel}, {@link
* java.nio.channels.FileChannel#open FileChannel.open}, and {@link
* java.nio.channels.AsynchronousFileChannel#open AsynchronousFileChannel.open}
* when opening or creating a file.
*
* <p> The {@link StandardOpenOption} enumeration type defines the
* <i>standard</i> options.
*
* @since 1.7
*/
public interface OpenOption {
}
책에있는 예시보단 StandardOpenOption, StandardCopyOption enum 클래스가 이 예제에 더 적합해보입니다.
- p.225 주석.2 구아바 라이브러리를 EnumSet을 사용해 구현해서 성능면에서는 손해 라고 되어있는데, 정확한 이유를 알고 싶습니다. 참고 : 구아바소스 (https://github.com/google/guava/blob/e62d6a0456420d295089a9c319b7593a3eae4a83/guava/src/com/google/common/collect/ImmutableSet.java)
ImmutableSet.java
```
/*
* Copyright (C) 2007 The Guava Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
불변 객체와 가변 객체의 성능을 생각하면 된다. 불변 객체는 한번 생성되고 나면 재할당 및 값을 변경할 수 없고 GC의 성능을 올려주나 가변 객체는 재할당할 수 있다.
- 아이템 39. 메타 어노테이션에 대해 좀 더 자세히 궁금합니다!
메타 어노테이션은 어노테이션에 대한 설명을 담은 어노테이션
https://github.com/naver/lucy-xss-servlet-filter/tree/master/src
'IT 개발 > 개념 정리' 카테고리의 다른 글
[아이템 49] 매개변수가 유효한지 검사하라 (0) | 2022.07.22 |
---|---|
[Git] .gitignore적용 방법 (0) | 2022.07.20 |
[아이템 29] 이왕이면 제네릭 타입으로 만들라 (0) | 2022.06.03 |
[아이템 28] 배열보다는 리스트를 사용하라 (0) | 2022.05.29 |
[아이템 27] 비검사 경고를 제거하라 (0) | 2022.05.28 |