→ 기존 클래스를 재활용하여 보다 빠르고 쉽게 새로운 클래스 작성 : 프로그램의 생산성 증가
→ 공통적인 속성과 행위를 가진 다수 클래스 작성시 공통적인 속성과 행위가 선언된 클래스를 상속받아 작성 : 유지보수의 효율성 증가
● 물려주는 클래스 : 부모클래스, 선조클래스, 기본클래스, 슈퍼클래스(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("======================================================");
}
}