본문 바로가기

Java/JAVA

상속 (2)

반응형

Object 슈퍼클래스

자바에서 모든 클래스는 Object클래스를 직/간접적으로 확장한다. 클래스에 명시적인 슈퍼클래스가 없으면 암시적으로 Object클래스를 확장한다.

Object클래스는 모든 자바 객체에 적용할 수 있는 메서드를 정의한다.

이 중 몇가지를 살펴본다.

toString

객체의 문자열 표현을 돌려준다.

x.toString() 대신에 "" + x 로 작성할 수도 있다. 이 표현식은 x가 null이거나 기본 타입 값일 때도 제대로 동작한다.

배열 출력

Arrays.toString(배열참조변수이름)

equals

객체가 같은지 검사하는 메서드

두 객체가 같은 내용을 담고 있을 때 같다고 보는 상태기반 동등성 검사가 필요한 경우에만 equals 메서드를 오버라이드 한다.

인스턴스 변수가 배열이면 정적메서드 Arrays.equals를 사용해서 배열의 길이가 같은지 검사하고 대응하는 배열 요소가 같은지 검사한다.

* equals는 따로 연구해볼 필요가 있다.

if(!(otherObject instanceof Item))return false;

이렇게 하면 otherObject가 Item의 서브클래스에 속해도 검사할 수 있다.

예를 들면 Item과 DiscountedItem을 비교할 수 있다. 하지만 이런 비교는 동작하지 않는다. equals 메서드는 대칭으로 동작해야 한다. 다시말해 null이 아닌 x와 y가 있을때는 x.equals(y)와 y.equals(x)가 같은 값을 반환해야한다.

hashCode

해시코드는 객체에서 파생되는 정숫값이다. 해쉬코드 값이 중복될 수 있다. 하지만 그 빈도는 낮아야 한다.

hashCode와 equals 메서드는 반드시 호환되어야 한다.

x.equals(y) 면 x.hashCode() == y.hashCode() 여야한다.

equals를 재정의할 때 hashCode메서드도 재정의해서 equals와 호환되게 만들어야 한다.

이렇게 하지 않으면 클래스의 사용자가 해시 집합이나 해시 맵에 객체를 넣다가 객체를 잃게 될 수 도 있다.

인터페이스에서 Object클래스의 메서드를 재정의해서 기본 메서드로 만들 수 없다.

인터페이스에서는 특히 toString, equals, hashCode를 기본 메서드로 정의할 수 없다.

클래스 우선 규칙에 따라 이런 메서드는 Object.toString이나 Object.equals보다 우선할 수 없다.

clone

 * clone()은 오버라이드 하지 말아야 한다.

clone메서드의 목적은 객체의 복제본, 즉 원본과 같은 상태의 객체를 만드는 것이다.

두 객체중 하나의 상태를 변경해도 나머지 하나는 변하지 않는다.

clone은 얕은 복사를 수행한다.

인스턴스 변수가 기본타입이거나 불변 객체일 때는 얕은 복사로도 충분하지만 그렇지 않을 때는 원본과 복제본이 변경 가능한 상태를 공유하므로 문제가 될 수 있다.


반응형

'Java > JAVA' 카테고리의 다른 글

예외 (Exception)  (0) 2017.05.23
자바(JAVA) 열거와 리플렉션  (0) 2017.05.22
상속 (1)  (0) 2017.05.21
람다표현식 (2)  (0) 2017.05.21
람다표현식 (1)  (0) 2017.05.21