반응형
[VO] inheritance > Member.java - (부모)
package inheritance;
//회원정보(아이디, 이름)를 저장하기 위한 클래스
public class Member {
private String id;
private String name;
public Member() {
// TODO Auto-generated constructor stub
}
public Member(String id, String name) {
super();
this.id = id;
this.name = name;
}
public String getId() {return id;}
public void setId(String id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public void display() {
System.out.println("아이디 = "+id);
System.out.println("이름 = "+name);
}
}
[VO] inheritance > MemberEvent.java - (자식)
package inheritance;
//이벤트 관련 회원정보(아이디,이름,이메일)를 저장하기 위한 클래스
public class MemberEvent extends Member {
private String email;
public MemberEvent() {
//부모클래스의 기본 생성자 호출 - 부모클래스의 객체 생성
//super();//기본 생성자를 호출하는 명령은 생략 가능
}
/*
//비권장
public MemberEvent(String id, String name, String email) {
super();//기본생성자 호출
setId(id);
setName(name);
this.email = email;
}
*/
public MemberEvent(String id, String name, String email) {
super(id, name);
this.email = email;
}
public String getEmail() {return email;}
public void setEmail(String email) {this.email = email;}
@Override
public void display() {
//super 키워드로 부모클래스의 숨겨진 메소드 호출
super.display();//아이디와 이름 출력
System.out.println("이메일 = "+email);
}
}
[실행] inheritance > MemberCastApp.java
package inheritance;
//상속관계의 클래스에서 참조변수와 객체와의 관계
public class MemberCastApp {
public static void main(String[] args) {
- 💑[부모]참조변수에 💑[부모]객체 저장 (일반적인 객체 생성법 -상속 무관)
//부모클래스 참조변수=new 부모클래스();
// => 부모클래스로 객체를 생성하여 부모클래스의 참조변수에 저장 : 가능
Member member1=new Member();
//참조변수에 저장된 객체를 사용하여 부모클래스의 메소드 호출
member1.setId("aaa"); //[부모]메소드 호출
member1.setName("홍길동"); //[부모]메소드 호출
member1.display(); //[부모]메소드 호출
//아이디 = aaa
//이름 = 홍길동
- 👶[자식]참조변수에 👶[자식]객체 저장 (보편적인 상속관계 객체생성법)
//자식클래스 참조변수=new 자식클래스();
// => 부모클래스의 객체와 자식클래스의 객체를 생성하고 자식클래스의 참조변수에는
//자식클래스의 객체 저장 : 가능
MemberEvent member2=new MemberEvent();
//참조변수에 저장된 자식클래스의 객체를 사용하여 자식클래스의 메소드 호출이 가능하며
//부모클래스의 객체를 참조하여 부모클래스의 메소드 호출 가능
member2.setId("bbb");//[부모]메소드호출
member2.setName("임꺽정"); //[부모]메소드호출
member2.setEmail("bbb@itwill.com"); //[자식]메소드호출
member2.display(); //[오버라드된 자식]메소드호출
//아이디 = bbb
//이름 = 임꺽정
//이메일 = bbb@itwill.com
- 👶[자식]참조변수에 💑[부모]객체 저장 - 불가능
//자식클래스 참조변수=new 부모클래스();
// => 부모클래스로 객체를 생성하여 자식클래스의 참조변수에 저장 : 불가능
// => 자식클래스의 참조변수에는 자식클래스의 객체를 저장해야 되지만
//자식클래스의 객체가 없으므로 에러 발생
//MemberEvent member3=new Member();
- 💑[부모]참조변수에 👶[자식]객체 저장 (특별한 상속관계 객체 생성법)
//부모클래스 참조변수=new 자식클래스();
// => 부모클래스의 객체와 자식클래스의 객체를 생성하고
//부모클래스의 참조변수에는 부모클래스의 객체 저장 : 가능
Member member4=new MemberEvent();
//부모클래스의 참조변수에는 부모클래스의 객체가 저장되어 있으므로 부모클래스의 메소드 호출
//=>부모클래스의 참조변수는 자식클래스의 객체를 참조할 수 없으므로
//자식클래스의 메소드 호출 불가능
member4.setId("ccc"); //[부모]메소드호출
member4.setName("전우치"); //[부모]메소드호출
- 🎭객체형변환을 통해 일시적으로 👶[자식]객체를 저장해 👶[자식]메소드 호출 가능
//객체 형변환을 이용하면 부모클래스의 참조변수로 자식클래스의 메소드 호출 가능
//🎭객체형변환의 종류 : 명시적 객체 형변환(강제 형변환) , 묵시적 객체 형변환(자동 형변환)
//🎭객체형변환은 [상속관계의 클래스]에서만 사용가능 - [부모 -> 자식]으로 형변환하는 것
//🎭 객체형변환은 언제 활용?
//1:1상속이 아니라, 1:多 상속인 경우 활용하자
//부모가 모든 자식에게 접근(포함, 참조) 가능
//참조변수 : 부모클래스로
//객체형성( new연산자 + 생성자 ) : 자식클래스로
//[🎭명시적 객체 형변환] : Cast 연산자를 사용하여 부모클래스의 참조변수 자료형을 자식클래스로 변경하면, 일시적으로 참조변수에는 자식클래스의 객체가 자동 저장
//=> 명시적 객체 형변환에 의해 자식클래스로 자료형이 변경된 참조변수는 자식클래스의 객체를 참조할 수 있으므로 자식클래스의 메소드 호출 가능
//MemberEvent event=(MemberEvent)member4;
//event.setEmail("ccc@itwill.xyz");
//Cast 연산자로 참조변수의 자료형을 자식클래스로 변경하고 자식클래스의 객체를 저장하고 자식클래스의 메소드 호출
((MemberEvent)member4).setEmail("ccc@itwill.xyz");
//((MemberEvent)member4).display();
//[🎭묵시적 객체 형변환] : 부모클래스의 메소드를 "오버라이드 선언된 자식클래스의 메소드"는 부모클래스의 숨겨진 메소드 대신 자식클래스의 메소드를 호출하기 위해 참조변수의 자료형이 "자동으로 자식클래스로 변경"되어 자식클래스의 객체를 참조하여 메소드 호출
member4.display();
//아이디 = ccc
//이름 = 전우치
//이메일 = ccc@email.com
}
}
반응형
'java > inheritance' 카테고리의 다른 글
[inheritance] 6. 학원인적자원관리 ERP프로그램 (AcademyApp) (2) | 2024.04.23 |
---|---|
[inheritance] 5. 메소드 오버라이드(Method override) (0) | 2024.04.22 |
[inheritance] 4. super키워드의 개념 (0) | 2024.04.21 |
[inheritance] 2. 포함관계예시 VS 상속관계예시 (0) | 2024.04.20 |
[inheritance] 1. 객체 간의 관계 (2) | 2024.04.20 |