본문 바로가기

Java

[Java] 오늘의 교훈. 위와 같은 코드가 있었다. 위와 같은 상태에서 class A에 있던 public enum을 삭제하고 하나의 독립적인 클래스 파일로 E라는 enum 클래스를 생성하였다. 어차피 public이고 Type도 그대로인지라 컴파일에러는 어디서도 떨어지지 않았고, 변경된 클래스인 A와 새로 만들어진 enum 클래스인 E만을 배포하여 컴파일하였다. 전혀 문제가 없을거라 생각했는데 문제는 User 클래스의 do() 메서드에서 발생하였다. 생각해보면 당연한 것인데... 기존의 E enum 클래스의 return type은 A$E 였고, 새로 뽑아낸 enum 클래스의 Type은 E였다. (기본적으로 앞에 붙는 패키지는 제외..) 결국, 타입이 맞지 않는 오류가 발생하여 위와 같이 기존의 E를 받아 쓰던 클래스들을 전부 다시.. 더보기
[Java] equals의 활용. 더 나아가 코드 구현의 방법. - 2 - 앞서 포스트에서는 결과 값을 List에 담기로 하였습니다. 그래서 중간 중간 나오는 결과를 List에 담아 두는 로직이 들어가 있었습니다. 하지만, 그렇기 때문에 이미 합산 된 검색어를 찾기 위해서 다시 List에 대해 loop를 돌면서 해당 검색어를 가진 TestDomain을 찾아야 했습니다. 순차 탐색을 하기 때문에 최대 n만큼의 시간이 소요됩니다. 합산 되는 결과가 많아져서 List의 크기가 커질 수록 탐색 시간도 길어질 것 입니다. 그러면 이 탐색시간을 줄이면 더욱 속도를 올릴 수 있을 것 같습니다. 여러가지 데이터를 탐색하는 알고리즘 중에서 상당히 빠른 방법이 있습니다. 바로 HashCode를 사용한 방법입니다. 이제 350000개의 7일치 검색어를 loop돌면서 (이건 어쩔 수 없다 치고요.... 더보기
[Java] equals의 활용. 더 나아가 코드 구현의 방법. - 1 - 이번에 작성하는 내용은 딱히 어떤 주제를 정하기가 좀 그렇네요.. 먼저 이 내용은 어떤 코드가 제일 좋다 나쁘다를 얘기하기 위한 것은 아닙니다. 약간의 생각의 전환이 많이 다른 결과를 가져 올 수도 있다는 것을 이야기 하고 싶어서 작성하는 글 입니다. 제가 최근에 한 소스에서 본 내용을 리팩토링 했던 내용을 적어 보려고 합니다. 7일치의 검색어와 그 검색어의 검색 횟수를 합산하는 프로그램이 있습니다. 일단, 어딘가의 로그에서 하루 단위의 각 검색어와 그 검색어의 검색 횟수는 가져 올 수 있다고 가정하고 하루에 검색횟수 상위 5만개의 검색어를 7일치 가져와서 각 검색어의 검색 횟수를 합산하고 이것을 merge하여 다시 검색 횟수순으로 정렬하여 보여주는 프로그램입니다. 어떻게 보면 map and reduce.. 더보기
[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 4 - 인터페이스에 대한 얘기를 하다가 여기까지 오게 되었네요.. 이번 포스트에서는 어노테이션을 사용해서 지금까지 만들었던 심플 프레임워크를 바꿔보려고 합니다. 사실 이번 포스트는 인터페이스와는 큰 관련은 없을지 모르겠습니다. 어노테이션은 @XXX 의 형식으로 사용되는 것으로 가장 대표적인 어노테이션은 @Override 그리고 스프링에서 사용하는 @Controller나 JUnit4 이상에서 사용되는 @Test 정도라고 생각하는데요 이 어노테이션은.. 사전에서는 주석이라고 되어 있습니다. 일반적으로 코드에 주석이라고 하면 컴파일러나 JVM은 읽지 못 하고 사람만 볼 수 있는 주석이라고 생각을 했다면 이 어노테이션은 컴파일러나 JVM에서도 볼 수 있고 활용 할 수 있는 주석이라고 보시면 될 것 같습니다. 어노테이션.. 더보기
[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 3 - 앞선 포스트에서는 Interface를 사용해서 같은 Interface를 구현한 테스터 클래스들을 한번에 실행하여 그 결과를 볼 수 있는 Tester.java 까지 구현하였습니다. Tester.java 새로운 테스터가 추가되어야 한다면 ProductTester Interface를 구현하여 위 Tester.java 에서 그 클래스를 add해주면 되었습니다. 하지만, 매번 이렇게 테스터가 추가 될 때 마다 클래스를 수정하고, 컴파일해서 배포를 해야 한다면 조금 귀찮은 작업이 될 수도 있습니다. 그리고, 실제로 현장에서 사용되는 테스터 클래스가 한두개가 아닐 수 있는데 그렇게 되면 Tester.java의 클래스는 addTester 메서드로 도배가 될 것 입니다. 그래서 간단하게 프로퍼티를 사용해서 , 테스트 할.. 더보기
[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 2 - 앞선 포스트에서 테스트 프로그램을 만들어서 돌리는 간단한 프로그램을 만들었습니다. 물론 내부 로직은 다 빠지고 형태만 보여주기 위한 코드였고요.. 최종적으로 나온 Tester.java 의 모습은 아래와 같았습니다. 2개의 테스터 클래스가 보입니다. 내부로직으로 구현되어 있지는 않지만 ProductListsComapreTester.java는 상품 리스트를 검색해서 그 정렬 순서가 원하는 순서대로 정렬되어 있는지 확인하는 Tester 클래스입니다. ProductRankScoreTester.java는 다른 두개의 검색 서버가 있다고 가정 할 때 각각의 서버에 검색을 하고 그 두개의 결과가 일치하는지 확인하는 Tester 클래스입니다. 물론, 내부 로직은 구현을 하지 않았습니다. 일단, 앞에서 이제 인터페이스를.. 더보기
[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 1 - Java책을 보면서 공부를 하면 Interface에 대한 내용을 볼 수 있습니다. 제 기억으로 처음 자바를 공부하는 입장에서 가장 기억에 남았던 것은 인터페이스는 내용 없는 메서드 정의가 가능하고, 이것을 구현하는 클래스들은 만드시 그 메서드의 내용을 구현해야 한다. (추상 클래스는 여기서 논외로 하겠습니다.) 라는 것이었습니다. 그리고 나오는 예제들이 TV나 그런거였고.. 여기서 다형성과 캐스팅에 대한 얘기들도 같이 나옵니다. 그렇게해서 Interface를 공부했는데.. 그렇게 공부를 하고 몇 년이 지나도록 업무에 있으면서 도무지 이 Interface가 왜 좋은지 이해를 못 하고 있었습니다. Interface로 메서드를 정의하고 그것을 구현하는 클래스들이 항상 같은 메서드를 갖도록 한다. 이것이 사람/.. 더보기
[Java] for loop에서 카운터를 조작하지 맙시다. 간단한 소스를 보겠습니다. 어떤 문제가 보이시나요? 일단, 변수 i를 두개의 for문에서 조건 counter로 사용하고 있는 것이 보이실 것 입니다. 이런 경우 i를 여러 for문이 공유하게 되면 문제가 발생 할 가능성이 커지고 디버그 하기도 매우 어렵습니다. 일반적으로, 변수는 사용하기 바로 직전에 초기화 하는 것이 좋다고 하죠.. 위와 같은 경우는 for(int i = 0; i< 10; i++) { .. } 이렇게 되겠네요.. 중요한 것은 여기서 얘기하고 싶은 것은 변수의 초기화 시점이 아닙니다. i라는 변수는 for문에서 loop를 계속 돌릴지 빠져나갈지를 결정하는 제어변수로 사용되고 있습니다. 그런 변수 i를 for문 내부에서 임의로 값을 할당하여 변경하고 있습니다. int result = get.. 더보기
[Reflect] 예제. 더보기
[Java] enum을 사용해 분기문을 없애보자. 웹 사이트에서 "정렬" 이라던가 파라메터에 따른 "로그"등을 남길 때 if문이 많이 사용 됩니다. 일반적으로 처음 사이트를 구축시 파라메터를 정해 놓습니다. 정렬에 대한 파라메터.. 처음에는 각 파라메터와 그 파라메터가 뜻하는 것들을 주석으로 잘 달아 놓습니다. 그리고 이것을 처리하는 클래스는 일반적으로 아래와 같은 모양을 갖게 되는 경우가 많습니다. 이제 사이트가 만들어지고 , 다른 개발자들에 의해서 유지보수가 되고 요구사항으로 정렬조건등이 늘어나게 되면서 처음 달아놨던 주석은 엉망이 되고, QueryBuilder의 if문은 요구사항이 생길 때 마다 늘어나게 됩니다. 그나마 Builder 클래스를 로직이 필요한 곳에서 모두 공통으로 사용하고 있다면 상황은 좋은 편이겠지만 혹시라도 위 로직이 여기저기 퍼.. 더보기