[자바(Java)] 상속 (Inheritance)

방용환·2023년 4월 10일
0
post-thumbnail

1. 상속 (Inheritance)

1. 상속 (Inheritance)

  • 상속 (Inheritance) : 클래스를 선언할 때 기존 클래스를 물려받아 사용하는 기능
  • 공통적인 속성과 행위를 포함한 다수의 클래스를 선언할 때 공통적인 속성과 행위의 클래스를 선언하고 작성된 크래스를 상속받아 사용
  • 물려주는 클래스 : 부모클래스, 선조클래스, 기본클래스, 슈퍼클래스
  • 물려받는 클래스 : 자식클래스, 후손클래스, 파생클래스, 서브클래스
public class 자식클래스 extends 부모클래스{
	// 자식클래스에서는 부모클래스의 필드 또는 메소드 사용 가능
}

2. 상속의 장점

  • 기존 클래스를 재활용하여 새로운 클래스를 쉽고 빠르게 작성
  • 코드의 중복성을 최소화하여 프로그램 생산성 및 유지보수의 효율성 증가

3. 상속 특징

  • 부모클래스의 생성자는 자식클래승에게 상속되지 않음
  • 부모클래스의 은닉화 선언된 필드와 메소드에는 접근 불가능
  • 자식클래스의 생성자로 객체를 생성할 경우 부모클래스의 생성자가 먼저 호출되어 부모클래스의 객체가 먼저 생성된 후, 자식클래스의 생성자로 객체를 생성하여 상속관계 자동으로 성립
  • 자식클래스의 메소드에서는 this 키워드로 자식클래스 객체의 필드 또는 메소드를 참조
  • 자식클래스 객체의 필드 또는 메소드가 없는 경우 부모클래스 객체의 필드 또는 메소드 참조
  • 자바에서는 단일 상속만 가능
  • 자식클래스의 참조변수애는 자식클래스 객체의 메모리 주소 저장하여 자식클래스 객체의 필드와 메소드를 참조하지만 상속관계에 의해 부모클래스 객체의 필드 또는 메소드 참조 가능

2. super 키워드

1. super 키워드

  • super 키워드 : 자식클래스의 메소드에서 부모클래스 객체의 메모리 주소를 저장하기 위한 키워드
  • 자식클래스의 메소드에서 부모클래스 객체의 필드 또는 메소드를 참조하기 위해 사용
  • 자식클래스의 메소드에서 supper 키워드르르 사용하지 않아도 자식클래스의 메소드에서는
    this 키워드로 참조되는 필드와 메소드가 없으면 자동으로 부모클래스 객체의 필드 또는 메소드 참조

2. super 키워드 사용 경우

  1. 자식클래스의 생성자에서 부모클래스의 매개변수가 있는 생성자를 호출하여 초기화 처리하기 위해 super 키워드 사용 -> 부모클래스 객체가 생성될 때 필드에 원하는 초기값 저장 가능
super(,, ...);

=> 생략된 경우 부모클래스의 매개변수가 없는 기본 생성자를 호출하여 객체 생성
=> 생성자에서 다른 생성자를 호출하는 명령은 반드시 첫번째 명령으로 작성

  1. 자식클래스의 메소드에서 오버라이드 선언되어 숨겨진 부모클래스의 메소드를 호출할 경우 super 키워드 사용

3. 상속 예제

Member.java

Member.java

//회원정보(아이디, 이름)를 저장하기 위한 클래스
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);
	}
}

MemberApp.java

MemberApp.java

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("======================================");
	}
}

// 아이디 = abc123
// 이름 = 홍길동
// ===========================================
// 아이디 = xyz789
// 이름 = 임꺽정
// ===========================================

MemberEvent.java

MemberEvent.java

public class MemberEvent extends Member {
	private String email;

	public MemberEvent() {
		// super();//부모클래스의 매개변수가 없는 기본 생성자 호출 - 생략 가능
	}

	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.display();// super 키워드로 부모클래스의 숨겨진 메소드 호출
		System.out.println("이메일 = " + email);
	}
}

MemberEventApp.java

MemberEventApp.java

public class MemberEventApp {
	public static void main(String[] args) {
		
		MemberEvent member1 = new MemberEvent();

		member1.setId("abc123");
		member1.setName("홍길동");
		member1.setEmail("abc@aabab.xyz");

		member1.display();
		System.out.println("======================================");
		
		MemberEvent member2 = new MemberEvent("xyz789", "임꺽정", "xyz@aabab.xyz");
		member2.display();
		
		System.out.println("======================================");
	}
}

// 아이디 = abc123
// 이름 = 홍길동
// 이메일 = abc@aabab.xyz
// ===================================================
// 아이디 = xyz789
// 이름 = 임꺽정
// 이메일 = xyz@aabab.xyz
// ===================================================

4. 객체 형변환 (Casting)

1. 부모클래스 참조변수 = new 부모클래스();

  • 부모클래스의 생성자로 객체를 생성하여 부모클래스의 참조변수에 저장 (가능)

MemberCastApp.java

MemberCastApp.java

public class MemberCastApp {
	public static void main(String[] args) {
		Member member1 = new Member();

		// 참조변수에 저장된 부모클래스의 객체를 사용하여 부모클래스의 메소드 호출
		member1.setId("abc123");
		member1.setName("홍길동");

		member1.display();
	}
}

