상속
- 상속
- 상속과 생성자
- 오버라이딩
1. 상속
상속을 통해 부모 클래스의 필드와 메서드를 자식 클래스에서 사용가능하다 단, 여러 부모클래스를 갖는 다중상속은 불가능하다 (? 이중상속??)
class A {
String aField = "클래스 A 필드";
public void aMethod() {
System.out.println(aField);
// System.out.println("A : "+ bField); // 컴파일 에러(자식 필드 사용 불가)
}
}
class B extends A {
String bField = "클래스 B 필드";
public void bMethod() {
System.out.println(aField); // 부모 클래스 필드 사용
System.out.println(bField); // 본인 클래스 필드 사용
// System.out.println("B : "+cField); // 컴파일 에러(자식 필드 사용 불가)
}
}
class C extends B { // 부모의 부모 클래스까지 상속받음
String cField = "클래스 C 필드";
public void cMethod() {
System.out.println(aField); // 조부모 클래스 필드 사용
System.out.println(bField); // 부모 클래스 필드 사용
System.out.println(cField); // 본인 클래스 필드 사용
}
}
public class SuperSubEx01 {
public static void main(String[] args) {
System.out.println("----------A----------");
A a = new A();
a.aMethod(); // 본인 메소드 사용
// a.bMethod(); // A(부모) 객체로 B(자식) 메소드 접근 불가
System.out.println("----------A----------");
System.out.println("----------B----------");
B b = new B();
b.aMethod(); // 부모 메소드 사용
b.bMethod(); // 본인 메소드 사용
// b.cMethod(); // B(부모) 객체로 C(자식) 메소드 접근 불가
System.out.println("----------B----------");
System.out.println("----------C----------");
C c = new C();
c.aMethod(); // 조부모 메소드 사용
c.bMethod(); // 부모 메소드 사용
c.cMethod(); // 본인 메소드 사용
System.out.println("----------C----------");
}
}
// [출처] [JAVA/자바] 상속의 개념 및 부모/자식 클래스|작성자 JOKER
개발자 입장에서 상속
- 부모클래스 멤버로 있는 경우 => 그냥 호출
- 부모 클래스에 없는 경우 => 추가
- 부모 클래스에 있는데 수정이 필요한 경우 => overriding을 통한 수정
1.1 상속과 생성자
부모클래스의 필드와 메서드를 상속받기 전에 우선, 부모 인스턴스가 생성되어야 한다
단, 생성자는 될 수 없으며 자식인스턴스가 생성될 때 자동으로 부모클래스의 기본 생성자가 호출된다
만약 부모클래스에서 기본생성자 외에 매개변수를 갖는 생성자가 있다면 이는 자식클래스에서 자동호출되지 않으며 자식클래스 생성자에서 super()를 통해 호출해주어야 한다
class SuperClass { // 부모클래스
public SuperClass(String str){ // 매개변수를 갖는 부모클래스 생성자
System.out.println(str + "호출");
}
}
class SubClass extends SuperClass{ // 자식클래스
public SubClass() { // 자식 생성자 // 자식생성자에서 부모클래스 생성자 호출 super()
super("부모 생성자 "); // 부모 생성자 호출
System.out.println("자식 생성자 호출");
}
}
public class InheritanceConstructorEx01 {
public static void main(String[] args) {
SubClass sc = new SubClass(); // 자식 인스턴스 생성
}
}
// [출처] [JAVA/자바] 상속에서의 생성자|작성자 JOKER
2. Overriding
상속에 의한 메서드 오버라이딩
자식클래스에서는 부모클래스의 필드와 메서드를 물려받게되는데 자식클래스에서는 부모클래스의 메서드를 재정의 하여 사용할 수 있다
메서드 오버라이딩 조건 : 메소드 이름, 리턴 타입, 매개변수의 갯수,순서,자료형 동일
만약 오버라이딩 된 메서드에서 부모의 메서드를 그대로 호출하고 싶은 경우 super.메서드이름을 이용하면 된다
class Woman{ //부모클래스
public String name;
public int age;
public void info(){
System.out.println("여자의 이름은 "+name+", 나이는 "+age+"살입니다.");
}
}
class Job extends Woman{ //Woman클래스(부모클래스)를 상속받음 :
String job;
public void info() {//부모(Woman)클래스에 있는 info()메서드 오버라이딩
super.info(); // 부모메서드를 그대로 호출함
System.out.println("여자의 직업은 "+job+"입니다.");
}
}
public class OverTest {
public static void main(String[] args) {
Job job = new Job();
//변수 설정
job.name = "유리"; // 상속에 의한 접근
job.age = 30;
job.job = "프로그래머";
//호출
job.info();
}
}
// <!-- 출처: https://private.tistory.com/25 [공부해서 남 주자] -->