본문 바로가기

Foundation/- Java

추상클래스, 인터페이스, 내부클래스

1. 추상클래스란? (abstract class)

 

- 클래서가 설계도라면 추상클래스는 '미완성 설계도'

- 추상메서드(미완성 메서드)를 포함하고 있는 클래스

- 완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.

- 다른 클래스를 작성하는 데 도움을 줄 목적으로 작성된다.

- 일반메서드가 추상메서드를 호출할 수 있다. ( 호출할 때 필요한 건 선언부 )

 

 

2. 추상메서드(abstract method)란?

- 선언부만 있고 구현부(몸통, body)가 없는 메서드

- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용

- 추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야한다.

(만약에 자손클래스에서 추상메서드의 구현부를 다 정의하지 않는다면 abstract를 붙여줘야 한다.)

 

 

▶ 추상 클래스와 추상메서드의 예시를 통해 알아보자.

unit 의 추상클래스는 move라는 추상메서드를 가지고 있다.

unit이라면 움직이는 기능이 있고, 필요하지만 unit의 자손인 Marine, Tank, Dropship은 모두 움직이는 것이 다르므로 추상메서드를 이용했다.

또 이렇게 공통적인 부분을 클래스로 묶어준다면, 다형성을 이용해서 순차적으로 접근할 수 있다는 장점이있다. 위의 예시를 다형성을 이용해 접근한다면 다음과 같다.

 

3. 인터페이스(interface)란?

- 일종의 추상클래스. 추상클래스보다 추상화 정도가 높다.

- 실제 구현된 것이 전혀 없는 기본 설계도.(알맹이 없는 껍데기)

- 추상메서드와 상수만들 멤버로 가질 수 있다.

- 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.

- 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.

 

3-1. 인터페이스의 작성

- 'class'대신 'interface'를 사용한다는 것 외에는 클래스 작성과 동일하다.

- 하지만, 구성요소(멤버)는 추상머세드와 상수만 가능하다.

- 모든 멤버변수는 public static final 이어야 하며, 모든 메서드는 public abstract이어야 하는데, 이둘은 생략이 가능하다.

 

3-2. 인터페이스의 상속

- 인터페이스도 클래스처럼 상속이 가능하다.(클래스와 달리 다중상속 허용)

- 인터페이스는 Object클래스와 같은 최고 조상이 없다.

위와같이 다중 상속을 할 수 있다. Fightable interface는 2개의 메서드를 갖게 된다.

 

3-3. 인터페이스 구현

- 인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다.

   다만, 'extends' 대신 구현이라는 뜻의 'implements'를 사용한다.

- 인터페이스에 정의된 추상메서드를 완성해야 한다.

- 상속과 구현이 동시에 가능하다.

위의 Fightable 을 구현해서 Fighter 클래스는 만들면 다음과같다. 만약에 move나 attact메서드 중 하나라도 추상메서드를 완성안해주면 Fighter클래스에 abstract를 붙여줘야한다. 그리고 interface의 모든 메서드는 public abstract가 생략되어있기 때문에 접근제어자를 그보다 좁은범위로 설정하면 안된다. 따라서 public을 붙이고 메서드를 완성 시켜야 한다.

 

3-4. 인터페이스를 이용한 다형성

- 인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.

- 인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.

- 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

 

위는 리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다. 그래서 그 해당 반환값을 다형성으로 위와 같이 이용할 수 있다.

 

3-5. 인터페이스의 장점

▶ 개발시간을 단출시킬 수 있다.

- 일단 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능하다. 메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문이다. 그리고 동시에 다른 한 쪽에서 인터페이스를 구한혀는 클래스를 작성하도록 하여, 인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고도 양쪽에서 동시에 개발을 진행할 수 있다.

 

▶ 표준화가 가능하다.

- 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능하다.

 

▶ 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.

- 서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어 줄 수 있다.

 

▶ 독릭적인 프로그래밍이 가능하다.

- 인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제구현에 독립적인 프로그램을 작성하는 것이 가능하다. 클래스와 클래스간에 직접적인 관계를 인터페이스를 이용해서 간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

 

 

3-6. 인터페이스의 이해

▶ 인터페이스는 두 대상 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.

- 선언과 구현을 분리시키는 것을 가능하게 한다.

 

▶ 인터페이스를 이해하려면 먼저 두 가지를 기억하자.

- 클래스를 사용하는 쪽(user)과 클래스를 제공하는 쪽 (provider)이 있다.

- 메서드를 사용(호출)하는 쪽(User)에서는 사용하려는 메서드(Provider)의 선언부만 알면 된다.

 

 

4-1. 내부 클래스

- 내부 클래스는 주로 GUI환경에서 많이 사용된다.

- 클래스 내에 선언된 클래스가 내부클래스다.

- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.

        (이와 반대는 불가능 한데, 내부 클래스의 객체를 만들어주면 접근이 가능하다.)

- 코드의 복잡성을 줄일 수 있다.

 

4-2. 내부 클래스의 종류와 특징

▶ 인스턴스 클래스 - 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언된다.

 

▶ 스태틱 클래스 - 외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어진다. 주로 외부 클래스의 static 멤버, 특히 static메서드에서 사용될 목적으로 선언된다.

 

▶ 지역 클래스 - 외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다.

 

▶ 익명 클래스 - 클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스(일회용)

 

 

'Foundation > - Java' 카테고리의 다른 글

유용한 클래스(Object class)  (0) 2017.08.21
예외처리  (1) 2017.08.17
제어자(modifier)  (0) 2017.08.04
생성자  (0) 2017.07.28
변수와 메서드  (0) 2017.07.26