[Java10-1] 상속(Inheritance) : 클래스 작성시 다른 클래스를 물려받아 사용하는 기능

임승현·2022년 10월 16일

Java

목록 보기
33/126

🐧상속(Inheritance) : 클래스 작성시 다른 클래스를 물려받아 사용하는 기능

→ 기존 클래스를 재활용하여 보다 빠르고 쉽게 새로운 클래스 작성 : 프로그램의 생산성 증가
→ 공통적인 속성과 행위를 가진 다수 클래스 작성시 공통적인 속성과 행위가 선언된 클래스를 상속받아 작성 : 유지보수의 효율성 증가

● 물려주는 클래스 : 부모클래스, 선조클래스, 기본클래스, 슈퍼클래스(Super Class)
● 물려받는 클래스 : 자식클래스, 후손클래스, 파생클래스, 서브클래스(Sub Class)

형식) public class 자식클래스 extends 부모클래스 {
자식클래스에서는 부모클래스의 필드 또는 메소드 사용 가능
}
→ 부모클래스의 생성자를 자식클래스에게 상속되지 않으며 부모클래스의 은닉화 선언된 필드 또는 메소드는 자식클래스에서 접근 불가능

● 자식클래스의 생성자로 객체를 생성할 경우 부모클래스의 생성자가 먼저 호출되어 부모클래스의객체 생성 후 자식클래스의 객체 생성 - 객체간의 상속관계가 자동으로 성립

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);
	}
}
package inheritance;

public class MemberApp {
	public static void main(String[] args) {
		Member member1=new Member();
		
		member1.setId("abc123");
		member1.setName("홍길동");
		
		member1.display();
		System.out.println("=======================================================");
		Member member2=new Member("xyz789", "임꺽정");
		member2.display();
		System.out.println("=======================================================");
	}
}

=============================================================

package inheritance;


//상속관계의 클래스에서 참조변수와 객체와의 관계
public class MemberCastApp {
	public static void main(String[] args) {
		//부모클래스 참조변수=new 부모클래스();
		//=> 부모클래스로 객체를 생성하여 부모클래스의 참조변수에 저장 : 가능
		Member member1=new Member();
		
		//참조변수에 저장된 객체를 사용하여 부모클래스의 메소드 호출
		member1.setId("aaa");
		member1.setName("홍길동");
		
		member1.display();
		System.out.println("============================================");
		//자식클래스 참조변수=new 자식클래스();
		//=> 부모클래스의 객체와 자식클래스의 객체를 생성하고 자식클래스의 참조변수에는 
        자식클래스의 객체 저장 : 가능
		MemberEvent member2=new MemberEvent();
		
		//참조변수에 저장된 자식클래스의 객체를 사용하여 자식클래스의 메소드 호출이 가능하며 
        부모클래스의 객체를 참조하여 
        부모클래스의 메소드 호출 가능
		member2.setId("bbb");
		member2.setName("임꺽정");
		member2.setEmail("bbb@itwill.xyz");
		
		member2.display();
		System.out.println("============================================");
		//자식클래스 참조변수=new 부모클래스();
		//=> 부모클래스 객체를 생성하여 부모클래스의 참조변수에 저장 : 불가능
		//=> 자식클래스의 참조변수에는 자식클래스의 객체를 저장해야 되지만 자식클래스의 
        객체가 없으므로 에러 발생
		//MemberEvent member3=new Member();
		System.out.println("============================================");
		//부모클래스 참조변수=new 자식클래스();
		//=> 부모클래스의 객체와 자식클래스의 객체를 생성하고 부모클래스의 참조변수에는 
        부모클래스의 객체 저장 : 가능
		Member member4=new MemberEvent();
		
		//부모클래스의 참조변수에는 부모클래스의 객체가 저장되어 있으므로 부모클래스의 메소드 호출
		//=> 부모클래스의 참조변수는 자식클래스의 객체를 참조할 수 없으므로 자식클래스의 
        메소드 호출 불가능
		member4.setId("ccc");
		member4.setName("전우치");
		
		//객체 형변환을 이용하여 부모클래스의 참조변수를 사용하여 자식클래스의 메소드 호출 가능
		//=> 명시적 객체 형변환(강제 형변환), 묵시적 객체 형변환(자동 형변환)
		//=> 상속관계의 클래스에서만 객체 형변환 사용 가능
		
		//명시적 객체 형변환 : Cast 연산자를 사용하여 부모클래스의 참조변수 자료형을 자식클래스로
        변경하면 일시적으로 참조변수에 자식클래스의 객체가 자동 저장
		//=> 명시적 객체 형변환에 의해 자식클래스로 자료형이 변경된 참조변수는 자식클래스의 
        객체를 참조할 수 있으므로 자식클래스의 메소드 호출 가능
		/*
		MemberEvent event=(MemberEvent)member4;
		event.setEmail("ccc@itwill.xyz");
		*/
		//Cast 연산자로 참조변수의 자료형을 자식클래스로 변경하고 자식클래스의 메소드 호출
		//(MemberEvent)member4.setEmail("ccc@itwill.xyz");//에러발생
		((MemberEvent)member4).setEmail("ccc@itwill.xyz");
		
		//((MemberEvent)member4).display();
		//묵시적 객체 형변환 : 부모클래스의 메소드를 오버라이드 선언된 자식클래스의 메소드는
        부모클래스의 숨겨진 메소드 대신 자식클래스의 메소드를 호출하기 위해 참조변수의 자료형이
        자동으로 자식클래스로 변경되어 자식클래스의 객체를 참조하여 메소드 호출
		member4.display();
	}
}

=============================================================

package inheritance;

