1) Inheritance & Polymorphism
1-1. Inheritance
-
선언
public class MainMember extends Member { }
-
Method overriding
- Method overloading과는 다른 개념이다(같은 이름의 여러 메소드)
- 자식 클래스에서 부모클래스의 메소드를 새로 정의하면 덮어씌울 수 있음.
-
super
- 현재 객체(this가 참조하는)의 부모객체의 레퍼런스를 가지는 객체.
- methods
super.멤버변수이름
: 부모 클래스의 멤버변수super.메소드이름()
: 부모 클래스의 멤버메서드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 } }
이런식으로 부모 클래스의 유산들을 사용할 수 있음.
-
주의점
-
클래스의 속성이나 기능을 선택적으로 상속받을수는 없다.
-
IS-A 관계
Member dongchan = new MainMember(); // 가능함 MainMember dc = new Member(); // 불가능함
-
다중 상속이 불가능함!
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이 손실되지 않고 잘 있는 모습입니다.