JVM이 Lambda를 어떤 방식으로 다루는지 궁금해서 찾아보던 중 Oracle 블로그에서 Red Hat의 시니어 엔지니어인 Ben Evans가 쓴 글을 찾을 수 있었다. 이를 이해하며 Lambda가 JVM에서 어떻게 다뤄지는지 살펴보려 한다. https://blogs.oracle.com/javamagazine/post/behind-the-scenes-how-do-lambda-expressions-really-work-in-java https://blogs.oracle.com/javamagazine/post/behind-the-scenes-how-do-lambda-expressions-really-work-in-java blogs.oracle.com javac, javap 모두 19.0.1을 사용하였다...
Stack을 쓰지 말라 프로그래밍에 조금만 익숙하다면 Stack과 Queue라는 자료구조를 알 것이다. 각각 LIFO(Last In First Out), FIFO(First In First Out)가 필요한 상황에 흔히 사용된다. java.util의 Stack은 Vector를 상속받아 구현되었는데 Vector는 대표적인 자바의 레거시 클래스로 Stack 또한 이 단점을 그대로 가지고 있다. A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. For exam..
try-finally의 단점 InputStream, OutputStream과 java.sql.Connection과 같은 자원은 close 메서드를 사용자가 직접 호출해 닫아주어야 한다. 이런 자원을 직접 닫아주지 않아도 gc가 알아서 처리해주긴 하지만 그 시점을 정확히 알 수 없기 때문에 직접 닫아주는 것이 가장 안전하다. Java7 이전에는 자원의 닫힘을 처리하기 위해 try-finally가 사용되었다. BufferedReader를 사용해 한 줄의 콘솔 입력을 받는 메서드는 아래와 같다. String readLine() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { re..
동일성과 동등성 '동일하다'와 '동등하다'는 거의 같은 단어처럼 들리겠지만 프로그래밍에서는 큰 차이를 가지고 있다. int나 double 같은 기본 타입의 경우 우리는 '==' 연산자를 통해 같음을 확인한다. 그러나 객체의 경우 우리가 같다고 취급하고 싶어도 equals 메서드 혹은 '==' 연산자로 동일함이 확인되지 않는다. System.out.println(1 == 1); // true // 리터럴로 생성된 string은 string pool에 담겨 같은 객체가 재사용된다. String string1 = "string"; String string2 = "string"; System.out.println(string1 == string2); // true System.out.println(string1..
가변 인수(Varargs) 사용하기 Java 5 이전에는 메서드에 다른 개수의 인수들을 넣기 위해서는 메서드를 여럿 정의하거나 배열의 형태로 인수를 넘겨주어 처리해야 했다. Java 5의 가변 인수(Varargs)의 등장으로 Object... 와 같이 메서드의 인수를 0개 이상 받을 수 있게 선언이 가능해지며 이러한 불편함이 사라지게 되었다. public void method(String... strings) { for (String string : strings) { System.out.println(string); } } // method("a", "b", "c") 와 같이 사용 이렇게 가변 인수를 통해 입력을 배열처럼 편하게 처리할 수 있는 지금과 달리 public void method(String..
객체지향 생활체조 원칙에선 '모든 원시값과 문자열을 포장한다'라는 규칙이 존재한다. 객체지향적 설계를 위해 원시값을 포장해 얻는 이점이 무엇이며, 어떻게 사용하면 좋을까? 원시값을 포장하여 책임을 분산시키자 모의 로또 게임을 위한 값을 입력받는 상황을 가정하자. 원시값을 포장하면 아래와 같이 새로 입력받은 값에 대한 검증을 private List getLottoNumbers() throws Exception { List lottoNumbers = new ArrayList(); for (int i = 0; i < 6; i++) { int lottoNumber = readLottoNumber(); validateLottoNumber(lottoNumber); lottoNumbers.add(lottoNumber..
- Total
- Today
- Yesterday
- MySQL 이벤트 스케줄
- Payload 암호화
- 우테코 5기
- 생성자 주입
- 우테코 프리코스
- 람다식
- java switch case
- RandomPort
- Java
- invokedynamic
- Fromtail
- GitHub Discussion Template
- Spring 테스트
- multiplebagsfetchexception
- GitHub Discussion 템플릿
- JPA
- 우테코
- 자바
- Spring Boot Monitoring
- logback-spring.xml
- 의존성 주입
- stubbing
- GitHub Discussion
- MySQL
- 함수형 인터페이스
- springboottest
- Spring
- Jenkins 예약 배포
- JPA JSON
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |