추상클래스(abstract Class)

Posted by ITPangPang
2016. 4. 15. 01:01 Java/Java 알아두면 좋은것


[자바]추상클래스(abstract Class) 사용


 

추상클래스

이름에도 나와있듯이 abstract의 사전적 의미는 "추상적인" 입니다.

이름 그대로 추상적인 클래스입니다.

 

사용하기 전에 추상적인 이란 느낌을 모르시는분들을 위해 설명해보자면

추(抽) : 뽑을 추

          -> 추출

상(象) : 코끼리 상

           -> 코끼리의 의미일수도 있지만 깊게 파고들면 象< 이 한자는 코끼리를

               형상을 본따 만든것입니다. 상형문자이죠.

               다른 의미로 비슷하다, 같다, 추측하다, 유추하다 라는 뜻들이 있습니다.

 

합쳐서 생각하면 비슷하거나 같은것을 추출하다 입니다

 

또는,

추 : 측하다, 출하다

상 : 상하다

라고 풀이해서 추측하고 상상을 통해서 공통된것을 추출하다 라고도 많이 쓰입니다

    

대충 단어 의미를 알겠고

예를 통해서 비슷하거나 같은 것을(공통된것)을 추출(뽑아)해보겠습니다

음.. 보통 동물들을 많이 하는데 .. 저는.. 사람으로 해보겠습니다.

 

사람을 분류?? 분류라는 말이 적절할지는 모르겠지만 해보자면 끝없이 가능합니다

남자, 여자, 할머니, 할아버지, 어린이, 10세이상, 청소년, 미성년자 등등

어쨋든 공통점은 사람이라는 점입니다.

이것을 프로그래밍에서 추상클래스로 나타내보면


abstract class Person{}


으로 나타낼수 있겠네요

 

그리고 남자든 여자든 할머니든 할아버지든 사람이라면 공통적으로 하는

행동들이 있습니다. 역시 추상의 과정을 통해서 뽑아내자면

밥 먹는 것, 잠자는 것, 숨을 쉬는 것 등 여러가지 공통행동이 있습니다.

이것도 한번 프로그래밍적으로 나타내보겠습니다


abstract class Person
{
	abstract void eatRice();
	abstract void sleep();
	abstract void breathe();
}


으로 나타낼 수 있겠네요.

메서드 안에 내용을 채우지 않는 이유는 당연히 밥을 먹는다는 것을 같지만

세부적인 내용을 같을수가 없습니다.

사람마다 고기를 먹을수도, 비빔밥을 먹을수는 있지만

모든 사람들이 고기만 먹고 비빔밥만 먹을수는 없으니까요.

 

이제 사람의 전체공통행동을 알아봤으면 분류를 해서 세부적으로 표현해주면 됩니다

여자인 민지는 비빔밥을 먹고, 낮잠을 자고, 한숨을 쉬고있네요.

남자인 민호는 콩밥을 먹고, 새우잠을 자고, 깊은숨을 쉬고있네요.

 

이것을 프로그래밍으로 나타내보겠습니다.


abstract class Person
{
	abstract void eatRice();
	abstract void sleep();
	abstract void breathe();
}

class Woman extends Person
{
	@Override
	void eatRice() 
	{
		System.out.println("민지가 비빔밥을 먹다");		
	}

	@Override
	void sleep() 
	{
		System.out.println("민지가 낮잠을 자다");	
	}

	@Override
	void breathe() 
	{
		System.out.println("민지가 한숨을 쉬다");
	}
}

class Man extends Person
{
	@Override
	void eatRice() 
	{
		System.out.println("민호가 콩밥을 먹다");
	}

	@Override
	void sleep() 
	{
		System.out.println("민호가 새우잠을 자다");
	}

	@Override
	void breathe() 
	{
		System.out.println("민호가 깊은숨을 쉬다");
	}
}

public class ManAndWoman 
{
	public static void main(String[] args) 
	{	
		Woman minji = new Woman();
		Man minho = new Man();
		
		minji.eatRice();
		minji.sleep();
		minji.breathe();
		
		minho.eatRice();
		minho.sleep();
		minho.breathe();
	}
}




몇가지 알아둬야 할점은 추상클래스에서 정의한 추상메서드들은

SubClass에서 무조건 전부 재정의해야 한다는 것은 알아둬야 합니다.

하지만 메인에서 무조건 호출해야하는 것은 아닙니다.

재정의하는것만 전부 해줘야하고, 메인에서는 필요한것만 쓰면 됩니다

minji.eatRice();

minho.sleep();

이렇게 6개 전부 안쓰고 2개만 써도 된다는 의미입니다.

 

그리고 추상클래스에서 추상메서드가 아닌 일반메서드도 정의가 가능합니다.

일반메서드는 SubClass에서 필수적으로 재정의 할 필요가 없으며,

필요에 따라서 오버라이드해서 재정의하면 됩니다.

 

 

 

이것으로 추상클래스의 기본적인 개념을 알아보았습니다.

결국 추상클래스를 사용하는 이유는 프로젝트가 커졌을때

다른 개발자들과의 공유를 효율적으로 하기 위해서 입니다.

추상클래스를 사용하면 공통된 메서드를 사용하므로 일관성 있는 프로그램을

작성할 수 있습니다.

 

지금까지 계속 배워온 상속이든 오버로딩, 오버라이딩등

자바에서 기본적인 개념을 사용해야 하는 이유는

결국 객체지향적이고 효율적인 프로그래밍을 만들기 위해서입니다