강좌 Course 1. Part 4. ch6 요약
Object는 자바에서 가장 처음에 만들어진 최상위클래스로, 모든 클래스들은 Object 클래스를 상속한다. Object를 사용하면 모든 클래스 객체를 생성할 수 있다.
import java.lang.*; // 일반적으로 생략되어 있음
public class A extends Object{ // extends Object 생략
public A(){
super(); // 기본생성자 메서드 생략되어 있음
}
}
}
// Object 클래스로 A 객체 생성하기
public class ObjectTest {
public static void main(String[] args) {
Object obj = new A(); // 업캐스팅
((A)obj).display(); // 다운캐스팅
}
}
다형성 인수로 Object를 받을 수 있다. Object 타입으로 업캐스팅되면 반드시 다운캐스팅을 하게 되어 있다.
// A 클래스
public class A {
public void printGo(){
System.out.println("AAA");
}
}
// B 클래스
public class B {
public void printGo(){
System.out.println("BBB");
}
}
타입별로 printGo()를 호출하려는 메서드를 만들면 코드가 반복되니, 이때 다형성 인수를 받도록 수정할 수 있다.
public static void display(Object obj){
if (obj instanceof A){
((A)obj).printGo();
} else {
((B)obj).printGo();
}
}
Object[] 을 생성하여 A타입, B타입을 저장할 수 있다. 이때 업캐스팅을 사용하며, A나 B의 메서드를 호출하려면 다운캐스팅을 해주어야 한다.
public class ObjectArrayTest {
public static void main(String[] args) {
Object[] obj = new Object[2]; // 다형성 배열
obj[0] = new A(); // upcasting
obj[1] = new B(); // upcasting
// A나 B의 메서드를 호출하려면 downcasting
for(int i=0;i<obj.length;i++){
if (obj[i] instanceof A){
((A)obj[i]).printGo();
} else {
((B)obj[1]).printGo();
}
}
}
}
기본적으로 클래스를 생성하면 toString()이라는 메서드가 함께 생성된다. 이 toString()은 원래 Object가 가지고 있는 메서드로, 객체의 메모리 번지를 문자열로 출력해준다.
메모리번지 말고 객체의 정보를 출력하게끔 만들고 싶으면 재정의해주면 된다.
* toString()을 생략하고 그냥 객체만 프린트해도 같은 메모리 번지가 출력된다.
public class Board extends Object{
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String toString(){
return title;
}
}
toString()은 재정의하여 사용하는 것이 일반적이다.
Object를 상속한 다른 API들도 toString()을 재정의해두었기 때문에, 기본 toString()을 쓰는 경우는 드물다.
만약 재정의하는 동시에 Object의 toString()을 쓰고싶다면, toString()의 오버라이드 블록 첫줄에
super.toString();
을 쓰면 상위클래스의 toString()이 호출된 다음 재정의된 내용을 실행하게 된다.
* 이때 super.toString()으로 나온 메모리 번지는 Object가 아닌 현재 메모리 객체의 번지이다.