☕️ Java/기본

🧐 Lombok Getter Recored Style @Accessors(fluent = true) 와 @Getter를 사용합니다. @Accessors(fluent = true) @Getter @RequiredArgsConstructor public class Member { private final String name; } class MemberTest { @Test void test() { // given Member mallang = new Member("mallang"); // when String name = mallang.name(); // then assertThat(name).isEqualTo("mallang"); } }
🧐 Varargs가 없었을 때 Varargs(이하 가변인수)가 없었을 때에는, 임의의 수의 값을 파라미터로 사용하는 메서드를 사용하기 위해서는 배열을 사용하여야 했습니다. 예를 들어 다음과 같습니다. public static void main(String[] args) { final Object[] objects = { new Date(), "안녕하세요", 24, "살 말랑이입니다." }; printSequence(objects); } public static void printSequence(Object[] args) { for (int i = 0; i < args.length; i++) { System.out.println("[" + i + "] : " + args[i]); } } 그러나 매번 배열을..
🧐 Collectors.toMap이 뭔가요? Stream을 사용하는 경우, 최종 연산으로 collect()를 사용하는 경우, Stream의 요소들을 수집하여 특정한 자료구조로 변환할 수 있습니다. 이때 Map으로 변환하기 위해서는 Collectors.toMap을 사용합니다. 흔히 사용하는 toMap은 다음과 같습니다. List strings = Arrays.asList("apple", "banana", "pear"); Map map = strings.stream() .collect(Collectors.toMap(String::length, Function.identity())); System.out.println(map); // 결과: {4=pear, 5=apple, 6=banana} 그러나 위 코드에는..
객체를 복사하는 방법에는 크게 얕은 복사와 깊은 복사, 그리고 방어적 복사가 있습니다. 이러한 방법들이 각각 어떻게 동작하는지, 어떤 상황에서 사용하는 것이 적절한지 알아보도록 하겠습니다. 🧐 얕은 복사 얕은 복사(shallow copy)는 객체를 복사할 때, 객체의 주소 값만을 복사하는 방식입니다. 이 방식은 객체의 내부에 다른 객체를 참조하는 포인터가 있을 경우, 참조된 객체를 새로 복사하지 않습니다. 따라서, 복사된 객체와 원본 객체는 같은 객체를 참조하게 되어, 하나의 객체를 수정하면 다른 객체에도 영향을 미칩니다. 자바에서는 = 연산자를 쓰면 얕은 복사가 수행됩니다. 예시를 위해 다음과 같이 클래스들을 정의하겠습니다. public class Name { private final String va..
🧐 EnumMap EnumMap은 Java의 Map 인터페이스를 구현한 컬렉션 클래스 중 하나로, Enum 타입의 상수를 효율적으로 처리하기 위해 설계되었습니다. EnumMap은 다른 Map과 달리 특별한 제약사항이 있는데, Map의 키(key)로는 Enum만을 사용할 수 있다는 것입니다. 🧐 EnumMap의 장점 EnumMap은 내부적으로 배열을 사용하기 때문에, 일반적인 Map의 구현체들보다 더 좋은 성능을 가집니다. 또한 HashMap처럼 Key의 충돌이 발생하지 않습니다. 🧐 사용 방법 EnumMap map = new EnumMap(Enum타입.class); // Enum 클래스에 대한 타입토큰 예를 들면 다음과 같습니다. enum Weekday { MONDAY, TUESDAY, WEDNESDAY..
🧐 groupingBy를 통해 동일한 자료의 개수 구하기 Collectors.counting()을 groupingBy의 두 번째 인자로 전달하면 됩니다. 사용 예시는 아래와 같습니다. public void sample(List data) { Map result = data.stream() .collect(Collectors.groupingBy(Function.identity(), counting())); }
Fork-Join 프레임워크의 등장 배경 현재 CPU의 속도의 발전은 한계점에 도달하여, CPU 속도를 향상시키는 것 보다는 코어의 개수를 늘리는 방식을 통해 CPU의 성능을 발전해가고 있습니다. 이러한 하드웨어의 변화에 맞춰 프로그래밍도 멀티 코어를 잘 활용할 수 있는 멀티쓰레드 프로그래밍이 점점 더 중요해지고 있습니다. JDK 1.7 버전(자바 7버전)부터 fork-join(포크 - 조인) 프레임워크가 추가되었고, 이는 하나의 작업을 작은 단위로 나눠 처리하는 분할 정복(divide and conquer) 방식을 통하여 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어줍니다. 포크조인 프레임워크는 어떠한 작업에 대하여 포크(fork)하여 해당 작업이 비동기식으로 실행하기에 충분히 단순해질 때까지 작업을..
Lock 쓰레드를 동기화할 수 있는 또다른 방법으로, 'java.util.concurrent.locks'패키지에서 제공합니다. synchronized 블럭을 사용하면 자동으로 lock이 잠기고 풀리기 때문에 간편하지만 같은 메서드 내에서만 lock을 걸 수 있다는 제약사항과 쓰레들를 구분해서 통지가 불가능하다는 제약사항이 있었습니다. 이럴 때 lock 클래스를 사용할 수 있습니다. 종류 ReentrantLock : 재진입이 가능한 lock. 가장 일반적인 배타적(Exclusive) lock ReentrantReadWriteLock : 읽기에는 공유적이고, 쓰기에는 배타적인 lock StampedLock : ReentrantReadWriteLock에 낙관적 읽기(Optimistic Reading) lock..
말 랑
'☕️ Java/기본' 카테고리의 글 목록