Java

[java] 상속, 다중상속

jwKim96 2019. 8. 2. 16:50

1. 상속

상속이란 자식 객체가 부모 객체의 내용을 물려받는것을 의미한다.

 

  객체 내부 상속받은 객체 패키지 내부 모두
private O X X X
protected O O X X
default(package) O O O X
public O O O O

위 표를 참고해서 설명하면, 자식객체는 부모객체가 private으로 선언한

변수, 메소드를 제외하고는 모두 상속받을 수 있다.

 

2. 다중상속

객체지향의 상속을 활용하여 객체지향 언어인 C++에서는 다중상속을 허용하고 있지만, 

Java, C#과 같은 객체지향 언어는 다중상속을 허용하지 않는다.

 

자바에서 다중상속을 허용하지 않는 이유를 다음 예제코드로 설명을 하겠다.

 

UserService.java

1
2
3
4
5
6
pubilc class UserService {
    public UserVO getData(String id) {
        // 유저의 데이터를 가져오는 메소드
    }
... 생략 ...
}
cs

 

BoardService.java

1
2
3
4
5
6
pubilc class BoardService {
    public BoardVO getData(String id) {
        // 게시글의 정보를 가져오는 
    }
... 생략 ...
}
cs

부모 객체인 UserService와 BoardService는 각각 getData 라는 메소드를 가지고 있다.

 

만약 일반 클래스 다중상속을 허용한다면, 자연스럽지는 않지만

아래와 같은 자식 객체를 구현하게 될 수도 있다.

(원래는 에러가 나는 코드)

 

UserAndBoardService.java

1
2
3
pubilc class UserAndBoardService extends UserService, BoardService {
    // 기능 구현
}
cs

만약 이 클래스를 사용하게 된다면, 어떻게 될까.

상속 관계

 

 

 

 

다중 상속이허용되어 UserAndBoardService가 UserService와 BoardService 두 객체를 상속

받은 상황이다.

 

MainClass.java

1
2
3
4
5
6
7
8
public class MainClass {
    public static void main(String[] args) {
        String id = "10";
        UserAndBoardService service = new UserAndBoardService();
        UserVO userVO = service.getData(id);
        BoardVO boardVO = service.getData(id);
    }
}
cs

이렇게 Main클래스에서 service인스턴스에서 getData()라는 메소드를 실행시키면

service는 UserService와 BoardService 두 객체 중 어느 객체의 getData()메소드를

실행시켜야 할지 모호하다.

 

이러한 점이 자바에서 다중상속을 허용하지 않는 이유이다.