본문 바로가기

Java

추상 클래스와 인터페이스

추상 클래스란

 

추상 클래스는 하나 이상의 추상 메소드를 가지고 있는 클래스를 의미한다.

추상 클래스가 가지고 있는 특징은 다음과 같다.

 

  1. 추상 클래스를 선언할 때는 class 앞에 abstract 키워드를 사용한다.
  2. 어떠한 클래스가 추상 클래스를 상속하면 추상 클래스에 선언된 추상 메소드를 반드시 구현해야 한다.
  3. 추상 클래스는 new 키워드로 인스턴스를 생성할 수 없다.
  4. 상속할 때 extends 키워드를 사용하며 다중 상속이 불가능하다.
  5. 추상 클래스는 필드를 가질 수 있다. 이러한 필드는 상속받는 자식 클래스에서 사용할 수 있다.

 

추상 클래스 사용 예시

 

public abstract class Authenticator {
    private String authType;

    public Authenticator(String authType) {
        this.authType = authType;
    }

    public String getAuthType() {
        return authType;
    }

    // 추상 메소드: 사용자 인증
    public abstract boolean authenticate(String username, String password);

    // 공통된 메소드: 인증 타입 출력
    public void printAuthType() {
        System.out.println("Authentication type: " + authType);
    }
}

 

public class PasswordAuthenticator extends Authenticator {
    public PasswordAuthenticator() {
        super("Password");
    }

    @Override
    public boolean authenticate(String username, String password) {
        // 실제로는 데이터베이스나 다른 저장소에서 사용자 정보를 확인
        // 여기서는 예제로 간단히 확인
        if ("user".equals(username) && "pass".equals(password)) {
            System.out.println("Password authentication successful for user: " + username);
            return true;
        } else {
            System.out.println("Password authentication failed for user: " + username);
            return false;
        }
    }
}

 

public class Main {
    public static void main(String[] args) {
        // Password 인증 객체 생성
        Authenticator passwordAuth = new PasswordAuthenticator();
        passwordAuth.printAuthType();
        passwordAuth.authenticate("user", "pass"); 
    }
}

 


 

인터페이스란

 

자바에서 인터페이스(interface)란 클래스가 구현해야 하는 메소드의 집합을 정의하는 특수한 타입이다.

인터페이스가 가지고 있는 특징은 다음과 같다.

 

  1. 인터페이스의 모든 필드는 public static final이며 이를 생략할 수 있다.
    - 보통 클래스에서 공통으로 사용되는 상수를 정의할 때 쓰인다.  
      ex) MAX_SIZE, DEFAULT_NAME

  2. 인터페이스의 모든 메소드는 public abstract이며 이를 생략할 수 있다.
    - java8 부터는 default, static 메소드도 사용할 수 있다.
    - java9 부터는 private, private static 메소드도 사용할 수 있다.

  3. 인터페이스는 상속 키워드로 implements를 사용한다.

  4. 다중 구현이 가능하다.
    - 하나의 클래스가 여러 개의 인터페이스를 구현하는 것이 가능

  5. 인터페이스가 인터페이스를 상속받는 것이 가능하다.
    - 이 경우에는 다중 상속도 가능하다.

 

인터페이스 사용 예시

// 인터페이스 정의
interface Animal {
    void makeSound(); // 추상 메소드
}

// Dog 클래스가 Animal 인터페이스를 구현
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

// Cat 클래스가 Animal 인터페이스를 구현
class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

// 메인 클래스
public class InterfaceExample {
    public static void main(String[] args) {
        Animal dog = new Dog(); 
        Animal cat = new Cat(); 
        
        dog.makeSound(); // "Bark" 출력
        cat.makeSound(); // "Meow" 출력
    }
}

 


 

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

  추상 클래스 인터페이스
사용 키워드 abstract interface
사용 가능 변수 제한 없음 static final(상수)
사용 가능 접근 제어자 제한 없음(public, private, protected, default) public
사용 가능 메소드 제한 없음 abstract method, default method, static method, private method
상속 키워드 extends Implements
다중 상속 가능 여부 불가능 가능(클래스에 다중 구현, 인터페이스 끼리 다중 상속)
공통점 1. 추상 메소드를 가지고 있어야 한다.
2. 인스턴스화 할 수 없다 (new 생성자 사용 X)
3. 인터페이스 혹은 추상 클래스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다.
4. 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현하여야 한다.

 

 

[추상 클래스가 사용되는 경우]

  1. 공통적인 기능과 상태를 공유할 때
    - 추상 클래스는 상태(필드)와 구현된 메소드를 가질 수 있으므로 여러 서브클래스가 공통으로 사용할 수 있는 기본 구현과 필드를 제공할 수 있다.
    - ex) 데이터베이스 연결 관리 클래스에서 공통적인 속성(DB Password)과 동작(연결, 연결 해제)을 정의하고, 구체적인 데이터베이스 연결 방법은 서브클래스에서 제공

  2. 기본 구현을 제공하면서 특정 메서드만 서브클래스에서 구현하도록 강제할 때
    - 추상 클래스는 일반 메소드와 추상 메소드를 모두 포함할 수 있다.
    - ex) 데이터베이스 연결 관리 클래스에서 기본 연결 및 해제 동작을 제공하고 구체적인 데이터베이스 연결 방법(예: MySQL, PostgreSQL)은 서브클래스에서 구현하도록 강제

  3. 클래스 간의 강한 관계가 있을 때
    - 추상 클래스는 상속을 통해 클래스 간의 강한 관계를 나타낼 수 있다.

 

[인터페이스가 사용되는 경우]

  1. 서로 관련 없는 클래스에 공통 기능을 제공할 때
    - 인터페이스는 서로 관련이 없는 클래스들이 공통 기능을 구현하도록 할 수 있습니다. 이는 클래스 간의 결합도를 낮추고, 유연한 설계를 가능하게 한다.
    - ex) 여러 클래스에 로깅 기능을 추가할 때 Logger 인터페이스를 구현하도록 한다.

  2. 다중 구현이 필요할 때
    - 자바는 클래스의 다중 상속을 허용하지 않지만 인터페이스는 여러 개를 implements할 수 있다. 이를 통해 여러 소스로부터 기능을 가져올 수 있다.

출처 : 
https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
https://hahahoho5915.tistory.com/70
https://n1tjrgns.tistory.com/289

 

'Java' 카테고리의 다른 글

Singleton 패턴  (0) 2024.07.16
SOLID 원칙  (0) 2024.07.13
인터페이스(Interface)  (0) 2024.07.12
상속(Inheritance)  (0) 2024.07.12
동일성(identity)과 동등성(equality)  (1) 2024.06.07