저번 시간에 InputStream으로 파일을 읽는 것에 대해서 배웠습니다. 다시 1.txt를 보겠습니다. 이번에는 한글이 포함된 무언가가 있습니다. 이것은 UTF-8로 인코딩 되어 있습니다. 제가 저번에 작성했던 이 프로그램은, 의도대로 잘 동작할까요? 인풋의 크기에 비해서 버퍼의 크기가 상대적으로 크니 제대로 동작하는 것처럼 보입니다. b의 배열 크기를 5로 줄여보도록 하겠습니다. 이 프로그램을 실행시켜 보겠습니다. 그러면 글자가 깨져서 나옵니다. 이는, 2byte나 3byte 길이의 데이터를 읽다가 끊었기 때문입니다. 어떻게 읽어들였는지, 헥사로 출력해 보도록 하겠습니다. 요렇게 바꿔 보겠습니다. Integer.toHexString은, int 값을 Hexa로 출력해 주는 겁니다. 우리는 byte 값을..
코딩/Java 검색 결과
파일 입출력을 다뤄봅시다. 사실, 예외나, 인터페이스를 하지도 않았는데 뜬금없이 이것을 다루는 이유는, 네. 맞습니다. 같이 다루기 위해서입니다. 여기에서는 파일을 읽는 것에 대해서만 중점적으로 다루고, 중간 중간에 예외나, 인터페이스에 대해 다루겠습니다. 그리고, 인코딩 디코딩도 중요하기 때문에 다시 한 번 짚고 넘어가겠습니다. 먼저, 1.txt에 저장된 내용을 보겠습니다. Hello Java, ... 이런 내용들이 들어 있습니다. 이 파일을 읽어서 콘솔에 그대로 출력하고자 합니다. 물론, src 아래에 1.txt가 있습니다. 파일 객체를 하나 생성합니다. src\\1.txt는 윈도우에서, 프로젝트의 루트로부터의 경로 /src/1.txt를 의미합니다. 파일객체 하나를 얻어옵니다. 그리고, try res..
네이버 이웃 블로그 글을 보다가 개발자의 70%가 틀리는 문제 라는 제목을 가진 어떤 글을 보았습니다. 사실 과장이 되었는지 아닌지는 모르겠지만, 헷갈리는 것 중 하나임은 분명해 보입니다. 언어는 파이선이였습니다만, 자바로 해도 정답률이 비슷하지 않았을까 싶기도 합니다. 이 코드는 어떻게 동작할까요? 먼저, toUpperCase는 String을 대문자로 바꾸는 메서드입니다. 예를 들어, "abcde".toUpperCase()의 리턴값은 "ABCDE"가 됩니다. 이건 그렇게 크게 어렵지는 않습니다. 여기서 출력값은 아래와 같이 됩니다. 분명한 것은 우리가 예상했던, ABCDE, BCDEF가 나오지 않았음을 알 수 있습니다. 왜 그럴까요? 코드를 뜯기는 상당히 기니, identityHashCode 값을 보도..
이펙티브 자바에 나오는 깊숙한 내용은 나중에 하기로 하고, try with resources 문에 대해서 간략하게 언급해 보도록 하겠습니다. 닫아야 할 자원. 이것들은 생각보다 어렵지 않게 찾을 수 있습니다. Stream, DB connection 등이 이에 속합니다. 저 또한 프로그램을 이런 식으로 작성하곤 했습니다. 대충 A라는 친구를 새로 생성합니다. 이것을 새로 생성하면 내부적으로 리소스를 오픈하는 작업을 수행합니다. 흔히들 생각하는 인풋 스트림이나 DB connection 등이라고 생각하시면 됩니다. try 안에서 do work를 합니다. 그런데, try 내부에서 a.close를 호출하면 안 됩니다. 왜냐하면, 중간에 Exception이 걸려서, main 함수에서 catch가 되는 경우에, a...
finalize 함수는 Object 클래스에 있는 메서드입니다. 공식 문서에서는 아래와 같이 설명하고 있습니다. 여기서 중요한 것은, gc가 해당 object를 참조하는 레퍼런스가 없을 때 Call 한다는 것입니다. 예제 프로그램을 몇 개 보면서 이해해 보도록 하겠습니다. 1번째 프로그램입니다. Obj는 Object를 상속받습니다. 따라서, finalize를 오버라이딩 할 수 있습니다. finalize가 gc에 의해서 호출이 되면, Common.rm이 증가하게 되는데요. 새로운 Obj 객체 1000만개를 생성하기만 했습니다. 그리고 80초동안 sleep을 시키고, Common.rm을 출력하였습니다. 1000만이 출력되지 않았다는 것이 중요합니다. 100개의 Obj를 새로 생성한 다음에 Common.rm을..
최근댓글