Language/Java

인터페이스와 추상클래스 그리고 Enum

지팡구 2022. 5. 14. 21:44

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

 

한 클래스가 다양한 클래스를 상속받아 다양한 기능을 사용하면 얼마나 좋을까?

 

하지만 다중 상속을 자바에서는 지원하지 않는다. 그래서 자바에서는 인터페이스를 이용해 다중 상속을 지원하고 있는데, 인터페이스(interface)는 클래스와 달리 객체를 생성할 수 없는, 클래스에서 구현해야하는 일종의 작업 명세서이다.

다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상클래스이다.         (인터페이스와 상속은 엄연하게 다름!)

 

상속이 부모 클래스의 기능을 자식 클래스가 물려 받는 것이라고 한다면, 인터페이스는 하위 클래스에 특정한 메소드가

반드시 존재하도록 강제한다.

 

일반적으로 인터페이스는 이렇게 구현한다.

(추가적으로 인터페이스의 맴버는 반드시 public 이다)

 

class 클래스 명 implements 인터페이스 이름 {...}

////////////////////////////////////////////////

interface Animanl{
	public abstract void cry();
}


class Cat implements Animal{
	public void cry(){
    	Sysyem.out.println("냐옹");
    }
}

class Dog implements Animal{
	public void cry(){
    	Sysyem.out.println("멍멍");
    }
}


public class Animal01{
	public static void main(String[] args){
    	Cat c = new Cat();
        Dog d = new Dog();
        
        c.cry();
        d.cry();
    }
}

 

다중 상속은 다음과 같이 구현할 수 있다.

// 자바에서는 상속과 구현을 동시에 할 수 있음
class 클래스 명 extend 부모 클래스 명 implements 인터페이스 이름{...}


// 또한 아래와 같은 방식으로 다중 상속을 받을 수 있음
interface Animal { public abstract void cry(); }
interface Pet { public abstract void play(); }

 
class Cat implements Animal, Pet {
    public void cry() {
        System.out.println("냐옹냐옹!");
    }

    public void play() {
        System.out.println("쥐 잡기 놀이하자~!");
    }
}

class Dog implements Animal, Pet {
    public void cry() {
        System.out.println("멍멍!");
    }
    public void play() {
        System.out.println("산책가자~!");
    }
}

public class Animal01 {
    public static void main(String[] args) {
        Cat c = new Cat();
        Dog d = new Dog();
        c.cry();
        c.play();
        d.cry();
        d.play();
    }
}

 

  인터페이스를 구현한 경우 반드시 인터페이스에 정의된 메소드들의 몸통을 만들어 주어야 한다.
    즉, 메소드들을 구현해야만 한다. 

 

인터페이스는 부모에서 선언만 해놓고 자식에서 오버라이딩(재정의)해서 사용해야 함


2. 인터페이스의 장점

    - 다중 상속 지원 (이로서 다양한 클래스의 속성을 사용할 수 있음)

    - 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화 가능.

    - 클래스 간 관계를 인터페이스로 연결 시, 클래스마다 독립적인 프로그래밍 가능.

    - 클래스의 작성과 인터페이스 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축할 수 있음.

 

 

인터페이스에 대해 알아보았다. 인터페이스는 선언시 class라는 예약어를 사용하지 않고 interface 라는 예약어를 사용하며, 각 메소드 선언문은 일반 메소드 선언문과 동일하지만, 메소드의 몸통이 없는 특징을 가지고 있다.


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

 

추상 메소드(abstract method)는 자식 클래스에서 반드시 오버라이딩해야만 사용할 수있는 메소드를 의미한다.

 

JAVA에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하기 위해서이다. 

 

예시로 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 필요로 하는 쪽에서 사용하되 필요한 부분만 재정의를 통해 생산성을 향상할 수 있기 때문이다.

 

이러한 추상 메소드는 선언부만 존재하며, 구현부는 작성되어 있지 않다. 그래서 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩(overriding)해 사용하는 것이다.

 

 

추상 클래스(Abstract class)는 위에 설명한 추상 메소드를 하나 이상 포함한 클래스를 추상 클래스라고 한다. 반드시 사용되어야 하는 메소드를 추상 클래스에서 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 한다. 

 

