저번 시간에 InputStream으로 파일을 읽는 것에 대해서 배웠습니다. 다시 1.txt를 보겠습니다. 이번에는 한글이 포함된 무언가가 있습니다. 이것은 UTF-8로 인코딩 되어 있습니다. 제가 저번에 작성했던 이 프로그램은, 의도대로 잘 동작할까요? 인풋의 크기에 비해서 버퍼의 크기가 상대적으로 크니 제대로 동작하는 것처럼 보입니다. b의 배열 크기를 5로 줄여보도록 하겠습니다. 이 프로그램을 실행시켜 보겠습니다. 그러면 글자가 깨져서 나옵니다. 이는, 2byte나 3byte 길이의 데이터를 읽다가 끊었기 때문입니다. 어떻게 읽어들였는지, 헥사로 출력해 보도록 하겠습니다. 요렇게 바꿔 보겠습니다. Integer.toHexString은, int 값을 Hexa로 출력해 주는 겁니다. 우리는 byte 값을..
Java 검색 결과
안녕하세요. 조경완입니다. 어제 카톡 방에 이런 질문이 올라왔습니다. 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이라는 값을 가지는 어떤 문자 하나를 ..
네이버 이웃 블로그 글을 보다가 개발자의 70%가 틀리는 문제 라는 제목을 가진 어떤 글을 보았습니다. 사실 과장이 되었는지 아닌지는 모르겠지만, 헷갈리는 것 중 하나임은 분명해 보입니다. 언어는 파이선이였습니다만, 자바로 해도 정답률이 비슷하지 않았을까 싶기도 합니다. 이 코드는 어떻게 동작할까요? 먼저, toUpperCase는 String을 대문자로 바꾸는 메서드입니다. 예를 들어, "abcde".toUpperCase()의 리턴값은 "ABCDE"가 됩니다. 이건 그렇게 크게 어렵지는 않습니다. 여기서 출력값은 아래와 같이 됩니다. 분명한 것은 우리가 예상했던, ABCDE, BCDEF가 나오지 않았음을 알 수 있습니다. 왜 그럴까요? 코드를 뜯기는 상당히 기니, identityHashCode 값을 보도..
안녕하세요. chogahui05입니다. 자바의 해시맵은 hashCode를 기반으로 버킷의 어디에 들어갈지를 계산합니다. 그런데, putVal을 자세히 보셨다면 아시겠지만, hash function의 리턴값을 인자로 넣는 것을 알 수 있습니다. 이것은 어떻게 된 일일까요? java8에서 모 자료구조 코드를 조금씩 뜯어봅시다. get 메서드를 보시면, getNode를 호출합니다. 그리고, 이 메서드는 hash(key)를 인자로 삼습니다. 이것은 put도 마찬가지입니다. 내부적으로 putVal을 호출하고, 이것 역시 hash(key)를 호출합니다. 내부를 보시면, key.hashCode 값을 h에 넣습니다. 여기서, 해시코드는, 오버라이딩이 된 hashCode 값입니다. 그리고 이것과 다른 값을 비트 xor을..
최근댓글