코딩이란 무엇일까

Java/자바 [14일차] (2)-Object 클래스 본문

국비지원수업

Java/자바 [14일차] (2)-Object 클래스

둥구는 지굴다 2022. 11. 8. 22:44
글을 읽기 전 필자는 아직 코딩을 배우는 단계이므로 글의 내용이 부정확할 수 있습니다.

여러 가지 글과 책, 수업을 바탕으로 정리한 내용이니 알맞지 않은 내용이 있다면 댓글 남겨주시면 수정하겠습니다.

Object클래스란?

object클래스는 자바의 최상위 클래스를 뜻합니다.

클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않더라도

암시적으로 java.lang.Object 클래스를 상속하고 있습니다.

그림으로 표현하면 대강 이러한 구조를 갖고 있습니다.

위에 표현한 3개의 클래스 말고도

더 많은 클래스가 Object클래스를 상속하고 있죠

Object 클래스의 메서드

Object클래스는 다양한 메서드가 있습니다. 

그중 대표적인 메서드인 

equals( ), hashCode( ), toString( ) 메서드에 대해 다루어 보겠습니다.

객체 비교 (equals( ) )

equals( ) 메서드는 Object클래스의 메서드 중 하나입니다.

equals( ) 메서드는 비교 연산자인 ==과 동일한 결과를 리턴합니다.

두 객체가 동일한 객체라면 true 그렇지 않다면 false를 리턴합니다.

		Animal a1= new Animal();
		Animal a2= new Animal();
		System.out.println(a1.equals(a2));
		//동일한 객체가 아니기에 결과 :false

equals( )메서드는 주로 두 객체를 동등 비교할 때 사용합니다.

두 객체를 비교해서 논리적으로 동등하면 true를 리턴, 그렇지 않으면 false를 리턴합니다.

논리적으로 동등하다는 것은 같은 같은 객체가 건 다른 객체이건 상관없이 객체가 저장하고 있는 데이터가 동일  함을 뜻합니다.

따라서 equals( )메서드를 재정의 하지 않고 쓴다면 단순히 == 비교 연산자를 사용하는 것인데

저희가 문자열을 비교할 때 equals( ) 메서드를 사용하는데

분명 객체는 다른데 값이 같으면 true를 리턴합니다.

이 또한 String클래스 내부에서

equals( )메서드를 오버라이드 했기에 가능한 이야기입니다.

Object클래스의 equals메서드

public boolean equals(Object obj) {
        return (this == obj);
    }

위의 equals메서드는 Object클래스에서 정의된 메서드입니다.

String 클래스에서 재정의된 equals메서드

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }

String클래스에서 재정의된 equals( ) 메서드를 보시면

위의 Object클래스의 equals메서드와 많이 다른 것을 볼 수 있습니다.

이렇든 저희는 equals( ) 메서드를 재정의하여 객체의 논리적으로 동등한 지를 알 수 있습니다.

equals메서드 재정의 해보기

Member클래스 부분

class Member{ 
	private final int id;
	private final String name;
	private final int age;
	private final boolean isAdult;
	
	public Member(int id,String name,int age,boolean isAdult) {
		this.id=id;
		this.name=name;
		this.age=age;
		this.isAdult=isAdult;
	}
	public int getAge() {
		return age;
	}
	public String getName() {
		return name;
	}
	public int getId() {
		return id;
	}
	public boolean isAdult() {
		return isAdult;
	}

equals( )메서드 재정의 부분

@Override
public boolean equals(Object obj) {
if(this==null)  return false;
if(this == obj) return true;
Member m=(Member)obj; //매개변수 Object는 모든 타입이 가능한 인자가 될수 있다.
return this.name.equals(m.name) && this.age==m.age && this.id==m.id&&this.isAdult==m.isAdult;
	}

equals( )메서드를 재정의 해보았습니다.

return 부분 위에는 매개변수로 받아온 타입을

Member 타입으로 강제 형 변환해주어야

필드를 사용할 수 있기에 강제 형 변환을 해주었습니다.

return부분이 가장 중요한데

return에 모든 필드 값이 동일한지 검사한 뒤

동일하다면 true를 리턴하게 메서드를 재정의 해주었습니다.

Main메서드

public static void main(String[] args) {
		Member sana = new Member(12,"사나",24,true);
		Member sana2= new Member(12,"사나",24,true);	
		//재정의된 equals( )메서드 확인
		System.out.println(sana.equals(sana2));
		System.out.println(sana2.equals(sana));
		//결과 값 : true, true
}

객체 해시 코드 (hashCode( ))

객체 해시 코드란 객체를 식별하는 하나의 정수 값을 말합니다.

hashCode( ) 객체의 메모리 번지를 이용해서 해시 코드를 만들어 리턴합니다.

따라서 객체마다 다른 값을 가지고 있습니다.

hashCode( ) 메서드 또한 논리적으로 동등한지 비교를 할 때 메서드를 재정의 할 필요가 있습니다.

hashCode( )메서드 재정의 해보기

위의 클래스를 이어서 하겠습니다.

@Override
		public int hashCode() { //객체의 주소공간은 달라도 필드 값(data)이 같으면 동일한 해시코드 생성 
		return Objects.hash(name)+Objects.hash(age)+Objects.hash(id)+Objects.hash(isAdult);
	}

Objects.hash( )는 필드의 데이터를 해시 코드를 만들어 정수형 타입으로 리턴해줍니다.

Main 메서드

Member sana = new Member(12,"사나",24,true);
		Member sana2= new Member(12,"사나",24,true);	
		//재정의된 hashCode( ) 메섣 확인
		//10진수와 16진수로 확인
		System.out.println(sana.hashCode()+","+Integer.toHexString(sana.hashCode()));
		System.out.println(sana2.hashCode()+","+Integer.toHexString(sana.hashCode()));

출력 결과

위의 결과를 보면 sana와 sana2는 서로 다른 객체임에도 불구하고 같은 해시 코드가 나온 것을 볼 수 있습니다.

toString( ) 메서드

Object의 클래스인 toString( ) 메서드는 객체의 문자 정보를 리턴합니다.

여기서 문자 정보는 객체를 문자열로 표현한 값입니다.

재정의를 안 한 메서드의 리턴 값은 ‘클래스 이름’ @16진수 해시 코드로 구성된 문자정보를 리턴합니다.

toString메서드로 객체 정보 출력해보기

public static void main(String[] args) {
		Member sana = new Member(12,"사나",24,true);
		Member sana2= new Member(12,"사나",24,true);
		System.out.println(sana.toString());
		System.out.println(sana2.toString());
}

출력 결과

출력 결과를 보시면 패지키명. 클래스 이름@16진수의 해시 코드로 이루어진 것을 확인할 수 있습니다.

하지만 자바 애플리케이션에서는 별로 값 어치가 없는 정보이므로

toString메서드를 재정의하여 좀 더 필요한 정보를 리턴할 수 있습니다.

toString( ) 메서드 재정의

@Override
	public String toString() {
		return "Member [id=" + id + ", name=" + name + ", age=" + age + ", isAdult=" + isAdult + "]";
	}

toString메서드를 재정의하여 객체의 필드 값을 출력할 수 있게 재정의 해주었습니다.

Main 메서드

public static void main(String[] args) {
		Member sana = new Member(12,"사나",24,true);
		Member sana2= new Member(12,"사나",24,true);
		System.out.println(sana.toString());
		System.out.println(sana2.toString());
}

출력 결과

Comments