Java(10) - 오버라이드, super

JeJune Lee·2021년 8월 16일
0

Java

목록 보기
10/18

오버라이드

앞의 글에서 살펴봤듯이 오버라이드는 부모 클래스의 메소드를 재정의 하는 것이다. 자식 클래스가 부모 클래스를 상속하여 자식한테 없는 메소드를 호출하면 부모클래스에 가서 해당 메소드를 찾게 된다. 만약 부모 클래스의 메소드를 자식클래스에서 동일한 이름으로 다시 재정의 하면 부모클래의 메소드를 찾지 않고 자식 클래스의 메소드를 호출하게 된다. 이것을 오버라이드(재정의)라고 한다.

바로 예제로 가보자!

HeadQuarterStore.java

package com.javalec.store;

public class HeadQuarterStore {
	
	public HeadQuarterStore() {
		
	}
		
	public void orderKimChijjige() {
		System.out.println("5,000원 입니다.");
	}
	
	public void orderBuDaejjige() {
		System.out.println("6,000원 입니다.");
	}
	
	public void orderBiBimbap() {
		System.out.println("6,000원 입니다.");
	}
	
	public void orderSunDaeguk() {
		System.out.println("5,000원 입니다.");
	}
	
	public void orderGongGibap() {
		System.out.println("1,000원 입니다.");
	}
	
}

먼저 본사에서 가격을 설정하고 그 뒤에 각각 지역에 따라 가격을 변화 시킬 것이다.
위는 미리 본사에서 정한 가격이다. 이것을 상속 받아 오버라이드 해보자!

StoreNum1.java

package com.javalec.store;

public class StoreNum1 extends HeadQuarterStore {
	
	public StoreNum1() {
	}
	
	@Override
	public void orderKimChijjige() {
		System.out.println("4,500원 입니다.");
	}
	
	@Override
	public void orderBuDaejjige() {
		System.out.println("5,000원 입니다.");
	}
	
	@Override
	public void orderSunDaeguk() {
		System.out.println("판매 하지 않습니다.");
	}
	
}

첫 번째 스토어는 3가지 메뉴의 가격을 설정하였다.

StoreNum2.java

package com.javalec.store;

public class StoreNum2 extends HeadQuarterStore {
	
	public StoreNum2() {
	}
	
	@Override
	public void orderBuDaejjige() {
		System.out.println("5,000원 입니다.");
	}
	
	@Override
	public void orderBiBimbap() {
		System.out.println("5,000원 입니다.");
	}
	
	@Override
	public void orderSunDaeguk() {
		System.out.println("4,000원 입니다.");
	}
	
	@Override
	public void orderGongGibap() {
		System.out.println("무료 입니다.");
	}
	
}

두 번째 스토어는 4가지 메뉴를 수정하였다.

StoreNum3.java

package com.javalec.store;

public class StoreNum3 extends HeadQuarterStore {
	
	public StoreNum3() {
	}
	
	@Override
	public void orderKimChijjige() {
		System.out.println("6,000원 입니다.");
	}
	
	@Override
	public void orderBuDaejjige() {
		System.out.println("7,000원 입니다.");
	}
	
	@Override
	public void orderBiBimbap() {
		System.out.println("7,000원 입니다.");
	}
	
	@Override
	public void orderSunDaeguk() {
		System.out.println("6,000원 입니다.");
	}
	
}

세 번째 스토어는 4가지의 메뉴를 수정했다. 이제 메인 클래스를 보자!

MainCalss.java

package com.javalec.store;

public class MainClass {

	public static void main(String[] args) {
		
		HeadQuarterStore store1 = new StoreNum1();
		store1.orderKimChijjige();
		store1.orderBuDaejjige();
		store1.orderBiBimbap();
		store1.orderSunDaeguk();
		store1.orderGongGibap();
		
		System.out.println();
		
		HeadQuarterStore store2 = new StoreNum2();
		store2.orderKimChijjige();
		store2.orderBuDaejjige();
		store2.orderBiBimbap();
		store2.orderSunDaeguk();
		store2.orderGongGibap();
		
		System.out.println();
		
		HeadQuarterStore store3 = new StoreNum3();
		store3.orderKimChijjige();
		store3.orderBuDaejjige();
		store3.orderBiBimbap();
		store3.orderSunDaeguk();
		store3.orderGongGibap();
		
	}
	
}

객체를 생성한 다음 각각 메소드를 호출해주면 된다. 그리고 객체를 생성할 때 상속 받고 있는 부모 클래스를 선언할 때 사용할 수 있다!!!

4,500원 입니다.
5,000원 입니다.
6,000원 입니다.
판매 하지 않습니다.

1,000원 입니다.
5,000원 입니다.
5,000원 입니다.
5,000원 입니다.
4,000원 입니다.
무료 입니다.

6,000원 입니다.
7,000원 입니다.
7,000원 입니다.
6,000원 입니다.
1,000원 입니다.

override의 장점은 잘 만들어진 클래스를 상속받아 일부 메소드를 수정(재정의) 할 수 있다는 것이다. 하지만, 자식클래스에서 부모클래스를 override하면 부모클래스의 메소드는 사용할 수가 없다. 이것이 override의 단점이라고 할 수 있다. 자식 클래스에서 부모클래스의 메소드를 사용하고자 할 때 super키워드를 사용 한다.

예제를 보자!

super

ParentClass.java

package com.javalec.superex;

public class ParentClass {
	
	public ParentClass() {
		System.out.println("ParentClass");
	}
	
	
	public void method() {
		System.out.println("부모 클래스의 method() 입니다.");
	}
}

그냥 간단하게 메소드를 정의해줬다.

ChildClass.java

package com.javalec.superex;

public class ChildClass extends ParentClass {
	
	public ChildClass() {
		System.out.println("ChildClass");
		super.method();
		this.method();
	}
	
	@Override
	public void method() {
		super.method();
		
		System.out.println("부모 클래스의 method()를 실행 하고, 자식 클래스의 나머지 작업을 합니다.");
	}
}

실행할 때 childClass를 찍게 하고 부모 클래스의 메소드를 사용할 수 있게 super로 불러왔다. 그리고 그 메소드를 재정의 해서 출력될 때 저 출력문도 같이 출력되게 했다. 메인 클래스를 보고 실행해보자.

MainClass.java

package com.javalec.superex;

public class MainClass {
	public static void main(String[] args) {
		
		ChildClass childClass = new ChildClass();
		childClass.method();
		
	}
}

그냥 객체를 생성해주고 메소드를 실행하면 된다.

출력

ParentClass
ChildClass
부모 클래스의 method() 입니다.
부모 클래스의 method() 입니다.
부모 클래스의 method()를 실행 하고, 자식 클래스의 나머지 작업을 합니다.
부모 클래스의 method() 입니다.
부모 클래스의 method()를 실행 하고, 자식 클래스의 나머지 작업을 합니다.

이처럼 부모클래스를 상속 받고 super를 통해 부모 클래스의 메소드를 가져와 실행할 수 있다!

오늘은 여기까지...

오늘은 상속 개념과 super 개념을 정리해보았다. 이제 슬슬 객체지향의 힘이 들어나는 것 같다~

profile
Being Server developer

0개의 댓글