자바(Java)/JAVA 2SE

추상클래스와 인터페이스의 사용

본클라쓰 2010. 11. 29. 16:06

 객체 지향 프로그래밍 언어에서 클래스의 상속과 구현은 핵심적인 부분이다. 객체는 속성과 메소드로 구성되어 있다. 객체란 사물을 대표하며 사물을 공통된 분류에서 세부화시켜 분류할 수 있다. 예를 들면, 가축은 소, 돼지, 개 등이 있는 것처럼 가축 하위에 소, 돼지, 개 등을 세부화 시킬 수 있다.

 

 객체 지향 언어에서는 이런 상속과 구현을 위한 방법으로 직접 상속하는 방법과 추상 클래스와 인터페이스를 통한 구현하는 방법을 제공한다. 즉, 공통된 성질을 하나의 클래스(추상클래스, 인터페이스)에 작성하고 개별적인 내용은 구현을 통해 세부적인 객체를 작성하는 것이 가능하다. 또한, 구현된 클래스들은 최상위 클래스(추상클래스, 인터페이스)를 통해 접근이 가능하다.

 

 일반적으로 상속은 닫혀 있는 구현이다. 즉 클래스를 확장하는 것은 가능하나 개별적인 특성을 표현하기에는 부족하다. 기능을 확장할 때는 상속을 통해 객체를 구성하고 개별적인 특성을 객체에 부여하고 싶다면 추상 클래스와 인터페이스를 통해 구현한다. 따라서 추상클래스와 인터페이스를 사용하면 확장에 열려 있는 구현이 가능하다.

 

 

 

■ 추상 클래스(Abstract Class)


 자바의 추상 클래스는 객체지향 언어의 중요한 개념이다. 추상 클래스란 "abstract" 키워드를 사용하여 작성한 클래스로서 하위 클래스에서 반드시 구현해야 되는 메소드들을 포함하고 있는 클래스 이다.

 

abstract 클래스 {

 

    // 한개 이상의 추상 메소드를 반드시 포함해야 합니다.


    public 메소드();


}

[예제] 추상클래스 기본 형태

 

 추상 클래스의 특징은 속성과 메소드를 가진 클래스로 하나 이상의 추상 메소드를 포함한 클래스이며 클래스 선언은 'abstract'로 되어 있는 클래스를 말한다. 추상 클래스로 선언된 클래스는 직접 객체를 생성해서 사용할 수 없다. 추상 클래스를 상속받아 구현한 하위 클래스만 메모리에 올려 사용할 수 있는 객체가 되는 것이다.


 추상 메소드란 선언만 되어 있고 구현부분은 생략된 메소드를 말한다. 추상 클래스를 사용하는 이유는 공통적인 부분은 미리 구현한 추상클래스에서 가지고 있고 각각의 특성에 따라 변할 수 있는 부분은 선언만 메소드를 통해 구현하여 추상 클래스를 통해 접근할 수 있는 방법을 제공하기 때문이다. (다형성을 가질 수 있는 클래스 설계가 가능해짐) 즉, 추상 클래스는 기능이 무엇(what)인지만 정의하고 어떻게(how)구현되는지는 정의하지 않는 클래스이다. 추상 클래스를 구현할 때는 상속키워드('extends') 를 사용하여 구현한다.  

 

 

 

■ 인터페이스(interface)

 

 인터페이스는 상수(static final)와 메소드 선언들의 집합이다. 인터페이스는 추상 클래스보다 더욱 완벽한 추상화를 제공한다. 추상 클래스는 추상 메소드외에 다른 멤버 변수나 일반 메소드를 가질 수 있지만, 인터페이스는 추상 메소드와 상수만 가질 수 있다. 즉 인터페이스는 추상 메소드와 상수만으로 구성된 추상 클래스라 할 수 있다.

 

 인터페이스를 사용하는 이유는 자바에서는 다중상속(multiple inheritance)을 지원하지 않아서 인터페이스를 사용하여 다중 상속처럼 클래스를 설계하고 또한 인터페이스를 통한 구현은 변화에 열려 있는 코드가 되는 장점을 가지고 있기 때문에 사용한다.

 

 인터페이스와 추상클래스(abstract)는 공통적으로 자식 클래스에게 상속됨으로서 사용이 가능하며 자식 클래스에게 자신의 추상 메소드를 구현하도록 강제한다. 즉, 자식 클래스들은 공통된 이름의 메서드를 가지게 되는 것이다. 추상 클래스는 구현된 메소드와 구현되지 않는 메서드를 둘 다 가질 수 있지만 인터페이스는 메소드에 대해 정의만 할 수 있지 구현된 메서드는 포함 시킬 수 없다.

 

  

※ 사용시 주의점


 추상 클래스와 인터페이스 클래스는 인스턴스(객체)를 생성할 수 없다. 객체를 생성할 수 없는 이유는 간단하다. 객체란 실제 메모리에 올려져서 코드를 수행하는 클래스를 말한다. 하지만 추상 클래스와 인터페이스는 구현 부분이 생략되어 있기 때문에 직접 객체를 생성해도 수행할 부분이 없다. 이런 이유로 실제적으로 메모리에 올려져서 객체가 생성된다 해도 실행할 부분이 없기 때문에 실익이 없다. 이렇기에 추상 클래스와 인터페이스 클래스는 객체를 생성할 수 없다.

 

 하지만 추상 클래스와 인터페이스는 다형성을 지원하는 중요한 개념이다. 공통부분을 가지고 있는 추상 클래스와 인터페이스를 통해 각기 다르게 구현된 메소드를 같은 방식으로 사용할 수 있기 때문이다. 즉, 구현이 어떻게 되어 있는지 신경 쓸 필요 없이 클래스를 사용할 때는 같은 방법으로 사용할 수 있다는 편리성을 제공한다.

 

 예를 들어 A라는 추상클래스에 a()라는 추상 메소드가 있다면 A라는 추상 클래스를 상속받아 A-1, A-2 클래스에 a() 추상 메소드를 구현했다면 생성에만 해당 클래스를 선언하면 A.a() 메소드 사용이 가능하다는 점이다.

 

A a = new A-1();

a.a();

 

A a = new A-2();

a.a();

 

'자바(Java) > JAVA 2SE' 카테고리의 다른 글

자바의 데이터형 변환  (0) 2010.11.29
자바의 변수와 데이터 타입  (0) 2010.11.29
다형성(Polymorphism)이란?  (0) 2010.11.29
캡슐화(Encapsulation)란?  (0) 2010.11.29
상속(Inheritance) 이란?  (0) 2010.11.29