개발 공부/Java 7

개발 공부/Java JEP 304 Garbage-Collector Interface로 보는 관심사의 분리

새로운 가비지 컬렉터를 HotSpot에 추가한다고 가정해 보자. 공통 인터페이스를 구현하고 등록하면 끝날 것 같지만, 과거의 HotSpot에서는 그렇지 않았다. CollectedHeap 구현 객체를 생성하는 코드가 구체적인 Collector를 직접 선택했고, 모니터링 코드와 컴파일러에도 Collector별 지식이 흩어져 있었다.흥미로운 점은 당시에도 이미 CollectedHeap이라는 추상 클래스가 있었다는 사실이다. 인터페이스는 있었지만 관심사는 충분히 분리되지 않은 상태였다.JEP 304는 이 문제를 다룬다. 이 글에서는 새로운 인터페이스의 메서드를 나열하기보다 다음 두 가지에 집중한다.공통 타입이 있는데도 왜 관심사의 분리에 실패했는가구체 구현을 고르는 조건문을 없애지 않고도 어떻게 구조를 개선했는..

2026.08.30

개발 공부/Java 자바 Collector 구조 (feat. groupingBy() 사용법)

Collectors의 groupingBy() 메서드를 사용하면 아래와 같이 데이터 스트림을 맵으로 편리하게 반환할 수 있어서 프로젝트나 알고리즘 문제를 풀 때 종종 사용했었다. 그런데 쓸 때마다 groupingBy() 메서드의 API 문서를 보며 아 이렇게 쓰는 거였지 하고 그대로 따라 치곤 했다.public class GroupingByTest { @Getter static class Person { private final int age; private final String name; public Person(int age, String name) { this.age = age; this.name = name; ..

2024.01.14

개발 공부/Java 형 변환 정리

알고리즘 문제를 풀다보니 문제는 풀 수 있겠는데 형변환을 못해서 해결이 안 되는 문제가 꽤 많았다. 그래서 형 변환 문제에 봉착할 때마다 계속해서 추가하며 정리해보려고 한다. String ↔ int Integer의 static 메소드 parseInt, toString을 사용할 수 있다. String → int // 기본형 int i = Integer.parseInt(str); // str이 x진수로 작성되었다고 생각하고 int로 변환 int t = Integer.parseInt(str, x); int → String String str = Integer.toString(i); char ↔ int 이 경우 (char), (int)로 간단하게 변환 가능 char로 변환하는 경우 int 값을 아스키코드로 인식..

2022.05.17

개발 공부/Java 내부 클래스에 static이 권장되는 이유

강의를 듣던 중 강사님께서 내부 클래스를 static으로 선언하시길래 이유가 궁금하여 찾아보았다. 찾아보니 이팩티브 자바에 해당 내용에 대한 설명이 나와있다고 한다. 나중에 꼭 읽어봐야지,, 결론은 내부 클래스에서 외부 클래스의 인스턴스 변수에 접근하지 않는다면 내부 클래스는 static으로 선언하는 것이 좋다는 것이다. 그 이유는 크게 두 가지로 정리할 수 있는데 static으로 선언되지 않은 내부 클래스는 외부 클래스에 대한 숨은 참조를 저장해야 하기 때문에 이를 위한 시간/공간적 복잡도가 증가해 성능이 떨어진다. 내부 클래스가 외부 클래스에 대한 숨은 외부 참조를 갖기 때문에 가비지 컬렉션이 제대로 이루어 지지 않아 메모리 누수가 발생할 수 있다. 숨은 외부 참조 숨은 외부 참조라는 개념이 잘 와닿..

2022.04.26

개발 공부/Java 함수형 인터페이스와 람다식

스프링 및 자바 공부 중에 람다식을 통한 익명 내부 클래스를 종종 사용하게 되었는데 원리를 모르고 따라 사용하기만 하고 있는 듯해서 관련 내용을 공부하고 정리했다. 1. 함수형 인터페이스? 추상 메서드가 한 개만 선언된 인터페이스를 말함. 추상 메서드 외에 다른 static, default 메서드 존재 여부 및 개수는 관계 없음 @FuncationalInterface 어노테이션을 붙여 해당 인터페이스가 함수형 인터페이스인지 검증할 수 있다. (필수는 아니나 함수형 인터페이스가 아닐 경우 오류 발생) 자바에서는 기본적으로 여러 종류의 유용한 함수형 인터페이스를 제공한다. ex) 함수형 인터페이스 Function Generic으로 T 타입 인자를 받아 R 타입을 반환한다. 수학의 ‘function’과 같은 ..

2022.04.26

개발 공부/Java ISP (인터페이스 분리 원칙) in 스프링 프레임워크

제목이 너무 거창한가 스프링 공부 중 아래와 같이 스프링 컨테이너인 ApplicationContext 의 구현체로 AnnotationConfigApplicationContext 를 설정하고 BeanDefinition을 반환하는 ac.getBeanDefinition() 메서드를 호출하려는데 계속 메서드를 찾을 수 없다는 오류가 발생했다. ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); 알아보니 ac의 타입을 인터페이스인 ApplicationContext가 아닌 구현체 자체로 설정해주어야 했고, 이러한 일이 발생하는 이유는 객체 지향 설계 원칙인 SOLID 중 ISP 때문이라고 한다. ORP나 DIP, SRP에 ..

2022.04.17

개발 공부/Java 자바 기초 여러가지 정리

개인적으로 맨날 쓰는데 맨날 헷갈리는 자바 기초 문법이나 특징 등등을 정리해봤습니다. 이 글은 제가 또 새롭게 헷갈리는 게 나오는 대로(?) 계속해서 업데이트할 예정입니다..😂 기본 자료형 vs 참조 자료형 기본 변수는 메모리에 값 자체를 저장하지만 참조 변수는 참조하는 객체의 주소를 메모리(변수)에 저장한다. JAVA에서 char 크기 c와 다르게 java에서는 char이 2byte로 저장된다. 서식 문자 %d - 10진수 → %Xd - 오른쪽 정렬 + 최소 X칸 만큼 공백 유지 %o - 8진수 %x - 16진수 %f - 실수 → %.Xf - 소수점 아래 X자리까지 출력 %c, %s - 문자, 문자열 조건문 (삼항 연산자) 축약 표현 조건문 : true ? false JAVA 배열의 특징 자바에서 배열..

2022.03.27