본문 바로가기

Programing/JVM(Java, Kotlin)

(94)
[Java] JMM 에 대한 글들 자바에서 동시성에 대해 알기위한 기초. 자바 메모리 모델의 줄임말 JMM에 대한 JSR-133 스펙을 대신할 수 있는 좋은 글들이 있어서 블로그에 링크를 달아둔다. Java 5의 동시성 라이브러리를 많이 만든 더그 리(Doug Lea)의 The JSR-133 Cookbook for Compiler Writers 그림이 곁들어져 있는 Aleksey Shipilёv의 Close Encounters of The Java Memory Model Kind
[Java 11] 자바11 에서 테스트가 깨진다!? Spock Framework 로 테스트 코드를 짜고 있다. 이상하게 자바8에서는 잘 동작하던 것이 11에서 깨지는 것이 발견되었다. 두 개의 테스트가 실패했는데 공통점은 인터페이스를 익명클래스로 상속해서 오버라이딩하는 부류의 코드였다. 결국 Spock Framework에서 제공하는 Stub()으로 그 인터페이스를 대체했더니 사라지긴 했다. 에러 스택은 아래와 같았다. 클래스로더가 테스트 메소드에서 오버라이딩한 클래스를 로딩을 못하는 느낌이 든다. (모듈 때문일까?) java.lang.ClassFormatError: Illegal method name "어떤 테스트..." in class com/tistory/namocom/service/FooSpec$1 at java.base/java.lang.Class..
[Java] Object.hashCode JavaDoc - History Java 1.3.1 hashCode public int hashCode()Returns a hash code value for the object. This method is supported for the benefit of hashtables such as those provided by java.util.Hashtable. The general contract of hashCode is: Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no i..
[Java] "서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다."? 자바의 정석 453쪽에 보면 "서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다."라는 말이 나와있다. 물론 Object의 hashCode는 오버라이드가 가능하므로 다음과 같이 코드를 짠다면 무조건 같은 해시코드만 반환이 될 것이다.public class Foo { @Override public int hashCode() { return 1; } public static void main(String[] args) { Foo foo1 = new Foo(); Foo foo2 = new Foo(); System.out.println(foo1 == foo2); System.out.println(foo1.hashCode() == foo2.hashCode()); } }위의 코드를 실행한다면false tru..
[java] Java 8의 시간은 10000년을 파싱 못한다? 10000년까지 살아 있을지는 모르겠지만 테스트 케이스를 만들었는데 LocalDate.parse("10000-01-01") 위와 같은 코드는 아래와 같은 파싱 예외가 발생한다. java.time.format.DateTimeParseException: Text '10000-01-01' could not be parsed at index 0 at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) at java.time.LocalDate.parse(LocalDate.java:400) at j..
[Java] toString에서 나타나는 [, L 등의 문자의 정체는? 간단한 코드이다. 아래의 코드를 수행하면 어떤 글자들이 콘솔에 찍힐까? package com.tistory.namocom.question public class ToStringTest { public static void main(String[] args) { Object object = new Object(); Object[] objects = new Object[1]; System.out.println(object); System.out.println(objects); } } 아래의 결과를 보기 전에 미리 생각해보자. 더보기 java.lang.Object@6576fe71 [Ljava.lang.Object;@76fb509a 생각했던 것과 일치했을까? System.out.println 왜 이런 글자들이 ..
[Java] String: literal vs new 자바 기초중에 하나이다. 자바에는 문자열을 생성하는 방법이 크게 두가지가 있다. 리터럴(literal) 방식이고 다른 하나는 new 생성자를 이용한 방법이다. 코드로 설명하는 것이 이해가 빠를 것 같다. String str1 = "a"; String str2 = new String("a"); str1 이 리터럴 방식이고, str2 가 생성자를 이용한 방식이다. 퀴즈. 둘 중에 안티패턴은? 답부터 이야기하면 바로 생성자를 이용한 방식이다. 왜 그런지는 아래에서 살펴 볼 수 있다. String Internal 위의 자바코드를 읽을 수 있는 바이트 코드로 나타내보면 아래와 같다. ldc "a" astore_1 new java/lang/String dup ldc "a" invokespecial java/lang..
[Java] hashCode() internal : String, Object 질문: String 간 비교시 헸길리는 부분이있어서 질문 드립니다. String a = "a"; String b = new String("a"); 이와 같은 케이스는 주소가 다르게 생성되던데 이런 케이스 때문에 무조건 equals()메소드로 비교하는것인가요?? 답변부탁드립니다. 질문에 대한 답부터 하면 "맞다."이다. 하지만 이 글을 쓰게 된 이유에는 '주소'라는 말이 있었기 때문이다. 혹시 주소가 hashCode() 돌려주는 값을 의미했는지 물어보니 그렇다고 한다. String 클래스의 hashCode (보통) String 클래스의 hashCode() 는 Object의 hashCode()를 사용하지 않고 오버라이딩해서 구현한다. 버전에 따라 구현 방법은 바뀌었지만 자바 8에서는 public final ..