My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


Java (4) - Class (3) - Inheritance & Polymorphism

1) Inheritance & Polymorphism

1-1. Inheritance

  1. 선언

    public class MainMember extends Member {
           
    }
    
  2. Method overriding

    • Method overloading과는 다른 개념이다(같은 이름의 여러 메소드)
    • 자식 클래스에서 부모클래스의 메소드를 새로 정의하면 덮어씌울 수 있음.
  3. super

    • 현재 객체(this가 참조하는)의 부모객체의 레퍼런스를 가지는 객체.
    • methods
      1. super.멤버변수이름 : 부모 클래스의 멤버변수
      2. super.메소드이름() : 부모 클래스의 멤버메서드
      3. super() : 부모 클래스의 생성자

    ex) (물론 두개의 클래스가 다른 파일에 있어야함!)

    public class Member {
        int id;
        public Member(int id){
            this.id = id;
        }
        public void login(){
            System.out.println("회원 암호화 코드:" + this.hashCode());
        }
    }
    
    public class MainMember extends Member{
        int fee;
        public MainMember(int id, int fee){
            super(id);
            System.out.println(super.id);
            super.login();
            this.fee = fee;
        }
        public static void main(String[] args){
            MainMember dongchan = new MainMember(1, 500);
            // 1
            // 회원 암호화 코드:1854778591
        }
    }
       
    

    이런식으로 부모 클래스의 유산들을 사용할 수 있음.

  4. 주의점

    1. 클래스의 속성이나 기능을 선택적으로 상속받을수는 없다.

    2. IS-A 관계

      Member dongchan = new MainMember(); // 가능함
      MainMember dc = new Member(); // 불가능함
      
    3. 다중 상속이 불가능함!

      public class TopMember extends Member, MainMember { }
      

1-2. Polymorphism

  • Object polymorphism : 같은 타입의 변수가 다양한 형태의 객체를 참조

    • super

      상속을 통해서 sub 객체를 생성하면, super객체도 같이 생성되기 때문에 super type으로 변수선언이 가능함.

      public class MainMember2 extends Member {
          Member m = new Member(15);
      }
      

      뭐 이런식으로 할 수 있다는 것 같습니다.

    • (응용)멤버들을 관리하는 MemberMrg 클래스

      public class MemberMrg {
          Member[] members;
          public MemberMrg(int limit){
              this.members = new Member[limit];
              this.top = 0;
          }
          public void addMember(Member m){
              this.members[top++] = m;  
          }
          public Member getMember(int id){
              return this.members[id];
          }
          public static void main(String[] args){
              MainMember mm = new MainMember(15, 1000);
              MemberMrg mrg = new MemberMrg(15);
              mrg.addMember(mm);
              System.out.println(mrg.toString());
          }
      }
      

      다형성을 지원하기 때문에 Member를 넣는 배열에 MainMember 객체도 넣을 수 있다는 것입니다!

  • Method polymorphism : 같은 클래스 타입의 같은 method를 호출 시 기능이 다양한 것

    • Overloading
    • Overriding

1-3. Reference Type Casting

Member m = new MainMember(15, 1000); // 불가능

대안은 MainMember 객체를 형변환하는 것이다!

그렇지만, 생성자가 다를 수 있으므로, 일단 먼저 생성을 한 후에 형변환을 하는게 맞습니다.

MainMember mm = new MainMember(15, 1000);
Member m = (Member) mm;

물론 서브객체로 형변환을 하는것도 가능하다고 합니다.

mm = (MainMember) m;
System.out.println(mm.fee); // 1000

다시 줄였다가 늘여서 형변환을 해도 똑같이 원래 MainMember의 객체인 1000이 손실되지 않고 잘 있는 모습입니다.

comments powered by Disqus