본문 바로가기

BE/JAVA

[JAVA] 자바 상속 기본 및 활용

목차 
1. 상속
2. 오버라이딩 
3. 객체 생성 방법 (자기자신, 형변환)

 

📌1. 상속(Inheritance) 

객체지향 프로그래밍에서 '상속' 관계란

부모 클래스와 자식 클래스가 주체가 되어 자식클래스가 부모의 변수 및 메서드를 상속받아 활용할 수 있는 것을 말합니다.

즉, 부모가 자녀에게 변수/메서드 상속해주게 되면 자식은 부모가 가지고 있는 상태/동작을 모두 활용할 수 있습니다. 

자바에서 extends 를 활용해 상속받는데, 자녀 클래스는 extends 키워드를 통해 부모 클래스를 상속받습니다. 

부모 클래스는 상위 클래스(슈퍼 클래스, super class) 라고 하며, 자식 클래스는 하위 클래스(서브 클래스, sub class) 라고 합니다. 

 

클래스 생성자 호출 순서 (부모 -> 자식) 

클래스의 생성자는 부모 생성자 호출 -> 자식 생성자 호출 순서로 생성되게 됩니다.

아래 예시에서 부모 클래스는 Parent 클래스이며, 자식 클래스는 Child 클래스입니다.

자식 클래스(Child) 생성자에서 super() 메서드가 호출되면 부모 클래스가 생성되고, 이후 Child 생성자가 생성되게 됩니다.

 

⚡ super 키워드 

자바에서 메모리 내부적으로 클래스 할당은 부모 클래스 > 자식 클래스 순으로 메모리가 할당됩니다.

따라서 자식 객체를 생성하는 경우, 자동으로 부모 객체가 생성되는데요.

이는 자식 생성자에서 super(); 을 통해 부모 생성자를 호출하여 부모 객체가 메모리에 로딩되는 방식으로 실행됩니다.

또한 super 메서드가 선언되어 있지 않더라도, 자식 생성자 호출 시 부모 생성자가 호출되어 부모 객체가 메모리에 쌓이게 됩니다. 

public class Parent {
	public String name; 
	public int age;	
	public void walk(){
		System.out.println("부모가 걷는다");
	}
}
public class Child extends Parent{
	@Override
	public void walk(){
		System.out.println("자식이 걷는다");
	}
	public Child(){
    		super();
	}
}

 

 

📌 2. Override (재정의) 

오버라이딩

오버라이딩이란 부모-자식 상속 관계에서

상속받은 하위 클래스가 상위 클래스의 메소드를 동일하게 정의해 동작을 수정하는 것을 말합니다. 

위 코드에서 @Override(오버라이딩 어노테이션)을 활용해 자식 클래스에서 부모 함수(walk)를 재정의합니다.

public static void main(String[] args)
{
	Child c = new Child();
	Parent p = new Child(); //업캐스팅
	Child c2 = (Child)p; //다운캐스팅
	c.walk(); 
}

 

동적 바인딩

동적바인딩이란, 호출되는 메서드가 실행 시점에서 결정되는 바인딩입니다. 

기존 부모 클래스는 실행 시 부모 객체는 부모 메서드밖에 접근 불가합니다. 그러나 부모-자식을 오버라이딩한 후 객체를 아래와 같이 업캐스팅하여 만들면,  동적바인딩된 자식 메서드에 접근해 실행되게 됩니다.  프로그램의 컴파일 시점에서는 부모 메서드가 접근되며, 실행시키면 동적바인딩이 일어나 재정의된 메서드를 찾아가기 때문에 자식 메서드가 실행됩니다. 

이를 활용해 부모 클래스는 하위 클래스의 구동 방식을 모르고도 부모 클래스에서 자식 클래스 메소드를 실행할 수 있습니다. 

public static void main(String[] args)
{
	Parent p = new Child(); //업캐스팅
	p.walk(); 
}

 

 

📌3. 객체 생성 방법 (자기자신, 형변환)

1) 자기 자신 클래스 이용

상속관계에서 부모/자식 클래스를 이용하지 않고 직접 자기 자신을 이용하여 생성하는 방법입니다.

Parent p = new Parent();
Child c = new Child();

 

2) 클래스 형변환하여 객체 생성

아래는 상속관계에 있는 부모-자식 클래스들 간의 형변환을 통해 객체를 생성하는 방법입니다.

하위 클래스의 동작 방식을 모를 때, 다른 클래스들을 간접 이용하여 생성하는 업캐스팅/다운캐스팅 방법이 있습니다. 

캐스팅(casting)이란, 클래스 타입을 변환하는 것을 말하며 형변환이라고도 합니다. 

 

형변환 : 업캐스팅 (자식 -> 부모) 

업캐스팅이란, 자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것을 말합니다. 

Parent p = new Child(); //upcasting

 

형변환 : 다운캐스팅 (부모 -> 자식) 

업캐스팅된 자료형을 다시 자식 자료형으로 형변환 해주는 것을 말합니다.

Child 클래스의 특성을 잃은 자식 클래스를 다시 복구시켜 주며 다시 원 상태로 돌려줍니다. 

Parent p = new Child();
Child c = (Child)p; //downcasting

(필수) 다운 캐스팅의 경우 업캐스팅과 달리 명시적으로 자식 클래스형을 꼭 나타내야 합니다. 

 

캐스팅 불가의 경우

자식은 부모를 포함할 수 없으므로 아래와 같이 부모 자료형으로 자식 객체를 선언하는 경우 캐스팅이 불가합니다. 

Child c = new Parent();