본문 바로가기

기초 지식/Java

(18)
[Java] Virtual Thread(가상 쓰레드) Virtual Thread 2023년 9월에 릴리즈 예정인 Java 21부터 제공되는 기능으로써 기존의 스레드 이외에 추가되는 경량 쓰레드입니다. 기존의 스레드 VS 가상 스레드 기존 스레드 OS (Operating System)이 관리하고 스케쥴링 한다. 즉, 기존 Java에서 스레드를 사용하는 것은 OS의 스레드를 사용하는 방식이다. OS 커널 스레드를 새로 생성하는 것은 비용이 크다. 그래서 스레드 풀 (Thread Pool)을 사용했었다. OS에서 context switch가 될 경우 시간이 오래 걸리기 때문에 non-blocking I/O 방식 혹은 비동기 방식으로 사용해야 조금 더 효율적으로 스레드를 사용할 수 있다. 가상 스레드 JVM에 의해 관리되고 스케쥴링 된다. 가상 머신에 의해 관리되..
[Java 13 ~] Text Blocks Java Text Blocks java 13부터 제공되는 기능 중에 Text Blocks가 있습니다. 굉장히 유용한 기능이라고 보기는 어렵지만 이전에 html을 반환해주는 상황이거나 혹은 String을 여러 줄 작성해야 할 때 사용 가능한 기술입니다. 기능 여러줄의 String을 하나의 block에 작성할 수 있게 해 준다. 예시 public String textBlocks() { return """ """; } Text Block은 "(큰따옴표) 3개로 작성합니다. 내부에 원하는 Text를 작성하면 완성입니다. // Text Block안에 "(큰따옴표)는 escaping이 필요없습니다 public String textBlocks() { return """ "escape가 필요없다" """; } // f..
[Java] Sealed Class Java 17의 release note를 보다 보면 Sealed Class가 정식으로 확정된 것으로 보입니다. JDK 15부터 프리뷰로 추가되었던 것 같은데 한 번도 써본 적이 없네요. ㅎㅎ 오늘 알아보도록 하겠습니다. Sealed Class Sealed Class, Interface는 간단하게 상속하거나(extends), 구현(implements)할 클래스를 지정해두고 해당 클래스들만 상속 혹은 구현을 허용하는 키워드입니다. public sealed interface CarBrand permits Hyundai, Kia{} public final class Hyundai implements CarBrand {} public non-sealed class Kia implements CarBrand {} ..
[Java] HashTable, ConcurrentHashMap에 대해서 HashTable vs HashMap Java를 사용하면서 HashMap은 많이 사용해봤지만 HashTable은 들어만 보고 거의 사용해본 적은 없는 것 같습니다. 하지만 DB나 여러 라이브러리에서 사용하고 있을 것으로 생각이 되어서 정리해보려 합니다. 우선은 ConcurrentHashMap을 알아보기 전에 HashMap과의 차이를 알아보겠습니다. HashTable은 HashMap과 매우 유사합니다. 아래에서 사용법을 알아볼텐데 메서드 명조차 거의 동일합니다. 가장 큰 차이점은 Thread-safe 여부입니다. HashTable 내부에서는 synchronized 키워드를 이용해 Thread-safe하도록 구현되어 있습니다. 이외에도 Key값에 Null을 허용하는지 여부와 에러를 발생시킬 수 있는 코드를 ..
[Java] this 키워드에 관해서 this 키워드 java를 사용하다보면 this.~~ 방식으로 사용하는 키워드를 보게 됩니다. 단순하게는 객체 자기 자신을 가르킨다라고 생각하면 되는데요. 사용하다가 약간의 헷갈리는 부분이 생겨서 정리하게 됐습니다. this 키워드의 역할 클래스가 인스턴스화 되었을 때 자기 자신의 메모리 주소를 담고 있는 키워드 인스턴스의 지역변수로 숨겨진 채로 존재한다 자신의 인스턴스 필드임을 명시하고자 할 때 사용한다 기본적인 사용법 public class Car { private String name; private int power; public Car(String name, int power) { this.name = name; this.power = power; } } 기본적으로 생성자에서 주로 사용하게 되는..
[Java] HashMap에서 잠시 헷갈렸던 부분! Java에서 Map을 종종 사용하게 됩니다. 근데 Map에 대한 로직을 보는데 헷갈리는 부분이 있더라고요. 제가 헷갈렸던 부분을 예시로 보고 정리해보았습니다. HashMap HashMap같은 경우에는 메모리 값에 기반한 해시 값을 이용해 값을 찾아오게 됩니다. 여기에 사용되는 해시값은 Object 클래스에 포함되는 hashCode() 메서드를 통해서 만들어지게 됩니다. 그리고 여기서 만들어지는 값으로 equals() 메서드를 통해서 Object끼리 비교하게 됩니다. 물론 equals와 hashCode는 모두 오버라이딩이 가능합니다. 그리고 변경 시에는 통일성을 위해 두 메서드 모두를 수정하는 것이 필수입니다. 사용하는 방식과 약간 헷갈렸던 사례에 대해서 예제를 통해 보겠습니다. 예시 class TestC..
[Java 15 ~] Record Java Record 자바 14에서 preview로 등록되었고 자바 16 버전에 정식으로 새로운 기능으로 Record Type이 추가되었습니다.(나모찾기님 수정) 내용을 간단하게 설명하자면 기존의 POJO 객체를 만들 때 get~, set~ 이런 식으로 잡다하게 붙여줘야 할 일을 줄여주는 Type입니다. 기능 모든 프로퍼티를 포함한 생성자 제공 모든 프로퍼티에 private final 적용 모든 프로퍼티의 getter 메소드 생성 toString, equals, hashCode 메소드 생성 프로퍼티들에게 annotation을 붙일 수 있도록 허용 사용법 //Record를 사용하지 않은 클래스 public class Car { private final String name; private final int..
JVM에 관하여 Java는 쓰는데 JVM이 뭐지? Java를 사용하는 데에는 아주 간단한 과정이 있습니다. 자신의 OS에 맞는 JDK를 설치하고 내가 짠 Java 코드를 javac 명령어로 실행시키면 프로그램이 구동됩니다. 근데 이러한 과정은 맥, 윈도우, 리눅스 모두 같은 과정을 거쳐서 사용할 수 있습니다. 이것은 Java 언어의 특성이자 JVM을 이용해서 가능한 일입니다. JVM이란? Java Virtual Machine 자바 바이트 코드를 해석하고 실행 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어서 자바 API와 함께 실행 자바의 WORA(Write Once Run Anywhere) 컨셉을 위해 사용되는 소프트웨어 JVM은 우리가 흔히 사용하는 프로그램들과 똑같은 소프트웨어입니다. 단지 자..
[Java] Checked Exception, Unchecked Exception 1. Checked Exception, Unchecked Exception이란 자바로 열심히 코딩을 하다보면 여러가지 Exception(예외)들을 만납니다. 실무에서뿐만 아니라 코딩테스트를 풀다가도 자주 만나는 Exception으로는 NullPointException, ArrayIndexOutOfBoundsException 등이 있습니다. 그렇다면 앞의 두 예시는 어떤 상황에서 발생할까요? 보통은 컴파일 시에는 발생하지 않습니다. 그랬다면 이미 알고 수정했을겁니다. 그렇다면 실행도중에 발생한 예외일겁니다. 그럼 Runtime 시점에 발생했으니 RuntimeException일겁니다. 이것들은 우리가 프로젝트를 실행할 때는 전혀 문제가 없습니다. 그래서 굳이 에러가 발생할 상황이 만들어지지 않는다면 체크할 ..
[Java] String 선언 방식에 따른 차이 String을 사용할 때 2가지 방식으로 선언할 수 있는데 어떤 차이가 있을까요? Java에서 String은 Reference 타입 중 가장 많이 사용되지 않을까 생각됩니다. 그런데 잘 알지도 못하고 사용하고 있다고 위의 질문을 들었을 때 알게 되었습니다. 그리고 Java책을 다시 펴보게 됐네요 ㅎㅎ public class Test { public static void main(String [] args) { String init1 = new String("init1"); String init2 = "init2"; String init2_2 = "init2_2"; } } String을 사용할 때 보통은 init2의 방식대로 사용하겠지만 위의 방식도 가능합니다. 중요한 차이점은 JVM에서 관리하는 메모리 ..