추상 클래스란
추상 클래스는 하나 이상의 추상 메소드를 가지고 있는 클래스를 의미한다.
추상 클래스가 가지고 있는 특징은 다음과 같다.
- 추상 클래스를 선언할 때는 class 앞에 abstract 키워드를 사용한다.
- 어떠한 클래스가 추상 클래스를 상속하면 추상 클래스에 선언된 추상 메소드를 반드시 구현해야 한다.
- 추상 클래스는 new 키워드로 인스턴스를 생성할 수 없다.
- 상속할 때 extends 키워드를 사용하며 다중 상속이 불가능하다.
- 추상 클래스는 필드를 가질 수 있다. 이러한 필드는 상속받는 자식 클래스에서 사용할 수 있다.
추상 클래스 사용 예시
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)란 클래스가 구현해야 하는 메소드의 집합을 정의하는 특수한 타입이다.
인터페이스가 가지고 있는 특징은 다음과 같다.
- 인터페이스의 모든 필드는 public static final이며 이를 생략할 수 있다.
- 보통 클래스에서 공통으로 사용되는 상수를 정의할 때 쓰인다.
ex) MAX_SIZE, DEFAULT_NAME - 인터페이스의 모든 메소드는 public abstract이며 이를 생략할 수 있다.
- java8 부터는 default, static 메소드도 사용할 수 있다.
- java9 부터는 private, private static 메소드도 사용할 수 있다. - 인터페이스는 상속 키워드로 implements를 사용한다.
- 다중 구현이 가능하다.
- 하나의 클래스가 여러 개의 인터페이스를 구현하는 것이 가능 - 인터페이스가 인터페이스를 상속받는 것이 가능하다.
- 이 경우에는 다중 상속도 가능하다.
인터페이스 사용 예시
// 인터페이스 정의
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. 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현하여야 한다. |
[추상 클래스가 사용되는 경우]
- 공통적인 기능과 상태를 공유할 때
- 추상 클래스는 상태(필드)와 구현된 메소드를 가질 수 있으므로 여러 서브클래스가 공통으로 사용할 수 있는 기본 구현과 필드를 제공할 수 있다.
- ex) 데이터베이스 연결 관리 클래스에서 공통적인 속성(DB Password)과 동작(연결, 연결 해제)을 정의하고, 구체적인 데이터베이스 연결 방법은 서브클래스에서 제공 - 기본 구현을 제공하면서 특정 메서드만 서브클래스에서 구현하도록 강제할 때
- 추상 클래스는 일반 메소드와 추상 메소드를 모두 포함할 수 있다.
- ex) 데이터베이스 연결 관리 클래스에서 기본 연결 및 해제 동작을 제공하고 구체적인 데이터베이스 연결 방법(예: MySQL, PostgreSQL)은 서브클래스에서 구현하도록 강제 - 클래스 간의 강한 관계가 있을 때
- 추상 클래스는 상속을 통해 클래스 간의 강한 관계를 나타낼 수 있다.
[인터페이스가 사용되는 경우]
- 서로 관련 없는 클래스에 공통 기능을 제공할 때
- 인터페이스는 서로 관련이 없는 클래스들이 공통 기능을 구현하도록 할 수 있습니다. 이는 클래스 간의 결합도를 낮추고, 유연한 설계를 가능하게 한다.
- ex) 여러 클래스에 로깅 기능을 추가할 때 Logger 인터페이스를 구현하도록 한다. - 다중 구현이 필요할 때
- 자바는 클래스의 다중 상속을 허용하지 않지만 인터페이스는 여러 개를 implements할 수 있다. 이를 통해 여러 소스로부터 기능을 가져올 수 있다.
'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 |