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()메소드를
실행시켜야 할지 모호하다.
이러한 점이 자바에서 다중상속을 허용하지 않는 이유이다.