모든 클래스의 최상위 클래스로 모든 클래스들은 컴파일러가 자동으로 extends Object를 추가하여 java.lang.Object를 상속받는다.
class Student => class Student extends Object
Object 클래스의 일부는 재정의를 하여 사용할 수 있다.
ex) toString(), equals(), hashCode(), clone()
java.lang패키지는 많이 사용하는 기본 클래스들이 속한 패키지로 프로그래밍을 할때 import하지 않아도 자동으로 import된다. String, Integer, System, Object등이 속해있다.
package ch01;
class Book {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// toString을 overriding함으로써 기본 인스턴스 출력값이 주소값이 아닌 아래의 return값으로 바꼈다.
@Override
public String toString() {
// TODO Auto-generated method stub
return title + ", " + author;
}
}
public class BookTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Book book = new Book("데미안", "헤르만 허세");
System.out.println(book);
// 결과값 : ch01.Book@24d46ca6ㅜ
// ch01 package의 Book class이다.
// 인스턴스가 저장된 가상 메모리는 24d46ca6이다.
String str = new String("test");
System.out.println(str);
// 위의 book과 같이 String object로 str이라는 인스턴스를 생성하였는데
// 결과가 위와 다르게 주소값이 아닌 str의 문자열이 나온다.
// 이렇게 나오는 이유는 String의 toString method가 overriding되었기 떄문이다.
// Book Class도 toString method를 overriding을 하면 주소값이 아닌 결과 출력이 가능하다.
}
}
두개의 인스턴스의 주소 값을 비교하여 true/false를 반환하는 method이다.
같은 학번, 같은 아이디의 회원과 같이 인스턴스가 다르더라도 논리적으로 동일한 경우 true를 반환하도록 재정의 할 수 있다. (hashCode도 같이 재정의해줘야한다.)
hashCode()는 인스턴스의 저장 주소를 반환한다.
논리적으로 동일하다는 것을 위해서 equal() method를 재정의하였다면 hashCode() method도 재정의하여 동일한 인스턴스들이 동일한 hashCode값이 반환되도록 해야한다.
객체의 원본을 복사해주는 method이다.
clone()메서드를 사용하면 객체의 정보(멤버 변수 값등...)가 동일한 새로운 인스턴스를 생성할 수 있다.
동일한 인스턴스를 생성하는 것이기에 객체 지향 프로그래밍에서의 정보은닉, 객체 보호의 관점에서 위배될 수 있다. 그리하여 모든 class에서 사용이 가능한 것이 아니고 implements Cloneable를 넣은 class에서만 사용가능하다.
Student.java
package ch02;
public class Student implements Cloneable{ // 해당 class를 clone할 수 있다고 구현
private int studentNum;
private String studentName;
public Student(int studentNum, String studentName) {
this.studentName = studentName;
this.studentNum = studentNum;
}
public String toString() {
return studentNum + ", "+ studentName;
}
public void setStudnetName(String name) {
this.studentName = name;
}
// 같은 값을 같은 instance를 논리적으로 같다고 판별하기 위해서는 equels와 hashCode method를 재정의해야한다.
@Override
public int hashCode() {
// TODO Auto-generated method stub
return studentNum;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (obj instanceof Student) { //obj가 Student의 instance인가 확인
Student std = (Student) obj; //obj를 Student로 downcasting
if(this.studentNum == std.studentNum)
return true;
else
return false;
}
return false;
}
// 객체의 현재 상태를 그대로 복사하는데 사용하는 method로 clone()메서드를 사용하면 객체의 정보(멤버 변수 값등...)가
// 동일한 또 다른 인스턴스가 생성되는 것이므로, 객체 지향 프로그램에서의 정보 은닉, 객체 보호의 관점에서 위배될 수 있다.
// 그리하여 모든 class에서 사용이 가능한 것이 아니고 implements Cloneable를 넣은 class에서만 사용가능하다.
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
EqualTest.java
package ch02;
public class EqualsTest {
public static void main(String[] args) throws CloneNotSupportedException {
// TODO Auto-generated method stub
Student st1 = new Student(100, "Lee");
Student st2 = new Student(100, "Lee");
System.out.println(st1 == st2);
System.out.println(st1.equals(st2));
// 값들이 같음에도 불구하고 물리적으로 저장된 주소값이 달라서 false라는 결과가 나온다.
// Student의 equals method를 studentNum값이 같으면 같다고 판별하라고 overriding을 한 뒤에는 true로 return
System.out.println(st1.hashCode());
System.out.println(st2.hashCode());
// overriding전에는 hashCode의 값도 다른 값 출력
// hashcode를 overriding을 한 뒤에는 hashcode값도 동일하게 출력한다.
System.out.println(System.identityHashCode(st1));
// System.identityHashCode를 통해 실제로 st1이 갖는 실제 hashCode값을 찾을 수 있다.
st1.setStudnetName("Kim");
// clone을 통해 st1의 현재상태와 동일한 인스턴스인 copyStudent 인스턴스를 생성
Student copyStudent = (Student)st1.clone();
System.out.println(copyStudent);
}
}