[Java] 단일상속, 오버라이딩 (객체지향2-2)
🎈단일상속
Java는 단일상속만 허용한다. (C++은 다중상속 허용)
class Child extends Parent1,Parent2{
// error 상속은 단 하나의 클래스에게만 받을 수 있다.
}
Java를 다중상속처럼 사용할 수도 있다.
인터페이스를 사용하는 방법과,
비중이 큰 클래스는 상속, 비중이 적은 클래스는 포함관계를 사용하면 된다.
🔑 예시 코드
public class inheritance {
public static void main(String[] args) {
Child c1 = new Child();
c1.age = 1000;
System.out.println(c1.age + " " + c1.p2.name);
Child c2 = new Child(new Parent2("kwh"));
c2.age = 21;
System.out.println(c2.age + " " + c2.p2.name);
}
}
class Child extends Parent1 { // 비중이 많다는 가정하에 상속관계
Parent2 p2; // 비중이 적다고 가정하에 포함관계
Child(Parent2 p2) {
this.p2 = p2;
}
Child() {
this(new Parent2("DINO"));
}
}
class Parent1 {
int age;
}
class Parent2 {
String name;
public Parent2(String name) {
this.name = name;
}
}
1000 DINO
21 kwh
🎈Object 클래스의 상속
부모가 없는 클래스는 자동적으로 Object클래스에게 상속받는다.
모든 클래스는 Object클래스의 자손이기 때문에 Object클래스의 11개의 메서드를 상속받는다. (11개의 메서드 관련 글 https://javaone.tistory.com/69)
🎈오버라이딩
상속받은 조상의 메서드를 자신에게 맞게 변경하는 것 = 오버라이딩
class Animal {
String animal_name;
String strMethod(String name) {
return this.animal_name = name;
}
}
class Pet extends Animal {
String pet_name;
String strMethod(String name) { //overriding
return this.pet_name = name + " " + this.animal_name;
}
}
위 코드를 보면 Pet 클래스에서 Animal 클래스의 멤버인 strMethod를 사용한 것을 볼 수 있다.
저것처럼 상속받은 메서드를 똑같이 사용하고 구현부{} 부분만 수정하면 오버라이딩이다.
오버라이딩은 선언부는 반드시 같아야 한다. (이름, 매개변수, 리턴 타입)
다시 정리하면
오버라이딩의 조건
1. 선언부가 같아야 한다. (이름, 매개변수, 리턴 타입)
2. 접근제어자를 좁은 범위로 변경할 수 없다.
ex) 조상이 protected라면, 범위가 더 넓은 public으로 변경할 수 없다는 것이다.
3. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
오버라이딩과 오버로딩
오버로딩 (overloading): 기존에 없던 메서드를 정의하는 것
오버라이딩(overriding): 상속받은 메서드의 내용을 변경하는 것
class OverP{
void overMethod() {}
}
class Over extends OverP{
void overMethod() {System.out.println()} //오버라이딩
void overMethod(float f) {}//오버로딩
void c_over() {}
void c_over() {System.out.println()}//error 중복정의 상속받은 맴버중에 없는 메서드임
void c_over(char[] c) {} //오버로딩
}
🎈 다음 글 보기 (객체지향 2-3)
🎈 이전 글 보기 (객체지향2-1)