기술과 생각/자바와 JVM

자바 "IllegalArgumentException: Comparison method violates its general contract!" 에러에 대해 알아보자. 해당 에러는 비교 메소드가 Comparator 에서 사용하고 있는 어떤 contract 를 위반했기 때문에 발생하는 에러이다. 다시 말해서, Comparator 를 구현할 때 어떠한 모순점이 있으면 해당 에러가 발생하다. 어떤 contract 라는 것은 자바에서 따르고 있는 strict weak ordering 이라는 순서 규칙을 말한다. 에러에 대해 알아보기 전에 먼저 strict weak ordering 부터 살펴보자. 들어가기 Comparison method violates its general contract! 에러는 정렬 알고리즘이..
long 타입에서 int 타입으로 형변환하는 과정에 대해 알아보자. long val1Long = 108095103513L; long val2Long = 108030648857L; int val1Int = (int) 108095103513L; int val2Int = (int) 108030648857L; boolean isEqual = (val1Int - val2Int) == (val1Long - val2Long); 위에서 isEqual 는 true 이다. int 로 cast 되면서 정보 손실이 있었지만 그래도 true이다. 왜일까? val1Int, val2Int 는 int 로 cast 되면서 정보 손실이 일어난다. 여기서 말하는 정보 손실이란 int 값에 들어갈 수 있는 4 bytes (32 bits) ..
먼저 public static final 을 사용하는 이유에 대해서 생각해보자. public static final int DEFAULT_SIZE = 16; 와 같은 형태의 쓰임새는 이해가 갈것이다. 접근제어자를 public 으로 선언함으로써 전역에서 사용하도록 하고, static 키워드를 붙임으로써 메모리 한 영역에 정적으로 할당하여 자원을 공유하도록 하고, final 로 해당 변수의 값을 변경하지 못하게하여 불변성을 보장하도록 하는 것이기 때문이다. 즉 다시 말하자면, 자주 사용하는 자원을 효율적으로 불변성을 보장받고 사용하기 위하여 그런식으로 사용한다는 것을 알 수 있다. 이 점을 기억하고 접근 제어자가 public이 아니라 private으로 바꿔서 다시 생각해보자. 먼저 클래스 외부에서는 사용하지..
VO를 이해하기 위해서 기발한 예시가 생각났음. 두 사람이 만원짜리 지폐 한장씩 들고 있다. 그것을 서로 교환했다. 지폐의 번호(메모리 주소값)는 달라졌지만 그들이 교환한 지폐의 본질(속성)에는 차이가 없다. 그리고 사람들은 이것을 "같다고" 말한다. 나 같은 경우엔 Value Object라는 것을 체스를 구현하는 프로젝트에서 필요성을 느꼈다. 간단하게 콘솔로 구현하는 프로젝트인데 코드를 테스트할 때였다. 체스말들은 폰, 킹, 퀸, 룩 등 체스판이라는 리스트 안에 있다. 나는 체스판의 특정 좌표에서 특정 체스말을 get하여 개별적으로 생성자를 통해 만들어진 체스말을 비교하여 두개의 체스말을 같은지 아닌지 테스트하려고 했다. 의도하려 했던 테스트는 당연히 같은 속성을 가진 체스말이기 때문에 객체가 가지고 ..
kyupid
'기술과 생각/자바와 JVM' 카테고리의 글 목록