Java

    reflection

    reflection 패키지 reflection 패키지에 있는 클래스들을 사용하면 JVM에 로딩되어 있는 클래스와 메서드 정보를 읽어올 수 있다. 참고로 클래스의 메타 데이터 정보는 JVM의 Perm 영역에 저장되는데, 만약 엄청나게 많은 Class 클래스를 동적으로 생성하면 Perm 영역이 더이상 사용할 수 없게 되어 OutOfMemoryError가 발생할 수도 있다. Class 클래스 Class 클래스는 클래스에 대한 정보를 얻을 때 사용하며, 생성자는 따로 없다. Object 클래스에 있는 getClass() 메서드를 이용하면 Class 클래스를 생성할 수 있다. 주요 메서드 Stirng getName() 클래스의 이름을 리턴한다. Package getPackage() 클래스의 패키지 정보를 패키지 ..

    Optional 클래스

    Optional Optional은 T 타입의 객체를 감싸는 래퍼 클래스로, 모든 타입의 참조 변수를 저장할 수 있다. 최종 연산의 결과를 그냥 반환하는게 아니라 Optional 객체에 담아서 반환하므로, 예상치 못한 NullPointerException 예외를 피할 수 있다. 객체 생성 Optional 객체는 of() 메서드나 ofNullable() 메서드를 사용하여 생성할 수 있다. of() 메서드는 null이 아닌 명시된 값을 가지는 Optional 객체를 반환하며, 만약 null이 저장되면 예외가 발생한다. 따라서 만약 참조변수의 값이 null이 될 가능성이 있다면 ofNullable() 메서드를 사용해야 한다. 객체 접근 get() 메서드를 사용하면 Optional 객체에 저장된 값에 접근할 수 ..

    스트림 (Stream)

    스트림 API 스트림은 데이터 소스를 추상화하기 위해, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공한다. 즉, 데이터 소스가 무엇이든 간에 같은 방식으로 다룰 수 있게 함으로써 코드의 재사용성을 높인다. 스트림을 이용하면 배열이나 컬렉션 뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있다. 특징 스트림은 외부 반복을 통해 작업하는 컬렉션과 달리 내부 반복을 통해 작업을 수행한다. 스트림은 재사용이 가능한 컬렉션과는 달리 단 한번만 사용할 수 있다. 스트림은 데이터 소스로부터 데이터를 읽기만 할뿐 원본 데이터를 변경하지 않는다. 스트림의 연산은 필터-맵 기반의 API를 사용하여 지연 연산을 통해 성능을 최적화한다. 스트림은 parallelStream() 메서드를 통..

    람다 표현식

    람다 표현식 람다식은 메서드를 하나의 식으로 표현한 것으로, 람다식으로 메서드의 역할을 대신할 수 있다. 또한 람다식은 메서드의 매개변수로 전달되거나 메서드의 결과로 반환될 수도 있으므로, 메서드를 변수처럼 다루는 것이 가능하다. (x, y) -> x {함수 몸체} 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다. 매개변수가 하나인 경우에는 ()를 생략할 수 있다. 함수의 몸체가 하나의 명령문으로 이루어진 경우에는 {}를 생략할 수 있다. (세미콜론 X) 함수의 몸체가 하나의 return 문으로 이루어진 경우에는 {}를 생략할 수 없다. return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결과값이 된다. (세..

    Enum 클래스

    enumeration type 서로 관련된 상수를 편리하게 선언하기 위한 것으로, 여러 상수를 정의할 때 사용된다. 자바의 열거형은 타입에 안전한 열거형으로, 실제값이 같아도 타입이 다르면 컴파일 에러가 발생한다. 열거형 상수 간의 비교에는 ==를 사용할 수 있지만 비교 연산자는 사용할 수 없다. (대신 compareTo() 사용) @Getter @RequiredArgsConstructor public enum Role { // Role 클래스의 static 객체 USER("ROLE_USER", "일반 사용자"), ADMIN("ROLE_ADMIN", "관리자"); // 필드 private final String key; private final String title; } Enum 클래스 Enum 클래스..

    Arrays, Collections

    Arrays 배열을 다루는 데 유용한 메서드가 정의되어 있는 클래스로, 모든 메서드가 static 메서드이기 때문에 객체를 생성하지 않고도 바로 사용할 수 있다. 주요 메서드 List asList 전달받은 배열을 고정 크기의 리스트로 변환하여 반환한다. int binarySearch(Object[] a, Object key) 전달받은 배열에서 특정 객체를 이진 검색 알고리즘을 사용하여 검색한 후, 그 결과를 반환한다. T[] copyOf(T[] original, int newLength) 전달받은 배열을 특정 길이의 새로운 배열로 복사해서 반환한다. T[] copyOf(T[] original, int from, int to) 전달받은 배열의 특정 범위에 해당하는 요소만을 새로운 배열로 복사하여 반환한다...

    Comparable과 Comparator

    Comparable 객체를 정렬하는 데 사용되는 메서드인 compareTo() 메서드를 정의해놓은 인터페이스로, 같은 타입의 인스턴스를 비교해야 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다. 따라서 Boolean을 제외한 Wrapper 클래스와 String, Date, File 등의 클래스의 인스턴스는 모두 정렬 가능하며, 기본적으로 오름차순으로 정렬한다. compareTo() public interface Comparable { public int compareTo(Object o); } Comparable 인터페이스에서 객체를 정렬하기 위해 정의해놓은 메서드로, 해당 객체와 전달된 객체의 순서를 비교한다. 비교하는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수..

    Iterator

    Iterator 컬렉션에 저장된 요소에 접근하는 데 사용되는 인터페이스로, 컬렉션 요소를 읽어오는 방법을 표준화함으로써 코드의 일관성을 유지하고 재사용성을 극대화할 수 있다. Collection 인터페이스는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메서드를 정의해 놓았다. 따라서 컬렉션 클래스에 대해 iterator()를 호출하여 Iterator를 얻은 다음 반복문을 사용해서 컬렉션 클래스의 요소를 읽을 수 있다. List list = new ArrayList(); Iterator iter = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); } Map 인터페이스를 구현한 컬렉션 클래스..

    Map 컬렉션 클래스

    HashMap Map 컬렉션 클래스에서 가장 많이 사용되는 클래스로, 키와 값의 쌍으로 데이터를 저장한다. 해시 알고리즘을 사용하기 때문에 데이터를 검색하는 데에 있어 뛰어난 성능을 보인다. 내부적으로 Entry라는 내부 클래스를 정의하고, 다시 Entry 타입의 배열을 선언해서 구현되어 있다. public interface Map { public static interface Entry { Object getKey(); // Entry의 key 객체를 반환 Object getValue(); // Entry의 value 객체를 반환 Object setValue(Object value); // Entry의 value 객체를 지정된 객체로 변환 boolean equals(Object o); // 동일한 En..