Java 상속 - 3. toString

2019. 7. 23. 08:48 from CS/Java

일단 이것부터 알고가자!!

 

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()메소드를 호출한 내용이다.

 

 

 

 

다음엔 오버라이딩에 대해 알아봅시다~!!!

 

 

Posted by Jyoel :