공부방/JAVA 25

Map의 EntrySet()에 대한 자세한 설명(맵을 탐색하는 4가지 방법)

Map 인터페이스 내부 코드 Map에 저장되는 요소는 모두 Key-Value 쌍이므로 각 Key-Value 쌍마다 매핑 관계가 있어야 한다. Map은 매핑된 항목을 나타내기 위해 Entry 내부 클래스를 사용한다. 이 Entry 내부 클래스를 통해 키와 값을 얻어낼 수 있다. Map.Entry를 통해 getKey() 및 getValue() 사용 예제 entrySet() 이란 entrySet은 Map의 Key-Value 쌍의 모음이다. HashMap에 저장된 키-값의 데이터를 결합된 형태로 Set에 저장하여 반환해준다. Set 인터페이스의 타입은 Map.Entry이다. 다음 예제와 같이 map을 순회할 수 있다. keySet() 이란 keySet은 Key의 모음이다. Set으로 반환되며 Set의 타입은 K..

공부방/JAVA 2023.12.10

익명객체와 람다는 결국엔 같은걸까?

저번 글에서 아래 두개의 코드는 같은 일을 수행한다고 글을 쓴 적이 있었다. 즉, 이 둘을 보면 컴파일러는 람다식을 익명객체로 변환한다고 볼 수 있다고 생각할 수도 있다. 이 둘을 컴파일하고 javap로 디컴파일 하여 과연 바이트코드가 같은 지 확인해보겠다. 결론부터 말하면 익명객체와 람다식은 서로 다르다. 바이트코드를 얼핏 봐도 위에는 INVOKESPECIAL 이라는 JVM 명령어를 쓰고 있고, 아래는 INVOKEDYNAMIC이라는 JVM 명령어를 사용함을 볼 수 있다. 이 둘의 차이점이 뭔지 간단하게(깊지 않게) 고민해봤다. 익명 클래스 바이트 코드 1. Ex14_0의 내부 클래스인 INNERCLASS가 만들어지고 Ex14_0$1의 클래스가 새롭게 생성되었음을 위의 바이트 코드와 다음 클래스에서 확인..

공부방/JAVA 2023.12.03

람다식 기본 - 백기선 자바라이브스터디

람다식 사용법 함수형 인터페이스 : 하나의 추상 메서드만 포함하는 인터페이스는 함수형 인터페이스 이다. 함수형 인터페이스의 경우 람다 표현식을 통해 인터페이스의 객체를 생성할 수 있다. Lamda 표현식을 사용하면서 익명 내부 클래스에 대한 너무 많은 정의를 피하고, 코드를 더욱 간결하게 만들고, 의미 없는 코드 쌍을 제거하고 핵심 로직만 남긴다. 요약: 추상 메서드가 하나만 포함된 인터페이스의 경우 Lamda 표현식을 사용하여 코드를 단순화 하여 객체를 생성할 수 있다. 람다식 생략 가능한 것 매개변수 유형 생략 가능 메서드 본문에 코드 한 줄만 있는 경우 중괄호 반한과 세미콜론 생략 가능 메서드에 매개변수 하나만 있는 경우 괄호 생략 가능 https://babgeuleus.tistory.com/116..

공부방/JAVA 2023.12.02

코드 품질 향상을 위한 제네릭(Generic) - 백기선 자바라이브스터디

제네릭이 제대로 사용하기 위해서 왜 사용하는 지 부터 알아보겠다. 제네릭 사용 이유와 이점 컴파일 타임에 타입 검사를 통해 예외 방지 제네릭은 JDK 1.5에 추가된 기능이다. JDK 1.5 이전에서는 여러 타입을 다루기 위해 Object 타입을 사용했었다. 하지만 Object로 타입 선언할 경우 반환된 Object 객체를 다시 원하는 타입으로 타입 변환을 해야 하며, 런타임 에러가 발생할 가능성도 존재한다. 아래 왼쪽 사진은 Object를 사용했을 경우 문제, 오른쪽은 제네릭을 사용했을 경우에 대한 예제 이다. 불필요한 캐스팅을 없애 성능 향상 위 사진 처럼 Object를 사용한다면 다운 캐스팅을 해야 하고 , 컴파일러는 타입검사를 추가적으로 진행해야 했다. 반면 제네릭은 미리 타입을 지정하거나 제한하..

공부방/JAVA 2023.10.30

@GetterSetter을 만들어보자

왜 @GetterSetter을 만들어보려 하나요? 어노테이션 프로세서를 공부하면서 직접 Lombok이 가지고 있는 기능인 @Getter와 @Setter을 만들어보고 싶다는 생각이 들었다.그리고 롬복이 어떤 방식으로 작동을 하는지 궁금증이 생겨 어노테이션을 직접 만들어보면서 동작방식을 이해위해 시작한 것이다. Lombok의 원리가 뭔지 모르면 먼저 이것부터. Lombok의 어노테이션들 중 @Getter을 예시로 들고 생각해보자. (롬복의 다른 어노테이션을 생각하고 봐도 상관없다) 컴파일타임때만 @Getter을 사용하고 있기 때문에 Javac의 이해가 먼저 필요하다. Javac의 컴파일 과정은 크게 3가지 과정을 거친다. 1단계 : 심볼 테이블 구문 분석 및 채우기 먼저 심볼테이블 파싱은 크게 두가지로 나뉜..

