상속(Inheritance)

신광진·2021년 3월 18일
0

Java

목록 보기
12/19
post-thumbnail

상속(Inheritance)


자바에서 상속이라는 것은 내용이 작성되어 있는 클래스를 다른 클래스에서 사용할 수 있도록 만들어 주는 것입니다

또한 상속을 사용하면 코드의 재사용을 통해 코드의 중복을 없앨 수 있고, 유지보수가 매우 용이해지는 장점이 있습니다.

하나의 클래스만 잘 구현해 놓아도, 여기저기서 상속을 받아 사용가능한 것입니다.



[상속 예시]

public class Parent {

	public static void main(String[] args) {
		Child inheritance = new Child();
		
		inheritance.printX();
	}
	
	public void printX() {
		System.out.println("PrintX - Parent");
	}
		
}

class Child extends Parent {
	
}

위 코드에서 Child 클래스안에는 아무것도 정의되어 있지 않습니다.

하지만 코드는 컴파일도 잘되고 실행도 잘 됩니다.

그리고 출력결과는 PrintX-Parent라고 출력됩니다.

이러한 결과가 나오는 이유는 Child클래스가 Parent클래스를 상속받았기 때문입니다.

상속을 받으면 상속받은 클래스의 변수와 메서드를 모두 사용할 수 있습니다.

class Child extends Parent에서 Child를 자식클래스, Parent를 부모클래스라고 부릅니다.

그리고 상속을 받기위해서는 클래스 이름뒤에 extends라는 예약어를 사용하고 상속받고자 하는 클래스 이름을 쓰면 됩니다.

여기서 조심해야 하는점은 상속은 한 개의 클래스만 받을 수 있습니다



자식클래스의 경우, 자식클래스의 객체를 생성하면 부모클래스의 기본생성자가 실행되고 자식클래스의 생성자가 실행됩니다.

예제를 통해 알아보겠습니다.

[상속 예시 2]

public class Parent {
	
	Parent () {
		System.out.println("Constructor - Parents");
	}

	public static void main(String[] args) {
		Child inheritance = new Child();
		
		inheritance.printX();
	}
	
	public void printX() {
		System.out.println("PrintX - Parent");
	}
		
}

class Child extends Parent {
	
	Child () {
		System.out.println("Constructor - Child");
	}
}

[출력]

Constructor - Parents
Constructor - Child
PrintX - Parent

위에서 말했듯이 자식클래스의 객체를 생성하면, 부모클래스의 생성자가 먼저 호출됩니다.

하지만 상속 예시에서 우리는 생성자를 만들지 않았지만 실행이 잘 됐습니다

기억하시겠지만, 클래스 내에 생성자가 없는 경우에는 자바에서 기본 생성자를 자동으로 만들어 주기 때문입니다.

그렇다면 부모 클래스에 매개변수가 있는 생성자가 있는 경우는 어떻게 될까요?

이미 예상하시겠지만 그런 경우에는 반드시 부모 클래스에 기본 생성자를 만들어야 합니다.

Super


이전 포스팅에서 this에 대해서 알아본 적이 있습니다.

this는 인스턴스 자기자신을 의미하고, this를 통해 매개변수와 인스턴스변수의 이름이 똑같은 경우 구분하는 방법에 대해 알아보았었습니다

그렇다면 super는 무엇일까요?

바로 부모클래스를 의미하는 것입니다.

super를 사용하여 부모 클래스를 명시적으로 표현해 줄 수 있고, 부모 클래스의 매개변수가 있는 생성자를 이용하여 초기화 시 활용가능합니다.

[super 예시]

public class Parent {
	String name;
	int age;
	
	Parent (String name, int age) {
		this.name = name;
		this.age = age;
	}

	public Parent() {
		
	}

	public static void main(String[] args) {
		Child inheritance = new Child();	
		System.out.println(inheritance.toString());
	}
	
	public String toString() {
		return this.name + "," + this.age;
	}
		
}

class Child extends Parent {
	
	Child () {
		super("abc", 40); //부모 클래스의 생성자 호출
		System.out.println("Constructor - Child");
	}
	
}

[출력]

Constructor - Child
abc,40

이렇게 super를 명시적으로 사용하여 초기화 작업을 할 때 사용가능합니다.

여기서 주의사항은 부모클래스를 의미하는 super는 반드시 첫 줄에 있어야 합니다.

만약 Child의 기본생성자에서 System.out.println("Constructor - Child");가 첫 줄에 있었다면 오류가 발생했을 것입니다.

P.S


이후에 설명드릴 오버라이딩(Overriding), 다형성(polymorphism)은 매우 중요하고, 반드시 알아야 하는 개념입니다.

분량이 너무 많다고 생각되서 상속은 2개로 나눠서 포스팅하겠습니다.

이 글을 보시는 분들께 잘못된 지식을 전달하는 일이 없도록 열심히 공부해서 포스팅 하겠습니다!

profile
이거 왜안되냐

0개의 댓글