java/inheritance

[inheritance] 3. 참조변수와 객체와의 관계

jeri 2024. 4. 21. 15:06
반응형
[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

	}
}

 

반응형