Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

Min's dev-log

[JAVA] 문자열 비교 equals()와 Object 본문

JAVA

[JAVA] 문자열 비교 equals()와 Object

minyy 2023. 5. 11. 22:21

문자열 비교 equals()

1) 연산자의 연산 대상은 일반 변수

2) 연산자로 객체(문자열)를 비교할수는 없다. (객체는 일반 변수가 아니기 때문에)

3) ' == ' 비교연산자로는 문자열끼리 비교가 어렵다.

=> 문자열 객체들은 기본적으로 상대 문자열의 값을 추출하여 비교할 수 있는 메서드를 가지고 있다.

=> equals()

 

자주 보게 되는 에러 >> [NullPointerException]

원인 : 메서드 수행 주체인 객체가 NULL인 상황 (아무것도 없는 NULL이 수행할수없다)

ex) sc.nextInt(), rand.nextInt(10), car.speedUp(), cat.hello()

=> sc, rand, car처럼 수행주체인 객체가 있어야하는데 주체가 NULL이되면 안 된다.

=> equals()를 쓸때는 NULL체크 로직을 체크해야한다.

 

▼ 예시

package class01;

import java.util.Scanner;

// [문자열 비교]
public class Test03 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		
		System.out.print("문자열 입력: ");
		String msg=sc.next();
		// 객체는 ~
		String msg1="안녕하세요!";
		String msg2="ㅠㅠ";
		if(msg.equals(msg1)) { 
		// .equals -> input으로 상대객체를 받고 output은 boolean타입
			System.out.println("반갑습니다");
		}
		else if(msg.equals(msg2)) { 
			System.out.println("프로그램을 종료합니다..");
		}
		else {
			System.out.println("?");
		}
	}
}

 

Object

JAVA의 최상위 클래스는 Object이다.

Object 클래스의 메서드중에서 toString()과 equals()에 대해서 알아보자.

 

1) toString()

객체를 문자열로 변환하는 역할을 한다. 객체의 내용, 상태, 식별자를 나타낼 수 있으며

주로 디버깅 출력 목적으로 사용된다.

객체명. toString()을 자동호출하여 String화 시켜준다.이때 주소값을 반환한다.

기존의 toString() 기능이 변경하여 사용하고 싶다면! => 오버라이딩★ 

 

2) equals()

두 객체가 서로 같은지, 객체의 내용이 동일한지를 확인하는 역할을 한다.

문자열을 비교할 때는 비교연산자 ' == '를 사용하지 않는다.

비교 연산자는 변수끼리만 사용하고 객체를 비교할 때 사용하지않는다.

 

Object의 equals() 메서드를 오버라이딩하지 않으면 기본 구현인 객체의 참조값을 비교한다. (값 비교 로직 없음)

같은 내용을 가지는 두 객체라도 참조값(주소값)이 다르다면 false를 반환한다.

따라서, 객체의 내용이 같은지를 비교하기 위해서는 equals() 메서드를 오버라이딩하여 구현해야 한다.

 

String 클래스는 이미 equals() 메서드가 내용 비교를 하도록 오버라이드되어 있기 때문에

String이 아닌 다른 클래스의 객체를 equals()로 비교할 때는 해당 클래스에 맞게 오버라이딩 해줘야한다.

 

▼ 예시

class Point{
	int x;
	int y;
	void move() {
		this.x++;
		this.y++;
		// this.move(1,1); 이렇게 써도된다.
	}
	void move(int x, int y) { // 오버로딩
		this.x+=x;
		this.y+=y;
	}
	Point(int x, int y){
		this.x=x;
		this.y=y;
	}
	@Override
	public String toString() {
		return "("+this.x+","+this.y+")";
	}
	@Override
	public boolean equals(Object obj) { // equals는 원래 object꺼
		if(obj instanceof Point) { // 다운캐스팅이 가능한지를 먼저 체크해야한다
			// 실제로 들어오는 것들은 point
			// obj.x -> 안된다. object에는 x가 없다!!!!! 
			// -> 즉 부모가 자식에 있는걸 쓰는셈!!!!! 
			
			Point p=(Point)obj; // 담을수없음 -> 강제로()이렇게 다운캐스팅
			// 더큰클래스를 작은클래스에 넣을수없기때문에 강제로 타입 명시 => 다운캐스팅
			// equals의 최상단에 적어줌

			if(p.x==this.x&&p.y==this.y) {
				// input의 x(비교대상의 x)==this.x && input의 y(비교대상의 y)==this.y
				return true;
			}
		}
		return false;
	}
}
class ColorPoint extends Point{
	String color;
	ColorPoint(String color){
		//		super(0,0);
		//		this.color=color;
		this(color,0,0);
	}
	ColorPoint(int x, int y){
		//		super(x,y);
		//		this.color="검정";
		this("검정",x,y);
	}
	ColorPoint(String color,int x, int y){
		super(x,y);
		this.color=color;
	}
	@Override
	public String toString() {
		return this.color+"("+this.x+","+this.y+")";
	}
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof ColorPoint) { // 다운캐스팅이 가능한지 먼저 체크
			ColorPoint cp=(ColorPoint)obj; 
			// 더 큰클래스를 작은클래스에 넣을수없기때문에 강제로 타입 명시 => 다운캐스팅
			if(cp.color.equals(this.color)) { 
				//컬러먼저 비교후에 다음 x,y비교
				if(cp.x==this.x) {
					if(cp.y==this.y) {
						return true;
					}
				}
			}
		}
		return false;
	}
}
public class Test02 {

	public static void main(String[] args) {
		Point p=new Point(10,20);
		// (10,20)
		ColorPoint cp1=new ColorPoint(1,2);
		// 검정(1,2)
		ColorPoint cp2=new ColorPoint("파랑");
		// 분홍(0,0)
		ColorPoint cp3=new ColorPoint("파랑",3,4);
		// 파랑(3,4)

		System.out.println(p);
		System.out.println(cp2);
		System.out.println(cp3);

		p.move(); // (11,21) 1씩증가
		cp2.move(); // 분홍(1,1)
		cp3.move(-2,-3); // 파랑(2,2) 정확하게 입력하면 입력한대로

		System.out.println("==========");
		System.out.println(p);
		System.out.println(cp2);
		System.out.println(cp3);

		/*Object : equals()
		 |
		 String : equals() 오버라이딩
		 */

		// Object가 기본적으로 제공하는 equals() 메서드에는
		// 값을 비교하는 로직이 없음! (주소값 비교)

		// String은 비교한다 -> Object의 equals()메서드를
		// 오버라이딩하여 값을 비교하는 로직을 추가한 것!!
		// 결론) 우리도 오버라이딩하여 로직을 추가해야한다

		// 객체니까 == 비교연산자를 쓰는게 아니다
		if(cp2.equals(cp3)) { 
			System.out.println("같다.");
		}
		else {
			System.out.println("다르다.");
		}

		// ex) p.equals(stu)
		// 캐스팅을 무리하게 수행하려한다. 
		// -> 그래서 instanceof로 캐스팅이 가능한지 먼저 체크해야한다

	}
}

'JAVA' 카테고리의 다른 글

[JAVA] 배열 리스트  (0) 2023.05.15
[JAVA] 추상 클래스 이야기  (0) 2023.05.13
[JAVA] 동적바인딩  (0) 2023.05.04
[JAVA] 상속  (0) 2023.05.04
[JAVA] 객체 배열  (0) 2023.05.03
Comments