클린 코드를 스터디 하면서 제가 이전에 짠 코드들을 리팩토링 하고 있는데요. 제가 출제한 문제인 22232번은 코딩 테스트에 꽤 나오는 유형입니다만, 제가 코드를 깔끔하게 짜지 않은 탓에 스터디 재료가 되고 말았습니다. 스터디를 하다가 스트림과 람다에 대해서 오갔는데요. 다른 분의 코드를 보다가, 입력 부분을 Intstream과 range 등을 이용해서 깔끔하게 처리할 수 있다는 것을 보고 놀랐습니다. 사실 이전에도, 한 분이 기여를 해 주셔서 스트림과 람다의 존재는 알고 있었지만, 신세계였습니다. 심지어, String을 Integer로 변환하는 작업도 Stream을 잘 이용하면 잡스러운 로직들을 간결하게 짤 수 있다는 걸 보고 너무 놀랐습니다. 아무튼, 코드를 분석해 보면서 배운 점이 많았는데요. 그 ..
Java 검색 결과
자바에서 map이나 set에 특정한 원소들이 모두 있는지 확인하려면 어떻게 해야 할까요? stream을 생각하기 쉽지만, 사실 map이나 set에서는 containsAll을 쓰는 게 나을 수도 있습니다. containsAll은 collection이 c에 있는 모든 원소들을 가지고 있는지를 판단합니다. 보통 stream의 allMatch나, filter를 이용해서 처리하기도 할 텐데요. 저는 containsAll 메소드를 쓰는 것을 보다 선호합니다. 더 직관적이기 때문입니다. 사용법을 간단하게 보겠습니다. ori와 tar에 1부터 10까지 키를 넣었습니다. 그러면 처음에 둘 다 1부터 10까지 들어있을 테니, ori가 tar에 있는 원소들을 모두 가지고 있는 것이 맞습니다. 문제는, ori에서 5를 제거했..
안녕하세요. 666번째 글입니다. 이번 시간에는 reflection을 이용해서 field value를 set하는 코드만 간략하게 보겠습니다. 먼저, data 클래스의 코드는 요렇습니다. private field로 선언된 x, y, 그리고 hm이 있네요. 당연하게도, hashCode와 equals, 그리고 toString은 오버라이딩 되어 있습니다. 우리는 먼저, 이름으로 Field에 대한 정보를 얻어온 다음에, 10번째 줄에서 set 메서드를 이용해서, 객체 d의 hm 필드의 값을 {"a":"b", "c":"d"}로 바꿀 것인데요. NoSuchFieldException이 뜹니다. 왜 그런지 메서드 설명을 봐야 겠어요. 먼저, 이 친구는 public member인 field member를 리턴합니다. Da..
저번 시간에 transient를 보다가, 잠깐 reflection에 대해서 언급했었는데요. 아마 언급을 하지 않았더라도, 클래스의 메타 데이터에 대한 정보를 얻어온다. 라는 것은 언급했을 듯 합니다. 내부를 보실 때, 이해하셨다면 좋았을 법한 로직만 간단하게 소개해 볼게요. 먼저, 객체를 직렬화 하기 위해서, 필드와 필드에 셋팅된 값이 어떤 값이였는지 알아야 했습니다. 그러한 정보들을 얻어와서 직렬화를 시킨다고 했어요. 그런데, transient 같은 키워드가 앞에 붙어있으면 직렬화를 하지 말아야 함을 의미해요. 즉, 필드 중에서 직렬화를 하지 말아야 하는 키워드가 앞에 붙어있는지도 알아내야 합니다. 즉, 객체에 대한 정보를 얻어올 때, 이 필드가 직렬화가 가능한 친구인지, 할당된 값은 무엇인지. 필드 ..
안녕하세요. 이 글에서는 Serializable에 대해서 상세히 다루지 않습니다. 다만, java에서 transient 키워드에 대해서 간단하게만 다뤄보고자 합니다. transient가 무엇을 하는 지 알아보기 위해 Serializable을 implements 했어요. 굵게 쳐져 있는 Warning. 신뢰되지 않는 데이터를 역직렬화를 시키지 말아달라는 부분이 있긴 하지만, 여기에서는 다룰 주제가 아닙니다. 직렬화? 뭘 어떻게 한다는 것일까요? data class를 직렬화 시켜서 파일로 떨궈보겠습니다. 그랬더니 byte 형태로 표현이 되었어요. AC ED 00 05 ... 00 02 data의 내용을 조금 조작해서 직렬화를 시켜 봤더니 요래 나왔네요. AC ED 00 ... 01. 우리가 객체를 누군가와 ..
최근댓글