[Java] 추상화 - 추상클래스, 추상메서드, 인터페이스

2025. 5. 20. 17:32·공부/☕Java

✅ 1. 추상클래스

public abstract class Animal {
    public abstract void run(); // 추상 메서드
    
    public void eat() { // 일반 메서드
        System.out.println("This animal eats food.");
    }
}
  • 추상 클래스는 class 앞에 abstract 키워드를 붙힌 클래스를 의미한다.
  • abstract 키워드를 명시하면 해당 클래스는 객체 생성이 불가능한 클래스가 되며, 상속으로만 이용이 가능해진다.
  • 추상클래스 내부에는 멤버 변수를 가질 수 있다.
  • 추상클래스에는 추상메서드, 일반메서드 둘 다 만들 수 있다.
  • 구현 클래스가 상속을 받게되면, 추상 메서드는 반드시 구현을 해야하고, 일반 메서드는 상속과 동일한 구조를 갖는다.
  • 마지막으로, 추상클래스는 extends를 활용한 상속 구조이기 때문에, 단일 상속만 가능하다

참고사항

  • 추상클래스는 기본적으로 상속만 가능하고 new 객체 생성이 불가능하지만, 생성자는 가질 수 있음.
  • 이유는, 추상클래스는 필드에 멤버변수를 가질 수 있으므로, 생성자를 통해 필드를 초기화 할 수 있기 때문이다.
  • 즉, 상위클래스의 필드에 값을 넣기 위해서 생성자를 이용해 값을 초기화 할 때 사용이 된다.

추상 클래스 사용 이유

  • 여러 관련 클래스들이 공통으로 가져야 할 메서드와 필드를 정의할 때 사용이 된다.
  • 추상 클래스는 객체 생성이 불가능하기에 무조건 상속을 받아야하는 구조가 형성이 된다.
  • 이말은즉슨, 상속을 무조건 받게 하여, 설계를 명확히 하고, 일관된 구조를 강제하게 하기 위해서 사용이 된다는 말이다.

✅ 2. 추상메서드

public abstract class Animal {
    public abstract void run(); // 추상 메서드
    
    public void eat() { // 일반 메서드
        System.out.println("This animal eats food.");
    }
}
  • abstract 키워드가 붙은 메서드를 의미한다.
  • 추상클래스 내부에서만 추상메서드를 만들 수 있으며, 일반 클래스에서 만들려고 하면 컴파일 오류가 뜬다.
  • 구현하는 하위 클래스가 추상메서드를 반드시 구현을 해줘야하며, 구현을 안하면 컴파일 오류가 뜬다.
  • 하위클래스가 추상클래스일 경우 추상메서드를 구현을 해도 되고 안해도 된다.
  • 만약 안하게 된다면 구현 클래스 즉, 상속을 받는 하위 클래스가 존재하는 경우에는 반드시 해줘야 한다.

참고사항

  • private 접근 제어자는 사용이 불가능하다.
  • 디폴트 접근 제어자는 사용이 가능하지만, 해당 패키지 내부에 없으면 상속 받는 클래스에서 컴파일 오류가 뜸.
  • protected 접근 제어자는 상속을 반드시 받기 때문에 오류 없이 이용이 가능하다.

✅ 3. 인터페이스

public interface A {
    void hello();

    default void defaultMethod() {
        System.out.println("default method");
    }

    static void staticMethod() {
        System.out.println("static method");
    }
}
  • 클래스가 구현해야 할 기능의 명세 즉, 메서드를 정의하는 추상적인 타입을 의미한다.
  • 인터페이스는 이 메서드들을 반드시 구현해야 한다 라는 규칙을 정해 구현을 강제화 하기 위한 도구이다.
  • 인터페이스에는 생성자가 없으며, 다중 상속이 가능하다.

특징

  • 구현하는 클래스에선 implements 키워드를 이용해 구현을 할 수 있다.
  • 기본적으로 class 대신 interface 키워드를 이용해 클래스를 명시해서 만들 수 있다.
  • 인터페이스에는 생성자가 없으며, 다중 상속 즉, 다중 구현이 가능하다.
  • 메서드는 총 3개 추상메서드, default 인스턴스 메서드, static 클래스 메서드를 만들 수 있다.
  • 인터페이스에서는 멤버 변수 즉, 필드에 변수를 선언 할 수 없다.

참고사항

  • 사실 interface 키워드 앞에 abstract 키워드가 존재하며, 해당 부분은 생략 할 수 있으며, 컴파일 때 자동으로 들어간다.
  • 모든 메서드에는 public 접근 제어자만이 들어가게 된다. 이 부분은 생략이 가능하며, 자동으로 들어간다.
  • 추상 메서드에는 자동으로 abstract 키워드가 붙게 된다. 붙혀도 되고 안붙혀도 된다.
  • 인터페이스의 이름은 보통 형용사로 쓴다. 즉, 형용사의 형태로써 이용을 하는게 일반적이다.

