본문 바로가기

CS/JAVA

(8)
[JAVA] JDK21의 Virtual Thread Virtual Thread란 Project Loom의 일환으로 JDK21에서 release 된 Virtual Thread는 기존의 OS Thread와는 다르게 훨씬 더 적은 리소스를 소비한다. 기존 Java의 Thread는 OS Thread를 직접 사용하기에 수천 개 이상의 요청 처리 시 효율적이지 못했다. 그러나 경량 스레드 모델인 Virtual Thread의 등장으로 OS Thread를 그대로 사용하지 않고 JVM의 내부 스케줄링을 통해 다수의 스레드를 사용할 수 있게 하였다. 따라서 더 많은 요청처리가 가능해지고, 컨텍스트 스위칭 비용을 줄이며 성능을 높일 수 있었다. Project Loom has made it into the JDK through JEP 425. It’s available sin..
[JAVA] Record 스프링 프로젝트를 진행하며 레이어 간 통신을 위해 DTO, VO 등의 클래스를 만들어 사용했다. 데이터의 무결성을 유지하기 위해서는 필드의 타입을 final로 설정하고, public 생성자를 정의하며, equals hashCode의 함수를 재정의하는 등의 작업이 필요했다. 이런 작업은 반복되고 번거로워서 코드의 일관성을 유지하는 데 어려움을 겪었다. 그러나 자바 14부터는 데이터의 불변성을 강제할 수 있는 Record라는 새로운 타입이 등장하게 되었다. Record는 간결한 문법을 통해 필드를 정의하고, 불변성과 관련된 메서드들을 자동으로 생성해 주어, 개발자가 불필요한 코드 작업을 줄이고 데이터를 쉽게 다룰 수 있도록 도와준다. 이번 블로그를 통해 Record 타입에 대해 자세히 알아보려고 한다. ..
JAVA의 리플렉션 API 스프링을 공부한다면 의존성 주입(Dependency Injection)에 대해 들어봤을 것이다. @Autowired 애노테이션을 사용해서 생성자 없이 인스턴스를 생성하고, @Controller, @Service , @Repository 등의 애노테이션을 통해 해당 클래스의 인스턴스를 새로 생성하지 않아도 자동으로 스프링 컨테이너에 빈을 생성하여 관리한다. 여기서 사용되는 기술이 Reflection API이다. 스프링(스프링에만 국한된 기술은 아님)은 개발자가 만든 구체적인 클래스에 대한 정보를 알 수 없을텐데 어떻게 의존 주입이 가능한 것일까? 백기선님의 "더 자바, 코드를 조작하는 다양한 방법", 메타코딩의 리플렉션 강의, 우아한 Tech의 [10분 테코톡] 파랑, 아키의 리플렉션 등을 참조 하였습니다..
[JAVA] String 그리고 StringBuffer와 StringBuilder Java로 코드를 작성하며 String 클래스를 많이 활용해 봤을 것이다. String 클래스 이외에도 StringBuffer, StringBuilder등 다양한 String 타입의 클래스들이 존재한다. 이러한 클래스들은 사용 의도가 모두 각각 다르다. 이들의 특성에 대해 알아보도록 하자. 계층 구조 Interface 기능 소개 CharSequence : String 타입의 문자열을 판독하는 기능을 가진 인터페이스. 문자열의 길이를 반환하거나, 특정 인덱스의 값을 반환하는 기능을 갖추고 있다. Appendable : Appendable 인터페이스는 StringBuffer와 StrigBuilder가 구현하고 있는 대표적 인터페이스로, 문자열 뒤에 추가적인 문자열을 덧붙일 때 사용하는 기능을 가지고 있다. ..
Abstract Class와 Interface Abstract Class와 Interface를 상속 또는 구현하려는 클래스는 이들이 명시한 추상 메서드들을 모두 구현해야 사용할 수 있다. 추상 메서드를 가진 추상 클래스와 인터페이스. 이들이 가지고 있는 공통점이지만 과연 차이점은 무엇일까? 무엇 때문에 이 둘을 나눠 놓았을까? Abstract Class와 Interface의 특성과 차이점 그리고 언제 사용해야 하는지에 대해 알아보도록 하자. ※추상화 : 기능의 내부 구현을 숨기고 사용자에게 기능만을 명시하는 것을 의미함 Abstract Class public abstract class Animal { //field public String name; public String kind; //method public abstract sound(); } ..
Java에서의 Hash Hash 가능한 한 빨리 데이터를 저장하고 검색하기 위해 Hash라는 자료구조를 많이 활용한다. 해시 테이블은 데이터를 저장하는 테이블로 Key와 Value가 한 쌍으로 존재한다. Key 값은 해시 테이블에서 인 mysterlee.tistory.com 이전 포스팅으로 Hash에 대해 간단히 정리하였다. Hash는 Hash Function을 이용하여 데이터가 저장된 또는 저장될 위치의 고유한 인덱스를 반환한다. 이 인덱스 값을 통해 해시 테이블의 데이터 탐색 또는 삽입, 삭제를 하는데 가장 빠른 경우 O(1)의 시간 복잡도로 이루어진다. 하지만 해시 테이블의 크기는 한정되어 있어서 언젠가는 Collision이 발생하기 마련이다. 따라서 Collision이 발생하지 않도록 Hash Function을 잘 설계..
정적 팩토리 메서드(Static Factory Method) 패스트 캠퍼스의 강의를 듣던 중 정적 팩토리 메서드를 사용하는 상황을 보았다. 처음 보는 객체 생성 방식이길래 찾아보던 중 이것이 정적 팩토리 메서드라는 것을 알게 되었고, 관련 내용을 찾아보던 중 이펙티브 자바라는 책을 알게 되었다. 조슈아 블로크의 Effective Java에서 첫 번째 아이템으로 '생성자 대신 정적 팩토리 메서드를 고려하라'는 주제를 내놓았다. 정적 팩토리 메서드가 과연 무엇이고, 왜 써야 할까? Static Factory Method에 관해 다양한 블로그와 강의 영상이 있지만, 인프런에서 백기선 강사님의 를 참고하였습니다. Static Factory Method 정적 팩토리 메서드는 객체 생성 역할을 하는 클래스 메서드로 생성자(Contstructor)를 통해서가 아닌 Static..
JVM 구조 JAVA는 OS와 상관없이 Window, Linux, MacOS 등 어디에서든 실행할 수 있다. C언어와 다르게 자바는 JVM위에서 실행되므로 OS를 가리지 않는 것이다. 다만 OS에 맞는 JVM을 별도로 설치해줘야 한다. 따라서 우리는 플랫폼에 상관없이 하나의 자바 소스와 자바 컴파일러를 통해 코드를 실행할 수 있게 되었다. JVM(Java Virtual Machine) 자바 가상머신이라고 불리며 자바와 운영체제 사이에서 중개해주는 역할을 하며, 자바 언어가 CPU나 운영체제에 구애받지 않고 실행될 수 있도록 도움을 준다. Java source : 사용자가 작성한 자바 코드 Java Compiler : 기계가 읽을 수 있도록 해석하여 Byte Code로 변환 Class File : 자바 컴파일러에 의해..