최원종의 개발 블로그

추상 클래스(abstract class) 본문

Java/Java 객체지향

추상 클래스(abstract class)

chl6698 2026. 3. 6. 11:03

추상 클래스는 하나 이상의 추상 메서드를 포함하고 있는 클래스.

추상 메서드는 구현이 없는 메서드이며, 추상 클래스 내에서는 이러한 추상 메서드의 정의만을 포함하고 있다.

추상 클래스는 직접적으로 객체를 생성할 수 없으며, 다른 클래스에서 상속받아 구현되어야 한다.

 

추상 메서드

 int add(int x, int y); // 선언 

 int add(int x, int y){ ... } // 구현부가 있음, 추상 메서드 아님

추상 클래스 코드

 

-Animal

package com.tenco._abstract;

public abstract class Animal {
    //추상 클래스란(abstract class)
    //하나 이상의 추상 메서드를 포함하는 클래스를 말하고 또는 클래스 이름 앞에 abstract키워드가 붙어 있다

    String name;

    public void move() {
        System.out.println("이동 합니다");
    }

    //추상 메서드 -> 메서드에 선언부만 존재하는 녀석 + abstract
    public abstract void hunt();

    //테스트 코드
    public static void main(String[] args) {

        //Animal animal = new Animal();
        //추상 클래스는 new란 키워드와 생성자를 바로 호출해서 메모리에 직접 올릴 수 없다

    }
}

 

-Tiger

package com.tenco._abstract;

//1. 부모 클래스에 추상 메서드가 있으면
//자식 클래스를 추상 클래스로 만들 수 있다
//public abstract class Tiger extends Animal
public class Tiger extends Animal{

    //2.추상 메서드를 일반 메서드로 재정의하면 된다
    //오버라이드 활용
    @Override
    public void hunt() {

    }

    @Override
    public void move() {
        super.move();
    }

    public static void main(String[] args){
        //내가 코드의 활용성을 높이고 객체 지향 개념을 코드를 설계 하기 위해서
        //강제로 추상 클래스를 개념으로 설계할 수 있다.
        // 그러면 추상 클래스를 사용하는 입장에 개발자는 실수로 추상 클래스를 new 하지 않아도 된다.
        Tiger tiger = new Tiger();
    }
}

 

package com.tenco._abstract;

public abstract class Human extends Animal {

    @Override
    public void hunt() {
        System.out.println("사람이 사냥을 합니다");
    }
}



추상 클래스 구현

 

라면 만들기 코드

package com.tenco._abstract;

public abstract class RamenRecipe {
    public void boilWater() {
        System.out.println("물 500ml를 넣고 팔팔 끓입니다");
    }

    public void putNoodles() {
        System.out.println("면을 투척합니다");
    }

    public abstract void addSpecialSoup();

    public void serve() {
        System.out.println("맛있는 라면이 완성되었습니다!. 후루룩!");
    }

    //라면 레시피는 순서가 있다. -> 템플릿 메서드 패턴 : 요리 순서를 정해 줌
    //디자인 패턴( final ) 키워드
    // 메서드 final 키워드가 있다면 자식 클래스에서 오버라이드(재정의) 불가이다.
    public final void cook() {
        boilWater();
        putNoodles();
        addSpecialSoup();
        serve();
    }

}
package com.tenco._abstract;

public class ShinRamen extends RamenRecipe{

    // 추상 메서드를 강제로 재 정의하기 때문에 강제성이 생김
    @Override
    public void addSpecialSoup() {
        System.out.println("매콤한 신라면 분말스프와 건더기 스프를 넣습니다");
    }

    //cook()메서드는 final메서드라 재정의 불가함(메서드 호출에 순서가 정해져있다) -> 템플릿이 정해져있음
}

class JinRamen extends RamenRecipe{
    @Override
    public void addSpecialSoup() {
        System.out.println("구수한 진라면 스프와 계란 블록을 넣습니다");
    }
}

 

-RamenTest

package com.tenco._abstract;

public class RamenTest {
    public static void main(String[] args) {
        //추상 클래스는 바로 객체를 생성할 수 없다
        //RamenRecipe ramenRecipe = new RamenRecipe(); ->불가

        System.out.println("-- 신라면 조리 시작 --");
        RamenRecipe shin = new ShinRamen();
        shin.cook();

        System.out.println("-- 진라면 조리 시작 --");
        RamenRecipe jin = new JinRamen();
        jin.cook();

    }
}

 

'Java > Java 객체지향' 카테고리의 다른 글

인터페이스 활용  (0) 2026.03.06
인터페이스(interface)  (0) 2026.03.06
다형성(Polymorphism)  (0) 2026.03.05
포함관계와 집합관계  (0) 2026.03.04
연관관계(Association)  (0) 2026.03.04