추상 클래스와 인터페이스는 객체 지향 프로그래밍에서 중요한 역할을 하며, 둘 다 추상화를 제공한다. 그러나 사용하는 시나리오와 제공하는 기능에 차이가 좀 있는데, 이를 선택하는 기준을 이해하기 위해서 추상클래스와 인터페이스가 뭔지 소개한다.
interface PaymentProcessor {
void processPayment(double amount);
}
class CreditCardProcessor implements PaymentProcessor {
@Override
public void processPayment(double amount) {
System.out.println("신용카드로 " + amount + "원 결제 처리됨.");
}
}
class NaverPayProcessor implements PaymentProcessor {
@Override
public void processPayment(double amount) {
System.out.println("네이버페이로 " + amount + "원 결제 처리됨.");
}
}
public class PaymentTest {
public static void main(String[] args) {
PaymentProcessor creditCard = new CreditCardProcessor();
PaymentProcessor naverPay = new NaverPayProcessor();
creditCard.processPayment(10000);
naverPay.processPayment(20000);
}
}
출력 결과
신용카드로 10000.0원 결제 처리됨.
네이버페이로 20000.0원 결제 처리됨.
abstract class Animal {
int age;
double height;
double weight;
public Animal(int age, double height, double weight) {
this.age = age;
this.height = height;
this.weight = weight;
}
abstract void eat();
abstract void move();
void sleep() {
System.out.println("동물이 잠을 잡니다.");
}
void displayStats() {
System.out.println("나이: " + age + ", 키: " + height + "cm, 몸무게: " + weight + "kg");
}
}
class Dog extends Animal {
public Dog(int age, double height, double weight) {
super(age, height, weight);
}
@Override
void eat() {
System.out.println("개가 먹습니다.");
}
@Override
void move() {
System.out.println("개가 달립니다.");
}
}
class Fish extends Animal {
public Fish(int age, double height, double weight) {
super(age, height, weight);
}
@Override
void eat() {
System.out.println("물고기가 먹습니다.");
}
@Override
void move() {
System.out.println("물고기가 헤엄칩니다.");
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal dog = new Dog(5, 30.0, 20.0);
Animal fish = new Fish(1, 5.0, 0.2);
System.out.println("Dog:");
dog.displayStats();
dog.eat();
dog.move();
dog.sleep();
System.out.println("\nFish:");
fish.displayStats();
fish.eat();
fish.move();
fish.sleep();
}
}
출력 결과
Dog:
나이: 5, 키: 30.0cm, 몸무게: 20.0kg
개가 먹습니다.
개가 달립니다.
동물이 잠을 잡니다.
Fish:
나이: 1, 키: 5.0cm, 몸무게: 0.2kg
물고기가 먹습니다.
물고기가 헤엄칩니다.
동물이 잠을 잡니다.
interface DataSource {
String getData();
}
class DatabaseSource implements DataSource {
@Override
public String getData() {
return "데이터베이스로부터 데이터를 가져옵니다.";
}
}
class APISource implements DataSource {
@Override
public String getData() {
return "API로부터 데이터를 가져옵니다.";
}
}
public class DataSourceTest {
public static void main(String[] args) {
DataSource database = new DatabaseSource();
DataSource api = new APISource();
System.out.println(database.getData());
System.out.println(api.getData());
}
}
출력결과
데이터베이스로부터 데이터를 가져옵니다.
API로부터 데이터를 가져옵니다.
interface Logger {
void log(String message);
}
interface Validator {
boolean validate(String data);
}
class Service implements Logger, Validator {
@Override
public void log(String message) {
System.out.println("로그: " + message);
}
@Override
public boolean validate(String data) {
return data != null && !data.isEmpty();
}
}
public class ServiceTest {
public static void main(String[] args) {
Service service = new Service();
service.log("서비스 시작");
System.out.println("데이터 검증 결과: " + service.validate("테스트 데이터"));
}
}
출력 결과
로그: 서비스 시작
데이터 검증 결과: true
실제로 이 둘 사이의 선택은 프로젝트의 요구사항과 개발 팀의 선호에 따라 달라질 수 있다.