[Java] final, interface, abstract class

2025. 8. 27. 01:24·Java

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();
    }
}

 

 

<참고 자료>

https://developshrimp.com/entry/JAVA-%EC%B6%94%EC%83%81-%ED%81%B4%EB%9E%98%EC%8A%A4Abstract-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

[JAVA] 추상 클래스(Abstract) 완벽 이해하기

추상 클래스란? 추상 클래스는 추상 메서드를 하나라도 가지고 있는 클래스를 만한다. 추상 메서드는 "메서드가 완성되지 않은, 껍데기만 있는 메서드" 이다. 쉽게 이해하기 위해서 예를 들자면

developshrimp.com

https://developshrimp.com/entry/JAVA-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4Interface-%ED%95%B5%EC%8B%AC-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

[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
'Java' 카테고리의 다른 글
  • [Java] Stream, Collection
  • [Java] Garbage Collection
  • [Java] ClassNotFoundException VS NoClassDefFoundError
  • [Java] Exception
SeungbeomKim
SeungbeomKim
[IT(PS, CS, SW, etc.) 지식 기록] Github : https://github.com/daily1313/
  • SeungbeomKim
    개발 블로그
    SeungbeomKim
  • 전체
    오늘
    어제
    • 분류 전체보기 (392) N
      • 일상 (33)
        • 여행 (17)
        • 회고록 (9)
        • 리뷰 (7)
      • PS (138)
        • 그리디 알고리즘[Greedy] (25)
        • 정렬 알고리즘[Sort] (18)
        • 문자열 알고리즘[String] (14)
        • 동적 계획 알고리즘[DP] (17)
        • 깊이 우선 탐색, 너비 우선 탐색[DFS, BFS.. (34)
        • 재귀[Recursion] (2)
        • 백트래킹[Backtracking] (5)
        • 브루트포스 알고리즘[Bruteforce] (16)
        • 자료 구조[Data Structure] (4)
        • 분할 정복 알고리즘[Divide & Conquer.. (3)
      • CS (26) N
      • Network (11)
      • Database (8)
        • Elasticsearch (3)
      • Linux (2)
      • JavaScript (4)
        • AngularJS (1)
      • Java (5) N
        • Effective Java (7)
        • Java Concept (20)
        • Spring (61)
        • Design Pattern (3)
      • Python (2)
      • Vscode (1)
      • DevOps (43)
        • AWS (27)
        • Git (7)
        • Docker (6)
        • Nginx (1)
      • 자격증 (10)
        • SQL (4)
      • 사이드 프로젝트 (3)
        • MatJido (3)
      • 기타 (9)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 소개
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    컴퓨터구조
    메타코딩
    Effective Java
    Wi-Fi
    백트래킹
    정보처리기사
    이펙티브 자바
    Spring
    BFS
    dfs
    springboot
    너비 우선 탐색
    다이나믹 프로그래밍
    sqld
    정보처리기사 실기
    AWS
    docker
    정보처리기사 필기
    일본여행
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
SeungbeomKim
[Java] final, interface, abstract class
상단으로

티스토리툴바