티스토리 뷰

▶상속(Inheritance) 개념 정리

이번 글에서는 상속의 개념에 대해 정리해 보려고 합니다 :)

상속을 사용하는 이유는 결국 더 좋은(빠르고, 유지 보수가 쉽고, 중복이 적고, 통일성이 있는) 프로그램을 만들기 위해서인데요!

그러면 상속이란 무엇이고 어떻게 사용되는지 알아봅시다!

 

🔎 상속(Inheritance) ?


자바에서의 상속은 우리가 생각하는 그 상속의 단어와 비슷한 원리라고도 할 수 있는데요.

현실과의 차이가 있다면,

자바에서는 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받습니다.

이때 상속받는 클래스를 자식 클래스, 하위 클래스 또는 서브 클래스라고 부릅니다.

상속을 해주는 클래스를 부모 클래스, 상위 클래스 또는 슈퍼 클래스라고 합니다.

상속

📌 상속 문법

class A {
    A 필드
}

class B extends A {
    A, B 필드
}

 

📌 상속의 대상

❓뭘 상속 받는가

자식 클래스가 부모 클래스로부터 상속을 받게 되면 부모 클래스의 필드를 물려받게 됩니다.

 

다음 코드를 통해 상속의 대상을 쉽게 이해해 봅시다.

class Parent {
	String name = "A";
	int data = 10;
	
	public Parent() {System.out.println("부모 생성자");}
	
	void printName() {
		System.out.println(name);
	}
}

class Child extends Parent {
	
}

위와 같이 부모 클래스 Parent 클래스 생성자 즉, 해당 클래스로 객체가 만들어지자 마자 실행되는 부분입니다.

이제 자식 클래스 Child에서는 별다른 코드 없이 extends 키워드를 통해 Parent 클래스를 상속받았습니다.

 

이제 메인 메소드에서 Child 클래스라는 타입의 객체를 생성해봅시다.

위에서 알아본 상속의 개념이 적용되었다면,

Child 클래스는 Parent 클래스를 상속 받았기 때문에 Parent 클래스의 필드를 모두 상속 받았을 것입니다.

 

이와 같은 이유로 Child 클래스라는 타입의 객체가 생성되는 순간, Parent 클래스의 생성자도 실행될 것입니다.

다시말해서 System.out-println("부모 생성자")가 실행될 것입니다.

출력 화면

실제로 "부모 생성자"라고 콘솔창에 출력된 것을 확인할 수 있었습니다.

 

❓ 상속만 받을 수 있는건가, 더 작성할 수 있는가

자식 클래스는 부모 클래스를 상속 받고 거기서 더 필요한 변수나 메소드가 있다면

클래스에서 변수나 메소드를 선언하듯이 선언을 하고 사용하면 됩니다.

 

상속을 받음으로써 중복된 코드를 작성하지 않을 뿐으로 이해하면 되겠습니다.

 

🔎 super( ) : 부모 생성자


이제부터 상속을 받은 자식 클래스에서 super()라는 것을 볼 수가 있는데요.

이는 자식 클래스 타입의 객체에서 부모 필드에 접근할 수 있게 해주는 것입니다.

 

좀 전에 위해서 상속을 받음으로써 자식 클래스의 필드에서 부모 필드에 있는 변수나 메소드에도 접근할 수 있음을 확인했었습니다.

 

따라서 자식 생성자가 호출될 때 부모와 자식 필드 모두 메모리에 할당되게 되는 것입니다.

이때 부모 생성자를 호출하는 방법이 super()입니다.

 

알고 있어야 하는 점은, 만약 자식 클래스에서 super()를 호출하지 않더라도 컴파일러가 자동으로 작성해준다는 것입니다. 

 

→ 💡 super()는 부모 생성자를 호출하는 방법이다

 

1️⃣ super()는 항상 먼저 올라가 있어야 한다.

부모 생성자를 호출하는 super()가 자식 클래스의 필드 값보다 아래에 있으면 에러가 발생합니다.

항상 부모 클래스의 필드가 먼저 메모리에 올라가야 한다는 점을 기억해야 합니다.

class B extends A {
	
	public B() {
		this.data = 20;
		super(); // error. 항상 부모가 먼저 올라가 있어야 함
	}
}

 

2️⃣ 자동참조 : this에서 없으면 super에서 찾는다.

this는 인스턴스 자기자신의 필드를 의미한다고 했었습니다.

그런데 아래 코드에서 자식 클래스 B의 필드를 보면 어디에도 data는 없습니다.

즉 this에서 못 찾았음을 의미하기도 합니다.

 

이제 상속받은 부모 클래스의 필드로 올라가 해당 변수를 찾게 됩니다.

값을 찾아 가는 것뿐이지 부모 클래스 필드값을 마음대로 변경할 수 있다는 것은 아닙니다.

class B extends A {
	
	public B() {
		this.data = 20; // 자동참조. this에서 없으면 super에서 찾음
	}
}
728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함