고통은 사라지고 결과는 남는다. Records of Chansolve

추상클래스와 인터페이스 (Java) 본문

Computer Science

추상클래스와 인터페이스 (Java)

엄청큰노란닭 2023. 2. 16. 16:42

추상 클래스와 인터페이스

추상화

  • 추상화는 클래스들의 공통적인 요소를 뽑아서 상위 클래스를 만들어내는 것
  • 반드시 상위 클래스일 필요는 없어서, 공통적인 속성과 기능을 정의한 하위 클래스를 생성할 수도 있다.
  • 한 마디로 추상화는 공통적인 속성과 기능을 정의함으로써 코드의 중복을 줄이고, 클래스 간 관계를 효과적으로 설정하고, 유지·보수를 용이하게 하는 것
  • 자바에서는 추상 클래스와 인터페이스라는 문법 요소를 통해 추상화를 구현한다.

abstract 제어자

  • abstract는 주로 클래스와 메서드에 붙이는 키워드
  • 이것을 붙이면 자동으로 '추상 클래스'와 '추상 메서드'가 된다.
  • abstract는 '추상적인'이라는 사전적인 의미가 있지만, 핵심은 '미완성'이라는 개념에 있다.
  • abstract class 클래스명 { ... }와 같이 클래스 선언부가 작성되어 있으면 이것은 미완성된 추상 클래스이므로 상속을 통해 내부의 추상 메서드를 구현해줘야한다는 점을 알 수 있다.
    • 추상 메서드가 없더라도 키워드를 붙여서 추상 클래스로 지정할 수 있다. 다만 메서드 바디가 완성 되기 전까지는 이를 기반으로 한 인스턴스 생성이 불가

추상 클래스 (abstract class)

  • 추상 클래스는 한 마디로 미완성 설계도이다.
  • 미완성이기 때문에 이를 기반으로 인스턴스를 생성할 수 없다.
  • 오직 상속을 통해 하위 클래스에서만 완성될 수 있다.
  • 클래스 역할을 못하는 추상 클래스가 필요한 이유는 이것이 새로운 클래스를 작성하는데 유용한 바탕이 되어주기 때문
  • 무에서부터 클래스를 만드는 것보다는, 추상 클래스라는 최소한의 틀에서 확장시키는 것이 편리하기도 하고 설계에 있어 유연함을 가져다 줌

추상 메서드 (abstract method)

  • 추상 메서드는 구현부가 없이 선언부만 있는 메서드이다.
  • 추상 클래스와 마찬가지로 설계만 하고 구체적인 내용을 작성하지 않아 미완성 메서드이다.
public interface Dog {
    public static final int age = 5;
    final int weight = 10; // public static 생략
    static int registernum = 49; // public & final 생략

    public abstract String getDogInfo();
        void info()
}
  • 추상 클래스 속 추상 메서드의 예시이다.
  • 추상 메서드는 구현부가 없으므로 { } 대신 끝을 표시해주는 의미로 ;를 적어준다.
  • 추상 메서드의 구현은 하위 클래스로 상속하여 실행할 수 있는데, 이때 사용하게 되는 것이 '오버라이딩'이다.
  • 오버라이딩을 통해 메서드를 완성시키고, 이렇게 완성된 클래스로 해당 인스턴스를 생성할 수 있다.

인터페이스 (Interface)

  • 인터페이스는 일종의 추상 클래스이다.
  • 추상 클래스와 다른 점이 있다면 더 높은 추상화 정도를 가지고 있어서 바디가 있는 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다는 점이다.
  • 인터페이스는 interface 키워드를 사용해 만든다. 또한 예시를 보면 알 수 있듯이 구현부가 완성되지 않은 추상 메서드와 상수로만 이루어져있다.
  • 일반 클래스와 다르게 내부의 필드가 public static final로 정의되어있다.
    • 이러한 요소가 인터페이스의 필드와 메서드에 내포되어 있기 때문에 생략해도 괜찮다.
      • 상수로 정의하는 경우에는 public static final
      • 메서드로 정의할 때는 public abstract로 정의해야지만 일부 또는 전부 생략할 수 있다.
public interface Dog {
    public static final int age = 5;
    final int weight = 10; // public static 생략
    static int registernum = 49; // public & final 생략

    public abstract String getDogInfo();
        void info()
}

