본문 바로가기

Languages/JAVA

[JAVA] 상속 알아보기 #1 - 기본 개념, 오버라이딩, 생성자 호출, 다형성

자바의 상속에 대해서 알아봅시다.

상속은 단어 그대로 자식이 부모로부터 어떤 것을 물려받는 것입니다.

자바에서의 상속은 부모의 필드나 메소드를 물려받습니다.

자바에서 이러한 상속을 사용하기 위해서 extend 를 사용합니다.


예시를 보면서 이해해봅시다.

phone 이라는 클래스를 HandPhone이 상속받고 HandPhone을 SmartPhone이 상속받는 예제입니다.

 

 

Phone.java

package test.mypac;

public class Phone {
	public Phone() {
		// TODO Auto-generated constructor stub
		System.out.println("Phone() 생성자");
	}
	//전화 거는 메소드
	public void call() {
		System.out.println("전화를 걸어요");
	}
	
}

HandPhone.java

package test.mypac;

//Phone 클래스를 확장해서 HandPhone 클래스를 정의한다.
//Phone 클래스를 상속 받아서 자식클래서 HandPhone을 정의한다.
public class HandPhone extends Phone{
	public HandPhone() {
		// TODO Auto-generated constructor stub
		System.out.println("HandPhone() 생성자");
	}

	//이동중에 전화를 거는 메소드
	public void mobileCall() {
		System.out.println("이동중에 전화를 걸어요!");
	}
	//사진 찍는 메소드
	public void takePicture() {
		System.out.println("30만 화소의 사진을 찍어요");
	}
	
}

SmartPhone.java

package test.mypac;

public class SmartPhone extends HandPhone{

	public SmartPhone() {
	
		System.out.println("SmartPhone() 생성자");
	}
	public void doInternet() {
		System.out.println("인터넷을 해요");
	}
	
	@Override
	public void takePicture() {
		//필요하다면 부모의 메소드도 여기서 super 예약어를 이용해서 호출할수도 있다.
		//super.takePicture();
		
		System.out.println("1000만 화소의 사진을 찍어요");
	}
}

 


 

자식 클래스는 부모 클래스의 기능을 사용할 수 있습니다.

package test.main;

import test.mypac.SmartPhone;

public class MainClass09 {
	public static void main(String[] args) {
		SmartPhone p1 = new SmartPhone();
		p1.mobileCall();
		
	}
}

SmartPhone에서는 mobileCall이라는 메소드가 정의되어있지 않지만 HandPhone을 상속받았기 때문에 mobileCall을 사용할 수 있습니다.


오버라이딩 

 

또한 자식 클래스에서 부모 클래스 기능을 재정의 할 수 있습니다. 이것을 오버라이딩이라고 합니다.

오버라이딩을 하는 방법은 자식 클래스에서 부모클래스의 메소드의 이름, 인자를 같게 만들고 재정의해주면 됩니다.

예제에서 takePicture부분이 오버라이딩된 모습입니다.

 

 

오버라이딩 예제

package test.main;

import test.mypac.HandPhone;
import test.mypac.SmartPhone;

public class MainClass08 {
	public static void main(String[] args) {
		HandPhone p1 = new HandPhone();
		
		SmartPhone p2 = new SmartPhone();
		
		p1.takePicture();
		p2.takePicture();
	}
}

SmartPhone의 takePicture에서 1000만 화소의 사진을 찍어요가 출력 되는 모습을 볼 수 있습니다.


상속관계에서의 생성자 호출

상속관계에서의 생성자 호출을 알아봅시다.

new SmartPhone();

객체를 생성하면 부모의 생성자부터 호출이 되는 모습을 볼 수 있습니다.


IS-A 관계

예제의 상속관계는 phone <- HandPhone <- SmartPhone 이렇습니다.

즉, SmartPhone은 HandPhone과 Phone의 하위 개념이라고 할 수 있습니다.

이럴경우에 SmartPhone은 HandPhone, Phone 이다라고 표현 할 수 있습니다.

하지만 Phone이나 HandPhone은 SmartPhone이라고 할 수 없습니다.

 

자바에서는 이러한 관계를 IS-A 관계라고 합니다.

HandPhone p2 = new SmartPhone();

자식 객체를 생성하여 부모 클래스에 담을 수 있게 됩니다.

이렇게 같은 자료형에 여러 가지 객체를 대입하여 다양한 결과를 얻어내는 성질을 자바에서 다형성이라고 말합니다.


cf) 모든 클래스는 자동으로 Object를 상속합니다.

A가 Object에 대입되는 것을 볼 수 있습니다.

 

모두 Object로 선언이 되는 것을 볼 수 있습니다.