일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- DDL TRUNCATE
- 자바오류
- collection framework
- ddl alter
- 스프링 인터셉터
- Servlet cookie
- Spring Cookie
- Spring 객체로 주입받기
- Spring MVC Interceptor
- 코드로 배우는 스프링 웹 프로젝트
- Mybatis 오류
- Dependency Injection
- Spring message
- Spring
- properties 변수
- annotation
- 자바스크립트
- 오라클 TRUNCATE
- 자바 List
- properties 파일
- 스프링 파라미터 추출
- JSR - 380
- 오라클 DROP
- DDL DROP
- properties 파일 주입
- JSR - 303
- 오라클 CREATE
- 자바
- Spring MVC5 기본 세팅
- Spring 커맨드 객체
- Today
- Total
개발이좋아
[Java] toString( ) 메서드와 equals(Object obj) 메서드 본문
toString( ) 메서드와 equals(Object obj) 메서드의 공통점은 어떤 클래스에서도 사용할 수 있는 메서드라는 것이다.
그 이유는 toString과 equals가 Objcet클래스에 정의되어 있는 메서드이기 때문이다.
toString과 equals메서드를 이해하기 위해서는 먼저 Object클래스의 대한 이해가 필요하다.
※Obcject클래스 : 자바에서 모든 클래스들의 최상위 클래스이며 모든 클래스는 Object클래스를 상속받는다.
모든 클래스는 Object클래스를 상속받는다고 하였는데 우리가 클래스를 작성할 때 따로 extends 예약어를 사용하여 Object클래스를 상속받는다고 명시하지 않아도 된다. 그 이유는 컴파일 시 컴파일러가 자동으로 extends Object를 붙여주기 때문이다.
toString과 equals메서드는 Object클래스에서 정의된 메서드라고 하였다. 그러므로 모든 클래스는 toString과 equals메서드를 재정의하여 사용할 수 있다.
하지만 Object에서 정의되어 있는 메서드라고 해서 모든 메서드가 하위 클래스에서 재정의될 수 있는 것은 아니므로 주의가 필요하다.
Object 클래스의 관한 자세한 사항은 JavaDoc을 살펴보면 된다.
toString( ) 메서드
toString 메서드는 인스턴스의 정보를 문자열로 반환해주는 메서드이다.
위 사진은 toString메서드의 관한 설명으로 빨간 줄을 보면 toString( ) 메서드의 원형(prototype)을 살펴볼 수 있다.
사진의 설명에 따르면 toString의 반환 값은 '클래스이름@해시 코드 값'이라는 것을 알 수 있다.
위 사진은 toString( ) 메서드의 원형을 보여주는 예제로 Car 클래스를 만들고 main( ) 메서드 안에서 Car인스턴스를 생성한 뒤 car 참조 변수를 출력하는 코드이다. 하나는 참조 변수 car를 다른 하나는 car.toString( ) 메서드를 출력하고 있다.
위 코드를 실행한 결과이다.
System.out.println(car);와 System.out.println(car.toString());으로 출력한 결과 서로 같은 값을 나타내고 있다.
그 이유는 참조변수를 출력하면 컴파일할 때 자동으로 toString( ) 메서드를 호출하고 때문이다.
로그의 결과를 보자 @를 중심으로 왼쪽은 클래스의 풀네임 오른쪽은 인스턴스의 주소를 해시 코드 값으로 나타내고 있다.
위에서 설명한 원형과 일치한다.
그럼 이제 toString( ) 메서드를 재정의 하는 코드를 작성해보도록하자.
위 사진에서는 toString( ) 메서드의 반환 값으로 name과 company를 반환하도록 재정의한 코드이다.
위 코드를 실행한 결과는 아래와 같다.
위 코드에서 재정의한 name과 company가 로그에 찍힌 모습을 볼 수 있다.
여기서 한 가지 중요한 점이 있는데 이미 toString( ) 메서드를 재정의하여 사용하는 클래스들이 있다는 것이다.
대표적으로 String 클래스와 Integer 클래스가 toString( ) 클래스를 미리 재정의하고 있다.
위 사진은 위에서 사용한 예제 밑에 String 인스턴스와 Integer 인스턴스를 생성하고 toString( ) 메서드를 호출해서 출력하는 예제이다.
로그 결과는 위와 같다. 이미 toString 메스드가 인스턴스를 생성할 때 입력한 값을 출력하도록 재정의 되어 있다.
이렇듯 toString( ) 메서드를 재정의함으로써 원하는 결과를 출력하게 만들 수 있다.
equals(Object obj) 메서드
equals(Object obj) 메서드는 호출하는 인스턴스와 매개변수로 들어가는 인스턴스의 주소 값을 비교해서 true 혹은 false를 반환해주는 메서드이다.
위 사진을 보면 car1과 car3는 매개변수의 값이 같으며 car2에는 car1을 대입하고 있다.
그 후 car1 과 car2 , car1 과 car3의 인스턴스 주소 값이 같은지를 출력하고 있다.
위 예제의 결과이다. car1과 car2는 동일한 주소를 가리키고 있지만 car1과 car3는 매개변수의 값이 같더라도 다른 인스턴스이기 때문에 서로 다른 주소 값을 가지고 있어 false를 리턴한 모습을 볼 수 있다.
생성된 인스턴스는 힙 메모리에 저장되며 아무리 값이 같더라도 인스턴스가 가리키는 주소가 다르기 때문에 false를 리턴한 것이다.
하지만 car2에는 car1을 대입하여 car1과 car2는 같은 인스턴스를 가리키고 있어 true를 리턴한 모습을 볼 수 있다.
이제 equals 메서드에 관한 기본적인 개념을 알아봤으니 인스턴스의 주소 값이 아닌 Car클래스의 name 속성이 같다면 true를 반환하도록 재정의하여 사용하는 법을 보도록 하자.
위에서 사용한 Car클래스 예제를 재활용하여 Car클래스 안에 equals 메서드를 재정의한 모습이다.
우선 instanceof() 메서드로 매개변수 obj가 Car 클래스인지 확인한다.
※instanceof( ) : 왼쪽의 참조 변수의 원래 자료형이 오른쪽에 클래스가 맞다면 true 아니라면 false를 반환
1. obj가 Car 클래스로 선언된 인스턴스라면 if문 안에 코드를 실행한다.
2. Car로 참조 변수를 하나 만든 뒤 obj클래스를 형 변환하여 대입한다.
3. 그 후 원래 인스턴스의 멤버 변수 값과 비교할 인스턴스의 멤버변수 값이 같은지 비교하고 맞다면 true 틀리다면 false를 리턴하게 한다.
4. 처음 instanceof( ) 메서드부터 틀렸다면 바로 false를 리턴한다.
그럼 main( ) 메서드를 다시 실행해 보록 하자.
equals 메서드를 재정의하기 전에는 true, false를 리턴하던 로그가 car1과 car3의 name속성이 같으니 true를 반환하는 것을 확인할 수 있다.
equals 메서드를 재정의해서 name 속성이 서로 같다면 true를 반환하게 하는 즉 물리적 주소가 아닌 논리적으로 같다면 true를 반환하게 재정의하였다면 hashCode( ) 메서드도 equals 메서드로 비교하여 true 나온 참조 변수들은 같은 해시 코드를 반환하게끔 재정의해주는 것이 좋다.
※ hashCode( ) : 해시코드 값을 반환해주는 함수 각 인스턴스의 해시 코드값은
System.out.println(System.identityHashCode(참조변수 명));
toString( ) 메서드와 마찬가지로 equals메서드를 String클래스와 Integer클래스는 미리 재정의하여 사용하고 있다.
인스턴스가 가지고 있는 값이 서로 같다면 true를 반환하는 모습을 볼 수 있다.
본 포스팅은 필자가 공부한 것을 정리해 놓은 것으로 오류가 존재할 수 있습니다.
참고: Do it! 자바 프로그래밍 입문
'Java' 카테고리의 다른 글
[Java] static 변수와 static 메서드 (0) | 2019.12.12 |
---|---|
[Java] Wrapper 클래스, 오토박싱과 언박싱 (0) | 2019.12.10 |
[Java] 템플릿 메서드 (Template Method) (0) | 2019.12.08 |
[Java] 단락 회로 평가 (Short Circuit Evaluation; SCE) (0) | 2019.12.05 |
[Java]생성자 Constructor (0) | 2019.12.04 |