final 키워드

  • '최종'이라는 뜻을 가진 final 키워드는 필드, 지역 변수, 클래스 앞에 위치할 수 있다.
  • 클래스 앞에 있을 때는 변경∙확장∙상속 불가, 메서드 앞에 있을 때는 오버라이딩 불가, 변수 앞에 있을 때는 값 변경이 불가하다.
  • final class Final { final int a = 100; final void run() { final int localVar = x; return x; } }
  • 코드로 살펴보면 위와 같다.
    • Final 클래스는 변경∙확장∙상속이 안 되고, int a는 변경할 수 없고, run() 메서드는 오버라이딩이 불가하다.
interface Dog { ... }
interface Cat { ... }
interface FurryAnimals extends Dog, Cat { ... }
  • 다시 인터페이스로 돌아와서, 인터페이스는 인터페이스로부터만 상속 받을 수 있다.
  • 자바에서 불가한 다중상속이 인터페이스에서는 가능해서 여러 개의 인터페이스로부터 상속 받는 것도 가능
  • 참고로 Object 클래스와 같은 최고 클래스는 없다.
  • 클래스 상속처럼 하위 인터페이스는 상속 받은 상위 인터페이스의 멤버를 모두 상속 받는다.
class 클래스명 implements 인터페이스명 { 추상메서드 구현 }
  • 인터페이스는 구현시 implements 키워드를 사용한다.
  • 만약 구현하는 인터페이스 메서드 중 일부만 구현한다면, abstract를 붙여서 추상클래스로 선언해야 한다.
abstract class 클래스명 implements 인터페이스명 { (메서드) { ... } }

인터페이스 활용 코드

  • 인터페이스와 다형성을 활용
public interface Student {
    String getHomeWork();
}

class StudentA implements Student {
    public String getHomeWork() {
        return "two pages of essay";
    }
}
class StudentB implements Student {
    public String getHomeWork() {
        return "ten math questions";
    }
}
  • 먼저 Student라는 인터페이스를 만들어 임의의 학생 두 명을 위한 클래스를 Student로부터 implements했다.
public class Teacher {
    public void giveHomeWork(Student student) {
        System.out.println("Assignment of the day : " + student.getHomeWork());
    }
}
  • 이후 Teacher 클래스를 작성해 매개변수로 Student 타입이 입력될 수 있게끔 만들어주었다.
public class InterfacePractice {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        Student studentA = new StudentA();
        Student studentB = new StudentB();

        teacher.giveHomeWork(studentA);
        teacher.giveHomeWork(studentB);

    }
}
// 출력:
// Assignment of the day : two pages of essay
//Assignment of the day : ten math questions
  • 마지막으로 InterfacePractice 클래스에서 테스트를 해보면 선생님이 두 학생에게 각자 다른 숙제를 내주는 출력값이 나오는 것을 확인할 수 있었다.

인터페이스 vs 추상클래스 비교

정리

추상클래스

  • 추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스
  • 추상클래스는 다중 상속이 불가능하여 단일 상속만 허용한다
  • 추상클래스는 추상 메소드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질수 있다
  • 이러한 특징으로, 추상클래스는 추상화(추상 메서드)를 하면서 중복되는 클래스 멤버들을 통합 및 확장을 할 수 있다
  • 같은 추상화인 인터페이스와 다른점은, 추상클래스는 클래스간의 연관 관계를 구축하는 것에 초점을 둔다

인터페이스

  • 내부의 모든 메서드는 public abstract 로 정의 (default 메소드 제외)
  • 내부의 모든 필드는 public static final 상수
  • 클래스에 다중 구현 지원
  • 인터페이스 끼리는 다중 상속 지원
  • 인터페이스에도 static, default, private 제어자를 붙여 클래스 같이 구체적인 메서드를 가질 수 있음
    • 따라서 하위 멤버의 중복 메서드 통합을 어느정도 할수는 있겠지만, 필드는 상수이기 때문에 중복 필드 통합은 불가능
  • 인터페이스는 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상 메서드를 정의해놓고 구현(implement)하는 식으로 추상클래스보다 자유롭게 붙였다 땟다 사용
  • 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점
  • 다중 구현이 된다는 점을 이용해, 내부 멤버가 없는 빈 껍데기 인터페이스를 선언하여 마커 인터페이스 로서 이용 가능
  • 보통 xxxable 이런 형식으로 인터페이스 네이밍 규칙을 따름

'Computer Science' 카테고리의 다른 글

[SQLD] 식별자  (0) 2023.03.03
이진 트리 순회  (0) 2023.03.03
맵핑(Mapping)  (0) 2023.02.24
라이브러리(Library)  (0) 2023.02.16
객체 지향 프로그래밍(Object Oriented Programming)  (0) 2023.02.16
Comments