2016년 2월 3일 수요일

[JAVA 교육] 예외 Tip / equals Tip / etc Tip

[JAVA 교육] 예외 Tip / equals Tip / etc Tip
(*본 게시물은 본인이 교육을 통해서 배우는 내용을 정리하는 글입니다. 부족한 부분이 많으니 참고해주시기 바랍니다. 혹시 정확한 의미를 알고 싶으시거나, 틀린 내용에 대해 조언해주시고 싶은 분들께서는 댓글을 남겨주시면 최대한 빠르게 답변하겠습니다. 감사합니다.)


  1. Tip
    1. Interface는 자식클래스에서 구현이 어떻게 될 지 모르니깐 예외를 throws 하지 않는다.
    2. Callee에서 에러가 발생하는데 그 원인이 Caller 가 전달해준 매개변수 때문일때,
      1. Runtime Exception이 발생하는 것이면 Callee에서는 try-catch도 안해도 되고, throws도 안해도 된다.단지 Caller에서 try-catch만 처리하면 된다.
      2. Checked Exception이 발생하면 Collee는 예외발생의 원인이 자신이 아니더라도 try-catch로 처리해줘야한다.
        하지만 이런경우 Callee에서만 예외를 처리하면 정작 예외발생의 원인이되는 Caller는 예외인줄도 모르고 자신이 올바르게 작업했다고 생각한다. 그래서 Callee의 catch문에서 throw new RuntimeException("에러문구") 를 수행한다.
        그런뒤에 Caller에서는 예외가 던져져 왔으니깐 try-catch문을 써서 catch에서 Exception 또는 RuntimeException으로 받는다.
        1. 왜 이렇게 하냐면 일례로 Caller가 전달한 매개변수로 인해서 Collee에서 SQLException이 발생할 경우 Caller 에서 catch에 SQLException을 처리해버리게 하면 Caller는 Callee의 예외에 종속되어버린다. 이렇게 클래스가 다른 클래스에 종속되는 것은 좋지 않다.
    3. Java에서 객체를 동등 비교 할때는 equals를 사용한다. 기본 클래스가 아니면 equals를 사용하기 위해서는 클래스에 equals 메서드를 재정의 해줘야 한다.
    4. HashSet, HashMap, Hashtable에서는 동등비교에서 바로 equals로 값을 비교하지 않고 객체의 hashcode를 먼저 비교한다. 객체가 같으면 hashcode가 같다.
      1. 객체의 비교를 hashcode로 할 때, 두 객체의 hashcode가 다르면 두 객체는 같지 않다는것이 보장된다. 하지만 그렇다고 해서 두 객체의 hashcode가 같다고해서 두 객체가 같다는 것은 보장되지 않는다.
      2. 결론적으로 equals 동작은 hashcode를 먼저 비교하고 hashcode가 같을때, equals로 비교한다.
        (equals보다 hashcode 수행속도가 더 빠르다.)
      3. HashSet, HashMap, Hashtable에서 객체의 동등비교를 위해서 hashcode와 equals를 모두 사용하기 때문에 내가 만든 클래스에 equals를 재정의할때는 hashcode도 재정의 해줘야한다.
    5. 객체를 복제할 때는 clone을 이용하는 것이 편리하다. 기존 객체의 필드값을 모두 새로운 객체에 옮겨 담으려면 필드가 많을수록 점점 어렵고 불편해진다. clone을 이용하면 편리하게 객체 자체를 복제할 수 있다.
      1. clone을 사용하기 위해서는 복제하고 싶은 클래스에 Cloneable을 implements해야한다.
      2. 재정의 clone함수를 만들면 함수 내부에서 객체를 생성하고 super.clone() 으로 객체를 복제하여 리턴한다.
      3. !!주의!! clone하려는 객체에 기본타입이 아닌 객체타입의 멤버가 있으면 원본과 clone이 같은 객체타입 멤버를 가리킨다.!! 이 경우에는 해당 객체멤버는 clone함수 내에서 new로 다시 생성해서 할당해야 한다.
    6. 객체가 GC쓰레드에 의해서 소멸될 때는 finalize 함수가 호출된다.
    7. 강제로 GC쓰레드를 실행시키려면 System.gc() 를 이용한다.
      1. ex. 영상처리같이 한번에 메모리가 많이 차지할 때는 강제적으로 GC쓰레드를 작동시킬 때도 있다.
    8. 정규표현식과 Pattern클래스
      1. 문자열이 특정 패턴과 일치하는지 확인할 수 있다.
      2. 패턴을 정규표현식이라고 하고, Pattern클래스의 메서드로 일치 여부를 확인할 수 있다.

댓글 없음:

댓글 쓰기