공부방/JAVA 2023.10.12

I/O - 백기선 자바라이브스터디

스트림 (Stream) / 버퍼 (Buffer) / 채널 (Channel) 기반의 I/O 스트림이란 자바에서 어느 한 쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전송할 수 있는 통로가 필요한데, 이것을 스트림(stream)이라고 정의한다. 스트림은 연속적인 데이터의 흐름을 물에 비유해서 붙여진 이름인데 여기서 마치 물이 한 쪽 방향으로 흐르는 것과 같아 스트림도 역시 단방향 통신만 가능하다. 즉, 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다. 따라서 양방향 통신을 위해 입력 스트림 출력 스트림 둘 다 필요하다. 입력스트림으로 바이트나 문자가 들어오는데 큐와 같이 FIFO 구조로 받아온다. 즉 먼저 보낸 데이터를 먼저 받게 된다. 버퍼란 I/O에서 입력 스트림과 출력 ..

공부방/JAVA 2023.10.10

Annotation 커스텀 하기 - 백기선 자바라이브스터디

애노테이션(annotation)은 사전에서 '주석' 이라고 정의한다. 주석은 /** .. */으로 표현을 하는데 이는 우리 개발자들이 소스코드를 보는 데 도움을 주는 주석이라면 애노테이션은 우리뿐 아니라 컴파일러에게 도움을 주기 위해 작성하는 주석이라고 볼 수 있다. 이번 글에서는 애노테이션을 이미 만들어진 built-in 애노테이션(@Override , @Deprecated , @SuppressWarnings , @SafeVarags)를 소개하는 것은 아니고 직접 애노테이션을 정의해보면서 이해를 해보도록 한다. @Override : 컴파일러에게 오바리이딩하는 메서드라는 것을 알린다. @Deprecated : 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다. @SuppressWarnings : 컴파일러..

공부방/JAVA 2023.09.30

자바 리플렉션(Reflaction)

어노테이션의 개념을 공부하던 중 리플렉션이라는 개념이 어노테이션을 커스텀 할 때 꼭 필요하다는 것을 알게 돼 이번 기회를 통해 정리해본다. 리플렉션 이란? 리플렉(reflect)의 어원 : "반사하다/비치다" 리플렉션은 밑에 사진처럼 클래스를 직접 조작하는 것이 아니라 거울에 반사된 사람을 보고 클래스를 검사하고 조작하는 기술이라고 보면 된다. 리플렉션의 정의를 보면 런타임에 클래스와 인터페이스등을 검사하고 조작할 수 있는 기능 이라고 적혀있는데 JVM 아키텍처 관점에서 이해하면, 런타임 동안 JVM의 Method Area에는 정적변수를 포함한 모든 클래스 수준 데이터가 저장된다. 여기서 리플렉션이란 거울에 반사되는 사람이 곧 Method Area라고 보면 되고 이 영역을 보면서 클래스를 조작하고 검사한..

공부방/JAVA 2023.09.28

Enum - 백기선 자바라이브스터디

Enum이란, 서로 관련된 상수를 여러개 정의할 때 사용한다. Enum(열거형)을 써야하는 이유는 다음과 같다. 허용되는 값들을 제한할 수 있다 리펙토링 시 변경범위가 최소화된다. 내용의 추가가 있어도 Enum 코드 외에 수정할 필요가 없다 자바의 Enum은 그외에 다양한 기능을 제공한다. 더 자세한 내용은 이펙티브자바에서 다루겠다 Enum 정의하는 방법 가장 기본적인 방법으로 아래와 같이 상수를 정의한다. 이제 여기서 각 상수에 가장 관련있는 값인 가격과 한국식 명을 추가하고 싶으면 생성자를 추가한다. 생성자에 변수말고도 각 상수마다 필요한 계산이 있다면 특정 상수에 함수를 관련 시키게 할 수 있다. 예를들면 삼성이 후원하는 매장에서 삼성노트북을 사면 할인을 해주는 그런 로직이 필요하다면 다음과 같이 ..

공부방/JAVA 2023.09.22

멀티스레드와 동기화 문제 - 백기선 자바라이브스터디

분명 프로젝트를 진행하면 싱글 메인스레드만을 돌리는 프로젝트를 보기가 오히려 어려울 것이다. 두 개 이상의 스레드를 돌리면서 각종 동시성 문제와 데드락을 해결하는 과정을 거치는 경험을 갖게될텐데 여기서 생기는 문제를 쉽게 해결하기 위해 이번 기회에 한번 쭉 정리하겠다. Thread 클래스와 Runnable 인터페이스 프로세스와 스레드의 차이 부터 알고 있어야 스레드를 이해할 수 있다고 생각한다. 운영체제에서 자세히 살펴볼 수 있으니 간단하게 언급만 하고 넘어가겠다 process : 프로그램이 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태 thread : 할당받은 자원을 이용하는 실행의 단위이고 프로세스 내에서 여러 개 생길 수 있다 하나의 프로세스는 코드와 데이터 영역은 여러 스..

공부방/JAVA 2023.09.20