본문 바로가기

웹 개발/Java

[Web_JAVA] 28

● Object 클래스(최상위 부모 클래스)

1. toString()

- 항상 객체명을 출력할 때에 toString()이 생략된다.

- toString()을 통해 출력되는 문자열이 마음에 들지 않는다면, 재정의하여 수정하도록 한다.

 

 

2. equals(): 주소값 비교(==)

- String 클래스에서 값 비교로 재정의 되었다.

- 문자열 비교에서는 반드시 equals()를 사용하고, null을 비교할 때에는 ==으로 비교한다.

- 만약 두 객체끼리 비교를 할 때, equals()를 사용한다면 원하는 필드 비교를 위한 재정의가 필요하다.

 

※참고

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java

 

 

3. hashCode()

- 해당 객체의 주소값(메모리상의 주소가 아닌 hash값을 통한 중복없는 값)

 

 

 


 

실습(toString())

1. Student.java 생성

- 필요한 변수 선언

private static int seq; 
private int num;
private String name;

 

 

- 필드 생성

// static 필드
// 생성자의 호출 횟수에 상관없이 무조건 한 번만 출력된다.
static {
	System.out.println("[학생 관리 프로그램]");
}

// 초기화 필드
// 생성자를 호출할 때마다 무조건 출력된다.
{ 
	System.out.println("학생이 한 명 추가되었습니다.");
	this.num = ++seq;
}

 

 

- 생성자 생성

public Student() {;}

public Student(String name) {
	super();
	this.name = name;
}

 

 

- getter, setter 생성

public int getNum() {
	return num;
}

public void setNum(int num) {
	this.num = num;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

 

 

- toString() 재정의(재정의하지 않으면 사용 시 주소값이 출력된다.)

@Override
public String toString() {
	String str = this.num + ". " + this.name;  // (ex) 1. 홍길동
	return str;
}

 

 

 

2. School.java에서 실행

public class School {
	public static void main(String[] args) {

		Student kim = new Student();
		Student hong = new Student("홍길동");
		kim.setName("김철수");
		
		System.out.println(kim);
		System.out.println(hong);

	}
}

 

결과(toString() 재정의 X)

 

결과(toString() 재정의 O)

 

 

 

 

실습(equals()(1))

import java.util.Random;

public class EqualsTest {
	public static void main(String[] args) {
		
		Random r1 = new Random();
		Random r2 = new Random();
		
		System.out.println(r1);
		System.out.println(r2);
		
		// r1과 r2의 주소가 다르다.
		System.out.println(r1 == r2); 
		System.out.println(r1.equals(r2));
		
		// r1과 r2의 주소를 같게 만들어준다.
		r1 = r2;
		
		System.out.println(r1 == r2);
		System.out.println(r1.equals(r2));

	}
}

 

결과

 

 

 

 

실습(equals()(2))

public class StringTest {
	public static void main(String[] args) {
		
		// 이미 동일한 값이 있다면 주소값을 공유하게 된다.
		String data1 = "ABC";
		String data2 = "ABC"; 
		
		// new로 선언하면 필드의 우선순위가 높기 때문에 필드 주소를 비교하게된다.
		String data3 = new String("ABC");
		String data4 = new String("ABC");
		
		System.out.println(data1 == data2);
		System.out.println(data1.equals(data2));
		
		System.out.println(data3 == data4);	 // 필드 주소는 서로 다르다.
		System.out.println(data3.intern() == data4.intern());  // 상수의 주소를 비교한다.
		System.out.println(data3.equals(data4));
		
	}
}

 

결과

 

 

 

 

실습(equals()(3))

1. Animal.java 생성

- 필요한 변수 선언

public int number;
public String name;

 

 

- 생성자 생성

public Animal() {;}

public Animal(int number, String name) {
	super();
	this.number = number; 
	this.name = name;
}

 

 

- equals() 재정의(재정의하지 않으면 필드 주소를 비교한다.)

@Override
public boolean equals(Object obj) {
	if(this == obj) {
		return true;
	}
		
	if(obj instanceof Animal) {
		Animal anotherAnimal = (Animal)obj;
		if(this.number == anotherAnimal.number) {
			return true;
		}
	}
	return false;
}

 

 

 

2. Zoo.java에서 실행

public class Zoo {
	public static void main(String[] args) {
		
		Animal cat = new Animal(1, "고양이");
		System.out.println(cat.equals(new Animal(1, "고양이")));
		
	}
}

 

결과(equals() 재정의 X)

 

결과(equals() 재정의 O)

 

 

 

'웹 개발 > Java' 카테고리의 다른 글

[Web_JAVA] 30  (0) 2022.03.16
[Web_JAVA] 29  (0) 2022.03.15
[Web_JAVA] 27  (0) 2022.03.13
[Web_JAVA] 26  (0) 2022.03.12
[Web_JAVA] 25  (0) 2022.03.11