<예시>

선언 방법 
abstact class 클래스 이름{
	abstract 반환타입 메소드이름();
}


public abstract class MemberManagerAbstract{
	public abstract boolean addMember(MemberDto member);
    public abstract boolean removeMember(String name String phone);
    public abstract boolean updateMember(MemberDto member);
    public void printLog(String data){
    	Sysytem.out.println("Data="+data);
    }
}
인터페이스와 달리 구현되어 있는 메소드가 있어도 상관없다.

 

출처 : 인프런 Java Programming 22강(추상 클래스)에서 발췌

위 코드를 설명하자면 메인 클래스에서 새로운 객체를 만듬과 동시에 매개 변수로 10과 'java'를 전달한다.

ClassEx에 매개변수를 전달하게 되는데, super(i,s)를 통해 이 매개변수 값을 전달 받고, super은 상위 클래스로 이동하게 되는데, 상위 클래스는 AbstractClassEx이다. 그래서 그 곳에서 this를 통해 i는 num에 저장, s는 str에 저장되고, 

AbstractClassEx constructor가 출력되고, 메인함수에서 fun1, fun2를 통해 fun1의 출력과 fun2의 출력이 된다.

 

2. 추상 클래스의 특징

  - 멤버 변수를 가진다

  - 추상 메서드를 가질 수 있으며 상속한 클래스에서 반드시 구현해야 한다.

  - 일반 메서드도 가질 수 있다.

  - 일반 클래스와 마찬가지로 생성자를 가질 수 있다.

 

 

 

  인터페이스 추상 클래스 클래스
선언 시 사용하는 예약어 interface abstract class class
구현 안 된 메소드 포함 가능 여부 가능하다(필수) 가능 불가
구현된 메소드 포함 가능 여부 불가 가능 가능(필수)
static 메소드 선언 가능 여부 불가 가능  
final 선언 가능 여부 불가 가능 가능

 

뭔가 인터페이스와 추상 클래스가 비슷한거같은데??? 공통점과 차이점을 비교해보면 다음과 같다

 

공통점 : 추상 메소드를 가진다. 객체 생성이 불가하며 자료형으로 사용된다

 

차이점 : 

           인터페이스는 상수, 추상 메소드만 가지며, 추상 메서드를 구현만 하도록 하며 다형성을 지원한다.

           추상 클래스는 클래스가 가지는 모든 속성과 기능을 가지며 추상메소드 구현 및 상속의 기능을 가진다. 

                               단일 상속만 지원한다.

 

 

 

출처 :&nbsp;http://alecture.blogspot.com/2011/05/abstract-class-interface.html

 

추상클래스는 같은 종류나 행돌들을 구현할 것이 많을 때 사용하고 추상 메소드를 상속받는 자식 클래스에서 구현할 때 사용한다. 상속에 대한 계층 구조를 명확히 표현할 때 추상 클래스를 이용하면 효과적이다.

 

인터페이스는 디자인을 구성하는 요소들이 자주 바뀔 대 사용하면 유용하고 메소드 형태만 공유해서 구현되는 상황일 때 적합하다.

 


1. Enum이란?

 

enum 클래스는 JAVA 1.5부터 새롭게 추가된 열거형 클래스로, 기존에 상수를 정의하는 방법인 final static string과 같이 문자열이나 숫자들을 나타내는 기본 자료형의 값을 열거를 이용할 수 있다.

 

2. enum의 특징

  - 단순한 코드와 가독성 상승

  - enum이라는 키워드를 통해 구현 의도가 명확함(열거)

  - enum class를 사용해 새로운 상수들의 타입을 정의해서 정의한 타입 외의 데이터 값을 컴파일시 확인함.

  - 인스턴스의 생성과 상속을 방지해 상수값의 타입 안정성이 보장됨. 

총 정리 !!

인터페이스와 abstract(추상) 클래스는 클래스의 골격을 잡아주고, 메소드를 선언해 놓을 때 매우 유용하게 사용할 수 있다. enum이라는 열거형 클래스는 이름대로 열거되어 있는 데이터나 상수를 처리할 때 사용해, 고정되어 있는 값을 처리할 때 사용하면 유용하게 사용이 가능하다.