본문 바로가기
Programming 개발은 구글로/JAVA[Android]

[안드로이드] 추상클래스와 인터페이스

by 40대직장인 2022. 5. 18.

추상 클래스(abstract class)와 인터페이스(Interface)

1. 추상 클래스(abstract class)

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

 

클래스라는 것을 만들어 두면 이것을 인스턴스 화하여 객체를 생성하고 객체를 통해 클래스의 기능을 이용하게 됩니다. 객체지향 언어에서 클래스는 객체를 구체화한 것인데 이 구체화 단계가 명확하게 떨어지지 않을 대 추상 클래스를 사용하게 됩니다.

 

추상 클래스는 상속(extends)을 통한 자식 클래스를 의해 완성되며 abstract 키워드로 클래스가 작성됩니다.

 

abstract class School { // abstract 추가
    abstract student high();
    abstract student secondary()
}

 

추상 클래스와 추상 메서드 속성
  1. 추상 메서드가 하나 이상 포함된 클래스는 반드시 추상 클래스이어야 합니다.
  2. 추상 클래스에서 선언된 메서드는 추상 메서드가 아니어도 상관이 없습니다.(일반 메서드도 선언 및 구체화 가능)
  3. 추상 클래스를 상속하는 자식 클래스는 반드시 추상 클래스의 메서드를 오버라이딩 해주어야 합니다.
  4. 추상 메서드는 구체화하지 않고 선언만 합니다.

※ 추상 메서드를 오버라이딩 하지 않으면 에러가 발생이 됩니다.

 

abstract class School { // 추상 클래스 선언
    String name;
    int age;
    

    School() { // 생성자 사용 가능
        name = "카피장인";
        age = 40;
    }
    
    abstract void speaking(); // 추상 메서드 선언
    abstract void listen();
}


class Copymaster extends School { // 추상 클래스 상속
    void speaking() { // 추상메서드를 오버라이딩을 해서 구체화 시킴.
        System.out.println("말하기");
    }    
    void listen() {
        System.out.println("듣기");
    }
}

class Example {
    public static void main(String[] args){
        Copymaster copymaster = new Copymaster();
        copymaster.speaking();
    }
}

 

abstract class로 추상 클래스 선언 후 그 안에 추상 메서드를 선언하였습니다.

그리고 Copymaster라는 클래스로 추상 클래스를 상속받고 추상 클래스 내의 추상 메서드를 구체화하였습니다.

 

2. 인터페이스(interface)

: 추상 클래스와 거의 비슷한 개념이지만, 인터페이스는 절대로 메서드의 구체적인 구현을 가지지 않습니다.

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

 

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

 

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

 

interface Lion {
    public static final int num = 3; 
    public abstract void growl(); 
    // int num = 3; // 상수의 경우 public static final이 생략 가능
    // void growl(); // 메서드의 경우 public abstract이 생략 가능         
}

class Animal implements Lion {
    void growl(){
        System.out.println("%d번 으르렁대다 :" + num);
    }
}

class MainClass {
    public static void main(String[] args){
        Animal animal = new Animal();
        animal.growl();
    }
}

 

Lion을 implement 받은 Animal Class를 만들고 abstract void growl()를 구체화하였습니다.

 

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

 

Interface는 관리가 쉽다는 부분과 재사용이 용이하며, 선언과 구현부의 구분이 명확하기 때문에 유지보수나 코드 리딩, 구현이 손쉽다는 장점이 있습니다.

 

 

 

 

 

 

댓글