부모 클래스를 상위 클래스(슈퍼 클래스, Super Class) 또는 기반 클래스(베이스 클래스, Base Class) 로 부르며, 상속받은 자식 클래스를 하위 클래스(서브 클래스, Sub Class) 또는 파생 클래스(유도 클래스, derived Class) 라 부른다.
Java 언어에서 상속을 하는 이유는 이미 존재하는 클래스의 메서드와 필드를 재사용할 수 있기때문이다.
즉, 새 클래스를 만들고자 하고, 구현하고자 하는 코드가 이미 다른 클래스에 존재한다면, 새로 작성할 필요없이 클래스 상속을 통해 이미 작성한 코드를 재사용할 수 있게된다.
부모의 기본 생성자를 호출하는 역할 (반드시 자식 생성자의 첫 줄에 위치)
자바는 자식 객체를 생성하면 부모 객체가 먼저 생성되고 자식 객체는 그 다음에 생성되는 구조
ex)
public class CellPhone { . . . }
public class IPhone extends CellPhone { . . . }
IPhone iPhone = new IPhone();
public IPhone() {
super();
}
super Class가 가지고있는 메서드를 서브클래스에서 새롭게 다른 로직으로 정의하고 싶을 때 사용하는 문법이다.
상속관계에 있는 클래스간에 같은 이름의 메서드를 정의하는 문법을 오버라이딩이라고 한다.
디스패치는 어떤 메소드를 호출할 것인가를 결정하여 그것을 실행하는 과정이다.
즉, 실행시킬 수 있는 다양한 메소드가 주어진다고 한다면, 받은 메세지를 기반으로 어떤 메소드를 실행할 지 결정하는것을 의미한다.
public class App {
public static void main(String[] args) {
AppService appService = new AppService();
appService.run();
appService.run(2);
}
}
class AppService {
void run() {
System.out.println("run 호출");
}
void run(int num) {
System.out.println("run" + num + "번 호출");
}
}
정적 타이밍(static)에 어떤 메소드를 호출할지 결정하는 과정이다. (컴파일 시점)
메소드를 오버라이딩 하거나 오버로딩 할때도 컴파일 시점에 결정된다.
public class App {
public static void main(String[] args) {
AppService appService = new subAppService();
appService.run();
AppService appService2 = new subAppService2();
appService2.run();
}
}
abstract class AppService {
abstract void run();
}
class subAppService extends AppService {
@Override void run() {
System.out.println("sub1");
}
}
class subAppService2 extends AppService {
@Override void run() {
System.out.println("sub2");
}
}
동적타이밍(Dynamic)에 어떤 메소드를 호출해야 할지 결정하는 과정을 말한다.
즉 런타임 시점에 어떤 메소드를 호출해야 할지 결정되는 과정이다.
인터페이스 또는 추상 클래스를 선언하고, 인터페이스를 구현 및 추상클래스를 상속 받은 하위 클래스를
인스턴스로 생성할 때 발생한다.
instance of를 사용하지 않는다.
동적 디스패치를 두 번하는 기법이다.
파라미터는 다이나믹 디스패치의 조건이 되지 않는다.
자바는 싱글 디스패치 언어이다. (receiver가 1개이다.)
interface Post{
void postOn(SNS sns);
}
static class Text implements Post{
public void postOn(SNS sns){
sns.post(this);
}
}
static class Picture implements Post{
public void postOn(SNS sns){
sns.post(this);
}
}
interface SNS{
void post(Text post);
void post(Picture post);
}
static class Facebook implements SNS{
public void post(Text post){
System.out.println("text -> facebook");
}
public void post(Picture post){
System.out.println("picture -> facebook");
}
}
static class Twitter implements SNS{
public void post(Text post){
System.out.println("text -> twitter");
}
public void post(Picture post){
System.out.println("picture -> twitter");
}
}
static class GooglePlus implements SNS{
public void post(Text post){
System.out.println("text -> gplus");
}
public void post(Picture post){
System.out.println("picture -> gplus");
}
}
public static void main(String[] args){
List<Post> posts = Arrays.asList(new Text(), new Picture());
List<SNS> sns = Arrays.asList(new Facebook(), new Twitter(), new GooglePlus());
posts.forEach(p->sns.forEach(s.postOn(s))); }
}
참조