Object 클래스

2022. 3. 26. 12:44java/java

java.lang.Object 클래스는 모든 클래스의 최상위 클래스로 모든 클래스는 Object 클래스를 상속받는다.

따라서 모든 클래스는 Object 클래스의 메소드를 사용할 수 있고 일부 메소드를 override해서 사용할수도 있다.

 

주로 equals(), hashCode(), toString()을 흔히 override해서 사용한다.

각 메소드에 대해 알아보자.

 

1.equals();

 기본 기능 : '==' 연산 결과 반환

 사용 목적 : 객체가 서로다른 메모리에 위치하더라도 객체가 가진 값이 같이 같은걸 알아보기 위해 사용

 

public static void main(String[] args) {
		Student s1 = new Student();
		
		s1.name      = "홍길동";
		s1.number    = "1234";
		s1.birthYear = 1995;
		
		Student s2 = new Student();
		
		s2.name      = "홍길동";
		s2.number    = "1234";
		s2.birthYear = 1995;
		
		if(s1.equals(s2))
			System.out.println("s1 == s2");
		else
			System.out.println("s1 != s2");

위 메인 메서드를 실행시키면 결과는 console은 false를 출력한다. 이유는 s1 과 s2가 서로다른 참조변수를 가리키기 때문이다.

그럼 equals를 오버라이딩 해보자 equals는 많이 오버라이딩 되기 때문에 이클립스에서  source generate로 쉽게 만들 수 있다.

 

	@Override
	public boolean equals(Object obj) {
		if (this == obj)                        //객체가 가리키는 참조변수가 같으면 true
			return true;
		if (obj == null)						//매개변수로 가져온 객체가 아무것도 가리키지 않으면 false
			return false;
		if (getClass() != obj.getClass())		//getClass는 오브젝트가 가진 메서드로 클래스 정보를 리턴한다
			return false;
		Student other = (Student) obj;
		if (number == null) {					//두 객체의 number만 같으면 객체가 같다고 오버라이딩 한 것이다
			if (other.number != null)
				return false;
		} else if (!number.equals(other.number))
			return false;
		return true;
	}

 

2.hashCode();

- 기본 기능: JVM이 부여한 코드값. 인스턴스가 저장된 가상머신의 주소를 10진수로 반환
- override 목적: 두 개의 서로 다른 메모리에 위치한 객체가 동일성을 갖기 위해

 

public static void main(String[] args) {
		Student s1 = new Student();
		
		s1.name      = "홍길동";
		s1.number    = "1234";
		s1.birthYear = 1995;
		
		Student s2 = new Student();
		
		s2.name      = "홍길동";
		s2.number    = "1234";
		s2.birthYear = 1995;
		
		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());

 위 메인 메서드를 실행하면 s1 객체와 s2 객체는 서로 다른 해시코드를 반환한다. 그럼 equals와 마찬가지로 s1,s2객체의 number가 같다면 같은 값을 반환할 수 있게 오버라이딩을 해보자

 

	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((number == null) ? 0 : number.hashCode()); 
		return result;
	}
    
    //4번째 라인에서 31 소수 * 1 + (number)가 null이면 0 , 아니라면 number.hashCode()를 계산해서
    //result변수에 저장하는데 정수형 데이터 타입인 변수의 값만 같다면 해시코드는 같은 값을 반환한다.
    //자세히 알고 싶으면 따로 알고리즘 공부를 해야한다

 

2.toString();

 

- 기본 기능      : 객체의 해시코드 출력
- override 목적 : 객체의 정보를 문자열 형태로 표현하고자 할 때

 

public static void main(String[] args) {
		Student s1 = new Student();
		
		s1.name      = "홍길동";
		s1.number    = "1234";
		s1.birthYear = 1995;
		
		Student s2 = new Student();
		
		s2.name      = "홍길동";
		s2.number    = "1234";
		s2.birthYear = 1995;
		
		System.out.println(s1);

위 메서드를 실행하면 s1의 해시코드 값이 출력된다.  클래스의 데이터 영역의 정보를 가지고 가지고 오고자 할 때를 오버라이딩 해보자

 

package javaUtil;

public class Student {
	String name;
	String number;
	int birthYear;
		
	@Override
	public String toString() {
		return "Student [name=" + name + ", number=" + number + ", birthYear=" + birthYear + "]";
	}


	public static void main(String[] args) {
		Student s1 = new Student();
		
		s1.name      = "홍길동";
		s1.number    = "1234";
		s1.birthYear = 1995;
		
		Student s2 = new Student();
		
		s2.name      = "홍길동";
		s2.number    = "1234";
		s2.birthYear = 1995;

		
		System.out.println(s1);
	}
}

출력 값은

Student [name=홍길동, number=1234, birthYear=1995]

이렇게 나온다. 다른 정보를 얻고 싶으면 오버라이딩할대 return문을 수정하면 된다

'java > java' 카테고리의 다른 글

인터페이스 선언  (0) 2022.04.14
인터페이스의 역할  (0) 2022.04.14
Set-HashSet (보완 필요)  (0) 2022.03.26
Generic (보완 필요)  (0) 2022.03.26
자바 데이터 타입  (0) 2022.03.13