Inheritance(상속)
접근제한자
package day0629_different;
public class SuperObj {
protected String name;
protected int age;
public SuperObj(String name,int age) {
this.name=name;
this.age=age;
}
}
- 별개의 package 설정
- public, protected : 부모 class가 다른 package에 있어도 변수에 접근 가능
- default : 같은 package에 있으면 변수에 접근 가능
- private : 같은 package에 있어도 변수에 접근 불가
package day0629;
import day0629_1.SuperObj;
public class SubObj_03 extends SuperObj{
String addr;
public SubObj_03(String name, int age,String addr) {
super(name, age);
this.addr=addr;
}
public void write() {
System.out.println(this.name+"\n"+this.age+"\n"+this.addr);
}
}
- SuperObj와 다른 package 설정 후 SuperObj(부모 class) 호출
- command : (class 속성) (class명) “extends (super class명)”{ }
- 부모 class 호출하면 반드시 부모 생성자 호출 필요
- 자식 class의 부모 생성자 호출 시 부모 생성자의 인자가 무조건 첫 줄에 위치
package day0629;
public class TestObj_03 {
public static void main(String[] args) {
SubObj_03 s=new SubObj_03("이민규", 29, "seoul");
s.write();
}
}
- 자식 class의 method만 호출해도 부모 class의 것까지 중복 호출
OverRiding(Return Method)
package day0629;
public class Employee_04 {
String sawonName;
int salary;
public Employee_04(String name,int sal) {
this.sawonName=name;
this.salary=sal;
}
public String getEmp() {
return sawonName+","+salary;
}
}
public class Manager_04 extends Employee_04{
String buseo;
public Manager_04(String name, int sal,String b) {
super(name, sal);
buseo=b;
}
@Override
public String getEmp() {
return super.getEmp()+","+buseo;
}
}
- 하위 class에서 부모 class의 method를 수정해서 사용
- method명과 return type은 부모 class의 method와 반드시 동일
- OverRiding은 부모, 자식 순서 무관
public class EmpMain_04 {
public static void main(String[] args) {
Manager_04 man=new Manager_04("최지우", 2500000, "기획경영부");
System.out.println(man.getEmp());
}
}
- 자식 class에서 수정된(재정의된) method를 호출
Default 생성자 & 명시적 생성자 구분 사용
class Point {
int x;
int y;
public Point() {}
public Point(int x,int y) {
this.x=x;
this.y=y;
}
public void write() {
System.out.println("x좌표="+x+"y좌표="+y);
}
}
- default 생성자와 명시적 생성자를 각각 생성(Super)
class SubPoint extends Point{
String msg;
public SubPoint() {
super();
}
public SubPoint(int x, int y,String msg) {
super(x, y);
this.msg=msg;
}
@Override
public void write() {
super.write();
System.out.println("메세지: "+msg);
}
}
- default 생성자와 명시적 생성자를 각각 생성(Sub)
- default 생성자 생성 시 super( ); 이 생략되어 있는 상태
- 부모 class에서 명시적 생성자를 만든 경우 하위 class에서 반드시 명시적 생성자를 만들어야 함
- 부모 class에서 명시적 생성자를 만들지 않은 경우(default 생성자가 생략된 경우) 하위 class에서도 default 생성자가 생략되어 있음 (but 하위 class에서 명시적 생성자 만들 수 있음)
public class ExObTest_05 {
public static void main(String[] args) {
SubPoint sp=new SubPoint();
sp.write();
SubPoint sp1=new SubPoint(43, 213, "hello");
sp1.write();
}
}
Abstract Class & Method
abstract class Fruit {
static final String MESSAGE="Hello!";
public void getTitle() {
System.out.println("Abstract Class");
}
abstract public void showMessage();
}
- abstract method가 하나라도 존재하면 abstract class
- Abstract class는 일반 변수(인스턴스 변수)를 내재 불가. 즉, 상수(static 변수), 일반 method, 추상 method를 내재 가능)
- Abstract class는 new로 생성 불가
- 추상 method가 하나라도 존재하면 추상 class
class Apple extends Fruit{
@Override
public void showMessage() {
System.out.println("Apple_Message");
System.out.println(Fruit.MESSAGE);
}
}
- 추상 class를 상속받은 하위 class Apple
- 부모 class의 미완인 추상 method를 상속 받으면 반드시 그 method를 overriding해야 함
public class ExAbstract_08 {
public static void main(String[] args) {
Apple a=new Apple();
a.showMessage();
다형성
public class ExAbstract_08 {
public static void main(String[] args) {
Fruit fruit;
fruit=new Apple();
fruit.showMessage();
fruit=new Banana();
fruit.showMessage();
fruit=new Orange();
fruit.showMessage();
fruit.getTitle();
}
}
- 각 다형성은 바로 위의(가장 가까운) 생성된 자식 class의 method를 실행
- command : (부모 class명) (참조변수명)=new (자식 class명)( ); \n (참조변수명).(method명);
- 하나의 변수로 여러가지 일을 처리할 때 사용
- 다형성은 부모와 자식 class 모두에 있는 method를 사용 가능
- 주의 : 자식 class의 method에서 부모 class의 method를 overriding한 경우 자식 class의 method를 기준으로 실행
Interface
public interface FoodShop {
String SHOPNAME="보슬보슬";
public void order();
public void beadal();
}
- Interface는 상수(final 변수)와 추상 method만 선언이 가능
- 즉, 모든 멤버 변수는 final이 생략, 모든 method는 abstract이 생략
public class Food_10 implements FoodShop {
@Override
public void order() {
System.out.println(SHOPNAME);
System.out.println("음식을 주문합니다");
}
@Override
public void beadal() {
System.out.println(SHOPNAME);
System.out.println("음식을 배달합니다");
}
}
- 인터페이스를 상속하고 overriding 하지 않으면 추상 class가 되어버린다
- implements는 다중구현이 가능
- class → class : extends
- class → interface : implements
- interface → interface : extends
- 주의 : interface 상속 시(implements) 추상 method를 상속 받기 때문에 반드시 override 해야 함
public class FoodBeadalMain {
public static void main(String[] args) {
Food_10 food=new Food_10();
food.order();
food.beadal();
FoodShop f=new Food_10();
f.order();
f.beadal();
}
}
- 위의 경우 일반생성과 다형성으로 method 호출 결과는 모두 같다