✅ 4. default 키워드 ( 메서드 )

  • 현재 자바에선 default 키워드는 인터페이스에서만 사용을 할 수 있는 키워드이다. 
  • default키워드는 인터페이스 내부의 인스턴스 메서드 즉, 구현 메서드를 만들 때 사용이 된다.
public interface A {
    public default void defaultMethod() {
        System.out.println("default A");
    }
}
// case 1
public class B implements A {
    // 메서드를 재정의 하지 않아도 내부에서 호출이 가능
    public void test() {
        defaultMethode(); // 오류x
    }
}
// case 2
public class B implements A {
    // 재정의 또한 가능함.
    @Override
    public void defaultMethod() {
        System.out.println("overring defaultMethod");
    }
}
  • default 메서드는 구현 과정에서 하나의 클래스만 상속을 받으면, 상속과 동일하게 메서드를 하위클래스에 포함시켜준다.

 

(1) interface 다중 상속 케이스일 경우 default 메서드

public interface A {
    public default void defaultMethod() {
        System.out.println("default A");
    }
}
public interface B {
    public default void test() {
        System.out.println("default B");
    }
}
// case 1 : 직접 재정의해서 구현을 하는 방식
public class C implements A, B {
    @Override
    public void defaultMethod() {
    	System.out.println("overring defaultMethod");
    }
}
// case 2 : 상위 클래스 어떤 메서드를 호출할지 직접 명시하는 방식
public class C implements A, B {
    @Override
    public void defaultMethod() {
    	A.super.defaultMethod(); // A 클래스의 메서드 호출
        B.super.defaultMethod(); // B 클래스의 메서드 호출
        // 하나 또는 둘 다 호출이 가능하다는 특징이 있음.
    }
}
  • 다중 상속을 받는 과정에서 동일한 디폴트 메서드를 상속 받을 때는 반드시 재정의(Overriding)을 해야한다.
  • 이유는, 컴파일러가 다중 상속과정에서 어떤 메서드를 자동 포함시켜줄지 모르기 때문에 직접 재정의해서 명시해야 한다.
  • 재정의한 메서드 내부에 예시 코드와 같이 메서드를 호출 할 수 있고, 또는 재정의로 덮어버릴 수 있다.

 

(2) default 메서드 사용이유

  • 인터페이스는 구현을 강제한다. 즉, 구현을 하지 않으면 컴파일 과정에서 에러를 내뱉는다는 의미이다.
  • 이러한 과정 때문에 개발자가 인터페이스에 코드를 추가한 경우 기존의 구현하고 있던 클래스에는 오류를 내뱉는다.
  • 이렇기 때문에 default 메서드를 활용해서 반드시 구현을 하지 않아도 포함이 될 수 있도록 하면 오류가 나지 않는다.
  • 예외 케이스로는 다중 상속을 받는데, 동일한 메서드가 있는 경우로 이때는 직접 구현 클래스 수정을 해야한다.

'공부 > ☕Java' 카테고리의 다른 글

[Java] 익명 클래스(Anonymous Class)  (1) 2025.05.22
[Java] 다형성(polymorphism)  (1) 2025.05.22
[Java] Enum 쉽게 이해하기  (1) 2025.05.05
[Java] JVM과 자바 실행 원리  (1) 2025.04.14
[Java] Java와 객체지향 프로그래밍이란?  (0) 2025.03.06
'공부/☕Java' 카테고리의 다른 글
  • [Java] 익명 클래스(Anonymous Class)
  • [Java] 다형성(polymorphism)
  • [Java] Enum 쉽게 이해하기
  • [Java] JVM과 자바 실행 원리
junbin2
junbin2
java.lang.NullPointerException
  • junbin2
    bin's Development Diary
    junbin2
  • 전체
    오늘
    어제
    • 전체보기 (233)
      • 방송통신대학교 (87)
        • ⚙️컴퓨터의 이해 (11)
        • 💻컴퓨터과학 개론 (15)
        • 🔢자료구조 (14)
        • 🧬알고리즘 (10)
        • ⚙️운영체제 (14)
        • 🕸️이산수학 (11)
        • 🌍유비쿼터스 컴퓨팅 (11)
        • 🖥️컴퓨터과학과 (1)
      • 공부 (72)
        • 📚백엔드 공부 (6)
        • ☕Java (23)
        • 🌳Spring (13)
        • ⚙️C (12)
        • ⚡Python (15)
        • JavaScript (1)
        • 🛢️Database (0)
        • Algorithm Problem Solving (2)
      • 네트워크 (7)
        • 📜HTTP (7)
      • 스파르타코딩클럽 (64)
      • 정보 (2)
      • 정리가 필요한 글 (1)
  • 블로그 메뉴

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

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    컴퓨터과학 개론
    C언어
    운영체제
    자바
    방통대
    방송통신대학교
    자료구조
    방송대
    파이썬
    spring
    컴퓨터의 이해
    컴퓨터과학과
    알고리즘
    Java
    배열
    이산수학
    그래프
    함수
    Python
    유비쿼터스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
junbin2
[Java] 추상화 - 추상클래스, 추상메서드, 인터페이스
상단으로

티스토리툴바