2 minute read

이번시간에는 상속에 대해 학습해보도록 하자

0. 들어가기 전에

객체 지향 프로그램에서는 부모 클래스의 멤버(필드, 메서드)를 자식클레스에게 물려줄수 있다(상속).

상속 :

  • 이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기에 중복되는 코드를 줄일수 있다.
  • 부모 클래스의 한번의 수정으로 모든 자식 클래스 까지 수정되는 효과가 있어 유지보수 시간이 줄어든다.

1. 클래스 상속

  • 자식 클래스 선언 시 부모 클래스 선택 (현실에선 부모가 자식을 만들지만 여기선 자식이 부모를 선택함. 금수저 은수저 고를수 있다.??)
  • extends 뒤에 부모 클래스를 기술한다.
class 자식클래스 extends 부모클래스 {
	//필드
	// 생성자
	// 메서드
}
  • 여러 개의 부모 클래스 상속할 수 없다.
  • 부모 클래스에서 private 접근 제한된 필드와 메서드는 자식이라도 상속 대상에서 제외된다.
  • 부모와 자식 클래스가 다른 패키지에 존재할 경우 default 접근 제한된 필드, 메서드 역시 제외된다.
package parentex;

public class Parent{
	private void method01{}
	void method02{}
	public void method03{}
}

////////////

package son;

public class son extends Parent{
	// 자식이 사용할 수 있는건 method03 밖에 없다.
	method03();
}

2. 부모 생성자 호출

  • 자식 객체 생성할 때 부모 객체가 먼저 생성되고, 그 다음 자식 객체가 생성된다. ( 힙 메모리 역역에 부모객체도 올라간다는 말 )

  • 자식 생성자 __맨 첫 줄__에서 부모 생성자가 호출된다.

 public Son() extends Parent{
	 // super()로 인해 부모객체가 먼저 생성된다.
	 // super()를 우리가 정의 안해도 알아서 생성 해준다.
	 super() 
 } 

음 위의 super는 __부모 생성자__를 호출하는 것이다. 그렇기에 올바른 부모 생성자가 정의되어 있지 않다면 컴파일 에러가 발생한다.

3. 메서드 재정의 (오버라이딩/ Overriding)

  • 부모 클래스의 메소드가 자식 클래스에서 사용하기에 부적합할 경우 자식 클래스에서 수정하여 사용 가능하다.
  • 메서드 재정의 방법
    • 부모 메소드와 동일한 시그니처 가져야한다. (부모 선언 방식을 따라야 한다)
    • 접근 제한 더 강하게 재정의 가능
    • 새로운 예외를 throws할 수 있다.
  • 메소드가 재정의될 때 부모 객체 메서드가 숨겨지며, 자식 객체에서 메서드 호출하면 재정의된 자식 메서드가 호출이 된다.
class Parent {
	public void method01{
		System.out.println("parent method01");
	}
	public void method02{
		System.out.println("parent method02");
	}
}

class Son {
	public void method02{
		System.out.println("son method02");
	}
	public void method03{
		System.out.println("son method03");
	}
	
}

class SonExam{
	public static void main(String[] args){
		Son s1 = new Son();
		s1.method01();
		s1.method02();
		s1.method03();
	}
}

출력결과는

parent method01
son method02
son method03

이 출력되게 된다. 그러면 오버라이딩도 사용하고 부모 메서드도 사용할 방법은 뭘까? 아래와 같이 사용하면 된다,

class Son {
	public void method02{
		System.out.println("son method02");
	}
	public void method03{
		System.out.println("son method03");
	}
	public void parentMethod{
		super.method02();
	}
}

class SonExam{
	public static void main(String[] args){
		Son s1 = new Son();
		s1.method01();
		s1.parentMethod();
		s1.method03();
	}
}

4. final 클래스와 final 메서드

  • 해당 선언이 최종 상태이며 수정될 수 없음을 의미하는 final
  • 클래스 및 메서드 선언시 final 키워드를 사용하면 이는 상속과 관련된 것이다.
  • class에 final 을 붙이면 그 클래스는 절대 부모 클래스가 될수 없어 자식클래스를 만들수 없다.
    // 자바 String 도 final class이다.
    public final Class String{...}
    
  • 부모 클래스에 선언된 final 메서드는 자식 클래스에서 __재정의가 불가!__하다

Categories:

Updated: