일단 이것부터 알고가자!!
Java에서 모든 클래스의 슈퍼 클래스는?? Object 클래스이다.
Java API 에서 java.lang -> Object class를 선택해보면 아래와 같은 화면을 확인해 볼 수 있다.
Object 클래스에는 필드는 없고 메소드 부분만 있는것을 확인할 수 있다.
그 중 빨갛게 표시해둔 toString()이라는 메소드를 확인할 수 있는데, 리턴 타입은 String이다.
다시 말해 toString() 메소드는 Object 클래스의 메소드이기때문에 모든 클래스에서 사용이 가능하다.
그럼 언제 사용될까?
여러가지 예가 있을 수 있겠지만 이번에 다룰 내용은 객체 주소에 대한 내용이다.
바로 예시로 들어가보자!!!
class A {
private int a;
public A(int a) { // A클래스의 명시적 생성자
this.a = a;
}
public int getA() {
return a;
}
}
public class Test {
public static void main(String[] args) {
A a = new A(5);
System.out.println(a.getA());
System.out.println(a);
}
}
<<<결과값>>>
위의 코드를 보면, A클래스로 a라는 객체를 생성해 5라는 숫자를 인자로 넘겨줘 명시적으로 생성자 호출을 하는것을 볼 수 있다.
그리고 a.getA() 메소드를 호출한 후 출력해 보면 5라고 잘 나온다.
하지만 a를 출력하면 A@15db9742라는 값이 나오는것을 볼 수 있다.
저 값은 @을 기준으로 나뉘어 지는데
@ 왼쪽(A) : 패키지+클래스명이 나온다. 위 코드는 패키지를 따로 지정해주지 않았기 때문에 패키지명 없이 클래스 명인 A가 나오게 된다.
@ 오른쪽(15db9742) : 실제 메모리의 주소값이 나오게 된다.
어떻게 a객체를 입력했을 때 String 타입의 주소값이 출력이 되는걸까??
이 때 toString이 사용된다.
사실 아래의 두 코드는 같은 말이다. 객체 뒤에는 주소값을 출력할 수 있도록 .toString()이 숨겨져 있는것이다.
System.out.println(a);
System.out.println(a.toString());
그렇다면 주소값이 아닌 내가 입력한 값 5를 출력하고 싶다면 어떻게 해야할까?
=> toString()메소드를 오버라이딩 해주면 된다.
class A {
private int a;
public A(int a) { // A클래스의 명시적 생성자
this.a = a;
}
public int getA() {
return a;
}
@Override
public String toString() { //toString() 메소드 오버라이딩
return a+""; //a의 타입은 int이므로 리턴타입 String에 맞춰주기 위해 ""추가
}
}
public class Test {
public static void main(String[] args) {
A a = new A(5);
System.out.println(a.getA());
System.out.println(a.toString());
}
}
<<<결과값>>>
Java에서 가장 상위 클래스인 Object 클래스에서 상속받은 toString()메소드를 아래와 같이 오버라이딩 해주면 된다.
return a + "";
클래스 A의 필드인 a는 int 타입이기때문에 return 타입인 String으로 맞춰주기 위해 ""를 추가해 주었다.
그럼 A를 상속받은 B를 출력하기 위해서는 어떻게 하면 좋을까?
class A {
private int a;
public A(int a) { // A클래스의 명시적 생성자
this.a = a;
}
public int getA() {
return a;
}
}
class B extends A{
private int b;
public B(int a, int b) { // B클래스의 명시적 생성자
super(a); // A클래스의 명시적 생성자를 명시적으로 호출
this.b = b;
}
@Override
public String toString() {
return super.getA() + " " + b; //toString() 오버라이딩
}
}
public class Test {
public static void main(String[] args) {
B b = new B(1, 5);
System.out.println(b);
}
}
다음과 같이 출력할 객체 주소 대신에 toString을 오버라이딩 해주면 된다.
위 코드는 B 클래스의 toString() 에서 부모클래스인 A의 getA()메소드를 호출한 내용이다.
다음엔 오버라이딩에 대해 알아봅시다~!!!
'CS > Java' 카테고리의 다른 글
Java Static - Static에 대한 모든것! 이거 하나면 끝! (0) | 2019.07.29 |
---|---|
Java 상속 - 5. Polymorphism(다형성) & instanceof (0) | 2019.07.29 |
Java 상속 - 4. 오버로딩 vs 오버라이딩 (0) | 2019.07.29 |
Java 상속 - 2. 상속과 생성자 (1) | 2019.07.22 |
Java 상속 - 1. 상속이란? (0) | 2019.07.22 |