[자바 중급] Object와 오버라이딩
본문 바로가기
기타 및 프로그래밍(Java)

[자바 중급] Object와 오버라이딩

by 환희의찬가 2022. 4. 18.
반응형

시작하며

object 클래스에 대해서 한번 알아보도록 하겠습니다. 
object 클래스는 모든 클래스의 최상위 클래스입니다. 
아무것도 상속받지 않으면 자동으로 오브젝트를 상속받기 때문입니다. 
이 말은 오브젝트가 가지고 있는 메서드는 모든 클래스에서 다 사용할 수 있다는 것을 의미합니다.

 

equals, toString, hashCode 개념

object가 가지고 있는 메소드메서드 중에서 가장 많이 사용되는 메서드는 equals, toString, hashCode 해시 코드 이런 메서드입니다. 그런데 이 세 가지 메서드는 사용하실 때 반드시 오버 라이딩해서 사용해야 합니다. 

equals는 객체가 가지고 있는 값을 비교할 때 사용할 수 있습니다.
같은 값인지 아닌지 비교할 때 사용하는데요. 
객체 간에 다르다 라고 비교하려면 어떤 기준을 가지고 있어야겠죠. 
학생이라는 객체가 있었을 때 학번만 같으면 같다고 볼 건지, 이름만 같으면 갔다고 볼 건지, 이런 기준을 정해야지만 비교를 해줄 수가 있습니다.
즉 object는 같은 값인지 다른 값인지에 대해서 비교할 수 있는 메소드는 제공하고 있지만 그 메서드를 오버 라이딩해서 기준을 정해주는 것은 프로그래머가 해야 할 일입니다. 
string 클래스의 equals 메소드는 오브젝트가 가지고 있는 메서드를 오버 라이딩한 것입니다. 
그래서 string 클래스가 가진 equals를 사용했을 때 안에 들어있는 문자 열들이 다 같으면 같아요라고 리턴하는 것을 볼 수 있었을 겁니다. 


그렇다면 이번에 hashCode라는 메소드는 무엇일까요? 
hashCode는 객체의 해시 코드를 구하는 메서드입니다.
hashCode의 값은 되도록 객체별로 서로 다른 값을 가지게 하는 것이 좋습니다. 
hashCode는 프로그래밍하다 보면 알게 모르게 자주 사용이 됩니다. 
특히 자료 구조에서 많이 사용됩니다. 


그리고 toString 메서드는 객체가 가지고 있는 값을 문자열로 바꾸어서 리턴하는 메서드입니다.
이런 세 가지 메서드는 굉장히 자주 사용되기 때문에 대부분 개발자 도구에서는 자동으로 생성하는 기능을 가지고 있습니다. 조금 편하게 여러분들이 사용할 수 있습니다. 

메소드 테스트

그렇다면 위와 같이 student라는 클래스를 하나 만들어서 해당 메서드들을 테스트해보도록 하겠습니다. 
student라는 클래스를 하나 정의했고요.
이 student라는 클래스가 string type으로 이름을 가리킬 수 있는 name이라는 필드를 하나 선언해보고요.

학번을 가리키는 number라는 필드도 하나 선언해보도록 하게겠습니다.

우리 태어난 해를 가리키는 birthYear라는 필드도 하나 선언을 해보도록 하겠습니다.
이름, 학번, 생년을 속성으로 가지는 student라는 클래스가 위에 사진처럼 만들어졌습니다. 

 

그러면 이 student 클래스 안에다가 그냥 간단하게 메인 메서드를 만들어보고요 코드들을 좀 살펴보겠습니다.

처음 생성할 때 메인을 체크하고 들어올 수도 있지만 그렇지 않았다면 간단하게 만들어낼 수 있는데 main 이렇게 쓰고 control space에 보시면 main 메소드를 쉽게 만들 수 있습니다. 

위의 사진처럼 student 객체를 하나 만들어서 이 student 객체의 속성의 값들을 부여해보겠습니다. 
student1의 name은 홍길동

student1의 number는 1234 학번입니다. 
student1의 생년은 1995라고 해봅시다. 

 

위 사진처럼 이번에는 student 객체를 하나 더 만들어보겠습니다. 
sudent2라는 객체에도 각각의 속성에다가 값들을 위처럼 부여해 보았습니다. 

우리는 이 두 개를 비교해볼 수 있을 있습니다.
equals를 써서 위와 같이 비교해 보면 둘이 같다면 s1과 s2는 같아요~ 이렇게 나올 거고,  둘이 같지 않다면 s1과 s2는 같지 않다고 나올 것입니다. 실행을 한번 시켜볼게요. 

 

두 개가 동일하게 지금 만들어져 있음에도 불구하고 equals라는 메서드를 이용했더니 서로 다르다고 결과 값이 나왔습니다. 

 

hashCode도 한번 비교해볼까요.
s1이 가지고 있는 hashCode와 s2가 가지고 있는 hashCode를 이렇게 실행해서 아래와 같이 비교를 해보면요. 

아래와 각각 다른 값이 나오고 있는 것을 볼 수 있습니다. 


이것은 현재 equals라는 메서드와 hashCode라는 메서드는 오브젝트가 구현하고 있는 메서드를 그냥 사용하고 있기 때문입니다. 
처음에 이야기드렸듯이 equals나 hashCode라는 메서드는 사용자가 알맞게 오버 라이딩해서 써야지만 된다고 말씀드렸었죠.

 

오버 라이딩

