유튜브 영상 초반에 나온 말부터 전달해 드리면 모든 기술을 선택할 때는 이유가 있어야 합니다. virtual thread의 소개도입을 고려하게 된 배경으로는 전사 게이트웨이 시스템 개발용 안정성과 처리량에 대한 고민이 필요해서 알아보게 되었다고 합니다Coroutine vs Virtual Thread1. Kotlin Coroutine (실제 선택하셨다고 합니다)2. Java Project Loom (jdk 21 이 나오기 전이라, 테스트 버전이었습니다)경량 스레드 모델로 jdk 21에 정식 feature로 추가됩니다. Virtual Thread의 장점스레드 생성, 스케쥴링 비용이 기존 스레드보다 훨씬 저렴합니다.스레드풀을 사용할 정도로 비용이 기존의 자바 스레드의 생성 비용이 큽니다.최대 2MB까지 차지할..
자바 버전 올리려다 과정을 기록해 두면 정말 많은 도움이 앞으로 될 것 같아서 기록해두려고 한 글입니다 이 글을 읽는 모든 분들은 비슷한 문제를 마주했을 것 같지만 천천히 편하게 올리면 결국 다 할 수 있습니다 파이팅 현재 상황은? 현재 저희 팀의 프로젝트는 자바 8로 되어있습니다 당연하지만 스프링부트도 2. 초반의 버전으로 이루어져 있습니다 자바 8이 유지가 되면 어떤 문제가 생길까요? 자바 8의 support 기간은 어마어마하게 많이 남아있는데요? 무려 앞으로 6년 10개월이나 남은 2030년 12월 31일에 서포트가 종료되는데요? 그전에 누군가가 자바 버전을 올려주지 않을까요? (하지만 그 일은 절대로 이루어지지 않습니다) 다른 사람을 설득할 수 있는 자바 버전을 꼭 올려야 하는 이유를 그나마 찾는..
우아한테크코스에서 자바 11을 사용하는 것이 너무 익숙해진 상황이어서, java 11 대신 java 17을 쓰려면 쓰는 대신, 왜 java 17을 쓰면 좋은지에 대해서 설득을 하는 시간이 있어야 하는데요 처음에는 단순히 record 클래스가 좋아요, collect(Collectors.toList()); 대신 toList() 만으로 해결할 수 있어서 좋아요 까지밖에 설명할 수 없었습니다. 이것만으로 동의를 해줘서 일단 java 17을 사용하기로 했지만, 이번 기회에 조금 더 자세하게 알아보려고 합니다 Java 17 과 Java 11의 중요한 차이들 기능적인 부분과, 숨겨진 부분을 나누어볼 수 있을 것 같습니다. 기능적인 차이점 언제나 직접 차이를 보면 더 직관적이기 때문에, 직접 코드를 보면서 설명을 해보..
리플렉션에 대해 공부하던 중 갑자기 궁금한 점이 생겼습니다. final 키워드가 붙은 곳도 변경이 가능하다는 점인데요 이를 실제로 변경하게 되면 어떤 결과가 나올까요? https://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection public class EverythingIsTrue { static void setFinalStatic(Field field, Object newValue) throws Exception { field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField("modifiers"); mod..
Collector 인터페이스는 collect 함수를 사용할 때 넣어줘야 하는 객체인데요 public interface Collector { /** * A function that creates and returns a new mutable result container. * * @return a function which returns a new, mutable result container */ Supplier supplier(); /** * A function that folds a value into a mutable result container. * * @return a function which folds a value into a mutable result container */ BiCons..
자바 멀티스레드 프로그래밍을 배우다 컴파일러 최적화에 대해서 다뤄야 할 기회가 생겨서 이루어보려고 합니다 class SharedClass{ private int x=0; private int y=0; public void increment(){ x++; y++; } public void validate(){ if(x=y는 어떤 경우에도 만족할 수 있을 것으로 보입니다 하지만 실제로 실행시켜보면 어떨까요? public class ConcurrentTest { public static void main(String[] args) { SharedClass sharedClass = new SharedClass(); Thread t1 = new Thread(() -> { for(int i=0;i { for(int..
Java Exception 의 계층 구조 Java의 예외에는 대표적인 클래스 4가지가 있습니다 이 4가지 클래스는 사실 직접 사용하는 것은 권장되지 않습니다. 대부분의 경우에 이를 상속받는 새로운 클래스를 만들어 사용하거나, 대표적인 예외들을 사용하도록 권장하고 있습니다( ex) IllegalArgumentException, NullPointerException ) 1. Throwable 모든 예외에 관련된 부분의 가장 조상이 되는 클래스 입니다. 모든 예외가 공통으로 가지고 있는 메서드나, 상태를 가지고 있습니다. 실질적으로 에러와 관련된 거의 모든 로직들이 담겨있지만, 직접 사용되는 경우는 거의 없기에, 사실 그렇게까지 깊게 알 필요는 없습니다 이 클래스를 포함한 서브 클래스들 중 RuntimeExc..
이 글을 쓰게 된 이유는 Java 에서 Exception 에 대해서 알아보는 과정에서 This 로 "초기화 되지 않음" 상태를 표현할 수 있다는 점을 알게 되어서 이를 정리하려고 합니다 초기화 되지 않음을 표현하는 방법 1. 기본 값 기본 값을 초기화되지 않았다는 표현을 할 방법으로는 한가지 밖에 존재하지 않습니다 Magic Number를 사용하는 방법인데요 int 값이라면 Integer.MAX_VALUE 같은 평범한 케이스에서 생길 수 없는 값을 미리 넣어놓고, 안 들어올 것 같으니까 초기화 안 된거다는 것으로 예외 처리를 하는 방법이 있습니다 당연하지만, 이것은 절대로 들어오지 않는다는 보장이 있어야 합니다 int 값이라면 이런 방식으로 설정이 가능하더라도, boolean 같은 경우가 된다면 더욱 까..
Generic과 함께하는 가장 대표적인 warning부터 보고 시작하겠습니다 List 대신 List 형태로 바로 사용하고 있는데요 Warning unchecked Generic을 이용해 타입 지정을 했지만, 실제 추론 가능한 타입은 Object일 때 사용됩니다 Object를 Generic에 의해서 제공된 타입의 정보로 캐스팅할 때 발생합니다 list.get(index)를 하는 결과는 Object타입이지만, 이를 (T) 형태로 캐스팅할 수 있는지 여부를 확인하지 못하고 변환했기에 발생한 예외입니다 rawtypes List를 List 형태로 작성하지 않고, List 형태로 사용했기 때문에 컴파일러가 타입추론을 할 수 없다는 경고를 하고 있습니다 List 를 제대로 적어준다면, 발생하지 않는 경고입니다 런타임..
Generic 을 왜 사용하기 시작했을까요? 이 질문에 대해서 알아보기 위해서 글을 작성했습니다 Generic 이 없었을 때는 어땠을까요? Generic 이 없이 작성된 과거의 코드를 가져와보도록 하겠습니다 실제로 작성할 수 있는데요 문제가 되는 상황이 2가지나 보이는데요 1. String을 직접 꺼내도 String이 나오지 않고, Object 형태로 나와서 캐스팅을 하지 않는다면 컴파일 에러가 발생하게 됩니다 2. String 만 들어있을 것으로 기대되는 ArrayList 에 int 값을 넣으려고 시도해도 에러가 발생하지 않습니다 실제로 그 위치까지 가서 String으로 변환을 시도했을 때 런타임에 ClassCastException 이 발생합니다 이를 generic으로 해결할 수 있습니다 실제로 int..