Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- 자바 멀티스레딩
- 반복문
- 연관관계
- IntelliJ IDEA
- 접근제어지시자
- 포함관계
- 형 변환
- While
- this예약어
- OPP개념
- Java
- Java데이터 타입
- java변수
- 시스템 환경 변수 편집
- continue문
- JAVA객체지향
- multi-threading
- 인텔리제이 기초 설정
- 집합관계
- 인텔리제이 한글 깨짐 해결법
- 메서드
- JAVA기초
- 메서드 오버로딩
- 생성자
- 컴파일
- break문
- function
- Thread
- for문
- 상수
Archives
- Today
- Total
최원종의 개발 블로그
추상 클래스(abstract class) 본문
추상 클래스는 하나 이상의 추상 메서드를 포함하고 있는 클래스.
추상 메서드는 구현이 없는 메서드이며, 추상 클래스 내에서는 이러한 추상 메서드의 정의만을 포함하고 있다.
추상 클래스는 직접적으로 객체를 생성할 수 없으며, 다른 클래스에서 상속받아 구현되어야 한다.
추상 메서드
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 |