그래서 우리는 이제 적절하게 오버 라이딩할 수 있을 텐데요.
오버 라이딩하는 방법은 간단합니다.

 

 

우리 클래스 안에다가 커서를 갖다가 놓으시고 메뉴 중에 source라는 메뉴를 보시면 이렇게 generate 하고 나와있는 것들은 이 도구가 자동으로 만들어주는 부분들이에요.
이런 equals나 hashCode나 이런 메서드들은 워낙 자주 사용되는 메서드이기 때문에 이 eclipse라는 도구가 자동으로 만들어주기까지 하죠. 그래서 우리는 equals나 hashCode를 오버 라이딩할 거니까 이 부분을 선택합니다. (위 그림에 커서 올려진 거 바로 위에 거) 
이렇게 선택해 주시면 비교할 대상이 나옵니다. 

 

그래서 어떤 속성을 비교할 건지 어떤 속성을 이용해서 해시 코드 값을 구할 건지 이것을 선택할 수 있게 합니다. 
모두 다 똑같아야지만 똑같아요라고 할 수도 있을 거고요 그중에 나는 이것만 같으면 같아요 라고 할 수도 있을 거예요. 학생이니까 학번만 같다면 나는 같다고 할 거예요!라고 한다면 이 학번만 남겨두고요, 나머지들은 체크를 빼주시고 실행해보도록 하죠. 
이렇게 실행해보시면 자동으로 equals라는 메서드와hashCode라는 메서드가 만들어져 있는 것을 볼 수 있을 거예요. (아래 사진 @Override 아래 보면 생겨져 있죠~)

해시 코드를 구하는 것은 일종의 수학식입니다. 
되도록 유일하지 않은 값을 반환하도록 합니다. 
소수 중에 하나인 31 값과 특정 수를 몇 개 곱하여 만들고 있는 것을 볼 수 있죠.

hashCode를 구하는 방법은 자동으로 만들어진 이 코드 말고도 다양한 방법이 있을 수 있습니다.
이 부분은 여러분이 알고리즘을 따로 공부하셔야 합니다. 


다음 equals라는 메서드를 살펴보면 메서드의 파라미터로 들어온 오브젝트와 자기 자신을 비교합니다. 
this와 오브젝트가 같다면 참조가 같은 것을 의미하므로 무조건 같습니다. 

 

또한, 인자로 들어온 obj가 nul이라면 nul이기 때문에 비교할 필요가 없이 false라는 것을 알 수 있겠죠. 
get 클래스는 오브젝트가 가지고 있는 메서드로 클래의 정보를 갖고 있습니다. 
클래스라는 객체를 반환합니다. 자기 자신의 클래스 정보와 obj의 클래스 정보가 같지 않을 경우에 false를 반환하는 것을 의미합니다.

서로 다른 클래스들끼리 값을 비교할 필요가 없는 것이죠. 
그 이후에는 obj를 student로 형 변환한 후에 자신의 넘버와 obj의 넘버를 비교해서 같으면 true를 반환하고 그렇지 않으면 false를 반환하고 있습니다. 


다시 프로그램을 실행해보도록 하겠습니다. 
s1과 이렇게 equals와 hashCode를 오버 라이딩한 채로 이제 다시 실행을 시켜봤더니 이번에는요 s1과 s2가 같아요라고 나오는 것을 볼 수 있겠죠. 
그리고 해시 코드도 두 개 같이 같은 값을 출력하고 있는 것을 볼 수 있습니다.

 

toString 오버 라이딩

마지막으로 이번에는 toString이라는 메서드를 오버 라이딩해보도록 하겠습니다. 
toString이라는 메서드가 오버 라이딩되기 전에 하나만 테스트해보자면요. 
나는 student객체를 출력하고 싶어요. 이랬을 때 s1은 아래와 같이 출력할 수 있습니다. 
실행을 시켜보면 이렇게 의미 없는 값이 출력이 되고 있는 것을 볼 수 있습니다. 

 

나는 student 객체를 출력하고 싶어요. 했을 때는 사실은 이 값이 아니라 student가 가진 속성이 무슨 값을 갖고 있는지 알고 싶은 경우가 많을 거거든요.

그래서 이 tostring이라는 메서드도 적절하게 overriding 해서 사용하실 수 있는데요. 
마찬가지 소스 메뉴에 보시면 generate tostring이라는 메서드를 갖고 있고요 이때 내가 보여주고 싶은 속성을 체크해주시면 됩니다. 
전부 보여주고 싶기 때문에 전부 체크해 놓은 상태로 tostring을 만들어볼게요..


이렇게 해보면 student의 이런 결과가 나오는 것을 볼 수 있고요 꼭 이런 속성 값이 아니라 다른 값을 나오게 하고 싶다면 여기에다가 다른 문자열을 넣어주셔도 괜찮습니다. 이렇게 tostring을 한 다음에 다시 한번 실행을 시켜볼게요. 

실행시켜보면 아까는 의미 없는 값이 나왔지만 이번에는 student 객체의 속성들을 보고 있는 것을 볼 수 있겠죠. 이 부분은 사실은요 s1 그냥 출력하는 거랑 s1 tostring 이렇게 출력하는 거랑 같습니다.


같은 결과가 출력이 되는 것을 볼 수 있죠 내부적으로 객체를 출력하면 toString이라는 메서드를 호출해서 출력하는 것을 알 수 있습니다. 
여기까지 오브젝트가 갖고 있는 메서드들을 살펴보았습니다.

반응형

댓글


TOP

Designed by 티스토리