본문 바로가기
Study/Java

[Java] 상속, Object & Super 클래스

by JYHAN 2020. 7. 3.

상속

기존에 만들어진 클래스의 기능을 상속받아서 새로운 클래스를 쉽게 만들 수 있는 방법

 

상속이란

상위 클래스를 상속받은 하위 클래스는 상위 클래스의 속성과 기능도 이용할 수 있다

따라서 하위 클래스에서 객체를 생성하면 상위 & 하위 클래스의 모든 속성과 기능을 사용할 수 있다

상속받은 하위 클래스에서 객체 생성

상속에는 다음 두 종류가 있다

  1. 구현상속 : 클래스 상속
  2. 인터페이스 상속 : 인터페이스 상속,

EX) 리모콘 케이스(인터페이스) / 리모콘 안에 들어가는 내부회로판(클래스)은 다를 수 있다

인터페이스는 클래스가 아니기 때문에 객체생성이 불가하다

인터페이스는 클래스가 지녀야 할 것들의 약속, 약속을 지키는 행위를 하는 것은 클래스이다

 

메서드 선언과 정의의 차이

  • method ( ); 선언 -> 추상메소드, 무슨 일을 하는지 정도만 알 수 있다
  • method ( ){  } 정의

 

상속의 필요성

기존의 검증된 class를 이용해서 빠르고 쉽게 새로운 class를 만들 수 있다

 

상속 구현

extends 키워드를 이용해서 상속을 구현한다

자바에서는 단일 상속만을 지원한다

public class ParentClass {
	public ParentClass() {
		System.out.println("ParentClass Constructor");
	}
	public void parentStart() {
		System.out.println("---- Parent Start ----");
	}
}

public class ChildClass extends ParentClass{
	public ChildClass() {
		System.out.println("ChildClass Constructor");
	}
	public void childStart() {
		System.out.println("---- Child Start ----");
	}
}

ChildClass child = new ChildClass();		
child.parentStart();
child.childStart();

--- result ---
ParentClass Constructor
ChildClass Constructor
---- Parent Start ----
---- Child Start ----

 

다중 상속을 지원하지 않는 이유?

상위 클래스로부터 상속받은 메서드를 사용할 때, 어떤 클래스에서 구현한 메서드인지 알 수 없게 되는 다이아몬드 문제가 발생한다

https://en.wikipedia.org/wiki/Multiple_inheritance

 

Multiple inheritance - Wikipedia

Multiple inheritance is a feature of some object-oriented computer programming languages in which an object or class can inherit characteristics and features from more than one parent object or parent class. It is distinct from single inheritance, where an

en.wikipedia.org

단, 인터페이스(interface)의 경우 상위 클래스에서 실질적인 구현이 이루어지지 않고 메서드에 대한 정의만 하고,

최종 구현구현 객체에서 이루어질 것이기 때문에 문제가 되지 않는다

 

부모 클래스의 private 접근자

자식 클래스는 부모 클래스의 모든 자원을 사용할 수 있지만, private 접근자의 속성과 메서드는 사용할 수 없다

public class ParentClass {
	public ParentClass() {
		System.out.println("ParentClass Constructor");
	}
	private void parentStart() {
		System.out.println("---- Parent Start ----");
	}
}

public class ChildClass extends ParentClass{
	public ChildClass() {
		System.out.println("ChildClass Constructor");
	}
	public void childStart() {
		System.out.println("---- Child Start ----");
	}
}

ChildClass child = new ChildClass();

// this method parentStart() from the type ParentClass is not visible
child.parentStart();
child.childStart();

 

메서드 오버라이드(Override)

부모 클래스의 기능을 자식 클래스에서 재정의해서 사용한다

public class ParentClass {
	public ParentClass() {
		System.out.println("ParentClass Constructor");
	}
	public void parentStart() {
		System.out.println("---- Parent Start ----");
	}
}

public class ChildClass extends ParentClass{
	public ChildClass() {
		System.out.println("ChildClass Constructor");
	}
	
	@Override
	public void parentStart() {
		System.out.println("---- Child's Parent Start ----");
	}
}

ChildClass child = new ChildClass();
child.parentStart();

--- result ---
ParentClass Constructor
ChildClass Constructor
---- Child's Parent Start ----

자료형(타입)

기본 자료형처럼 클래스도 자료형이다

public class ParentClass {
	public ParentClass() {
		System.out.println("ParentClass Constructor");
	}
	public void parentStart() {
		System.out.println("---- Parent Start ----");
	}
}

public class ChildClass extends ParentClass{
	public ChildClass() {
		System.out.println("ChildClass Constructor");
	}
	
	@Override
	public void parentStart() {
		System.out.println("---- Child's Parent Start ----");
	}
}

// ChildClass는 ParentClass를 상속받은 것이기 때문에 가능하다
ParentClass child = new ChildClass();
child.parentStart();

--- result ---
ParentClass Constructor
ChildClass Constructor
---- Child's Parent Start ----

 

Object 클래스

모든 클래스의 최상위 클래스는 Object 클래스이다

이클립스에서 클래스 이름을 누르고 Ctrl+T를 누르면 상속관계를 볼 수 있다

상속관계 / 최상위 클래스는 Object 클래스

super 클래스

상위 클래스를 호출할 때 super 키워드를 이용한다

public class ParentClass {
	int value = 100;
	public ParentClass() {
		System.out.println("ParentClass Constructor");
	}
	public void parentStart() {
		System.out.println("---- Parent Start ----");
	}
}

public class ChildClass extends ParentClass{
	int value = 9999;
	public ChildClass() {
		System.out.println("ChildClass Constructor");
	}
	
	@Override
	public void parentStart() {
		System.out.println("ChildClass : "+this.value);
		System.out.println("SuperClass : "+super.value);
	}
}

---- result ----
ParentClass Constructor
ChildClass Constructor
ChildClass : 9999
SuperClass : 100


댓글