Back-end/JAVA,Spring

인터페이스 Interface vs 추상클래스 abstract class

cheersHena 2018. 8. 23. 18:50
반응형

인터페이스 Interface 

추상화 정도가 높은 일종의 추상클래스. 

추상클래스처럼 추상 메서드를 갖지만 추상클래스보다 추상화정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 

추상클래스는 추상메소드 뿐만아니라 생성자, 필드 , 일반 메서드도 포함할 수 있지만 반면 인터페이스는 오직 추상메서드상수만을 멤버로 가질수 있음. 



*추상클래스 : 부분 구현된 '미완성 설계도' 

*인터페이스: 구현된 것은 아무것도 없고 밑그림만 그려진 '기본 설계도' (like 작업지시서)   




why? 인터페이스를 사용하는가?


client입장에서 자신이 사용하는 구체적인 클래스를 몰라도, 인터페이스를 사용하면 인터페이스 즉, 기본 설계도에서 정의된 메서드를 사용하는 객체 라는것이 보장되어 있기때문에 구체적인 클래스의 변경이 일어나더라도 client는 관심을 가지지 않아도 된다.

즉, 코드를 몰라도 인터페이스만 보고 어떤 기능을 하는지 간략하게 알 수 있다.


이는 클래스 간의 결합도를 줄임으로써 유지보수성 향상과,  개발자의 입장에서 협업 시 독립적인 프로그래밍이 가능하고 개발시간 단축이 가능하다. 


인터페이스를 설명하기위해선 다형성(Polymorphism)에 대한 개념이 나오는데 .. 


* 다형성(polymorphism)이란?

다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것.

자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현한다.

다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징이다.


쉽게 예를 들면 


Interface: 동물

Method: 먹다, 걷다, 잔다

Implements(구현체): 개 , 고양이, 닭  . . 


동물들은 모두 먹고 걷고 잔다. 하지만 동물들마다 방식이 다르다.

구현체에서 동물들이 각각 먹고 걷고 자는 방식을 구현한다.

같은 먹다라는 동사(메소드)에서 동물마다 다양하게 구현할 수 있기 때문에 

인터페이스에서 이를 다형성이라 함.



인터페이스의 장점

  • 다중 상속이 가능
  • 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능
  • 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축

  • 클래스와 클래스 간의 관계를 인터페이스로 연결하면, 클래스마다 독립적인 프로그래밍이 가능.


인터페이스 문법 :

interface 인터페이스명 {
    public static final 타입 상수명 = 값;
    public abstract 메서드명 (매개변수);
}

-모든 멤버변수는 public static final 이어야 하며 생략 가능.

- 모든 메서드는 public abstract 이어야 하며 생략가능. 

 (생략된 제어자는 컴파일 시 자바 컴파일러가 자동으로 추가해 줌)


인터페이스의 상속(extends)

인터페이스는 인터페이스로부터만 상속받을수 있으며, 클래스와 달리 다중상속 가능.


일반적으로 자식클래스가 여러 부모클래스를 상속 받을수 있다면(다중상속이 가능하다면) 메소드 출처의 모호성등 문제발생 여지가 있어서 자바에서 클래스 다중상속은 불가능하다.

하지만 다중상속의 이점도 있기에 자바는 인터페이스를 통해 다중상속을 지원한다.

인터페이스는 다른 클래스 작성시 기본이 되는 틀을 제공하면서, 다른 클래스사이의 중간 매개열할까지 담당하는 일종의 추상클래스이다.



인터페이스의 구현(implements)

인터페이스도 그 자체로는 추상클래스와 마찬가지로 인스턴스(객체)를 생성할수 없으며 인스턴스도 자신에게 정의된 추상 메서드의 몸통을 만들어주는(구현해줄) 클래스를 작성해야한다. 

때문에 구현클래스를 만들어주기위한 키워드 implements(구현하다) 를 사용해야한다.


