[Java] Object와 오버라이딩

Hyo Kyun Lee·2022년 2월 1일
0

Java

목록 보기
29/49

1. object

object class, Java에서 사용되는 모든 클래스에 적용할 수 있는 최상위 클래스이다. 기본적으로 한 객체 및 클래스 선언 시 자동적으로 object 및 class를 상속받는다.

이에 따라 모든 클래스는 object class가 가지고 있는 메소드를 상속받아 사용할 수 있으며, 사용시 해당 메소드를 구체화(오버라이딩)하여 활용해야 한다.

2. 메소드 오버라이딩

부모(추상) 클래스를 상속받은 자식 클래스는, 해당 추상클래스를 구체적으로 선언해주는 과정이 반드시 필요하다.

이 과정을 오버라이딩이라 하며, 가장 대표적으로 사용할 수 있는 메소드는 아래 3가지가 있다.

  • equals - 객체가 가진 값을 비교할 때(비교기준을 설정하고, 객체가 보유하고 있는 값을 비교)
    ※ String class의 equals는 String 문자열이 같은지 비교해주는 메소드.
  • toString - 객체가가지고 있는 값을 문자열로 변환하여 출력해주는 메소드.
  • hashCode - 객체를 해쉬코드로 변환해주며, 자료구조에서 많이 활용할 수 있다.

3. 오버라이딩 방법

오버라이딩 자체는 Java에서 시스템적으로 구현할 수 있는 도구를 제공해준다.

Source > Generate hasCode(), equals(), toString() 등으로 사용자가 해당 메소드를 빠르게 오버라이딩 할 수 있도록 제공한다.

그 후, 오버라이딩의 가장 중요한 점인 구별인자를 선택하면 자동적으로 구현된다.

  • equals() - 어떤 field 값을 기준으로, 동일하다면 같은 객체로 판단할 것인가 선택
  • toString() - 어떤 field 값을 기준으로 객체 정보를 출력할 것인가 선택

위 정보에서 선택할 수 있고, field에 나타난 속성값에 따라 선택인자가 달라질 수 있다.

4. 오버라이딩 구현

각 메소드 별로 오버라이딩을 구현하는 방법은 아래와 같다.

물론 시스템적으로 바로 구현할 수 있는 도구를 제공해주긴 하지만, 각 오버라이딩이 어떻게 구현되는지 먼저 이해하고 사용할 수 있도록 하자.

public class student{
	String name;
    int number;
    int birth;
}

위와 같은 클래스가 선언되어 있다고 하고,

public void main(String[] args){
	student s1 = new student;
    	s1.number = 1234;
    student s2 = new student;
    	s2.number = 1234;
}

위와 같이 구별자 number에 대해, 두 생성된 객체의 number가 같다면 같은 객체로 판별하도록 하는 특정 메소드를 오버라이딩 한다고 해보자.
※ 물론 위 상태에서 s1, s2는 서로 다른 객체이다.

4-1. hashCode()

내부적인 알고리즘을 통해 객체마다 특징적인 hashCode()를 부여받는다.

아래 hashCode의 경우 객체를 구별하기 위해 사용하는 구별인자를 number(즉, number만 같아도 같은 객체로 인정) number로 지정하였을 경우이다.

//@Override

public int hashCode(){
	final int prime = 31;
    	int result = 1;
        result = prime * result((number == null)? 0: number.hashCode());
        return result
}

4-2. equals()

obj1.equals(obj2) 연산을 통해 서로 같은 객체라면 true, 다른 객체라면 false를 반환한다.

이때 obj1은 this, 즉 연산주체를 일컫고 obj2는 피연산자를 일컫는다.

아래 equals() 메소드 오버라이딩은 구별인자를 number(즉, number가 같을 경우 같은 객체로 인정)로 지정해주었다는 점에 유의한다.

public boolean equals(Object obj){ //object를 전달받아 비교
	if (this == obj) //이때 this는 연산주체(피연산대상은 obj)
    		return true; 
    	if (obj == null); //클래스가 존재하지 않는다면 false
        	return false;
        if (getClass() != obj.getClass()) //클래스가 존재하지 않는다면 false
        	return false;
        
        Student other = (Student) obj; //전달받은 obj 객체를 참조하는 참조변수 선언
        //아래 구문은 구별인자를 기준으로 같은 객체인지 판별하는 알고리즘
        if(number == null){
        	if(other.number != null){ //주체 구별인자는 없으나 피연산자 구별인자는 존재할 경우 false
            		return false;
            	}
        }else if (!number.equals(other.number)){
        	return true //최종적으로 구별인자가 서로 같다면 true
        }
}

4-3. toString

toString 메소드의 경우엔 각 객체 field 중 어떠한 속성값을 출력할 것인지 설정할 수 있다.

아래의 경우 name, number을 출력한다.

public String toString(){
	return "Student [name=" + name +", number=" + number];
}

※ 참고로 toString() 메소드를 오버라이딩 할 경우, 기존 s1, s2를 println한 결과(무의미한 수열)와 달리 위에서 설정한 속성값 그대로 출력된다.

출력값은 s1 혹은 s1.toString()을 통해 볼 수 있다.

5. 참조자료

프로그래머스 강의 - Object와 오버라이딩
https://programmers.co.kr/learn/courses/9/lessons/249

0개의 댓글