본문 바로가기

java

[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 2 - 앞선 포스트에서 테스트 프로그램을 만들어서 돌리는 간단한 프로그램을 만들었습니다. 물론 내부 로직은 다 빠지고 형태만 보여주기 위한 코드였고요.. 최종적으로 나온 Tester.java 의 모습은 아래와 같았습니다. 2개의 테스터 클래스가 보입니다. 내부로직으로 구현되어 있지는 않지만 ProductListsComapreTester.java는 상품 리스트를 검색해서 그 정렬 순서가 원하는 순서대로 정렬되어 있는지 확인하는 Tester 클래스입니다. ProductRankScoreTester.java는 다른 두개의 검색 서버가 있다고 가정 할 때 각각의 서버에 검색을 하고 그 두개의 결과가 일치하는지 확인하는 Tester 클래스입니다. 물론, 내부 로직은 구현을 하지 않았습니다. 일단, 앞에서 이제 인터페이스를.. 더보기
[Java] Interface. - 아주 간단한 테스트 프레임웍 만들어보기 1 - Java책을 보면서 공부를 하면 Interface에 대한 내용을 볼 수 있습니다. 제 기억으로 처음 자바를 공부하는 입장에서 가장 기억에 남았던 것은 인터페이스는 내용 없는 메서드 정의가 가능하고, 이것을 구현하는 클래스들은 만드시 그 메서드의 내용을 구현해야 한다. (추상 클래스는 여기서 논외로 하겠습니다.) 라는 것이었습니다. 그리고 나오는 예제들이 TV나 그런거였고.. 여기서 다형성과 캐스팅에 대한 얘기들도 같이 나옵니다. 그렇게해서 Interface를 공부했는데.. 그렇게 공부를 하고 몇 년이 지나도록 업무에 있으면서 도무지 이 Interface가 왜 좋은지 이해를 못 하고 있었습니다. Interface로 메서드를 정의하고 그것을 구현하는 클래스들이 항상 같은 메서드를 갖도록 한다. 이것이 사람/.. 더보기
개인적으로 생각하는 강력한 디버깅 기법. 코드 컴플리트를 읽다보니 나온 이야기인데.. 여기서 소개되는 여러가지 디버깅 기법 중 "고백을 통한 디버깅"이 나온다. 이클립스 같은 툴에서 제공되는 디버깅 모드도 굉장히 강력하고 즐겨 사용하는데.. 이 고백을 통한 디버깅 또한 심심찮게 겪게 되는 것이라 많이 공감이 간다. 고백을 통한 디버깅은 이른바.. "OO대리님~ 잠깐 시간 좀 있으세요? 제가 ~~ 코드를 작성을 했는데, 정렬이 잘 안되거든요. 원래 하려던거는.. 이렇게 이렇게 하면 정렬이 이렇게 이루어지고.. 저렇게 하면 저렇게 이루어져야 하는데.. 데이터 입력이 되면서 바로 정렬이 되도록.. 엇.. 아니다. 정렬이 안되는구나.. 핫.. 감사합니다~" 이런 상황... ㅋ 듣는 사람은 "응 어? 응" 이런 상황이 되는데.. 들어주는 사람은 아무말도.. 더보기
[Java] for loop에서 카운터를 조작하지 맙시다. 간단한 소스를 보겠습니다. 어떤 문제가 보이시나요? 일단, 변수 i를 두개의 for문에서 조건 counter로 사용하고 있는 것이 보이실 것 입니다. 이런 경우 i를 여러 for문이 공유하게 되면 문제가 발생 할 가능성이 커지고 디버그 하기도 매우 어렵습니다. 일반적으로, 변수는 사용하기 바로 직전에 초기화 하는 것이 좋다고 하죠.. 위와 같은 경우는 for(int i = 0; i< 10; i++) { .. } 이렇게 되겠네요.. 중요한 것은 여기서 얘기하고 싶은 것은 변수의 초기화 시점이 아닙니다. i라는 변수는 for문에서 loop를 계속 돌릴지 빠져나갈지를 결정하는 제어변수로 사용되고 있습니다. 그런 변수 i를 for문 내부에서 임의로 값을 할당하여 변경하고 있습니다. int result = get.. 더보기
[Java] enum을 사용해 분기문을 없애보자. 웹 사이트에서 "정렬" 이라던가 파라메터에 따른 "로그"등을 남길 때 if문이 많이 사용 됩니다. 일반적으로 처음 사이트를 구축시 파라메터를 정해 놓습니다. 정렬에 대한 파라메터.. 처음에는 각 파라메터와 그 파라메터가 뜻하는 것들을 주석으로 잘 달아 놓습니다. 그리고 이것을 처리하는 클래스는 일반적으로 아래와 같은 모양을 갖게 되는 경우가 많습니다. 이제 사이트가 만들어지고 , 다른 개발자들에 의해서 유지보수가 되고 요구사항으로 정렬조건등이 늘어나게 되면서 처음 달아놨던 주석은 엉망이 되고, QueryBuilder의 if문은 요구사항이 생길 때 마다 늘어나게 됩니다. 그나마 Builder 클래스를 로직이 필요한 곳에서 모두 공통으로 사용하고 있다면 상황은 좋은 편이겠지만 혹시라도 위 로직이 여기저기 퍼.. 더보기
[Java] Generic을 사용 할 때 가끔 Generic Type의 instance를 만들고 싶다. Collection 같은 경우 generic type을 넣고 빼는 정도의 저장소로써 사용을 해서 그런 일이 없는데.. 가끔 Generic Type의 instance를 동적으로 가져오고 싶을 때가 있다... 얼마전에 enum 을 사용한 mapper에 대해서 살짝 쓴적이 있는데.. (http://devyongsik.tistory.com/288) 이 짓을 하기 위해서는 List 형의 데이터를 getter 메서드를 가지고 있는 T type을 사용한 List 형으로 바꿔주어야 했다. 솔루션에서 List type으로 결과를 받아서 for문 돌려주면서 만들면 되기는 하는데.. 필요한 곳에서 사용 할 수 있는 converter를 만들고 싶었다. 로 해결 되면 좋겠지만.. 문제는 이 generic type의 T가 생성자.. 더보기
정규표현식에서... 돌리면 아래와 같은 exception.. Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1 \ ^ 이유. What happens is that the compiler sees \\ as an escape for \, so it looks for something after the \\ and finds \h which isn't appropriate. You want it to see \\ so you need to escape the first \ to \\ and you need to escape the second \ to \\. 출처 : http://www.c.. 더보기
[Java] Class.class, Class 클래스. Class.class에 대한 나의 생각. Class 클래스가 있습니다. 저 처음에 자바 공부 할 때 이 클래스는 도대체 뭔가???? 했었습니다. String.class 라는 것이 코드 속에 나오는 것도 엄청 신기했습니다. String.class는 파일로만 존재하는 것인 줄 알았었습니다. Class 클래스는 무엇일까요. Java의 OOP를 얘기 할 때 나오는 얘기 중 가장 많이 나오는 것이.. 클래스를 만들어 틀을 만들어 놓고 , 이 틀을 사용해 인스턴스를 찍어낸다(?)라는 것입니다. 위 처럼 User 클래스를 만들어서 틀을 만들고 이렇게 인스턴스를 만들어냅니다. 이때 생성 된 User 클래스의 인스턴스들은 모두 이름,주민번호라는 필드와 getName, setName등의 메서드들을 가지고 있게 됩니다. 데.. 더보기
[Java] Object.equals() equals의 스펙이나 이런 것 보다는 (여기에 잘 나와있습니다.) 클래스를 만드는데 있어서 이 equals라는 메서드가 왜 필요한지.. OOP라는 관점으로 한번 써보려고 합니다. (그래봐야 아주 기초적인 내용입니다.) 사실 이런 것은... 논란의 여지가 있기도 할 것 같아서... 좀 그렇지만.. List는 자바에서 가장 많이 사용 되는 Collections 프레임워크에 속해있는 클래스입니다. 잘 알고 계시다시피.. List는 입력 된 순서대로 저장이 되며, index를 통해 접근한다는 특징이 있습니다. 원소를 가지고 있는지를 파악하는 contains라는 메서드도 가지고 있습니다. 일단 아래와 같은 클래스를 만들어 봅니다. 이름과 나이를 갖는 사람을 클래스화 하였습니다. 아래의 코드를 보겠습니다. 실행 .. 더보기
[JAVA] 클래스 hot deploy #2 라고 하기까진 뭐하고... 그냥 classloader를 바꿔버리는 것을 이용해서 해보았다. 예전에 실패했을 때의 원인이었던것... (http://devyongsik.tistory.com/274) 기본적으로 클래스패스에 있던 클래스는 이미 시스템클래스로더가 클래스를 로딩한 상태이기 때문에 그 하위 클래스로더에서 아무리 URLClassLoader를 사용해 바꿔치기 해봤자 영향이 없다는 것... 그렇다면, 방법은.. 우리가 hot deploy를 해보고 싶은 클래스를 시스템 클래스로더가 아닌 우리가 정의한 (즉, 우리가 컨트롤 할 수 있는) 클래스로더가 물고 올라가도록 하면 이후에도 우리가 컨트롤 할 수 있지 않을까... 생각했다. 이클립스에서 workspace를 c: 쪽을 사용하고 있는데 일단 이런저런 생각하.. 더보기