(인터페이스를 위한) 구현 클래스: 


class 클래스명 implements 인터페이스명{
    // 인터페이스에 정의된 추상메서드 반드시 구현해야함.
    //인터페이스에 2개의 추상메서드가 존재한다면 최소 2개의 인터페이스 추상 메서드 구현되어한다.
    //또한 클래스 자신의 메서드를 추가하여 구현할수도 있다.
}



** 상속과 구현을 동시에 할 수 도 있다.

ex) 

public class JdbcBoardDAO extends JdbcDaoSupport implements BoardDAO
{
    //insert example
    public void insert(Board board){
        
        String sql = "INSERT INTO board (name, password, title, content, read_cnt, create_date) VALUES (?, ?, ?, ?, ?, ?)";
            
        getJdbcTemplate().update(sql,
                new Object[] { board.getNo(),
                            board.getName(),
                            board.getPassword(),
                            board.getTitle(),
                            board.getContent(),
                            board.getReadCnt(),
                            board.getCreateDate()
                }); 
        }
}


JdbcBoardDAO: 구현 클래스


JdbcDaoSupport: 상속 클래스


BoardDAO: 인터페이스.



* 인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 여러 인터페이스를 상속받을 수 있다.(다중 상속 가능 ) 


인터페이스 구현 예제

interface Animal {  //인터페이스 

public abstract void cry(); 

}

 

class Cat implements Animal { //구현클래스 1

    public void cry() {

        System.out.println("냐옹냐옹!");

    }

}

 

class Dog implements Animal { //구현클래스 2

    public void cry() {

        System.out.println("멍멍!");

    }

}

 

public class Polymorphism03 {

    public static void main(String[] args) { //메인클래스 

        Cat c = new Cat(); 

        Dog d = new Dog();

 

        c.cry();   --> 냐옹냐옹!

        d.cry();   --> 멍멍!

    }

}



추상 클래스(abstract class)

하나 이상의 추상 메소드를 포함하는 클래스를 가리켜 추상 클래스(abstract class).

이러한 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다.

즉, 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야만 한다. 

 

*문법

abstract class 클래스이름 {

    ...

    abstract 반환타입 메소드이름();

    ...

}

이러한 추상 클래스는 동작이 정의되어 있지 않은 추상 메소드를 포함하고 있으므로, 인스턴스를 생성할 수 없다.

추상 클래스는 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식 클래스에서 추상 클래스의 모든 추상 메소드를 오버라이딩하고 나서야 비로소 자식 클래스의 인스턴스를 생성할 수 있게 된다.


** 추상 클래스는 추상 메소드를 포함하고 있다는 점을 제외하면, 일반 클래스와 모든 점이 같다.
즉, 생성자와 필드, 일반 메소드도 포함할 수 있다.


예제

abstract class Animal { //추상클래스 

abstract void cry(); 

class Cat extends Animal { //일반클래스 

void cry() { 

System.out.println("냐옹냐옹!"); 

class Dog extends Animal {  //일반클래스 

void cry() { 

System.out.println("멍멍!"); 

}

 

public class Polymorphism02 {

    public static void main(String[] args) {

        // Animal a = new Animal();  --> 불가 X // 추상 클래스는 인스턴스를 생성할 수 없음.

        Cat c = new Cat(); //일반클래스는 인스턴스 생성가능 

        Dog d = new Dog(); //가능 


        c.cry();

        d.cry();

    }

}


실행 결과

냐옹냐옹!

멍멍!


why? 추상화클래스를 사용하는가?

추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함이다. 

즉, 구현을 강제한다, 

만약 일반 메소드로 구현한다면 사용자에 따라 해당 메소드를 구현할 수도 있고, 안 할 수도 있다.

하지만 추상 메소드가 포함된 추상 클래스를 상속받은 모든 자식 클래스는 추상 메소드를 구현해야만 인스턴스를 생성할 수 있으므로, 반드시 구현해야한다.




반응형