«   2025/06   »
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
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

Java equals 함수 주의점 : String class / Do it! 자바 완전 정복 (김동형) -연습문제 본문

개발일기/Java

Java equals 함수 주의점 : String class / Do it! 자바 완전 정복 (김동형) -연습문제

민장미 2023. 4. 22. 13:25

Do it! 자바 완전 정복 (김동형) - 10장 클래스의 상속과 다형성 연습문제  11번

 

문제 맨 아래의 equals 함수를 보자마자 내 머릿 속은 ???? 였다.

전에 공부한 내용에서 저렇게 비교하면 안된다고 강조하면서 공부했기 때문.

 

바로 이클립스 켜서 코드 직접 쳐보니 false 나옴 그 순간 머릿속을 스쳐지나가는 게 있었으니

 

package book;

class A {
	int data;

	A(int data) {
		this.data = data;
	}
}

public class Page377Ex {

	public static void main(String[] args) {

		A a = new A(3);
		A a2 = new A(3);

		System.out.println(a.equals(a2));

	}

}

 

 

String class!!  내가 앞에서 생각한 것은 String 클래스에만 해당되는 거였는데 내가 착각한 거였다.

 

String str = "안녕하세요";

String str2 = new String("안녕하세요");

String str3 = "안녕하세요";

String class 의 특징:  문자열이 같으면 같은 주소를 공유한다. 

이 말은 즉 str과 str3는 힙영역에서 같은 주소를 공유하고 있다. 

즉, str과 str3만 있다고 치면 객체는 총 1개인 셈이다. 

 

다만 str2는 new 키워드를 사용하여 새 객체를 생성했기 떄문에, 내용물인 안녕하세요 가 같더라도

str과 str3와는 메모리 주소가 다르다. (저 위의 예시에선 객체가 총 2개다.)

 

equals 함수는 Stack 메모리의 값을 비교, 즉 객체의 위치를 비교한다. (같은 객체 안인지 아닌지)

그래서 String 객체들(문자열)을 비교할때는 equals 함수를 쓰면, 

 

str = = str3  => true

str == str2 => false 

이런 결과가 나온다. 

 

String 객체를 정확하게, 주소까지 같은지를 비교하고 싶다면, 

equals 함수 대신 아래처럼  == 비교연산자를 사용해서 비교하여야 한다. 

false가 출력된다.

 

 

 

다만 다른 보통 객체들 케이스와 변수를 비교할 떄는 equals 함수를 써도 무방하다.

String 클래스는 특별한 경우라 예외로 쳐야한다.

(다시 한번 말하지만, 문자열(String객체)이 같으면 힙영역에서 주소를 공유하는 하나의 객체에 둘 다 담기기 때문에)

 

다른 객체들,자료형의 경우엔 equals 함수를 쓰면 주소 값까지 같은지 비교가 가능하다. 

 

do it 자바의 연습문제 11번으로 다시 돌아와서,

 

객체 a1와 a2는 같은 객체가 아닌, 별도로 생성된 객체이기에 각자 다른 주소를 가지고 있다. 

즉 a1와 a2객체는 서로 다른 독립적이 존재니 false가 반환된다. 

 

 

+ 메인 함수를 생각없이 쓰다가 살펴보았다.

public static void main(String[] args)

static이니 static 변수만 사용이 가능하고, 매개변수는

String 배열, String 여러개를 갯수 상관없이 사용하는게 가능하다.

(그래서 문자열을 포함한 다른 기본 자료형의 변수들을 자유롭게 사용할 수 있는 것 같다.)

가변적 배열의 표기? 인 것 같다.  매개변수로 String...a 를 대신 대입해보니 역시 적용이 똑같이 된다. 

public static void main(String...a)