#8. Java - 상속

박주현·2023년 7월 17일
0

Java

목록 보기
8/11
post-thumbnail

1. 상속

상속이란, 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것.
기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아서 새로운 클래스를 생성할 수 있다.
기존의 정의된 클래스는 부모 클래스, 상위 클래스 라고함.
새롭게 정의된 클래스는 자식 클래스, 하위 클래스 라고함.

Car를 상속받은 Bus를 class로 표현

    public class Car{
    }
    public class Bus extends Car{
    }

부모클래스에 메소드 추가하기
1) Car에 run() 메소드 추가

    public class Car{
        public void run(){
            System.out.println("달리다.");
        }
    }

2) Car를 상속받은 Bus 사용

    public class BusExam{
        public static void main(String args[]){
            Bus bus = new Bus();
            bus.run();  
            //Bus class 는 아무런 코드를 가지지 않는다. 그럼에도 run 이라는 메소드를 사용하는데 문제가 발생되지 않는다. 
        }   
    }

3) Bus에 메소드 추가

    public class Bus extends Car{
        public void ppangppang(){
            System.out.println("빵빵");
        }       
    }

1.1 장점

  1. 기존 작성된 클래스를 재활용
  2. 자식 클래스 설계시 중복되는 멤버를 미리 부모클래스에 작성해 놓으면, 자식 클래스에서 멤버를 작성하지 않아도됨.
  3. 클래스 간의 계층적 관계를 구성하여 다형성의 문법적 토대 마련.
  4. 개발 시간을 효율적으로 사용.

1.2 주의할 점

  1. 상속을 해도 부모 클래스의 모든 필드와 메소드를 물려받진 않는다.
  2. private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외
  3. default 접근 제한을 갖는 필드와 메소드는 부모 클래스와 자식 클래스가 다른 패키지에 존재할 경우, 상속 대상에서 제외

2. super와 super()

  1. super
    자신이 상속받은 부모를 가르키는 참조 변수
    클래스 내의 멤버변수와 지역변수의 이름이 같을 경우 this 를 사용하듯이 부모클래스와 자식클래스 멤버이름이 같을 경우 사용.

예제

class Parent { int a = 10; }
class Child extends Parent {
    void display() {
        System.out.println(a);
        System.out.println(this.a);
        System.out.println(super.a);
    }
}
public class Inheritance02 {
    public static void main(String[] args) {
        Child ch = new Child();
        ch.display();
    }
}
  1. super()
    자신이 상속받은 부모의 생성자를 호출
    생성자는 상속되지 않는 유일한 멤버 함수이기에, 부모클래스의 멤버를 초기화하기 위해서 부모클래스의 생성자를 호출해야함.
    자식클래스 생성자를 호출할 경우, 부모클래스의 생성자도 동시에 호출해야함.

예제

class Parent {
    int a;
    Parent() { a = 10; }
    Parent(int n) { a = n; }
}
class Child extends Parent {
    int b;
    Child() {
①      //super(40);
        b = 20;
    }
    void display() {
        System.out.println(a);
        System.out.println(b);
    }
}
public class Inheritance04 {
    public static void main(String[] args) {
        Child ch = new Child();
        ch.display();
    }
}

3. 오버라이딩

부모클래스의 메소드를 자식클래스에서 재정의.

3.1 조건

  1. 오버라이딩은 메소드의 동작만 재정의함으로, 메소드의 선언부는 기존 메소드와 동일해야함.
  2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경가능
  3. 부모 클래스의 메소드보다 더 큰 범위의 예외 선언 가능.

예제

public class Bus extends Car {
    public void run(){
        System.out.println("차가 달리면서 다음 정거장을 안내합니다.");
    }
}
public class Car {
    public void run() {
        System.out.println("차가 달립니다.");
    }
    public void stop() {
        System.out.println("차가 멈춥니다.");
    }
    public void horn() {
        System.out.println("경적을 울립니다.");
    }
}
class BusExam {
    public static void main(String [] args) {
        Bus bus = new Bus();
        bus.run();
    }  
}
profile
빌드업 막 시작하는 개발자

0개의 댓글