//이벤트 관련 회원정보(아이디,이름,이메일)를 저장하기 위한 클래스
// => 회원정보를 저장하는 Member 클래스(아이디,이름)를 상속받아 작성하는 것을 권장 - 재사용성 증가
// => extends 키워드로 기존 클래스(부모클래스)를 상속받아 새로운 클래스(자식클래스) 작성
// => 자식클래스는 부모클래스의 필드 또는 메소드에 접근하여 사용 가능 - 상속성(Inheritance)
// => Java에서는 단일 상속만 가능 - 부모클래스는 하나만 설정 가능
public class MemberEvent extends Member {
	/*
	//부모클래스(Member)을 상속받아 사용하므로 필드 미선언 
	private String id;
	private String name;
	*/
	private String email;
	
	//자식클래스의 메소드에서 this 키워드로 자식클래스 객체의 필드 또는 메소드를 참조하고
	//없는 경우 자동으로 super 키워드로 부모클래스 객체의 필드 또는 메소드 참조
	//super 키워드 : 자식클래스의 메소드에서 부모클래스의 객체를 저장하기 위한 숨겨진 매개변수
	// => super 키워드로 자식클래스의 메소드에서 부모클래스 객체의 필드 또는 메소드에 접근
	// => super 키워드를 사용하지 않아도 자식클래스의 메소드에서는 부모클래스 객체의 필드 또는 메소드 사용 가능
	
	//super 키워드를 사용하는 경우
	//1.자식클래스의 생성자에서 부모클래스의 생성자를 호출하기 위해 super 키워드 사용
	// => 형식) super(값,값,...);
	// => 부모클래스의 생성자를 호출하는 명령 전에 다른 명령을 작성하면 에러 발생
	//2.자식클래스의 메소드에서 부모클래스의 숨겨진 메소드를 호출하기 위해 super 키워드 사용
	// => 형식) super.메소드명(값,값,...);
	public MemberEvent() {
		//부모클래스의 기본 생성자 호출 - 부모클래스의 객체 생성
		//super();//기본 생성자를 호출하는 명령은 생략 가능
	}

	/*
	public MemberEvent(String id, String name, String email) {
		super();//기본생성자 호출
		//자식클래스에서 필드 또는 메소드에 접근하는 순서 
		// => 자식클래스의 필드 또는 메소드 참조 후 없는 경우 부모클래스의 필드 또는 메소드 참조
		// => 부모클래스의 은닉화 선언된 필드 또는 메소드 접근 불가능
		//this.id = id;
		setId(id);
		//this.name = name;
		setName(name);
		this.email = email;
	}
	*/

	//[Alt]+[Shift]+[S] >> 팝업메뉴 >> [O] >> 부모클래스의 생성자 선택 >> 
    필드 선택 >> Generate
	public MemberEvent(String id, String name, String email) {
		//부모클래스의 매개변수가 선언된 생성자 호출 
		// => 부모클래스 객체에 원하는 초기값이 저장되도록 설정 - Setter 메소드 미호출
		super(id, name);
		this.email = email;
	}

	/*
	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 String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	/*
	//메소드 오버라이드(Method Override) : 상속 관계에서 부모클래스의 메소드를 자식클래스에서 
    재선언하는 기능
	// => 부모클래스의 메소드를 자식클래스의 객체가 사용하기 부적절한 경우 부모클래스의 메소드를
	//자식클래스에서 재선언하여 사용
	//메소드 오버라이드 작성 규칙 - 부모클래스의 메소드와 같은 접근제한자, 반환형, 메소드명
	//, 매개변수, 예외 전달을 사용하여 메소드 작성
	// => 부모클래스의 메소드는 숨겨지고 자식클래스의 메소드에만 접근 가능
	public void display() {
		//System.out.println("아이디 = "+id);
		System.out.println("아이디 = "+getId());
		//System.out.println("이름 = "+name);
		System.out.println("이름 = "+getName());
		System.out.println("이메일 = "+email);
	}
	*/
	
	//이클립스에서는 부모클래스의 메소드를 자식클래스에서 오버라이드 선언되도록 자동 완성하는 기능 제공
	// => 오버라이드 선언하고 싶은 부모클래스의 메소드명 입력 >> [Ctrl]+[Space] >> 
    Override 선택
	//@Override : 오버라이드 선언된 메소드를 표현하기 위한 어노테이션
	// => 메소드 오버라이드 작성 규칙을 위반한 경우 에러 발생
	//어노테이션(Annotation) : API 문서에서 특별한 설명을 제공하기 위한 기능을 구현
	// => Java Source 작성에 필요한 특별한 기능을 제공 위해 사용
	@Override
	public void display() {
		//super 키워드로 부모클래스의 숨겨진 메소드 호출
		super.display();//아이디와 이름 출력
		System.out.println("이메일 = "+email);
	}
}
package inheritance;

public class MemberEventApp {
	public static void main(String[] args) {
		//자식클래스(MemberEvent)의 생성자로 객체를 생성할 경우 부모클래스(Member)의 생성자가
		//먼저 호출되어 부모클래스의 객체가 생성된 후 자식클래스의 객체 생성되어 상속 관계 성립
		// => 자식클래스의 참조변수에는 자식 클래스의 객체 저장
		MemberEvent member1=new MemberEvent();
		
		//참조변수에 저장된 자식클래스의 객체를 참조하여 메소드 호출
		// => 자식클래스 객체에 없는 메소드는 부모클래스의 객체를 참조하여 메소드 호출
		member1.setId("abc123");
		member1.setName("홍길동");
		member1.setEmail("abc@itwill.xyz");
		
		member1.display();
		System.out.println("======================================================");
		MemberEvent member2=new MemberEvent("xyz789", "임꺽정", "xyz@itwill.xyz");
		member2.display();
		System.out.println("======================================================");
	}
}

0개의 댓글