Final Keyword
- 필드, 메서드, 클래스 앞에 위치할 수 있습니다.
- 변경이나 확장이 불가능한 성질을 가지게 됩니다.
위치 | 의미 |
클래스 | 변경 또는 확장이 불가능한 클래스, 상속 불가 |
메서드 | 오버라이딩 불가한 메서드 |
변수 | 값 변경이 불가능한 상수 |
final class Final { // 확장/상속 불가능
final int x = 1; // 변경할 수 없는 상수
final void getConstant() { // 오버라이딩 불가한 메서드
final int CONSTANT = x; // 상수
return x;
}
}
Interface
- 클래스가 구현해야 하는 동작을 선언하는 데 사용되는 추상 유형 (wikipedia)
- interface 키워드를 사용하여 정의하며, 오직 추상 메서드와 상수(static final)만을 가지고 있는 것
- 인터페이스에 선언된 추상 메서드를 반드시 구현하도록 강제합니다.
- 특징
- 모든 멤버 변수는 public static final이어야 하며, 생략이 가능합니다.
- 모든 메서드는 public abstract이어야 하며, 생략이 가능합니다.
- Java 8 부터는 static, default method를 사용할 수 있습니다.
- 하위 호환성을 위해 default 메서드를 제공합니다. → 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서 추상 메서드를 하나 더 정의를 할 경우, 기존에 인터페이스를 구현하는 모든 클래스에 추상 메서드를 구현해야 하기 때문입니다.
- default mehtod: 구체 메서드지만, 선택적으로 오버라이딩이 가능한 메서드
- static method: 인스턴스 생성 없이 즉시 호출이 가능합니다.
- 상속 키워드로 implements를 사용합니다.
- 다중 상속이 가능합니다.
Interface Simple Example
Payment.class
public interface Payment {
void pay();
}
BankTransfer.class
public class BankTransfer implements Payment {
@Override
public void pay() {
System.out.println("bank transfer");
}
}
CreditCard.class
public class CreditCard implements Payment {
@Override
public void pay() {
System.out.println("credit card");
}
}
KakaoPay.class
public class KakaoPay implements Payment {
@Override
public void pay() {
System.out.println("kakao pay");
}
}
OrderPayment.class
public class OrderPayment {
private Payment payment;
public OrderPayment(Payment payment) {
this.payment = payment;
}
public void changePaymentMethod(Payment payment) {
this.payment = payment;
}
public void pay() {
payment.pay();
}
}
Application.class
public class Application {
public static void main(String[] args) {
OrderPayment payment = new OrderPayment(new BankTransfer());
payment.pay();
payment.changePaymentMethod(new CreditCard());
payment.pay();
payment.changePaymentMethod(new KakaoPay());
payment.pay();
}
}
Abstract Class
- 클래스 앞에 abstract 키워드를 사용하여 정의하며 하나 이상의 추상 메서드를 가지고 있거나 abstract로 정의가 된 클래스
- 공통되는 특성을 갖고 있는 클래스
- 상속을 통해 하위 클래스에서 반드시 구현하도록 강제하기 위한 클래스
- 추상 클래스에서는 default 메서드에 final keyword를 적용해 주면 하위 클래스에서 오버라이딩이 불가합니다.
- 상속은 되지만, 동작은 바꿀 수 없습니다.
- 특징
- 객체를 만들 수 없는 클래스 (new 키워드로 객체 생성 불가)
- 추상 메서드를 포함하는 클래스는 반드시 추상 클래스여야 합니다.
- 추상 클래스는 선언부만 존재하며 구현부는 존재할 수 없습니다.
- 일반 클래스 상속과 동일하게 상속 키워드로 extends를 사용합니다.
- 다중 상속이 불가능합니다.
Abstract Simple Example
Animal.class
public abstract class Animal {
void eat() {
System.out.println("eat");
}
void work() {
System.out.println("work");
}
void sleep() {
System.out.println("sleep");
}
// override x
final void awake() {
System.out.println("awake");
}
abstract void makeSound();
}
Cat.class
public class Cat extends Animal {
@Override
void makeSound() {
System.out.println("meow");
}
@Override
void eat() {
System.out.println("eat chur");
}
}
Dog.class
public class Dog extends Animal {
@Override
void makeSound() {
System.out.println("woof");
}
@Override
void eat() {
System.out.println("eat dog chew");
}
}
Application
public class Application {
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
cat.makeSound();
dog.makeSound();
cat.eat();
dog.eat();
}
}
<참고 자료>
[JAVA] 추상 클래스(Abstract) 완벽 이해하기
추상 클래스란? 추상 클래스는 추상 메서드를 하나라도 가지고 있는 클래스를 만한다. 추상 메서드는 "메서드가 완성되지 않은, 껍데기만 있는 메서드" 이다. 쉽게 이해하기 위해서 예를 들자면
developshrimp.com
[JAVA] 인터페이스(Interface) 핵심 이해하기
인터페이스(Interface)란 인터페이스는 프로그램 내 다양한 기능을 하는 클래스들에게 기본이 되는 틀(구조)를 제공하는 역할을 한다. 이전의 포스팅을 보았다면 알겠지만, 추상 클래스와 비슷한
developshrimp.com
https://www.geeksforgeeks.org/java/difference-between-abstract-class-and-interface-in-java/
Difference Between Abstract Class and Interface in Java - GeeksforGeeks
Your All-in-One Learning Portal: GeeksforGeeks is a comprehensive educational platform that empowers learners across domains-spanning computer science and programming, school education, upskilling, commerce, software tools, competitive exams, and more.
www.geeksforgeeks.org
'Java' 카테고리의 다른 글
[Java] Stream, Collection (6) | 2025.08.15 |
---|---|
[Java] Garbage Collection (1) | 2024.12.05 |
[Java] ClassNotFoundException VS NoClassDefFoundError (1) | 2024.02.06 |
[Java] Exception (0) | 2023.08.21 |