끝나지 않는 프로그래밍 일기
지금까지 올라온 기록들
-
프로그래밍 관련 게시글 내용을 최신에 맞춰 업데이트 할 예정입니다.
프로그래밍 관련 게시글 내용을 최신에 맞춰 업데이트 할 예정입니다.
2022.06.01대부분 2012년 쯤에 작성된 게시글들이 많아서 지금 와선 중요도가 떨어져 더 이상 사용되지 않고 사라진 기능을 소개하고 있거나 잘못된 내용을 적어둔 게시글들이 많은 것 같습니다. 따라서 부족한 내용은 더 보충하고 새롭게 소개된 기능들을 본문 내에 업데이트할 예정입니다. 이해가 힘들거나 잘못된 내용을 소개하고 있는 게시글을 댓글에 달아주시면 바로 확인하겠습니다. 업데이트 예정인 게시글들 자바 관련 게시글을 모두 업데이트하면 Python, C#, C/C++ 관련 게시글도 업데이트를 할 예정입니다. 링크가 파랗게 칠해진 부분은 최신으로 내용을 갱신한 것이며, 빨간색으로 칠해진 부분은 추가로 올릴 것들, 아직 아무것도 칠해지지 않은 부분은 갱신이 아직 되지 않은 것입니다. 1. 자바(JAVA) [2022년에 .. -
invokedynamic의 내부 동작
invokedynamic의 내부 동작
2022.05.22이 게시글은 자바 8을 기준으로 작성되었습니다. Invokedynamic 아래의 코드를 떠올려봅시다. 람다의 타입은 무엇일까요? 람다는 int, double 같은 기본 타입이 아니므로 참조 타입, 즉 객체의 참조여야 합니다. 다시 말해서, Runnable을 구현하는 클래스의 인스턴스에 대한 참조여야 합니다. package com.company; public class InvokeDynamicExample { public static void main(String [] args) { Runnable r = () -> System.out.println("Hello"); r.run(); } } 이를 javap로 뜯어보면 아래와 같은 바이트코드를 살펴볼 수 있습니다. 여기서는 명령 5~6에서 스택에 푸시된 람다.. -
37편. 레코드(Record)
37편. 레코드(Record)
2022.05.20도입 단순하게 데이터를 한쪽에서 다른 한쪽으로 전달하기 위해서만 사용되는 데이터 전송 객체(혹은 DTO)를 생각해봅시다. 이런 객체를 사용하는 이유는 다양한 집계 연산을 수행한 후의 결과를 담아두거나, 외부 시스템과 통신 시에 필요하지 않은 데이터를 제거하여 대역폭 사용량을 줄이기 위해, 세부 구현을 노출시키지 않기 위해서, 혹은 변경되지 말아야 하는 API 설계 상의 이유 등 다양한 이유가 있을 수 있습니다. 이를 제대로 구현하기 위해서는 (롬복이나 IDE의 도움을 받을 수도 있지만) 아래와 같이 게터(getter 혹은 accessor), equals(), hashCode(), toString() 처럼 계속 똑같은 구조의 코드를 반복해서 작성해야 했습니다. public class BookDto { pr.. -
프로젝트 롬복(Project Lombok) 살펴보기
프로젝트 롬복(Project Lombok) 살펴보기
2022.05.19프로젝트 롬복(Lombok) 프로젝트 롬복(Project Lombok, 이하 롬복)은 게터(getter), 세터(setter), equals()/hashCode() 등과 같이 코드를 작성하면서 계속 비슷한 내용이 지루하게 반복되었던 코드들을 애노테이션 선언 하나로 간단하게 대체할 수 있도록 도와주는 자바 라이브러리입니다. 설치 방법 여기서는 IntelliJ 위주로 살펴보므로, 최신 정보나 IntelliJ가 아닌 다른 IDE에서는 어떻게 설치하는지 알고 싶다면 공식 홈페이지에서 확인해보세요. IntelliJ 같은 경우는 2020.3 버전부터 롬복 플러그인이 내장되어 있어서 별도로 설정해줄 것이 없습니다. 의존성 설정은 직접 해도 되지만 아래와 같이 Alt+Enter를 눌러서 Context Actions에서.. -
JVM. 클래스로더 서브시스템(Class Loader Subsystem)
JVM. 클래스로더 서브시스템(Class Loader Subsystem)
2022.05.16JVM은 RAM에 위치하며, 실행 중에 클래스로더 서브시스템을 이용하여 클래스 파일을 RAM으로 가져옵니다. 이를 자바의 동적 클래스 로딩 기능이라고 합니다. 이 과정은 컴파일 타임이 아니라 런타임에 일어나며, 처음으로 클래스를 참조할 때 클래스 파일(.class)을 로드하고, 링크하고, 초기화 합니다. 로딩(Loading) 컴파일된 클래스(.class 파일)을 메모리에 적재하는 것이 클래스로더(class loader)의 주요 작업입니다. 보통, 클래스 로딩 과정은 메인 클래스(즉, static main() 메서드 선언이 있는 클래스)를 로드하는 것부터 시작됩니다. 이외에도 클래스 로딩은 아래의 상황에서 일어날 수 있습니다. // 클래스에 선언된 정적 메서드를 호출할 때 Car.invokeStaticMe..