하루에 0.01%라도 성장하자

Develop/Android

abstract, interface 그 차이와 사용법.. 그리고 사용하는 이유

뚠님 2019. 11. 8. 16:09
반응형
abstract(추상)

 

잘 모르더라고 사용하는 단어의 뜻을 이해하면 대충 50%정도 감이 온다.

 

abstract는 무슨 뜻을 가지고 있을까

 

출처 - 네이버 어학사전

abstract는 추상적인 이라는 뜻을 갖는 단어이다.

 

그렇다면 추상적이라는 의미는 무엇일까? ( 갑자기 국어 )

 

출처 - 네이버 어학사전

????

추상적 개념은 추상적인 것을 지칭하는 개념...이고...뭔소리야...

그래서 추상적이 뭐냐고..

 

출처 - 네이버 철학사전

철학적으로 접근을 해봤다.... 음.. 어렵네요

 

출처 - 네이버 어학사전

추상적이라는 것을 빼고 추상을 검색해 보았다. 

 

추상이란 구체에 대립하여 말하는 개념이며 전체의 한정된 것. 혹은 일부

나는 이렇게 추상이라는 것에 정의를 내렸다. 전체의 일부.

 

물론 추상이라는 단어자체의 뜻은 내가 내린 정의와 다를 수 있다. 하지만 내가 아래에 써 내려갈 글들은 JAVA의 추상적인 개념이고, 이 개념이 내가 내린 정의와 비슷 하다고 생각 한다.

 

 

추상클래스(abstract class)... 추상메소드(abstract method)

 

추상클래스는 전체적인 구성이 '구체화'되어 있지 않고 설계만 되어있는 클래스라고 정의할 수 있다.

추상클래스는 상속(extends)를 통한 자식클래스를 의해 완성되며 하나의 틀이라고 할 수 있다.

 

abstract class 클래스명 {
    abstract 메소드명();
}

 

abstract가 추가되어 선언한다.

 

추상 클래스와 추상메소드는 아래와 같은 성격을 갖는다.

 

  1. 추상 메소드가 하나이상 포함된 클래스는 반드시 추상 클래스여야 한다.
  2. 추상 클래스에서 선언된 메소드는 추상메소드가 아니어도 상관없다. ( 일반 메소드도 선언 및 구체화 가능 )
  3. 추상 클래스를 상속하는 자식 클래스는 반드시 추상클래스의 메소드를 오버라이딩 해주어야 한다.
  4. 추상 메소드는 구체화 하지 않고 선언만 한다.
// 추상 클래스 선언
abstract class User{
    String name;
    int age;
    
    // 생성자 사용 가능.
    User(){
        name = "뚠님";
        age = 20;
    }
    
    // 추상 메소드 선언
    abstract void speaking();
    abstract void listen();
}

// 추상 클래스 상속
class Ddunnim extends User{

    //추상 클래스 내의 추상메소드를 오버라이딩해 구체화 해준다.
    void speaking(){
        System.out.println("슈슉");
    }
    
    void listen(){
        System.out.println("듣고있습니다.");
    }
}


class Example01{
    public static void main(String[] args){
        Ddunnim ddunnim = new Ddunnim();
        ddunnim.speaking();
    }
}

 

코드를 보면 대충 감이 올것이다.

 

abstract class로 추상 클래스 선언 후 그 안에 추상 메소드를 선언만! 하였다.

 

그리고 Ddunnim 이라는 클래스로 추상 클래스를 상속받고 추상 클래스 내의 추상 메소드를 구체화 해주었다.

 

추상 메소드를 오버라이딩 하지 않았다면 에러가 발생한다.

 

 

 

인터페이스(interface)

 

인터페이스는 추상화 클래스의 추상화 정도를 조금 더 업그레이드한 것이다.

추상 클래스와는 다르게 오로지 선언만 가능하며, 변수를 가질 수 없고 상수만 가질 수 있다.

 

interface 클래스명 {
    public static final 변수명 = 값;
    public abstract 메소드명(매개변수);
}

 

기본문법은 위 코드와 같다.

 

인터페이스는 아래와 같은 성격을 갖는다.

  1. 모든 멘버 변수는 public static final 이어야 한다.( 상수여야 한다는 뜻 )
  2. 모든 메소드는 abstract 속성을 가져야 한다.
  3. 인터페이스는 인터페이스만 상속가능 하며 인터페이스를 상속(Extends)받을 때 클래스와 다르게 다중상속이 가능하다.
  4. extends가 아닌 implements를 이용하여 상속받는다.

 

interface Arms{
    public static final int num = 10;
    public abstract void shake();
    // int num = 10;
    // void shake();
    
    // 상수의 경우 public static final이 생략 가능하다.
    // 메소드의 경우 public abstract이 생략 가능하다.
}

class UserBody implements Arms {
    void shake(){
        System.out.println("하하하 숫자 :" + num);
    }
}


class MainClass {
    public static void main(String[] args){
        UserBody userBody = new UserBody();
        userBody.shake();
    }
}

 

Arms를 implement 받은 UserBody Class를 만들고 abstract void shake()를 구체화 하였다.

 

 

 

 

인터페이스를 사용하는 이유

 

어떻게 보면 불편해 보일 수 있다. 추상화된 메소드만 만들어 놓을 필요는 없고 그냥 다 구체화 해서 하면 안되나? 라는 생각이 들수도 있다.

 

자 그럼 어떤 장점이 있는지 확인해보자.

 

  1. 개발 시간 단축.
  2. 정형화된 프로그램 개발 
  3. 클래스의 선언부와 구현부를 구분하여 보다 독립적인(모듈화) 프로그래밍 가능
  4. 다중 상속으로 인한 구현의 편리성

 

협업을 하게 되면 엄청나게 많은 java 파일 들과 엄청나게 많은 메소드들을 선언하고 구현한다. interface의 가장 큰 장점은 관리가 쉽다는 부분과 재사용이 용이하며, 선언과 구현부의 구분이 명확하기 때문에 유지보수나 코드리딩, 구현이 손쉽다는 장점이 있다.

 

 


내용을 이해한것, 이해한 것을 설명하는 것, 설명하는 것을 글로 옮기는 것... 모두 어렵다...ㅠ

반응형