Modifier
클래스, 변수, 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
크게 "접근 제어자"와 "그 외 제어자"로 나눌 수 있다.
접근제어자(Access Modifier)
네 가지 중 하나만 선택해서 사용
그 외 제어자
static, final, abstract, native, transient, synchronized, volatile, strictfp
자바 예약어
제어자의 조합
프로그램 배포시 고정된 자원과 변화하는 자원이 있다. 게시판 배포를 예로 든다면 안에 소스는 대부분 고정된 자원이다. 하지만 사용자마다 database의 설정 등은 수정해서 사용해야 하는 부분이다. 이러한 값들은 프로그램의 알고리즘과 상관없는 부분으로 따로 관리해야 하는 자원들이다.
이러한 자원은 파일로 저장해서 관리하는 것이 보편적 추세로, ResourceBundle을 이용할 수 있다.
ResourceBundle클래스는 자원을 저장하고 반환하는 기능을 제공하는 클래스이다.
이 클래스의 getBundle메소드는 파일이나 클래스 등으로부터 ResourceBundle객체를 생성시켜 주어 key값을 통해 value를 얻을 수 있다.
ResourceBundle을 사용하면 java.util.Properties 클래스를 이용할 경우 properties 파일의 경로를 가져오고 파일의 내용을 Properties 객체에 저장하는 수고를 줄일 수 있다. 또한 국제화 과정에서의 리소스 관리를 편리하게 할 수 있다.
properties 파일에서 특정 키의 값을 가져오는 방법은 다음과 같다.
ResourceBundle bundle = ResourceBundle.getBundle("server.properties");
String value = bundle.getString("키이름");
ResourceBundle을 이용해서 다국어를 지원하는 properties 파일을 읽어들이는 방법은 Locale 파일 규칙을 이용하는 것이다.
ResourceBundle bundle = ResourceBundle.getBundle("Hello", Locale.KOREA);
String value = bundle.getString("hi");
String value = bundle.getString("bye");
ClassLoader
==
equals()
public boolean equals(Object obj){return (this==obj);}
hashCode()
public class Key{
...
@override
public int hashCode(Object obj){
return number;
}
}
리플렉션
<aside> ✅ Java와 같은 객체 지향 프로그래밍 언어에서 Reflection을 사용하면 컴파일 타임에 인터페이스, 필드, 메소드의 이름을 알지 못해도 실행 중에 클래스, 인터페이스, 필드 및 메소드에 접근할 수 있다.
</aside>
Reflection
을 이용하면 Annotation
지정만으로도 원하는 클래스를 주입할 수 있다.
// Without reflection
Foo foo = new Foo();
foo.hello();
// With reflection
Object foo = Class.forName("complete.classpath.and.Foo").newInstance();
// Alternatively: Object foo = Foo.class.newInstance();
Method m = foo.getClass().getDeclaredMethod("hello", **new** Class<?>[0]);
m.invoke(foo);
Java 8부터 null일 가능성 있는 객체는 Optional로 감싸서 받고, ifPresent메서드로 확인하자. get, orElseGet 메서드도 있음.
ThreadLocal
ThreadLocal의 활용
ThreadLocal은 한 쓰레드에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해 주기 때문에 쓰레드와 관련된 코드에서 파라미터를 사용하지 않고 객체를 전파하기 위한 용도로 주로 사용되며, 주요 용도는 다음과 같다.
사용자 인증정보 전파
트랜잭션 컨텍스트 전파
쓰레드에 안전해야 하는 데이터 보관
이 외에도 쓰레드 기준으로 동작해야 하는 기능을 구현할 때 ThreadLocal을 유용하게 사용할 수 있다.
Static
Thread polling
클로저(Closure)