티스토리 뷰
안녕하세요 :)
Shiny Ocean 입니다.
이번 포스팅에서 다루어볼 내용은 추상클래스와 인터페이스의 선언과 구현입니다.
개요
추상클래스와 인터페이스는 얼핏보면 굉장히 비슷해 보입니다.
추상클래스와 인터페이스는 본체 안에 완벽하게 구현된 메소드가 없습니다. 리턴타입과 접근제한자, 매개변수와 이름정도로만 추상적으로 메소드를 선언합니다. 구체적인 설계전에 스캐치를 따거나 구상도를 그리는 작업과 비슷합니다.
하지만 추상화 시키는 정도에 따라 그리고 활용도에 따라 이둘은 구분됩니다.
인터넷에 돌고도는 표현들중 가장 명확하게 제 머리에 들어온 표현은 아래와 같습니다.
인터페이스를 구현하면 "기능"을 추가할수 있고, 추상클래스를 구현하면 "속성"을 부여할수 있다.
추상클래스, 인터페이스 특징 비교
추상클래스의 특징
1. 다중 상속이 불가능 하다.
2. 일반 메소드와 추상메소드 모두 사용 가능하다.
3. 생성자와 일반변수를 모두 가질수 있다.
4. 메서드의 부분적인 구현 가능
5. 상속받는 클래스는 추상메소드만 구현해도 된다.
6. extends를 사용한다.
인터페이스 특징
1. 다중상속이 가능하다.
2. 추상메소드만 사용 가능하다.
3. 생성자와 일반변수를 가질수 없다.
4. 메서드 선언만 가능하다.
5. 상속받은 클래스는 반드시 인터페이스 내의 모든 메서드를 모두 구현해야 한다.
6. implements를 사용한다.
간단한 예시
이제 코드를 통해 인터페이스와 추상메소드가 어떻게 다른지, 또 어떻게 활용 되는지 알아 보겠습니다.
먼저 가장 위에서 강조한 구문처럼 클래스는 속성을 인터페이스는 기능을 구현한다했습니다. 사실 이는 특징 부분만 잘 살펴봐도 납득이 가능합니다. 추상 클래스는 생성자와 일반변수를 가질수 있는 반면 인터페이스는 상수값만 갖을수 있기 때문입니다.
게임을 예시로 들어보겠습니다. 게임에는 고유의 속성이 있습니다. 같은 분야의 게임이라도 그 게임의 메뉴얼을 다르기 마련이죠 하지만 같은 분야의 게임이라면 기본 조작키는 비슷합니다. 레이싱게임에서 마우스를 쓰는일이 없고 fps게임을 키보드만을 이용해서 하는일이 없듯이 말입니다.
저는 game이라는 패키지 안에 여러 종류의 추상클래스로 여러 게임들을 선언해 보았습니다.
그리고 gameInterface라는 패키지 안에는 비슷한 유형의 게임들의 조작키를 다룰 인터페이스를 선언해 보았습니다.
구조는 다음과 같습니다.
위의 예시에서 카트와 니드포스피드는 같은 유형의 게임이므로 Racing 인터페이스를 사용합니다. 즉 조작키 기능을 표현한 인터페이스는 같은걸 사용하지만 게임의 본질적인 속성인 클래스는 다르게 구현한다는 것이죠.
아래와 같이 두 레이싱게임의 추상클래스는 Racing 인터페이스를 사용합니다.
추상메소드로 메뉴얼이라는 메소드를 만들어 실제 구현시에는 두개의 클래스를 구분하도록 했습니다. 추상클래스로 속성값을 추상적으로 준것입니다. 이는 오버라이딩을 해도되고 안해도 됩니다.
아래처럼 니드포스피드는 아우터 클래스로 구현하였고 카트라이더의 경우 무명클래스를 통해 구현해 보았습니다. 저는 구현체의 구현과정이 전체 로직의 가독성을 높인다고 판단되는 코드는 무명클래스로, 아닌경우 아우터클래스나 따로 클래스를 선언하여 상속받습니다.
import game.*;
class NeedForSpeed_ver01 extends NeedForSpeed{
@Override
public void manual() {
System.out.println("니드포 스피드 오픈 베타 버전 01에 테스트서버 진행중입니다.");
};
}
public class MainController {
public static void main(String[] args) {
Kart recentKart = new Kart() {
@Override
public void manual() {
System.out.println("이번 카트라이더 패치사항으로 접속시 팅김현상을 개선했습니다.");
};
};
recentKart.manual();
recentKart.printInterface();
NeedForSpeed_ver01 recentNeedForSpeed = new NeedForSpeed_ver01();
recentNeedForSpeed.manual();
recentNeedForSpeed.printInterface();
}
}
결과 콘솔은 아래와 같습니다.
'Language > Java - 심화' 카테고리의 다른 글
Java(심화) - 어노테이션 (0) | 2022.01.16 |
---|---|
Java(심화) - 싱글톤 (0) | 2022.01.16 |
Java(심화) - 객체 지향 프로그래밍 (0) | 2022.01.04 |
Java(심화) - Enum 열거타입 (0) | 2021.12.30 |
Java(심화) - 스트링 타입과 객체 (0) | 2021.12.30 |