3층 1구역 - 개발의 장/JAVA

JAVA - 객체지향언어 추상클래스, 추상메서드 (2022-07-29)

상이태상 2022. 7. 31. 19:06

객체지향언어 중 상속 이란 것을 배웠었다.

간단하게 말하면 부모 클래스의 있는 내용을 자식클래스가 사용할 수 있게끔 해주는 것?

이 정도로 표현이 가능 할 것이다.

 

이 추상클래스,메서드는 더 나아가 부모클래스가 메서드를 정의 하지 않고,

부모를 상속받은 자식클래스가 부모의 메서드를 정의하게끔 해주는 것.

도면의 틀은 있지만 그 도면을 자식들이 채우게 하는 것이다.

 

좀 더 쉽게 다가가보자.

 

어떤 게임에서 필자가 전사 라는 직업을 선택했고, '무기'로 검을 받았다.

 

전사는 초기무기로 검을 '휘두를 수' 있지만

전직을 통해 무기를 창을 '휘두르고' , 둔기를 '휘두르고' , 카타나를 '휘두를 수' 있다.

 

여기서 공통점은? 무기를 휘두른다 가 공통점일 것이다.

즉, 휘두른다 는 공통된 액션이 메서드가 되어 추상클래스에 들어가게 되는 것이다.

 

다음 예시...

 

필자와 필자의 친구가 있다.

필자와 필자의 친구는 2개의 눈, 귀, 1개의 코 입을 갖고 있다.

필자는 눈이 작지만, 친구는 눈이 크고, 필자는 귓볼이 있지만 친구는 없다.

 

여기서 공통점은? 필자든, 친구든 일단 2개의 눈, 귀, 1개의 코 입을 갖고 있다는 것이다.

즉, 이 공통점이 추상메서드가 되는 것이다.

 

2.추상클래스,메서드는 왜 쓰는가?

 

개발자들에게 자동차를 만들어라. 라고 수주를 보냈다.

개발자들이 자동차를 만들 때 개발진 개개인 마다 생각하는 점이 다를거고,

 

극단적으로

어떤 개발자는 자동차에 바퀴없이 날 수 있는 자동차를 만들 수도 있고,

다른 개발자는 4개의 둥근 바퀴가 아니라 전차의 궤도를 달아 놓을 수 도 있다.

 

그래서 맘에 드는 자동차를 선택했는데 이 개발자가 도저히 못하겠다고 인수인계도 없이 그만 둬 버리고 말았다.

그럼 다른 개발자의 자동차를 선택해서 가져와야 하는데 이전에 만들었던 자동차와는 기능도 어디 생김새도 같은 곳이 하나도 없어 다시 구축해야만 한다.

 

하지만 공통적으로 정해진 것 자동차에는 바퀴가 4개있다, 기어는 오토이고, 트렁크가 있다 등등

자동차에 공통된 메서드가 존재한다면 그 부분들의 구현부와 부가적인 것만 수정하면 된다.

 

즉, 통일성과 유지보수가 편하다는 것.

 

추상클래스를 상속받아 실체클래스를 구현하는 실무현장

 

 

3. 추상클래스는 어떻게 사용하는가?

 

public abstract class 클래스명 {
	
}

클래스명을 표시 할땐 abstract를 붙여서 위와 같이 사용할 수 있다.

 

예제를 통해 알아보자.

 

4.예제

 

package inheritance5;

// 추상클래스 : 추상메서드를 가지고 있는 클래스
public abstract class Parent {
	public void method01() {
		System.out.println("Parent method01");
	}
	
	public void method02() {
		System.out.println("Parent method02");
	}
	
	//추상메서드 : 구현 내용은 자식에게 넘김
	public abstract void method03(); 
}

위와 같이 부모 클래스는 method03이란 값을 갖고 있지만 추상메서드로 실체메서드 내용을 존재 하지 않는다.

즉, 추상메서드의 내용을 자식들에게 넘겨 주는 것.

 

(그리고 따로 보이진 않지만 부모클래스의 method02 또한 자식 클래스에서 오버라이딩되어 재정의 되어지고 있다.)

package inheritance5;

public class Child1 extends Parent{
	
	public void method02() {
		System.out.println("Child1 method02");
	}
	public void method03() {
		System.out.println("Child1 method03");
	}
}

추상메서드를 받아온 child1은 System.out.println("Child1 method03");으로 method03을 정의하고

package inheritance5;

public class Child2 extends Parent{
	public void method02() {
		System.out.println("Child2 method02");
	}
	public void method03() {
		System.out.println("Child2 method03");
	}
}

추상메서드를 받아온 child2는 System.out.println("Child2 method03");으로 method03을 정의하고 있다.

 

		parentPrint(new Child1());
		parentPrint(new Child2());
        
        public static void parentPrint(Parent p) {
		System.out.println("\nparentPrint");
		p.method01();
		p.method02();
		p.method03();
	}

그래서 위와 코드 같이 parentPrint가 Child1를 새로 선언 받아 Parent p부분에 들어가며

 

결과

parentPrint
Parent method01
Child1 method02
Child1 method03

 

마찬가지로 parentPrint가 Child2를 새로 선언 받아 Parent p부분에 들어가며

 

결과

parentPrint
Parent method01
Child2 method02
Child2 method03