일반적인 A클래스를 생성해보았다.
public class A {
public void display() {
System.out.println("A");
}
}
이 때, A클래스를 생성하면서 생략되는 코드들이 몇 가지 있다.
import.java.lang.* // 생략1
public class A (extends Object){ // 생략2
public void display() {
System.out.println("A");
}
public A() { // 생략3
super();
}
}
1. import.java.lang.* : 빈번하게 사용되는 자바 API
2. ~extends Object : java.lang.Object로 java의 최상위 클래스
3. default 생성자와 super();
Object클래스는 java의 최상위 클래스로 모든 클래스는 Object클래스를 상속받는다. 따라서 Object클래스를 이용해 객체를 생성할 수 있다.
A a = new A(); // 일반적인 객체생성
Object obj = new A(); // Upcasting : 모든 클래스는 Object클래스를 상속받음
Object클래스를 UpCasting해 객체를 생성할 수도 있다.
자식클래스에 접근하려면 DownCasting을 이용해야 한다.
java의 최상위 클래스인 Object클래스를 이용해 다형성을 적용시킬 수 있다.
다형성 인수를 이용해 생성한 인스턴스를 매개변수에 UpCasting 방식으로 저장한다.
이후 DownCasting으로 매개변수로 받은 인스턴스에 접근해 처리한다.
public class ObjectPolyTest {
public static void main(String[] args) {
Aclass a = new Aclass();
display(a);
Bclass b = new Bclass();
display(b);
}
// 다형성 인수 활용
private static void display(Object obj) {
if (obj instanceof Aclass) {
((Aclass) obj).display();
} else {
((Bclass) obj).display();
}
}
}
<result>
여긴 A클래스
여긴 B클래스
다형성 배열을 활용할 수도 있다.
public class ObjectPolyArrayTest {
public static void main(String[] args) {
Object[] obj = {new Aclass(), new Bclass()};
display(obj);
}
private static void display(Object[] obj) {
for(Object o : obj) {
if (o instanceof Aclass) {
((Aclass) o).display();
} else {
((Bclass) o).display();
}
}
}
}
<result>
여긴 A클래스
여긴 B클래스
Object클래스의 toString()메서드는 객체의 주소값을 문자열로 출력할 수 있는 함수이다. 즉, toString()메서드는 인스턴스에 대한 정보를 문자열로 반환한다.
toString()메서드로 객체 정보를 패키지명+클래스명 + @ + 16진수 해시 코드(hash code)의 구조로 반환한다.
해시 코드 : 인스턴스의 주소를 해싱하여 변환한 값이다. 해시 코드는 고유 숫자로서 인스턴스마다 모두 다르게 반환된다.
java의 hashcode()메서드를 이용해 나타낼 수 있다.
다음은 java.lang.Object.toString()의 구조이다.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
패키지명+클래스명(getClass().getName()) + "@" + 16진수 해시 코드(Integer.toHexString(hashCode()))의 형태로 객체 정보를 반환하고 있다.
객체를 출력할 때 toString()을 사용하지 않아도 동일한 값이 출력된다. 이는 객체만 출력할 경우 컴파일러가 자동으로 toString()메서드를 붙이면서 컴파일하기 때문이다.
public class ObjectToStringTest { public static void main(String[] args) {
Board b = new Board();
System.out.println(b.toString()); // toString()메서드 이용해 객체 정보 출력
System.out.println(b);
}
}
org.example.part3.model.Board@2f92e0f4
```
Object에 기본적으로 내재되어 있는 toString()메서드를 사용하게 되면 위같은 결과값이 반환된다.
toString()은 Object 클래스의 메서드이기 때문에 Object클래스를 기본적으로 상속받는 모든 클래스들은 toString()메서드를 오버라이딩 해서 알맞게 사용할 수 있다.
객체의 이름이나 주소값이 아닌 객체에 설계된 필드의 고유 정보를 출력하고 싶을 때(Board인스턴스의 경우 Board의 title이나 content 등등) toString()메서드를 오버라이딩 해서 재정의 해주면 된다.
메서드 오버라이딩을 할 때 부모메서드의 접근제어자 범위보다 낮은 범위의 접근제어자를 지정할 순 없다. Object클래스의 toString()메서드 접근제어자는 public이기 때문에 반드시 오버라이딩하는 toString()의 접근제어자는 public으로 지정해야 한다.
public class Board {
private String title;
public Board(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
@Override
public String toString() { // toString메서드 오버라이딩
return String.format("title : %s", this.title);
}
}
super키워드를 이용해 부모클래스(Object)의 toString()메서드를 바로 사용할 수도 있다.
super.toString(); // Object class의 toString()을 바로 사용