[JAVA] 정리/클래스(Class)_타입(Type)

클래스_상속 자격(extends, implements)

쎈코 2023. 2. 22. 21:24

public class Ex67 {
public static void main(String[] args) {
//Ex67.java


상속
1. 클래스
2. 인터페이스
3. 추상 클래스

-> 무조건 누구나 부모/자식이 될 수 있는 것이 아님


(부모)        <-      (자식)
클래스             클래스          : (O). 가장 흔한 경우
인터페이스      클래스          : (O). 상속된 추상 클래스(메소드)를 자식이 구현해야 한다.
추상 클래스     클래스          : (O). 구현 멤버는 그대로 상속받고, 추상 멤버는 구현한다.
인터페이스      인터페이스   : (O). 매우 흔한 케이스
추상클래스      추상클래스   : (O). 상속받은 추상 메소드를 자식 클래스가 구현 할 지 안할지는 선택

인터페이스      추상클래스   : (O).
추상클래스      인터페이스   : (X). 부모의 구현된 멤버를 상속받을 수 없어서
클래스             인터페이스   : (X). 부모의 구현된 멤버를 상속받을 수 없어서
클래스             추상클래스   : (X). 일반클래스는 일반 클래스의 부모 역할만 가능


- 일반클래스는 일반 클래스의 부모 역할만 가능
- 일반클래스는 인터페이스나 추상클래스의 부모 역할이 불가능

- 추상 클래스는 추상클래스, 일반 클래스의 부모 역할만 함
- 추상 클래스는 인터페이스의 부모 역할 불가능

- 인터페이스는 인터페이스, 추상클래스, 일반 클래스 등 모든 경우의 부모 역할 가능

- (★) 순서 : (上)인터페이스 <- 인터페이스 <- (中)추상 클래스 <- 추상 클래스 <- (下)일반 클래스

 

 

 

 

interface AAA {                                         //인터페이스 AAA

void aaa(); //추상 멤버

}


abstract class BBB {                               //추상클래스 BBB

public int b; //구현된 일반 멤버
public abstract void bbb(); //추상 멤버
}

//abstract class FFF implements BBB {          //implements 뒤에 올 수 있는건 오직 인터페이스뿐
abstract class FFF extends BBB {                //추상클래스 BBB를 상속받은 추상클래스 FFF
                                                                        
public int f; //본인 멤버 구현


- 부모가 추상메소드를 물려주면 항상 자식은 구현했었음 근데 지금은 구현 안함
- 부모인 추상 클래스가 물려준 추상 메소드를 구현
public void bbb() {
//인터페이스에서는 public abstract void bbb();인데 자식에서는 'abstract'가 빠져있음
-> 얘도 추상 메소드를 받을 수 있는 능력이 있음
//-> 구현을 안해도 됨. 부모가 물려준 추상 메소드를 구현할지/안할지 추상클래스가 자식이 되면 선택 가능
}



class CCC {                                       //일반 클래스 CCC

public int c; //구현된 일반 멤버

}

//interface DDD implements AAA {

//인터페이스가 부모일땐 자식이 누군지 살펴봐야 함. 인터페이스는 클래스, 인터페이스, 추상클래스 모두 자식 가능
interface DDD extends AAA{             //인터페이스 AAA를 물려받은 인터페이스 DDD

                                                            //인터페이스를 물려받아도 extends로 상속받음

                                      
void ddd();     //추상메소드로서 그대로 물려받음
void aaa();    //인터페이스와 인터페이스끼리 상속받은 것
}

class EEE implements DDD {         //인터페이스 DDD를 물려받은 일반클래스 EEE

                                                         //인터페이스끼리의 상속도 매우 흔함
public void ddd() {

}

public void aaa() {

}

}


//abstract class GGG extends AAA { extends는 구현부를 갖고있는 애들만 올 수 있음
abstract class GGG implements AAA {

public void aaa() {

// 추상클래스가 부모고 자식이 추상클래스일때랑 똑같음
}

}


//interface HHH implements BBB { 둘 다 안됨
//interface HHH extends BBB {

// public int b; //구현된 일반 멤버 <- 얘는 안됨
// public abstract void bbb(); //추상 멤버 <- 얘는 됨

//}


//abstract class III extends AAA {
}





인터페이스끼리 물려받으면 extends, 일반클래스끼리 받아도 extends, 추상끼리 받아도 extends

-> 같은애들끼리 받으면 extends

 

 

일반클래스가 인터페이스를 물려받으면 implements, 추상에는 기본변수가 있어서 인터페이스를 받을 순 없음
-> 다른애들끼리 상속받으면 implements

 

예외!! 추상에서 일반클래스 받을때는 extends