JAVA

이것이 자바다 7강

challnum 2023. 1. 13. 16:16

상속

1. 상속 개념

  • 상속이란 하위 클래스에게 물려주는 것을 의미한다.

  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 대상에서 제외되며 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드 메소드도 제외된다.

  • 상속을 이용하게 된다면 클래스 A를 상속받는 B와 C는 A필드의 메소드를 수정시 B와 C를 수정하지 않아도 수정된 A의 필드와 메소드를 사용할 수 있다.

    public class A{
    int field1;
    void method1(){}
    }
    public class B extends A{
    int field2;
    void method2(){}
    }

    2. 클래스 상속

  • 자바의 경우 다중 상속을 허용하지 않는다. extends 뒤에는 단 하나의 부모 클래스만 상속해야 한다.

    // 부모 클래스
    public class Cellphone {
      // 필드
      String model;
      String color;
    
      // 생성자
    
      // 메소드
      void powerOn() { System.out.println("전원을 켭니다."); }
      void powerOff() { System.out.println("전원을 끕니다."); }
      void bell() { System.out.println("벨이 울립니다."); }
      void sendVoice(String message) { System.out.println("자기: " + message); }
      void receiveVoice(String message) { System.out.println("상대방: " + message); }
      void hangUp() { System.out.println("전화를 끊습니다."); }
    }
    // 자식 클래스
    public class DmbCellPhone extends Cellphone {
      // 필드
      int channel;
    
      // 생성자
      public DmbCellPhone(String model, String color, int channel) {
          this.model = model;
          this.color = color;
          this.channel = channel;
      }
    
      // 메소드
      void turnOnDmb() {
          System.out.println("채널 " + channel + "번 DMB 방송 수신을 시작합니다.");
      }
      void changeChannelDmb(int channel) {
          this.channel = channel;
          System.out.println("채널 " + channel + "번으로 바꿉니다.");
      }
      void turnOffDmb() {
          System.out.println("DMB 방송 수신을 멈춥니다.");
      }
    }
    public class DmbCellPhoneExample {
      public static void main(String[] args) {
          // DmbCellPhone 객체 생성
          DmbCellPhone dmbCellPhone = new DmbCellPhone("자바폰", "검정", 10);
    
          // CellPhone으로부터 상속받은 필드
          System.out.println("모델: " + dmbCellPhone.model);
          System.out.println("색상: " + dmbCellPhone.color);
    
          // DmbCellPhone의 필드
          System.out.println("채널: " + dmbCellPhone.channel);
    
          // CellPhone으로 부터 상속받은 메소드 호출
          dmbCellPhone.powerOn();
          dmbCellPhone.bell();
          dmbCellPhone.sendVoice("여보세요");
          dmbCellPhone.receiveVoice("안녕하세요! 저는 홍길동입니다.");
          dmbCellPhone.sendVoice("아~ 예 반갑습니다.");
          dmbCellPhone.hangUp();
    
          // DmbCellPhone의 메소드 호출
          dmbCellPhone.turnOnDmb();
          dmbCellPhone.changeChannelDmb(12);
          dmbCellPhone.turnOffDmb();
      }
    }

3. 부모 생성자 호출

  • 모든 객체는 클래스의 생성자를 호출해야만 생성된다.
    public DmbCellPhone(){
    super(); // 부모의 기본 생성자를 호출한다.
    }
    // super인자로 호출된 생성자
    public CellPhone(){
    }
  • 직접 생성자를 호출하고 싶을시에 아래와 같이 사용할 수 있으며 super(매개값)은 매가값의 타입과 일치하지 않는 부모 생성자를 호출할 시에 컴파일 오류가 발생한다.
  • 부모 클래스에 기본 생성자가 없고 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위해 super()를 선언해야 하며 자식 생성자 첫 줄에 위치해야 한다.
    자식클래스(매개변수선언){
    spuer(매가값);
    }
  • 부모 클래스에서 기본 생성자가 존재하지 않을시
    public class People{
      public String name;
      public People(Stinrg name){
          this.name = name;
      }
    }
    public class Student extends People{
      public int No;
      public Student(String name, int No){
          super(name); // 부모 생성자를 호출 한 것
          this.No = No;
      }
    }