상속이란
객체는 속성과 기능으로 이루어진다. 상속이란 속성과 기능을 전달하여
상속을 받는 클래스가 이를 사용할 수 있도록 일종의 분신을 만드는거라고 보면 된다.
상속 관계를 보여주는 표현
같은 칸에 있는 클래스 표현은 모두 같은 의미이다.
클래스 표현 | 내용 |
기본 클래스(Base Class) 슈퍼 클래스(Super Class) 부모 클래스(Parent Class) 상위클래스... |
-상속을 제공하는 클래스를 의미한다 -추상화된 객체 ex. 생물, 사람, 휴대폰 |
유도 클래스(Deviation Class) 하위 클래스(Sub Class) 자식 클래스(Child Class) 파생 클래스... |
-상속을 받는 클래스를 의미한다 -구체적인 객체 ex토끼, 홍길동, 갤럭시폰 |
단일상속 vs 다중상속
자바는 원칙적으로 다중상속을 허용하지 않는다. 즉 클래스 한개만 상속받을 수 있다. 다른 프로그래밍 언어의 경우 다중상속을 허용하는 경우도 있으며 그 편리함은 무시할 수 없다. 그럼에도 자바는 이를 허용하지 않는다.
자바 프로그래밍의 기본 단위는 클래스이다. 클래스란 객체이다 자세한 내용은 아래 포스트를 참고하기 바란다.
아무튼 클래스란 흔히 하는 비유로 객체가 정의되는 설계도와 같다. 자바는 클래스로 서로 구분이 되는데 다중상속을 하게 되면 객체의 명확성은 그만큼 떨어지게 된다.
상속에 대한 비유를 해보자. 홍길동이 비록 서자로 태어 아버지를 아버지라고 부르지는 못해도 홍씨인 것은 맞다. 근데 길동이가 김길동, 최길동 이렇게 성씨도 변경된다면 길동이는 서자신분에 더해 뿌리조차 모호한 것이다.
상속이란 사람이나 클래스나 어디서 갈라져 나온 것인지 명확히 보여주는 것이므로 자바는 단일상속만 허용하여
정확하고 명확한 프로그래밍이 되게끔 한다.
@상속코드
상속관계는 extends 키워드로 표현한다
class Child extends Human{
//Human 클래스를 Child 클래스가 상속받는다
}
자바는 단일상속만 가능하므로 아래 예시는 오류이다.
class Child extends Human, Creature{
//오류발생. java 는 다중상속을 허용하지 않는다
}
상속을 하는 이유
상속은 이미 잘 개발된 클래스를 재사용해서 클래스를 새로 생성하기 때문에 코드의 중복을 줄여준다
클래스에 동일한 변수, 메소드를 가지는 경우 공통되는 클래스를 상위클래스로 선언하고 하위 클래스에서 추가 작성하는 것이 효율적인 코드 작성이다
상위 클래스 수정시 모든 하위 클래스에 수정내용이 적용될 수 있기 때문에 유지보수가 수월해진다.
상속 해주면 하위클래스에서 상위클래스의 모든 필드와 메서드에 접근가능한가?
그렇지 않다. private 접근제한자을 지정해 자신만 접근할 수 있도록 한 경우 하위클래스에서 접근불가
서로 다른 패키지에 속한 경우 default 접근제한 지정한 경우에도 접근할 수 없다.
그리고 이외에 제공되는 상위클래스의 필드, 메서드를 하위클래스는 자유롭게 접근할 수 있다.
메서드 재정의(Override)
상속 받은 메서드를 재정의, 즉 가공하여 메서드를 사용하는 것을 말한다
메서드를 오버라이드 한 경우 상위클래스의 메서드는 숨겨지고, 하위 클래스의 재정의된 메서드가 호출된다.
메서드 재정의 규칙 1) 상위 메서드와 매개변수 타입, 매개변수 개수, 리턴 타입, 메서드 이름 등이 동일해야한다 2) 상위 메서드보다 강한 접근제한 규칙을 가질 수 없다. (반대의 경우는 가능함) 만약 상위 메서드의 접근 제한이 public 인데 하위 클래스가 private로 제한할 수 없다는 의미이다 반대로 상위 메서드의 접근 제한이 private 라면 하위 클래스가 public으로 제한이 개방되는 것은 가능하다 |
위에서 메소드를 오버라이드한 경우 상위 클래스가 숨겨지고 하위클래스가 호출된다고 했는데,
하위 클래스가 더 강한 접근제한을 갖는 경우 호출 논리에 충돌이 발생하기 때문에
java 에서 설정한 방식을 이해할 수 있다
super 와 super()
super는 객체를 참조할 수 있는 참조변수이다. 현재 자신이 바로 1단계 거슬러 올라간 상위 클래스를 참조할 수 있는 키워드이다. 앞서 오버라이딩 개념을 보면 하위클래스에서 메서드 오버라이딩을 하게 되면 상위클래스의 메서드 대신 하위클래스의 메서드가 호출된다고 했다. 이것을 메서드 은폐라고 한다.
반대로 하위클래스에서 상위 클래스에서 정의한 메서드 호출이 필요한 경우가 있다.
이 경우 super 를 사용하면 하위 클래스에서 호출할 수 있게 된다.
super는 상위객체를 참조하기 때문에 상위 메소드에 접근 및 호출하는 것이 가능하다
super : 하위 클래스에서 상위 클래스를 의도적으로(명시적으로) 호출하는 것을 말한다 |
'Java > 기본' 카테고리의 다른 글
[Java] 예외처리 - 예외(Exception)란 (0) | 2021.06.17 |
---|---|
[Java] 객체지향 - 추상화와 인터페이스 (0) | 2021.06.12 |
[Java] 객체지향 - 접근제한자(Access Modifier) (0) | 2021.06.11 |
[Java] 객체지향 - 객체지향의 특징 (0) | 2021.06.11 |
[Java] 객체지향101 - 객체지향프로그래밍(Object Oriented Programming)이란? (0) | 2021.06.10 |