1. Object 클래스
- Object 클래스는 멤버변수는 없고 오직 11개의 메서드만 가지고 있다.
- 아래의 중요한 메서드 몇가지만 알아보자.
1-1. equals(Obejct obj)
- 매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean으로 알려주는 역할을 한다.
- 그렇기 때문에 같은 클래스의 객체라도 서로 다를 수밖에 없다.
- 아래의 코드를 보고 이해해보자.
- 또한 아래의 코드처럼 오버라이딩을 통해 또 다른 비교를 할 수 있다.
1-2. hashCode()
- 이 메서드는 해싱 기법에 사용되는 '해시 함수'를 구현한 것이다.
- 해싱은 데이터 관리 기법 중의 하나인데, 대량의 데이터를 저장하고 검색하는 데 유용하다.
- 일반적으로 해시코드가 같은 두 객체가 존재할 수 있지만, Object 클래스에 정의된 해시코드는
다르다.
- 만약 비교하고 싶다면 앞에서 했던 equals 처럼 오버라이딩 해야할 것이다.
- 아래의 코드를 보자.
( 위에서 String 클래스는 해시 코드 메서드를 오버라이딩 되어 있기 때문에, 주소 값이 다른 두 객체는 같은 값이
나올 수 있다. )
( 그러나, Object 클래스의 해시코드 메서드처럼 주소 값으로 해시코드를 만들기 때문에 값이 다르게 나온다. )
1-3. toString()
- 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의한 것이다.
- 형식은 아래와 같다.
- 오버라이딩하지 않고 위 코드 그대로 toString()을 호출하면 클래스 이름에 16진수의 해시코드를 얻게 될 것이다.
- 아래의 코드를 보자.
1-4. clone()
- 이 메서드는 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다.
- 또한 이 메서드를 통해 기존의 인스턴스를 보존하면서 새로운 인스턴스를 가지고 작업을 실행하게 할 수 있다.
- 그렇게 함으로써, 작업이 실패하더라도 기존 인스턴스를 가지고 다시 복구할 수 있는 장점이 생긴다.
- Object 클래스에 정의된 clone()은 단순히 인스턴스 변수 값만을 복사하기 때문에, 참조 타입의 인스턴스 변수가 있는
클래스는 완전한 인스턴스 복제가 이루어지지 않는다.
( 자세한 내용은 다음장 java.lang 패키지(2) - 얇은 복사와 깊은 복사에서 설명함. )
- 예를 들어, 배열의 경우 복제된 인스턴스도 같은 배열의 주소 값을 갖기 때문에, 서로 영향을 주게 되므로 따로
오버라이딩을 해줘야 한다.
- 아래의 코드를 보자.
( clone()을 사용하기 위해서는 인터페이스를 구현해야 하고, super.clone()을 사용하는 곳에는
try/catch를 꼭 써야 한다. )
( clone()은 원래 protected로 되어 있지만 public으로 변경해서 써야 한다. 그 이유는 상속 관계가
없는 다른 클래스에서 호출할 수 있어야 하기 때문이다. )
- 또한 배열에서도 오버라이딩 된 clone()을 쓸 수 있는데, 아래의 코드를 보자.
( 배열도 객체이므로 Object 클래스를 상속받으며, 동시에 Cloneable인터페이스와 Serializable 인터페이스가
구현되어 있다. )
( 또한 배열 뿐만 아니라 java.util 패키지의 Vector, ArrayList, LinkedList, HashSet, TreeSet, HashMap,
TreeMap, Calendar, Date 와 같은 클래스들이 이와 같은방식으로 복제가 가능하다. )
2. 공변 반환타입
- 공변 반환 타입은 jdk 1.5부터 생겼으며, 오버라이딩 할 때 조상 메서드의 반환 타입을 자식 클래스의
반환 타입으로 변경을 허용하는 것을 말한다.
- 아래의 코드를 보자.
( 주석이 공변 반환타입을 설정하기 전이고, 바로 아래의 코드가 공변 반환타입을 설정한 코드이다. )
( 이렇게 함으로써, 번거러운 형변환이 줄어든다는 장점을 얻는다. )
다음장
java.lang 패키지(2) (tistory.com)
java.lang 패키지(2)
1. 얇은 복사와 깊은 복사 - clone()은 단순히 객체에 저장된 값을 그대로 복제할 뿐, 객체가 참조하고 있는 객체까지 복제하지 않는다. - 기본형 배열인 경우는 오버라이딩을 해서 문제가 되지 않
kind-coding.tistory.com
'자바 > java.lang 패키지' 카테고리의 다른 글
java.lang패키지(6) - Math 클래스 (0) | 2021.12.27 |
---|---|
java.lang패키지(5) - StringBuffer 클래스와 StringBuilder 클래스 (0) | 2021.12.26 |
java.lang패키지(4) - String 클래스(2) (0) | 2021.12.26 |
java.lang패키지(3) - String 클래스(1) (0) | 2021.12.24 |
java.lang 패키지(2) - Object 클래스(2) (0) | 2021.12.24 |