달력

4

« 2024/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2010. 11. 16. 17:54

compareTo Study/Java2010. 11. 16. 17:54

대체로 정렬을 할 때 사용하는 것으로 사용법은 obj.compareTo(obj2) 이런식이고.

양수일땐 obj > obj2
음수일땐 obj2 < obj
0일땐 obj = obj2

.... 이제 교재로.

:
Posted by 유쾌한순례자
equals 메소드를 오버라이드 하면 hashCode 도 오버라이드 해줘야 주소값이 일치한다.

@Override
    public int hashCode(){
     return answer.hashCode();
    }

해주었더니 주소값이 일치함을 알 수 있었다.
:
Posted by 유쾌한순례자
어렵게 꼬아놔서 뭔 소리인지 잘 몰랐는데 그냥 요약된 부분만 보니깐 알겠더라..

한마디로 수학 으로 생각하면 된다.

재귀적 : a=a
대칭적 : a=b  b=a
이행적 : a=b  b=c  a=c
일관적 : a=b 같은 상태에서 a와 b의 값이 변함이 없다면 항상 a=b

개인적으로 자주 겪었던 대칭적 부분만 일단 자세히 짚어보았다.

equals 오버라이딩 공부할때 작성했던 소스를 책 예제로 약간 개조해보자면

@Override
    public boolean equals(Object obj) {
        if((obj instanceof Quiz)&& obj != null ) {
            return answer.equalsIgnoreCase(((Quiz)obj).answer);
        }
        if((obj instanceof String) && obj != null){
            return answer.equalsIgnoreCase((String)obj);
        }
        return false;
    }

이렇게 한다음 q1,q2를 이런식으로 선언했다.

Quiz q1 = new Quiz("asd");
String q2 = "Asd"

그 다음 q1.equals(q2) 결과와 q2.equals(q1)의 결과를 비교했다.

첫번째는 같다. 두번째는 다르다 가 나왔다.

a=b b=a 라는 대칭적 계약의 위반이다. Quiz의 equals 메소드는 일반 문자열을 처리하고 있는 반면 String equals 메소드는

대소문자를 구분하지 않는 문자열을 인식하지 못하는 것이다.

이것을 고쳐보자면


@Override
    public boolean equals(Object obj) {
        return obj instanceof Quiz && ((Quiz)obj).answer.equalsIgnoreCase(answer);
    }

두 조건다 false 를 반환하게 된다.

이 예제의 의미를 잘 몰라서 자초스 뉴와이 님의 도움으로 알게 되었다.

뉴와이 님의 답변 전문

책 내용대로 라도 false false를 반환하게 설계하라고 추천하고 있는겁니다.

책에서 equlas()의 대칭성을 설명하는 부분이었고,
이전의 CaseInsensitiveString클레스에서
String클레스 형의 객체와 비교 가능하게 설계되어있을 겁니다.
하지만 String클레스에서 CaseInsensitiveString형의 비교 불가능하게 되어있죠..

ex)
CaseInsensitiveString a = new CaseInsensitiveString("Polish");
String b = "polish";

a.equals(b); //true
b.equals(a); //false
여서 대칭성의 문제로
CaseInsensitiveString에서
String형의 객체와의 비교처리를 지원하지 말라고 추천하는 내용입니다.

a에서의 equlas()만 지원하는 일방적인 equals 형태이죠.
이걸 방지하자는 내용이죠...

:
Posted by 유쾌한순례자
2010. 11. 11. 22:11

equals 메소드를 오버라이딩 하기. Study/Java2010. 11. 11. 22:11

그냥 String a = "aaa";
String b="aaa";

a.equals(b) 는 같다고 나오지만

String a = new String("aaa");
String b = new String("aaa");

a.equals(b) 는 false를 반환한다.

이럴 때에는 equals 메소드를 오버라이딩 해준다.

class Quiz {
    private final String answer;
   
    public Quiz(String answer){
     this.answer=answer;
    }
 
    @Override
    public boolean equals(Object obj) {
        if((obj instanceof Quiz)&& obj != null ) {
            return answer ==((Quiz)obj).answer;  
        } else {
            return false;
        }
    }
   
}

