List를 immutable 하게 변경시켜야 할 일이 있어서, UnmodifiableCollection을 쓰게 되었는데요. 이 친구들에 대해서 간단하게 알아보도록 하겠습니다. 아래와 같은 listBuilder 클래스가 있습니다. list에 무언가를 넣고, 8번째 줄에서 Collections.unmodifiableList를 호출합니다. 이 때 어떤 일이 일어날까요? Collection class의 1289번째 줄에 접근합니다. 저는 ArrayList를 넣었으니, RandomAccessList 생성자를 호출할 겁니다. 1397번째 줄에서 부모 생성자를 호출합니다. 1304번째 줄에서 또 부모 생성자를 호출합니다. 여기서 주목할 만한 것은 1301번째 줄의 list는 제가 넣었던 ArrayList의 참조 값이..
레퍼런스/분석 검색 결과
오늘은 String에서, Object의 valueOf는 어떤 식으로 동작하는지 알아보겠습니다. lombok을 쓰시다 보면, ToString 어노테이션을 잘못 쓰다가 stackoverflow 에러가 났다는 글을 보실 수 있습니다.이는 왜 그런 것일까요? 어떤 메서드 때문에 사이클이 문제가 된 것일까요? 결론부터 말하면 toString이 모든 필드에 대한 정보를 출력하게 만들었습니다. 그리고, 이들에 대한 정보를 출력하기 위해 호출하는 valueOf 메서드 때문입니다. 그래서, 이 메서드에 대해서 작성을 하였습니다. 문제 상황을 재현해 보면 아래와 같습니다. A.java입니다. A 안에는 필드 b가 들어 있습니다. A 객체 a를 하나 생성했다고 해 보겠습니다. 생성자가 호출이 되면, b에는 새로 생성한 B ..
이펙티브 자바 3편을 보면 for each에 대한 설명이 나와 있습니다. 거기에서도 언급했다 시피, for each문을 도는 동안에 이터를 돌고 있는 자료구조에 변형이 오면 안 됩니다. (item 58) 만약에 변형이 오면 어떻게 될까요? 사실 저는 null Exception이 뜨거나 (Linked인 경우에), 아니면 정상적으로 수행이 될 거라고 생각했습니다만.. 예상과는 다른 것이 출력되었습니다. 그 이유는 modCount 필드와 관련이 있습니다. 아래 코드를 보겠습니다. 0부터 4까지 차례대로 LinkedList에 넣습니다. 그리고, List를 순회합니다. 이는 향상된 for loop를 써서 할 수 있습니다. 그런데, 이 코드에서는 단순히 '순회'만 하지 않습니다. list에 있는 첫 번째 원소를 도..
안녕하세요. 조경완입니다. 어제 카톡 방에 이런 질문이 올라왔습니다. mutable한 객체를 키 값으로 넣었고, 맵이나 셋을 넣은 키를 어디선가 변경했는데, 왜 맵이나 셋 계열의 containsKey가 제대로 동작하지 않을까요? 사실, String을 키 값으로 삼으면 문제는 없습니다. 이것은 immutable 하기 때문입니다. 뮤터블의 반대 말이죠. im이 붙으면. 아래 예제 프로그램을 보겠습니다. 코드에서 필요 없는 부분은 생략하였습니다. equals는 x 값이 같으면 true를 리턴하게 되어 있습니다. 그리고 hashCode는 x를 2로 나눈 나머지를 돌려줍니다. Main 함수를 보겠습니다. x에 2, 3을 넣은 객체 a, b를 hashMap에 넣습니다. 그리고, 객체 a의 x값을 2에서 5로 바꿉니..
문자열은 잘 다루기 어렵습니다. toUpperCase와 toLowerCase를 보다가, 문득 이런 질문을 하게 되었습니다. 제 생각은 항상 같다. 였습니다. 어디까지나 내부 클래스들을 뜯기 전까지는요. 내부 클래스를 보고 공식 문서를 보니, 아니라는 것을 알기까지 그리 오랜 시간이 걸리지 않았습니다. 항상 맞다. 혹은 틀리다는 너무 극단적인 케이스이기도 하고요. 이럴수가. 제가 알고 있었던 것이 사실이 아니였다니. 사실, 저는 heroes를 toUpperCase로 바꿔버리면 HEROES가 되고, giant를 대문자로 바꾸면 GIANT로 바뀌고, toLowerCases는 역방향으로 바뀔 거니, 길이가 항상 같을 거라고 생각했습니다. 프로그램 1을 보겠습니다. 0x130이라는 값을 가지는 어떤 문자 하나를 ..
최근댓글