[Java] Inheritance

게맛살맛게·2021년 12월 6일
0

Java

목록 보기
12/18

Inheritance

부모 클래스에 정의된 필드와 메서드를 자식 클래스가 물려받는 것

  • 상속의 필요성
    • 클래스 사이의 멤버 중복 선언 불필요
    • 필드, 메서드 재사용으로 클래스 간결
    • 클래스간 계층적 분리 및 관리

자바 언어 상속의 특징

  • 다중 상속을 지원하지 않음
  • 상속의 회수에 제한을 두지 않음 (그러나 상속의 깊이가 깊어지면 유지보수가 어려워진다)
  • 최상위 클래스는 java.lang.Object

상속 선언의 예

extends 키워드 활용

public class Person {
	public void tell();
	public void eat();
	public void walk();
	public void sleep();
}

public class Student extends Person {
	public void study();
}

상속과 생성자

  • 자식 생성자에서 특별한 지시가 없으면 부모 클래스의 기본생성자가 선택 됨
    파라미터 입력 등으로 부모 생성자 중 필요 생성자를 super(arg1, arg2, ...)로 불러서 사용
	public class ColorPoint extends Point {
		private String color;
	
		// 생성자
		public ColorPoint(int x, int y, String color) {
			super(x, y);			// 부모 생성자 중 특정 생성자 이용
			this.color = color;
		}
	}
  • 부모 클래스의 특정 생성자를 호출해야 할 경우 super()명시적 호출
    ※ 부모의 필드나 메서드에 접근시 super키워드 사용



매서드 오버라이딩 (Method Overriding)


부모 클래스의 메서드를 동일한 이름으로 재 작성 (Re-Writting)
※ 같은 이름, 같은 리턴타입, 같은 시그니처 (내용만 변경)

  • 부모 클래스와 자식 클래스의 메서드 사이에서 발생하는 관계
  • 부모 클래스의 메서드를 무시
    @Overriding : 부모에게 메서드가 있는지 확인 (진짜로 오버라이딩 유무 컴파일러에게 체크)
	@Override		// 컴파일러에게 이 메서드가 오버라이딩한 메서드인지 확인
	public void draw(boolean bDraw) {
		// 부모로부터 물려 받은 메서드를 덮어 쓰기
		String message = String.format("색깔점[x=%d, y=%d, color=%s]을 ", super.getX(), y, color);
		message += bDraw ? "그렸습니다." : "지웠습니다.";
		
		System.out.println(message);
		
		// 부모의 메서드 호출
		super.draw(bDraw);
	}



상속의 참조

  • 부모타입으로 자식 객체를 참조 할 수 있다. -> new로 생성한 객체의 메소드/생성자 호출

부모 객체로 자식 객체를 참조 : Person p1 = new Student(); 자식의 생성자 사용 가능

Person p1 = new Student();			Student s1 = new Student();

p1.getName(); 		⭕ 			s1.getName(); 		⭕
p1.getAge(); 		⭕			s1.getAge();		⭕
p1.getShoolName(); 	❌			s1.getSchoolName();// p1은 Person의 Instance이므로 getShoolName()이라는 method가 존재하지 않음 

p1의 경우 Type(객체)는 Person Type이며, 참조 하고 있는 Instance는 Student이다.
➡ 따라서 p1getShoolName()이라는 Method를 가지고 있지 않으므로 호출 불가
이해가 잘 안되니 더 공부해보자

  • 참조타입 설계도 내의 메서드 호출 (overriding 된 경우)

Class Casting

  • 업 캐스팅
    자식 클래스가 부모 클래스 타입으로 변환되는것
    명시적으로 타입 변환을 하지 않아도 됨 Person p1 = new Student();

  • 다운 캐스팅
    업캐스팅된 것을 원래대로 되돌리는 것
    명시적 타입 변환 필요 ((Student) p1) : 일시적 형 변환
    다운캐스팅시 어떤 클래스를 객체화 한것인지 알고자 한다면 instanceof를 사용

❗ 자식 클래스간의 횡이동 캐스팅은 불가능

profile
IT 기술블로그

0개의 댓글