상속과 오버라이딩, 오버로딩
상속
1. 목적
- 코드의 재사용성이 주 목적
- 개발시간 단축, 유지보수 및 추가개발 용이
2. 내용 및 방법
- 부모 코드가 보유하고 있는 ‘멤버변수, 메서드’를 자식 코드에게 제공
※ '생성자, static{},private요소,패키지가다를경우default요소'은 자식에게 상속하지 않는다!!! - 상속받은 메서드의 내용을 수정하는 것을 '메서드 재정의' 혹은 '오버라이딩'이라고 표현한다. 이때 메서드의 이름이나 반환타입은 변경 불가능하고 부모와 동일하게 가져가야 한다.
- java.lang.Object : 모든 class의 root로 모든 클래스들은 이 클래스의 메서드들을 상속받는다. 따로 작성안해도 알아서 상속된다.
- <상속받는 형식(명시적 상속)>
- ==> class 자식클래스명 extends 부모클래스 { }
- 즉, 자식클래스를 선언할 때 extends 를 이용해 상속받을 부모클래스를 알려주는 것이다. 또한 위에서 Object는 따로 작성안해도 알아서 상속된다고 했는데, 일반적인 형태로 ‘class 클래스명 { }’로 클래스를 구현하면 ‘class 클래스명 extends Object { }’와 같은 형태라는 뜻이다.
## 3. super
기본적으로 생성자의 첫 라인에 자동 반영되고, 개발자가 명시적으로 개발해도 된다. super은 상위 부모의 파라미터가 일치하는 생성자를 호출한다.
ex)
package step01.basic;
class Parent2 extends Object {
Parent2() { //1번 부모 생성자
super();
System.out.println("Parent2()");
}
Parent2(String n, int a) { //2번 부모 생성자
name = n;
age = a;
System.out.println("Parent2(String n, int a)");
}
}
public class Child2 extends Parent2 {
public Child2() {
super(); //파라미터가 없는 1번 부모 생성자를 호출
}
public Child2(String job) {
super(); //파라미터가 없는 1번 부모 생성자를 호출
}
public Child2(String n, int a, String job) {
super(n, a); //파리미터가 2개인 2번 부모 생성자를 호출
}
}
4. 메서드 재정의(Overriding)
- super.부모메서드명 : 부모 메서드를 그대로 가져올 수 있다. 이때 반환타입과 메서드명은 변경하지 못한다.
- @Override 애노테이션(데코레이션)을 사용해 재정의 할 것을 알려줄 수 있다. @Override 다음에 재정의를 하지 않으면 컴파일 오류가 생긴다.
형식 :
부모메서드반환타입 부모메서드명 ( ) {
super.부모메서드명();
~ 재 정 의 파 트 ~
}
5. 다중정의(Overloading)
- 하나 이상의 생성자, 메서드를 구현하는 것
6. 실행순서
- 컴파일 순서 : 부모클래스부터 컴파일
- 실행 순서 : 자식클래스부터 실행
7. 다형성
- 상속 전제인 구조에서만 성립
- 다양한 형태를 보유할 수 있는 구조 : 상위타입의 변수는 모든 자손타입 객체 참조
- 상위타입 변수 = 자손타입객체;
ex)
Object 부모 / Stirng 자식
Object o = “안녕” =>가능
Object o = new Child3(); => 가능
하지만 이런식으로 객체를 만들경우 자손만의 멤버는 호출이 불가해진다.
ex)
Child c = new Child(); —> 부모멤버변수, 자식멤버변수 호출 가능
Parent c = new Child(); —> 부모멤버변수 호출 가능, 자식멤버변수 호출 불가능!
이때 사용하는 것이 참조타입 형변환이다. - 형변환(참조타입간)
- 기본자료형에서 형변환은 size기준으로 변환해주지만, 객체자료형에서 형변환은 상위타입, 하위타입 기준으로 변환한다.
- ex)
Parent c = new Child(); —>묵시적형변환(upcasting)
Child4 d = (Child4)c; 이렇게 명시적형변환(downcasting) - 위 예제 ‘Child4 d = (Child4)c;’ 에서 새로운 Child4개체를 만든 것이 아닌 이미 있는 객체 Parent c의 Child4부분을 가리키는 변수 d만 추가해준 것이다.
7.1 다형성의 필요성
부모클래스와 자식클래스가 있을 때 부모메서드의 파라미터로 부모메서드를 받을 경우, 자식클래스를 넣어도 되므로 재사용성이 커진다. 이런 이유로 다형성이 필요하다.