티스토리 뷰

많은 사람들이 왜 써야되는지 모르겠는 용어가 있다.

바로 abstract 이다.

abstract에 대해 먼저 알아보자.

 

1. class 내에 abstract 키워드가 하나라도 있으면 class에 abstract가 붙어야 한다.

2. abstract class 는 그자체를 instance (오브젝트) 화 할수 없다.

 

public class AbstractTest {
public static void main(String args[])
{
 Test t = new Child();
 t.func();
 t.func2();
}

}
abstract class Test
{
 public abstract void func();
 public void func2()
 {
  System.out.println("I'm not abstract method");
 }
}
class Child extends Test
{
 public void func()
 {
  System.out.println("I'm abstract method");
 }
}

 

Test라는 class는 abstract method 를 가지고 있다. 그리고 일반적인 method도 가지고있다.

그러나 , abstract를 하나라도 갖고있으면 class 앞에 abstract를 붙여야 한다.

또 , abstract class는 instance (오브젝트) 화 할수 없으므로 Child class 가 상속받아  그것을 instance로 만들고 있다.

이제 다시 안을 보자.

func() 는 선언은 Test에서 되고 정의는 Child 안에서 정의 되었다.

이처럼 abstract로 생성된 메소드는 상속받는 자식 class 내에서 재정의 해서 써야만 한다.

 

왜이렇게 복잡한 방법을 쓰는 것일까?
그냥 Test class 내에 기능을 다 만들어놓으면 되는게 아닌가?

 

그 이유는 자바의 장점중 하나인 재사용성 에 있다.

 

내가만약 도형을 그리는 스크립트를 짠다고 하자.

도형 class를 만들어 기초를 만들어 놓는다. ( abstract draw() 생성 )

그리고 ,  사각형 class , 삼각형 class 가 도형 class를 상속 받아  draw()를 재정의해서 사용한다.

다른 곳에서 사각형 class만 필요하다.  그렇다면 그곳에서 사각형 class를 다시 사용할 수 있다. 

 

위의 예는 자바의 장점인 재사용성을 살린 예제 라고 볼수있다.

사각형 class와 삼각형 class는 도형 class의 부품이라고 생각할 수있다.

이 부품을 필요하다면 다른곳에 끼워맞출 수도 있다.

이점을 이용하여 스크립트를 작성한다면 객체지향언어를 제대로 이용하고 있다고 볼수도 있다.

또 , 부품처럼 따로 따로 만들어 놓으므로 한곳이 고장나면 고치기도 쉽다.

 

 

또다른 장점으로는 다중상속의 구현이다 .

extends 를 통한 상속은 단일상속이었다.

이제 abstract와 관련된 키워드 interface를 통해 implements 해서 다중상속을 구현할 수있다.

 

public class InterfaceTest {
public static void main(String args[])
{
Test t = new Child();
t.x = 1;  // error 발생
}

}
interface Test
{
 int x = 0 ;
 public void func();
}
class Child implements Test
{
 public void func()
 {
  System.out.println("I'm abstract method");
 }
}

 

위 스크립트는 error가 발생한다.

interface class 내에서 선언되는 변수는 자동적으로 static final 키워드를 달고 나온다고 생각해도 된다.

final 변수는 변수를 상수로 만드므로 그것을 바꿀수 없다. 그러므로 error가 발생하는 것이다.

 

이제 다중상속을 해보자.

 

public class InterfaceTest {
public static void main(String args[])
{
Child c= new Child();
c.func();
c.func2();
}

}
interface Test
{
 public void func();
}
interface Test2
{
 public void func2();
}
class Child implements Test , Test2  // 다중상속 부분
{
 public void func()
 {
  System.out.println("I'm a Test's method");
 }
 public void func2()
 {
  System.out.println("I'm a Test2's method");
 }
}

 

 

interface class 는 abstract 메소드만 가지고 있는 class 이다.

그러므로 그안의 메소드는 모두 abstract 여야만 한다.

그렇기에 public void func() 는 자동적으로 abstract method가 된다.

 

 

이번 글에서 배운 키워드를 이용한다면 뛰어난 객체지향 프로그램을 만들수 있을것이다.

또 , 여러모로 편리할 것이다.

 

 

댓글
댓글쓰기 폼