본문 바로가기

Programming/JAVA

상속(1) - 상속의 기본 개념

java logo image

 

 

상속(Inheritance)은 객체 지향 프로그램 언어에서 부모(상위) 클래스를 상속한 자식(하위, 파생) 클래스를 생성하여 부모 클래스의 필드나 메서드를 그대로 사용하는 성질을 의미합니다. 기존에 개발되어 있는 클래스를 재사용함으로써 코드의 중복을 줄여줄 수 있고, 유지보수 리소스를 최소화할 수 있게 되죠. 부모 클래스를 수정하게 되면 자동으로 자식 클래스에서 상속받아 사용하고 있는 메서드 등도 자동으로 수정이 되는 효과를 누리게 되니까요.

 

물론 접근 제한자에 따라서 모든 요소들이 무조건 상속되지는 않습니다. 기본적으로 private속성을 갖는 필드와 메서드는 해당 클래스에서만 사용하는 것이기 때문에 자식 클래스에 상속이 되지 않습니다. 또한, default속성일 경우에는 자식 클래스라고 하더라도 패키지가 다르면 상속 대상이 아닙니다. 

 

 


 

 

그럼 이제 가장 기본적인 상속 형태에 대해서 알아보도록 하겠습니다. 혹시라도 '상속'이라는 일상 단어 때문에 착각하는 경우도 있을 수 있겠지만, 상속을 할지 여부는 자식 클래스에서 설정하게 됩니다. 기본적인 클래스 상속 형태는 아래와 같습니다.

 

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

class Genesis extends HyundaiCars{

}

 

여기서 가장 중요한 것은 키워드 extends입니다. 해당하는 자식 클래스가, extends 키워드를 이용해서 본인이 상속할 부모 클래스를 기술하여 선언하게 됩니다. 단, 중요한 것은 JAVA에서는 다중 상속을 허용하지 않습니다. 그러므로, 한 클래스의 부모 클래스는 한 개만 올 수 있다는 사실을 기억해야 합니다.

 

아래 예제를 통해서 상속의 기본적인 형태와 동작을 살펴보겠습니다. 여기서는 부모 클래스인 Galaxy와 이를 상속하는 자식 클래스인 GalaxySultra를 선언하여 간단한 실행 동작을 만들어 보겠습니다. 

 

public class Galaxy {
	//field
	String modelName;
	String color;
	
	//constructor
	
	//method
	void powerOn() { System.out.println("POWER ON"); }
	void powerOff() { System.out.println("POWER OFF"); }
	void bell() { System.out.println("SOUND RINGING"); }
	void sendMsg(String msg) { System.out.println("ME: " + msg); }
	void receiveMsg(String msg) { System.out.println("YOU: " + msg); }
	void closeApp() { System.out.println("EXIT"); }
}

 

 

public class GalaxySultra extends Galaxy {
	
	int serialNum;
	
	//constructor
	GalaxySultra(String modelName, String color, int serialNum) {
		this.modelName = modelName;
		this.color = color;
		this.serialNum = serialNum;
	}
	
	//method
	void checkSerial() {
		System.out.println("시리얼 넘버는 : " + serialNum + "입니다.");
	}
	
	void changeSerial(int serialNum) {
		this.serialNum = serialNum;
		System.out.println("시리얼 넘버가 " + serialNum + "으로 바뀌었습니다.");
	}
	
	void stopSettings() {
		System.out.println("설정을 종료합니다.");
	}
}

 

 

public class ExampleMain {
	
	public static void main(String[] args) {
		GalaxySultra galaxy = new GalaxySultra("Ultra30", "Space Grey", 8765623);
		
        //method from class Galaxy
		System.out.println("모델명: " + galaxy.modelName);
		System.out.println("색상: " + galaxy.color);
		
        //method from class GalaxySultra
		System.out.println("시리얼 넘버: " + galaxy.serialNum);
		
		galaxy.powerOn();
		galaxy.bell();
		galaxy.sendMsg("HELLO!!");
		galaxy.receiveMsg("It's been a long time!");
		galaxy.closeApp();
		
		galaxy.checkSerial();
		galaxy.changeSerial(9877654);
		galaxy.checkSerial();
		galaxy.stopSettings();
	}
}

/* 출력
모델명: Ultra30
색상: Space Grey
시리얼 넘버: 8765623
POWER ON
SOUND RINGING
ME: HELLO!!
YOU: It's been a long time!
EXIT
시리얼 넘버는 : 8765623입니다.
시리얼 넘버가 9877654으로 바뀌었습니다.
시리얼 넘버는 : 9877654입니다.
설정을 종료합니다.
*/