// 아이디 = abc123
// 이름 = 홍길동

2. 자식클래스 참조변수 = new 자식클래스();

  • 부모클래스의 생성자로 부모클래스 객체를 생성하고 자식클래스의 생성자로 자식 클래스 객체를 생성하여 자식클래스의 참조변수에 자식클래스의 객체 저장 (가능)

MemberCastApp.java

MemberCastApp.java

public class MemberCastApp {
	public static void main(String[] args) {
		MemberEvent member2 = new MemberEvent();

		member2.setId("xyz789");
		member2.setName("임꺽정");
		member2.setEmail("xyz@naver.com");

		member2.display();
	}
}

// 아이디 = xyz789
// 이름 = 임꺽정
// 이메일 = xyz@naver.com

3. 자식클래스 참조변수 = new 부모클래스();

  • 부모클래스의 생성자로 부모클래스 객체를 생성하고 자식클래스의 참조변수에 부모클래스의 객체 저장 (불가능)

MemberCastApp.java

MemberCastApp.java

public class MemberCastApp {
	public static void main(String[] args) {
		MemberEvent member3=new Member(); //error 
	}
}

4. 부모클래스 참조변수 = new 자식클래스();

  • 부모클래스의 생성자로 부모클래스 객체를 생성하고 자식클래스의 생성자로 자식클래스 객체를 생성하여 부모클래스의 참조변수에 부모클래스의 객체 저장 (가능)

MemberCastApp.java

MemberCastApp.java

public class MemberCastApp {
	public static void main(String[] args) {
		Member member4 = new MemberEvent();

		// 참조변수에 저장된 부모클래스의 객체를 사용하여 부모클래스의 메소드를 호출 가능
		// => 참조변수로 자식클래스 객체를 참조할 수 없으므로 자식클래스 호출 불가능
		member4.setId("opq456");
		member4.setName("전우치");
        
        member4.display();
	}
}

// 아이디 = opq456
// 이름 = 전우치
// 이메일 = null

5. 객체 형변환

  • 객체 형변환을 이용하면 부모클래스의 참조변수로 자식클래스의 메소드 호출 (가능)
  • 명시적 객체 형변환(강제 형변환), 묵시적 객체 형변환(자동 형변환)
  • 상속관계의 클래스에서만 객체 형변환 사용 가능

  1. 명시적 객체 형변환
  • Cast 연산자를 사용하여 부모클래스 참조변수의 자료형을 자식클래스로 변경하면 일시적으로 참조변수에 자식클래스의 객체가 자동 저장
  • 명시적 객체 형변환에 의해 자식클래스로 자료형이 변경된 참조변수는 자식클래스의 객체가 저장되므로 자식클래스의 메소드 호출 (가능)
  1. 묵시적 객체 형변환
  • 부모클래스의 메소드를 자식클래스에서 오버라이드 선언하면 부모클래스의 숨겨진 메소드 대신 자식클래스의 메소드를 호출하기 위해 참조변수의 자료형을 자동으로 자식클래스로 변경하여 일시적으로 자식클래스의 객체가 참조변수에 저장되어 자식클래스의 메소드 호출 가능

MemberCastApp.java

MemberCastApp.java

public class MemberCastApp {
	public static void main(String[] args) {
		Member member4 = new MemberEvent();

		member4.setId("opq456");
		member4.setName("전우치");
        ((MemberEvent) member4).setEmail("opq@naver.com");
        
        member4.display();
	}
}

// 아이디 = opq456
// 이름 = 전우치
// 이메일 = opq@naver.com

5. Object 클래스

  • Object 클래스 : 모든 Java 클래스의 최선조 클래스
    => Object 클래스로 생성된 참조변수에는 모든 클래스로 생성된 객체 저장 가능
public class Car /* extends Object */{
	private String modelName;
	private String userNmae;
}    
  • 클래스 선언시 상속받은 부모 클래스가 없는 경우 기본적으로 Object 클래스를 자동으로 상속

6. 추상클래스 (Abstract Class)

  1. 추상클래스 (Abstract Class) : abstract 제한자를 사용하여 선언된 클래스
  • 객체 생성이 목적이 아닌 상속을 목적으로 작성된 클래스
public abstract class 클래스명 {

}
  • abstract 제한자 : 클래스와 메소드의 설정에 사용 가능한 제한자
  • 추상클래스로 객체를 생성할 경우 에러 발생
  • 추상클래스로 참조변수 생성 가능
  1. 추상메소드 (Abstract Method): abstract 제한자를 사용하여 선언된 메소드
  • 메소드의 머리부만 작성하고 몸체부는 작성하지 않는 미완성된 메소드
접근제한자 abstract 반환형 메소드명 (자료형 매개변수명, ...);
  • 추상메소드가 선언된 클래스는 반드시 추상클래스로 선언
  • 추상메소드가 선언된 클래스를 상속받은 자식클래스는 무조건 모든 추상메소드를 오버라이드 선언
    => 자식클래스에서 추상메소드를 오버라이드 선언하지 않으면 자식클래스도 추상클래스가 됨

0개의 댓글