String 에서"="과"equals"

String 에서"="과"equals"
    http://www.51cto.com/art/200711/59832.htm
자바 프로 그래 밍 프로그래머 가 자주 겪 는 문 제 를 들 었 다.예 를 들 어 지금 은 새벽 3 시 입 니 다.네 번 째 커피 를 마신 후에 정확 한 논 리 를 찾 아 복잡 한 프로 그래 밍 문 제 를 해결 하려 고 합 니 다.지금까지 String 과 Object 인용 에 대해 서 는 거의 생각 할 수 없습니다.왜냐하면 당신 은 이미 졸 렸 기 때 문 입 니 다.그리고 끔찍 한 일이 벌 어 졌 습 니 다...............................................................
String name = getName();
if (name == "Sleepy") // oops!
{
doSomething();
}

코드 를 빠르게 컴 파일 하고 테스트 한 후에 코드 가 정상적으로 실행 되 는 것 같 습 니 다.드디어 퇴근 하고 집에 가서 쉴 때 가 됐어 요!그러나 한 동안 응용 프로그램 테스트 에서 간헐 적 인 오 류 를 발 견 했 고 이 오류 의 출처 를 추적 하 는 것 이 바로 이 코드 입 니 다.
"어떻게 이 럴 수가 있어 요?""며칠 전 까지 만 해도 비슷 한 String 비 교 를 해 봤 고 제대로 작 동 할 수 있 었 습 니 다!"라 고 분노 할 수도 있 습 니 다.하지만 자바 대상 이 인용 한 개념 을 먼저 복습 해 야 한다.하나의 대상 변 수 는 메모리(heap memory)에 저 장 된 실제 대상 을 가리 키 는 참조(포인터)입 니 다.다른 변수 에 변 수 를 할당 할 때 실제 대상 이 아 닌 인용 을 할당 합 니 다(그림 1-1 참조).
String a, b, c, d;
a = "123";
b = a;
c = new String("123");
d = "WCJ";

그림 1-1  대상 참조
자바 에서"=="연산 자 는 두 개의 인용 을 비교 하여 같은 메모리 대상 을 가리 키 는 지 확인 합 니 다.String 인 스 턴 스 의 경우 실행 시 상 태 는 같은 문자 정 보 를 가 진 String 글자 의 액면가 가 같은 내부 대상 을 가리 키 는 지 최대한 확보 합 니 다.이 과정 을 상주(interning)라 고 하지만 모든 String 의 비교 에 도움 이 되 지 않 습 니 다.한 가지 이 유 는 쓰레기 수집 기 스 레 드 가 상주 값 을 삭 제 했 기 때 문 입 니 다.다른 이 유 는 String 이 있 는 위치 가 String 구조 함수 가 만 든 새로운 인 스 턴 스 에 의 해 점용 될 수 있 기 때 문 입 니 다.만약 그렇다면,"=="은 항상 false 로 돌아 갑 니 다.equals 방법 을 설계 하여 두 대상 의 상태(state)나 각 대상 의 내용 을 비교 할 수 있 습 니 다.당신 의 클래스 에 대해 서 는 이 방법 을 다시 써 서 그것 을 정확하게 조작 해 야 합 니 다.그러나 equals 방법 을 사용 하면 String 인 스 턴 스 는 항상 정확하게 비교 할 수 있 습 니 다.모든 String 값 이 머 물 러 있다 고 가정 하면 다음 코드 세그먼트 에서 이 문 제 를 설명 합 니 다.
String name1, name2, name3;
name1 = "123";
name2 = name1; if (name1 == name2) {}         // true if (name1.equals(name2)) {}    // true name2 = "123"; if (name1 == name2) {}         // usually true if (name1.equals(name2)) {}    // true name3 = new String("123"); if (name1 == name3) {}         // false if (name1.equals(name3)) {}    // true
주의:
항상.equals 를 사용 하여 두 개의 String 값 을 비교 합 니 다."="연산 자 를 사용 하면 정확하게 조작 할 수 있 을 것 같 지만.대부분의 응용 프로그램 에 있어 서,설령 그것 이 정확하게 실행 된다 하 더 라 도,"=="코드 는 사실상 잘못된 것 이 고,equals 만 정확 한 것 이다.따라서 개발 동업자 들 에 게 String 을 지지 하 는'equals(평등)'권 을 모두 알려 주세요.

좋은 웹페이지 즐겨찾기