Java

추상 클래스란

감자꾸 2025. 10. 11. 02:12

추상 메소드는 

자식 클래스에서 재정의해야만 사용할 수 있는 메소드이다.

추상 클래스는

 이런 메소드를 하나 이상 포함하는 클래스를 추상 클래스라고 한다.

 

이 재정의한 메소드를 부모 클래스의 객체 변수를 통해 사용하려면 부모 클래스의 객체 변수를 선언할 때 자식 클래스의 생성자를 이용해야 한다.

 

좀 더 쉽게 말하자면

 

우리가 집 설계도를 만들고 있는 건축가라고 할 때, 이 집에 문을 달아야 한다고 하자.

  • 여기서 설계도는 추상 클래스이다

근데 지금은 어떤 문을 달지 아직 미정이다.
문의 종류는 워낙 많다.. 자동문,미닫이문,,여닫이문 등등... 그에 따라 문을 여는 방식이 다르다.

 

그래서 일단 설계도(추상 클래스)에는
문을 열 수 있어야 한다”는 정도만 넣어주는 것이다.


즉, 추상 클래스에 open()이라는 추상 메서드를 정의하는 것

 

그리고 나중에 구체적인 문이 만들어질 때 —
예를 들어 여닫이문, 미닫이문, 자동문 같은 문들이 생기면,
그때 각 문 클래스가 자기 방식대로 문을 여는 방법을 정의하는 것이다.

 

결국, 추상 클래스는

“문을 열어야 한다”는 공통 규칙만 정해두고,
실제로 어떻게 여는지는 자식 클래스가 결정하도록 맡기는 것

문의 여는 방식은 자식 클래스가 정의한다.

 

아래는 위 비유에 따른 코드 예시이다.

// 문 설계도 (추상 클래스)
//추상 클래스 
abstract class Door {
    abstract void open(); // "문을 열어야 한다"는 규칙만 정의 (추상 메소드)
}

// 여닫이문
class SwingDoor extends Door {
    void open() {
        System.out.println("문을 앞으로 연다");
    }
}

// 미닫이문
class SlidingDoor extends Door {
    void open() {
        System.out.println("문을 옆으로 민다");
    }
}

// 자동문
class AutomaticDoor extends Door {
    void open() {
        System.out.println("센서가 사람을 감지하고 열린다");
    }
}
public class Main {
    public static void main(String[] args) {

        // 여닫이문 객체 생성
        Door swing = new SwingDoor();
        swing.open(); // 문을 앞으로 연다 출력

        // 미닫이문 객체 생성
        Door sliding = new SlidingDoor();
        sliding.open(); // 문을 옆으로 민다 출력

        // 자동문 객체 생성
        Door auto = new AutomaticDoor();
        auto.open(); // 센서가 사람을 감지하고 열린다 출력
    }
}
  • 내가 달고 싶은 원하는 문의 객체만 생성하면 된다.

 

그럼 왜 굳이 추상 클래스를 사용해야 할까?

간단히 말하면

공통된 규칙은 미리 정해두고,
각자 다르게 해야 하는 부분은 강제로 만들게 하기 위해서이다.

 

이 부분도 코드를 통해 살펴보자.

class SwingDoor {
    void open() { System.out.println("문을 앞으로 연다"); }
}

class SlidingDoor {
    void open() { System.out.println("문을 옆으로 민다"); }
}

class AutomaticDoor {
    void open() { System.out.println("센서가 사람을 감지하고 열린다"); }
}

 

겉보기엔 잘 동작한다.
하지만,
이 세 문이 서로 아무 관계가 없게 된다.

 

사람인 우리 입장에선, 문의 종류라는 걸 알지만, 얘네가 다 문이라는 걸 코드가 모른다.

마치 like 하하버스 랄까.. 잘생기고 인기짱인데, 난 그걸 몰라

 

그래서 아래 코드는 사용할 수 없다.

void testDoor(Door door) {
    door.open();
}

 

왜냐,, door라는 공통 타입이 없으니까 

 

그래서 추상 클래스를 사용해야 아래와 같은 코드를 쓸 수 있다.

Door door = new AutomaticDoor();  // 자동문이지만, 추상 클래스를 통해 문으로서 인식됨
door.open(); // 자동으로 열린다

이렇게 해야, 코드 입장에서 자동문이 문이라는 걸 알고 있기 때문에 Door 타입 하나로 여러 종류의 문을 다 다룰 수 있다...

 

이게 바로 자바의 다형성이다.

요약하자면,

 

  • 추상 클래스공통 규칙을 정의해서
    “이 클래스는 이런 기능들을 반드시 가져야 해”라고 정해두는 역할.
  • 자식 클래스는 그 규칙을 따라서 자신만의 방식으로 구현하는 역할.

이렇게 하면 코드를 더 일관성 있고, 재사용성 있게 만들 수 있다.

 

 

이상,, 정처기 공부하다 다시 한번 다져보는 추상클래스