20/11/3

아라·2020년 11월 3일
0

국비교육

목록 보기
17/30

메서드 오버라이드(Method Override)

메서드 재정의. 기존의 메서드를 무시하고 새로 구현한다. 메서드 헤더는 그대로 두고 메서드 바디를 재정의. 상속에서 발생 > 자식 클래스에서 발생하는 일. 부모가 물려준 메서드를 그대로 명시적 선언하게 되면 부모 메서드를 감추고 부모 메서드와 자식 메서드를 동시에 존재하게 해준다. 기술은 발전하면서 사용자들의 사용경험은 유지하는 기술.

메서드 오버로딩 vs 메서드 오버라이드(면접질문!)

메서드 오버로딩 : 메서드가 인자리스트를 다양하게 가질 수 있는 기술. 개발자의 편의를 위해.
메서드 오버라이드 : 부모로부터 물려받은 메서드를 자식이 수정해서 사용하는 기술.

@Override

어노테이션(Annotation) : 컴파일러가 인식하는 주석.(원래 컴파일러는 주석을 인식 못하지만!) 일종의 명령어. 필수는 아니라서 지워도 되지만 편의상 남겨두는 게 좋음.

동일 클래스내에서 다른 생성자 호출하기

우리가 생성자를 아무 것도 안 만든 상태라면 자동으로 기본생성자가 수행되지만 하나라도 생성자를 만들면 그 생성자에 맞춰 생성해야 한다.
기본생성자에서 초기화하면 0이 들어가는데, 이 경우 인자를 받아쓰는 Time()생성자를 이용하는 방법도 있다. 아래와 같이 코드를 작성하면 된다.

class Time{
	private int hour;
	private int min;
	private int sec;
	
	public Time() {
		this(0, 0, 0);
	}
	public Time(int hour, int min, int sec) {
		this.hour=hour;
		this.min=min;
		this.sec=sec;
	}
}

흔히 볼 수 있는 오버라이딩의 예

아래와 같이 객체를 있는 그대로 출력하면 com.test.inheritance.Time@6d06d69c와 같이 나온다.

System.out.println(t2); = System.out.println(t2.toString()); // 결과 같음
// 이때 toString()의 클래스는 java.lang.object.

Date d1=new Date();
Calendar c1=Calendar.getInstance();
		
System.out.println(d1.toString()); // 이때 toString()의 클래스는 각 클래스.
System.out.println(c1.toString()); // 오버라이딩된 것!

위에서 t2를 print한 결과는 com.test.inheritance.Time@6d06d69c로 나온다.(com.test.inheritance.Time : 이 객체가 어떤 자료형인지 알려준다.
6d06d69c : 객체가 위치한 메모리 주소값)
이것은 toString()을 붙인 결과와 같은데, 우리가 만든 Time클래스말고 Date클래스와 Calendar클래스를 이용하여 출력한 것을 보면 시간형식으로 나온다. 이렇게 되는 이유는 object클래스에서 상속받은 toString()을 Date와 Calendar클래스는 오버라이딩해서 바꾸었기 때문.
우리가 만든 클래스에서 toString()을 재정의하고 싶다면 아래와 같이 코드를 적으면 된다. 되도록 해당 개체가 가지고 있는 데이터를 문자열로 반환하도록 고친다.

@Override
public String toString() {
	return String.format("%02d:%02d:%02d", this.hour, this.min, this.sec);
}

이렇게 오버라이딩을 해야 하는 이유는 전세계 개발자가 이 결과가 뭔지 알고 있기 때문. 모르는 클래스를 사용할 때 개발자들이 좀 더 빠르게 그 클래스를 파악할 수 있게 하기 위함.

final

final은 프로그램 안정성을 위해 사용한다.
1. 변수에 적용(final변수) -> 값을 변경할 수 없음. "(이름이 있는) 상수"! 자바말고 다른 언어에서는 final 대신 const라고 쓴다.

  • 상수명 표기는 ALL 대문자로!
  1. 메서드에 적용(final메서드) : 상속시 발생하는 안정성 문제때문에 사용.
  2. 클래스에 적용(final클래스) : 상속 불가능.

형변환

  1. 값형 형변환 : 값형끼리만 가능
  2. 참조형 형변환 : 참조형끼리만 가능
  • 클래스끼리 가능
  • 상속 관계를 맺은 클래스끼리만 가능
  • 자식클래스 -> 부모클래스 : 암시적, 업캐스팅(Up Casting) -> 100% 안전
  • 부모클래스 -> 자식클래스 : 명시적, 다운캐스팅(Down Casting) -> 100% 불가능
package com.test.inheritance;

public class Ex62_Casting {

	public static void main(String[] args) {
		CastParent p1=new CastParent();
		p1.a=10;
		p1.b=20;
		
		CastChild c1=new CastChild();
		c1.a=10;
		c1.b=20;
		c1.c=30;
		c1.d=40;
		
        // 1. 자식 -> 부모 복사
		CastParent p2; // 복사본(부모객체)
		CastChild c2=new CastChild(); // 원본(자식객체)
		p2=c2; // (p2=(CastParent)c2와 같음.)암시적, 업캐스팅
		System.out.println(p2.a);
		System.out.println(p2.b);
        // 실제 객체가 가지는 멤버 c와 d를 접근할 수 없다는 게 단점.
        
        // 2. 부모 -> 자식 복사
        CastParent p3=new CastParent(); // 원본(부모객체)
        CastChild c3; // 복사본(자식객체)
        c3=(CastChild)p3; // 100% 불가능.
	}

}

class CastParent{
	public int a;
	public int b;
}

class CastChild extends CastParent{
	public int c;
	public int d;
}

다운캐스팅이 가능한 경우

자식클래스를 먼저 생성하고, 그 자식클래스를 부모클래스로 업캐스팅하고, 그 부모클래스를 다시 자식클래스로 다운캐스팅하는 경우는 가능하다.

현존하는 모든 클래스의 최상위에는 Object클래스가 있다. 업캐스팅은 세대수와 상관없이 가능하기 때문에 결국 자바에 존재하는 모든 클래스는 Object 참조변수에 넣을 수 있다.(값형도 가능)

0개의 댓글