누군가가 class를 주면,
상속 => 변경 => 사용
Parent.java
- 외부 라이브러리라고 간주함
부모 클래스에서 정의한 메소드는 자식 클래스에서 사용가능
: 자식 클래스에서 extends 필요
부모 클래스에서 만든 메소드 중 abstract 한 메소드는 추상화 한 메소드로서, 자식 클래스는 반드시 그 메소드를 수행해야 함.
: 부모 메소드중 하나에 abstract 설정을 했다면
= public abstract void printNum1();
: 부모 클래스 속성에도 abstract를 설정해야 함.
= public abstract class Parent
2-1. 추상화 했기 때문에 자식이 일을 마무리 하지 않는 이상 부모의 일도 끝나지 않음
2-2. 빈 설계도를 줌으로써 자식이 편하게 만들 자유를 줌
2-3. 단, 자식은 반드시 이 메소드를 수행해야함
package com.example.basic;
import lombok.Getter;
import lombok.Setter;
// getter/setter는 필요할때마다 생성(사용)
// 생성자는 최초 한번만 생성(사용)
@Getter
@Setter
public abstract class Parent {
// 변수 : 클래스의 공통변수
private int num = 0;
// 생성자 : 클래스명과 일치
// 여러개 가능 => 오버로딩
public Parent() {
}
// 생성자
public Parent(int num) {
this.num = num;
}
// getter/setter
// 메소드
public void printNum() {
System.out.println("Parent => printNum ===> " + this.num);
}
// 메소드 : 기능구현X, 자식은 반드시 이 메소드의 기능을 구현해야함
// abstract = 추상 => 설계만 해둠
// 클래스 명 앞에도 반드시 명시해야함
public abstract void printNum1();
// 추상화 했기 때문에 자식이 일을 마무리 하지 않는 이상 부모의 일도 끝나지 않음
// 빈 설계도를 줌으로써 자식이 편하게 만들 자유를 줌
// 단, 자식은 반드시 이 메소드를 수행해야함
}
Child1.java - implement
extends => 외부 라이브러리(클래스) 사용 선언
생성자에서 super => 부모의 생성자를 호출
@Override => 부모의 기능 재구현 (부모의 구현부 + 자식의 구현부)
자식 클래스에서 Parent1 클래스(interface)를 사용하려면 implements Parent1
추가
Parent1의 추상화된 메소드를 수행해야함
// Parent1의 추상화된 메소드
public void printA();
public void printB();
@Override
public void printA() {
}
@Override
public void printB() {
}
package com.example.basic;
// Parent는 라이브러리고
//Child1을 만드는데 기존기능 + 새로운 기능추가
public class Child1 extends Parent implements Parent1 {
public Child1() {
}
public Child1(int num) {
// 부모의 생성자를 호출
// = public Parent(int num)
super(num);
}
// @Override = 부모의 기능 재구현 (부모의 구현부 + 자식의 구현부)
@Override
public void printNum() {
// 부모의 메소드 호출
super.printNum();
System.out.println("Child1에서 출력하는 기능 추가");
}
// 부모와 전혀 상관없는 메소드
public void printChild1() {
System.out.println("printChild1");
}
@Override
public void printNum1() {
// 자식입장에서는 이 일이 뭔지는 모르지만 해야하는 입장인것은 알고 있음
// 부모가 자식에게 남긴 일(printNum1())을 이 시점에 완료함.
System.out.println("printChild1-printNum1");
}
@Override
public void printA() {
// TODO Auto-generated method stub
}
@Override
public void printB() {
// TODO Auto-generated method stub
}
}
Parent1.java - interface
부모 클래스를 interface로 만듦
: interface = 여러 부모에게서 상속을 받아야 하는 경우
정의만 두개 함
public void printA();
public void printB();
App.java - 클래스 사용(컨트롤)
부모클래스명 변수 = new 부모클래스명();
: 미완성 된 클래스(Parent)라서 불러올수 없음
: 미완성 이유 : abstract로 추상화된 일을 자식에게 남겨두었기떄문
자식클래스명 변수 = new 자식클래스명();
: 의미가 없는 호출
부모클래스명 변수 = new 자식클래스명();
: 가장 많이 사용
: 자식이 부모의 클래스에서 추상화 시킨 메소드를 수행 할 수 있다.
// 클래스명 변수 = new 클래스명();
// // 미완성 된 클래스(Parent)라서 불러올수 없음
// // 미완성 이유 : abstract로 추상화된 일을 자식에게 남겨두었기떄문
// Parent obj1 = new Parent();
// obj1.printNum();
// 가장 많이 사용함
Parent obj2 = new Child1();
obj2.printNum();
obj2.printNum1();
// Child1에는 없는 메소드(printNum();)지만 상속받은경우 모두 사용가능
// // 의미가 없는 호출
// Child1 obj3 = new Child1();
// obj3.printNum();
// obj3.printChild1();