본문 바로가기

자바

자바 프로그래밍 - 상속 개념

상속


  자식 클래스가 부모 클래스의 기능을 그대로 물려받을 수 있는 상속(inheritance) 기능이 있다. 상속을 아래와 같이 구현된다.

>>> // 부모 클래스
>>> class Launch {
>>> 	String menu;
>>> 	
>>> 	void setMenu(String menu) {
>>> 		this.menu = menu;
>>> 	}
>>> }
>>>
>>> // 자식 클래스
>>> class Hamburger extends Launch {
>>> 	void eatBurger() {
>>> 		System.out.println("점심으로 " + menu + "먹었다.");
>>> 	}
>>> }

  클래스 상속을 위해서 자식 클래스에 "extends 부모 클래스 이름" 키워드를 사용한다. 또한 부모 클래스에 없는 eatBurger 메소드를 추가하여 자식 클래스에서 기능을 확장시킬 수도 있다.

 

 

상속 기능을 사용하는 이유


1. 코드 재사용

  이미 작성된 클래스의 기능을 재사용할 수 있다. 이로 인해 코드의 중복을 줄이고 개발 시간을 단축시킨다.

2. 유지 보수

  코드를 수정하거나 업데이트할 일이 생길 때 부모 클래스만 변경 사항을 수정해주면 자식 클래스는 자동으로 수정되기에 유지 보수에 이점이 있다.

 

 

IS-A 관계(상속 관계)


  Hamburger 클래스는 Launch 클래스를 상속했으므로 Hamburger는 Launch의 하위 개념이라고 할 수 있다. 하위 개념이라 하면 Hamburger가 Launch에 포함되기 때문에 'Hamburger는 Launch이다' 라고 표현이 가능하다.

  그렇다면 이를 코딩으로 확인해 보자.

>>> Launch bigMac = new Hamburger(); // 정상 작동

  Hamburger는 Launch에 포함되므로 이 코드는 오류 없이 컴파일 된다. 하지만 Hamburger 내에 메서드는 사용할 수 없다. 틀린 경우도 확인해 보자.

>>> Hamburger bigMac = new Launch(); // 컴파일 오류

  이 코드를 말로 풀이하면 'Launch 객체는 Hamburger 자료형이다'로 해석된다. 하지만 Hamburger는 점심 메뉴의 일종인 하위 개념이기에 코드를 실행하면 컴파일 오류가 나게 된다.

 

 

메서드 오버라이딩


  부모 클래스의 메서드를 자식 클래스가 동일한 형태로 구현하는 행위를 메서드 오버라이딩(메서드 덮어쓰기)라고 한다.  

예시로 Hamburger 클래스를 더 구체화해 보겠다.

>>> // 부모 클래스
>>> class Launch {
>>> 	String menu;
>>> 	void setMenu(String menu) {
>>> 		this.menu = menu;
>>> 	}
>>> }
>>>
>>> // 자식 클래스
>>> class Hamburger extends Launch {
>>> 	void eatBurger() {
>>> 		System.out.println("점심으로 " + menu + "먹었다.");
>>> 	}
>>>
>>> 	void eatBurger(int price) { // 오버라이딩
>>> 		System.out.println("점심으로 " + price + "원을 써서 "+ menu + "먹었다.");
>>> 	}
>>> }

아래는 출력 결과이다.

>>> Hamburger burger = new Hamburger();
>>> burger.setMenu = bigMac;
>>> burger.eatBurger();
>>> burger.eatBurger(7900);

점심으로 bigMac먹었다.
점심으로 7900원을 써서 bigMac먹었다.

  입력값이 다른 경우 동일한 이름의 메서드라도 다른 기능을 할 수 있게 만들 수 있다.

 

 

 

(이 글은 위키독스 점프 투 자바와 chatgpt를 참고하였습니다)