티스토리 뷰

주의 사항!

  • 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.


객체 지향 프로그램에서 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있습니다. 프로그램에서는 부모 클래스를 상위 클래스라고 부르기도 하고, 자식 클래스를 하위 클래스, 또는 파생 클래스라고 부르기도 합니다. 부모 클래스를 상속한 자식 클래스는 자신의 멤버뿐만 아니라 부모 클래스의 멤버까지도 사용할 수 있게 됩니다.

 

하지만 상속을 한다고 해서 부모 클래스의 모든 필드와 메서드들을 물려받는 것은 아닙니다. 부모 클래스에서 private 접근 제한을 갖는 필드와 메서드는 상속 대상에서 제외됩니다. 그리고 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메서드도 상속 대상에서 제외됩니다.

 

클래스 상속

자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지를 결정하고 선택된 부모 클래스는 다음과 같이 extends 뒤에 기술합니다.

class 자식클래스 extends 부모 클래스
{
	//필드
	//생성자
	//메서드
}

예를 들어서 Car 클래스를 상속해서 SportsCar 클래스를 설계하고 싶다면 다음과 같이 작성하면 됩니다.

class SportsCar extends Car
{
	...
]

다른 언어와 달리 자바는 다중 상속을 허용하지 않습니다. 즉, 여러 개의 부모 클래스를 상속할 수 없습니다. 그래서 extends 뒤에는 두 개 이상의 부모 클래스가 올 수 없습니다.

 

다음 예제는 핸드폰(CellPhone) 클래스를 상속해서 DMB폰(DmbCellPhone) 클래스를 작성한 것입니다.

//CellPhone.java
package chapter00.exam00;

public class CellPhone 
{
	//필드
	String model;
	String color;
	
	//생성자
	
	//메서드
	void powerOn() { System.out.println("전원을 켭니다."); }
	void powerOff() { System.out.println("전원을 끕니다."); }
	void bell() { System.out.println("벨이 울립니다."); }
	void sendVoice(String message) { System.out.println("자신 : " + message); }
	void receiveVoice(String message) { System.out.println("상대방 : " + message); }
	void hangUp() { System.out.println("전화를 끊습니다."); }
}
//DmbCellPhone.java
package chapter00.exam00;

public class DmbCellPhone extends CellPhone
{
	//필드
	int channel;
	
	//생성자
	DmbCellPhone(String model, String color, int channel)
	{
		this.model = model;
		this.color = color;
		this.channel = channel;
	}
	
	//메서드
	void turnOnDmb()
	{
		System.out.println("채널 " + channel + "번 DMB 방송 수신을 시작합니다.");
	}
	
	void changeChannelDmb(int channel)
	{
		this.channel = channel;
		System.out.println("채널 " + channel + "번으로 바꿉니다.");
	}
	
	void turnOffDmb()
	{
		System.out.println("DMB 방송 수신을 멈춥니다.");
	}
}
//exam00.java
package chapter00.exam00;

public class exam00 
{
	public static void main(String[] args)
	{
		//DmbCellPhone 객체 생성
		DmbCellPhone dmbCellPhone = new DmbCellPhone("자바폰", "검정", 10);
		
		//CelPhone으로부터 상속받은 코드
		System.out.println("모델 : " + dmbCellPhone.model);
		System.out.println("색상 : " + dmbCellPhone.color);
		
		//DmbCellPhone의 필드
		System.out.println("채널 : " + dmbCellPhone.channel);
		
		//CellPhone으로부터 상속받은 메서드 호출
		dmbCellPhone.powerOn();
		dmbCellPhone.bell();
		dmbCellPhone.sendVoice("여보세요");
		dmbCellPhone.receiveVoice("안녕하세요! 저는 홍길동인데요");
		dmbCellPhone.sendVoice("안사요.");
		dmbCellPhone.hangUp();
		
		//DmbCellPhone의 메서드 호출
		dmbCellPhone.turnOnDmb();
		dmbCellPhone.changeChannelDmb(12);
		dmbCellPhone.turnOffDmb();
	}
}

/*
실행결과

모델 : 자바폰
색상 : 검정
채널 : 10
전원을 켭니다.
벨이 울립니다.
자신 : 여보세요
상대방 : 안녕하세요! 저는 홍길동인데요
자신 : 안사요.
전화를 끊습니다.
채널 10번 DMB 방송 수신을 시작합니다.
채널 12번으로 바꿉니다.
DMB 방송 수신을 멈춥니다.

*/

 

부모 생성자 호출

자바에서 자식 객체를 생성하면, 부모 객체가 먼저 생성되고 자식 객체가 그 다음에 생성됩니다. 

DmbCellPhone dmbCellPhone = new DmbCellPhone("자바폰", "검정", 10);

이 코드는 자식 객체인 DmbCellPhone 객체만 생성하는 것처럼 보이지만 사실 부모 객체인 CellPhone 객체를 먼저 생성하고 그 다음으로 DmbCellPhone 객체를 생성합니다.

 

그리고 객체의 생성을 위해서는 생성자가 호출되어야 합니다. 이 말인즉슨 위 코드가 사실 자식 객체인 DmbCellPhone의 생성자만 호출하는 것으로 보이지만 부모 객체인 CellPhone의 생성자까지 호출하게 된다는 의미를 가지고 있습니다. 부모 객체 생성자는 자식 객체 생성자 블록의 가장 첫 줄에서 호출됩니다. 예를 들어 DmbCellPhone 객체의 생성자가 따로 명시되지 않았다면 컴파일러는 다음과 같은 기본 생성자를 추가합니다.

public DmbCellPhone()
{
	super();
}

첫 줄에 super()가 추가된 것을 볼 수 있습니다. super()는 부모의 기본 생성자를 호출합니다. 

 

만약 직접 자식 생성자를 선언하고 명시적으로 부모 생서자를 호출하고 싶다면 다음과 같이 작성하면 됩니다.

자식클래스(매개변수1, 매개변수2, 매개변수3, ...)
{
	super(매개값1, 매개값2, ...);
}

super(매개값1, 매개값2)는 매개 값의 타입과 일치하는 부모 생성자를 호출합니다. 만약 매개 값의 타입과 일치하는 부모 생성자가 없을 경우 컴파일 오류가 발생합니다. 만약 super()를 생략하면 컴파일러에 의해 super()가 자동으로 추가되기 때문에 부모의 기본 생성자가 존재해야 합니다.

 

다음 예제를 보겠습니다.

//People.java
package chapter00.exam00;

public class People 
{
	public String name;
	public String ssn;
	
	public People(String name, String ssn)
	{
		this.name = name;
		this.ssn = ssn;
	}
}
//Student.java
package chapter00.exam00;

public class Student extends People 
{
	public int studentNum;
	
	public Student(String name, String ssn, int studentNum)
	{
		super(name, ssn);
		this.studentNum = studentNum;
	}
}

People 클래스는 기본 생성자가 없고 name과 ssn을 매개 값으로 받아 객체를 생성시키는 생성자만 있습니다. 그렇기 때문에 People을 상속하는 Student 클래스는 생성자에서 super(name, ssn)으로 People 클래스의 생성자를 호출해야 합니다.

'공부 일지 > JAVA 공부 일지' 카테고리의 다른 글

자바, final 클래스와 final 메서드  (0) 2021.04.08
자바, 메서드 재정의  (0) 2021.04.08
자바, 어노테이션(Annotation)  (0) 2021.04.07
자바, Getter와 Setter 메서드  (0) 2021.04.07
자바, 접근 제한자  (0) 2021.04.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
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 31
글 보관함