public class eqtest {
    public static void main(String[] args)
    {
    
     Quiz q1 = new Quiz("테스트중입니다");
     Quiz q2 = new Quiz("테스트중입니다");

      if(q1==q2){
         System.out.println("같다");
      }else{
         System.out.println("다르다");

      if(q1.equals(q2)){
         System.out.println("같다");
      }else{
         System.out.println("다르다");
      }
   }
}
결과

다르다
같다

이제 Effective JAVA 에 항목 8 'equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자' 참고해서 공부해야겠다.
:
Posted by 유쾌한순례자
2010. 11. 9. 23:01

finalizer의 사용을 피하자 Study/Java2010. 11. 9. 23:01

신속하게 실행된다는 보장이 없다. 예를 들어 finalizer에서 파일을 닫는 것은 심각한 실수이다. 열 수 있는 파일이 제한되어 있는 상황에서 파일이 언제 닫힐지 보장이 안되기 때문이다.

finalizer를 하는 동안 catch 되지 않은 예외가 발생하면 그 예외는 무시되고 그 객체의 finalizer는 종결된다. catch 되지 않은 예외가 발생하면 객체가 불완전한 상태일 수 있다. 그런 상황에서 다른 스레드가 그런 객체를 사용하려 한다면 예측할 수 없는 결과가 생길 수 있다. 일반적으로 catch 되지 않은 예외가 발생하면, 스레드 실행이 중단되고 스택 추적정보가 출력된다. 그러나 finalizer 내에서 발생하면 그런 예외가 무시되므로 경고조차도 출력되지 않는다.

:
Posted by 유쾌한순례자
2010. 11. 9. 11:46

[자바퍼즐러] 홀수판별 Study/Java2010. 11. 9. 11:46

일반적으로 홀수 판별할때 2로 나누어서 나머지로 판단을 한다.

만약 판별할 수가 음수로 들어간다면?

한번도 생각해보지 않고 매번 i % 2 == 1 이렇게 했는데

음수일 경우도 생각해봐야겠다.

(즉 파라미터 각각에 음,양,0 을 넘겼을 때 제대로 작동하는지 확인)


:
Posted by 유쾌한순례자

static 팩토리 메소드

생성자와 달리 호출될때마다 매번 새로운 객체를 생성할 필요가없다.
자신이 반환하는 타입의 어떤 서브타입 객체도 반환할 수 있다.
자바 데이터베이스 연결 API(JDBC) 와 같은 서비스 제공자 프레임워크의 근간이 됨.
메소드를 정의한 클래스가 public 이나 protected 생성자를 제공하지 않으면, 다른 클래스가 이 클래스를 상속받을 수 없다.

public class Elvis{
  private static final Elvis INSTANCE = new Elvis();
  
  private Elvis(){  
  }
  
  //스태틱 메소드 사용
  public static Elvis getInstance(){
    return INSTANCE;
  }
  
  public void test(){
    System.out.println("test");
} } //Elvis.getInstance로 객체를 사용
:
Posted by 유쾌한순례자
2010. 11. 8. 23:24

Math.random() Study/Java2010. 11. 8. 23:24

많이 사용하는건데도 모르고 있었다.

이게 double 형을 반환한다는 사실을...

어쩐지 int idx = Math.random()*str.length;  이게 오류 나는 지-..-

간단히 int idx = (int)(Math.random()*str.length)로 하니까 되었다........

orz
:
Posted by 유쾌한순례자
2010. 11. 8. 23:22

toCharArray() Study/Java2010. 11. 8. 23:22

API 에서는 Converts this string to a new character array.  이런식으로 나온다.

이번 문제에서 핵심이었던 부분인거같다.

나같은 경우는 charAt으로 한글자씩 뽑아서 배열에 집어 넣어버렸는데

이걸로 하니깐 한꺼번에 한글자씩 나누어진다.


:
Posted by 유쾌한순례자
2010. 11. 8. 23:15

equalsIgnoreCase Study/Java2010. 11. 8. 23:15

이번 자바스터디 게시판에 있는 Java 1000제를 풀면서 공부해둔것.

eqaulsIgnoreCase 대소문자 무시하고 같은지 판단함.

처음에는 문제가 대문자니까 toUpperCase()를 써야할까 생각했는데 eqaulsIgnoreCase도 나쁘지 않은 것 같아서 결정했다.

toUpperCase는 대문자로 toLowerCase는 소문자로...

:
Posted by 유쾌한순례자