Programming/Java

8. 상속

주죵 2021. 1. 4. 23:39
728x90
반응형
package com.javalec.chain;

public class OfficeStore extends HeadQuarterStore {
	public OfficeStore() {
		// TODO Auto-generated constructor stub
	}
	@Override
	public void Kimichisoup() {
		// TODO Auto-generated method stub
		System.out.println("김치찌개 6000원");
	}
	@Override
	public void Budaesoup() {
		// TODO Auto-generated method stub
		System.out.println("부대찌개 7000원");
	}
	@Override
	public void Bibimbab() {
		// TODO Auto-generated method stub
		System.out.println("비빔밥 7000원");
	}
	@Override
	public void Sundaesoup() {
		// TODO Auto-generated method stub
		System.out.println("순대국 6000원");
	}

}

상속이란?

프로그래밍에서의 상속은 어떤 객체가 다른 객체로부터 객체의 데이터(속성)와 메소드를 상속받는 것이다.

이 경우 상속받은 객체는 상속해준 객체의 데이터 및 메소드를 이용 및 변경할 수 있다.

따라서 기존의 좋은 클래스를 만들어 놓으면 상속을 통해 개발시간 단축과 효율적인 프로그래밍이 가능하다.

 

상속이 필요한 이유

항상 맨땅에 헤딩할 수는 없다. 지름길이 있다면 쉽게가자!

상속이 필요한 이유는 크게 두가지이다.

 

1) 모든 개발을 처음부터 할필요가 없다!

이미 잘 만들어놓은 프로그램이 있다면 상속을 통해 빠른 결과물을 만들 수 있고, 검증이 잘 되어있어 버그의 가능성도 낮다

 

2) 추상화가 가능하다!

다양한 객체를 상속을 통해 하나의 객체로 묶을 수 있다.

A, B, C 클래스가 모두 S클래스를 상속받는다고 해보자. 이 경우 A, B, C클래스를 S라는 클래스로 상속을 통해 하나로 통일시켜 생각할 수 있다.

 

상속 문법의 이해

자바에선 extends를 이용해 상속으 받을 수 있다. 그러나 다중상속은 지원하지 않는다.

아주 기초적인 예제를 살펴보자


package com.javalec.inheritance;

public class ParentClass {
	public String pStr = "부모 클래스";
	public ParentClass() {
		// TODO Auto-generated constructor stub
	}
	public void getPapaName() {
		System.out.println("홍길동");
	}
	public void getMamaName() {
		System.out.println("김길자");
	}

}
package com.javalec.inheritance;
//ChildClass 는 ParentClass를 상속받는다
public class ChildClass extends ParentClass {
	public ChildClass() {
		// TODO Auto-generated constructor stub
	}

}
package com.javalec.inheritance;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ChildClass childclass = new ChildClass();
		System.out.println(childclass.pStr);
		childclass.getPapaName();
		childclass.getMamaName();

	}

}

 

ChildClass는 ParentClass를 상속받고 있기 때문에, MainClass에서 ChildClass객체를 생성했을때 ParentClass의 메소드를 사용 가능하다. 또한 ParentClass의 변수인 pStr에도 접근이 가능하다.

 


Override(오버라이드)

부모클래스의 메소드를 재정의하는 경우를 오버라이드라고 한다. 예시를 확인해보자

package com.javalec.restaurant;

public class PapaMenu {
	public PapaMenu() {
		// TODO Auto-generated constructor stub
	}
	public void makeKimchi() {
		System.out.println("김치");
	}

	public void makeBulgogi() {
		System.out.println("불고기");
	}
}

 

package com.javalec.restaurant;

public class ChildMenu extends PapaMenu {
	public ChildMenu() {
		// TODO Auto-generated constructor stub
	}
    @Override
	public void makeKimchi() {
		System.out.println("아들의 더맛좋은 김치");
	}

}

 

ChildMenu는 아빠의 메뉴를 상속받았다. 하지만 아빠가 만드는 방법으로 만든 김치는 신세대 입맛엔 맞지 않다고 해보자. 

따라서, 아들의 메뉴에선 만드는 김치를 다른방법 혹은 더 나은 방법으로 재정의가 가능하다.

이처럼 상속받은 메소드를 재정의해서 사용하는 방법을 오버라이드라고 한다.

 

두번째 예시를 보자

대학가는 생략했다..

package com.javalec.chain;

public class HeadQuarterStore {
	public HeadQuarterStore() {
		// TODO Auto-generated constructor stub
	}
	
	public void Kimichisoup() {
		System.out.println("김치찌개 5000원");
	}
	public void Budaesoup() {
		System.out.println("부대찌개 6000");
	}
	public void Bibimbab() {
		System.out.println("비빔밥 6000원");
	}
	
	public void Sundaesoup() {
		System.out.println("순대국 5000원");
	}
	
	public void Rice() {
		System.out.println("공기밥 1000원");
	}

}

 

가장 상위의 class인 HeadQuater Class

 

package com.javalec.chain;

public class HouseStore extends HeadQuarterStore {
	public HouseStore() {
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public void Kimichisoup() {
		// TODO Auto-generated method stub
		System.out.println("김치찌개 4500원");
	}
	@Override
	public void Budaesoup() {
		// TODO Auto-generated method stub
		System.out.println("부대찌개 5000원");
	}

	@Override
	public void Sundaesoup() {
		// TODO Auto-generated method stub
		System.out.println("판매하지않습니다");
	}

}

 

HeadQuater를 상속받은 두 클래스이다.

 

package com.javalec.chain;

public class MainClass {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		HeadQuarterStore store1 = new HouseStore();
		store1.Kimichisoup();
		store1.Bibimbab();
		store1.Budaesoup();
		store1.Sundaesoup();
		store1.Rice();
		
		HeadQuarterStore store2 = new OfficeStore();
		store2.Kimichisoup();
		store2.Bibimbab();
		store2.Budaesoup();
		store2.Sundaesoup();
		store2.Rice();
		

	}

}

 

미안하다 이거보여주려고 어그로끌었다.. 는 장난이고

MainClass의 객체 store1 과 store2를 살펴보자.

여기서 store1과 store2는 변수의 타입이 HeadQuaterClass이다.

즉 store1과 store2는 각각 Office, House의 생성자로 만든 객체이지만 타입은 HeadQuarter로 통일시킬 수 있다.(추상화)

 

 

 

Super키워드

override의 장점은 잘 만들어진 클래스를 상속받아 일부 메소드를 재정의하는것이다.

하지만, 자식클래스에서 부모클래스를 override하면 부모클래스 메소드를 사용할수 없게되는 단점이 존재한다.

이때! 자식클래스에서 부모클래스의 메소드를 사용하고자 할때 super키워드를 사용한다.

@Override
	public void Sundaesoup() {
		// TODO Auto-generated method stub
		super.Sundaesoup();
		System.out.println("하지만 이곳의 순대국 6000원");
	}

여기서 Sundaesoup메소드는 override되어있지만 super.Sundaesoup();으로인해 부모클래스에 있는 메소드 실행한 후 다음 명령어를 실행하게 된다.

 

출처 : 신입 SW인력을 위한 실전 자바 (by 블스)

728x90

'Programming > Java' 카테고리의 다른 글

10. 인터페이스  (0) 2021.01.07
9. 추상클래스  (0) 2021.01.07
7. Static  (0) 2021.01.03
6. 패키지 및 접근제한  (0) 2021.01.03
5. 객체지향 프로그래밍  (0) 2021.01.03