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 ..
카톡방에서 이야기를 하다가, 파이선은 '각'을 유니코드 포인트를 나타내는 정수로 쉽게 변환할 수 있단 걸 알게 되었습니다. 그것을 토대로 규칙을 찾아서 분리한다. 괜찮은 방법입니다. 일단 문자를 문자 번호로 변환하는 것부터 해야 겠는데요. 이럴 때 쓸 수 있는 것은 ord 함수입니다. ord 함수는 유니코드 문자가 하나 주어지면, 그것을 코드 포인트로 바꾸는 함수입니다. 다음을 수행해 보겠습니다. Cpython 3.x대에서 수행하였습니다. 44032가 나옵니다. '가'의 유니코드 포인트는 AC00입니다. 그리고 결과값으로 나온 44032를 2진수로 변환해서 HEX 값으로 보면 AC00임을 알 수 있습니다. 그러면, '각'과 '값' 등은 어떤 값으로 할당이 되어 있을까요? 이 문서를 보시면, 사전순으로 코..
이펙티브 자바 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로 바꿉니..
최근댓글