본문 바로가기

Java

[Java] 객체지향(3) 상속 정리

 

상속(Inheritance)

 

객체의 중요한 특징 중 하나는 확장성이다.

만약 게임 캐릭터를 3개에서 5개로 늘려야 하는 경우가 생긴다고 했을 때 캐릭터를 하나하나 따로 만들게 되면 굉장히 오랜 시간이 걸리고 유지보수에 어려움이 있을 것이다.

상속은 기존클래스를 확장해서 새로운 클래스를 만드는 기술이다. 상속이라는 기술을 사용한다면 기존 캐릭터를 활용해 짧은 시간에 유지보수에 용이한 코드를 작성할 수 있다.

 

상속에 대해..

 

 

class CardAccount extends Account { }

extends 키워드를 이용하여 상속할 클래스 이름을 명시해 준다. 상속할 클래스는 Account가 된다.

이때 Account는 상위클래스(부모클래스) , CardAccount가 하위클래스(자식클래스)가 된다.

하위클래스가 상위클래스 상속을 받게 되면 입장에서 상위클래스의 변수나 메서드를 사용할 수 있게 된다.

 

상속과 생성자

  • 하위클래스가 생성될 때 상위클래스도 메모리에 할당된다.
  • super() 키워드를 사용해 상위클래스의 생성자를 호출
  • 컴파일러는 생성자 안의 첫번째 명령문이 super()가 아니면 자동으로 호출문을 추가
  • 상위클래스에 parameter가 있는 생성자가 있고 디폴트 생성자가 없을 경우 하위클래스에서 반드시 parameter가 있는 생성자를 호출하거나 상위클래스에 디폴트 생성자를 추가해 준다.
  • super()와 super는 다르다. super는 상위클래스의 멤버를 가져올 때 사용한다.

 

메소드 오버라이딩(Overriding)

  • 상위 클래스와 똑같은 시그니처를 갖는 메서드를 하위클래스에 선언
  • 하위클래스에 맞는 메서드로 새롭게 구현
  • 오버라이딩 시 하위클래스의 메서드가 우선적으로 실행

 

 

  • 예제

video.java

public class Video {
    private String num;
    private String name;
    private String act;

    public Video() {}        

    public Video(String num, String name, String act) {
        super();
        this.num = num;
        this.name = name;
        this.act = act;        
    }                

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAct() {
        return act;
    }

    public void setAct(String act) {
        this.act = act;
    }
}

 

GeneralMember.java

public class GeneralMember {

  private String id;
  private String mName;
  private String address;
  private Video rentalVideo; //객체 간 상호관계 

  public GeneralMember() {}

  public GeneralMember(String id, String mName, String address) {
      super();
      this.id = id;
      this.mName = mName;
      this.address = address;
  }

  public void print() {
      System.out.println("회원의 아이디 : " + id);
      System.out.println("회원의 이름 : " + mName);
      System.out.println("회원의 주소 : " + address);
      System.out.println("회원이 대여한 비디오 번호 : " + rentalVideo.getNum());
      System.out.println("회원이 대여한 비디오 제목 : " + rentalVideo.getName());
      System.out.println("회원이 대여한 비디오 배우 : " + rentalVideo.getAct());
  }

  public String getId() {
      return id;
  }

  public void setId(String id) {
      this.id = id;
  }

  public String getmName() {
      return mName;
  }

  public void setmName(String mName) {
      this.mName = mName;
  }

  public String getAddress() {
      return address;
  }

  public void setAddress(String address) {
      this.address = address;
  }

  public Video getRentalVideo() {
      return rentalVideo;
  }

  public void setRentalVideo(Video rentalVideo) {
      this.rentalVideo = rentalVideo;
  }    
}

 

SpecialMember.java

public class SpecialMember extends GeneralMember {

    private int bonusPoint;

    public SpecialMember() {}

    public SpecialMember(String id, String mName, String address, int bonusPoint) {
        super(id, mName, address);
        this.bonusPoint = bonusPoint;
    }

    public void print() {
        super.print();
        System.out.println("회원의 보너스 포인트  : " + bonusPoint);
    }
}

 

VideoMain.java

public class Main {

public static void main(String[] args) {

      Video[] vrr = {
              new Video("1", "반도", "강동원"),
              new Video("2", "나는 살아있다", "유아인")
      };

      GeneralMember arr[] = {
              new GeneralMember("a", "홍길동", "서울"),
              new SpecialMember("b", "박길동", "인천", 100)
      };

      for(int i = 0; i < arr.length; i++) {
          arr[i].setRentalVideo(vrr[i]);
          arr[i].print();
          System.out.println();
         }
      }
    }