추상 클래스란 ?
- 몸체 없는 메소드를 포함한 클래스 (미완성 설계도)
- 객체로 만들면 안되는 클래스
- 클래스 선언부에 abstract 키워드 사용
*일반 필드/메서드 + 추상 메서드가 합쳐진 모습
→ 상속 받은 자식 객체 생성 시 내부에 일반 필드/메서드가 정상적으로
구현이 되어야 되기 때문에 추상 클래스도 생성자가 필요하다!!
[접근제한자] abstract class 클래스명 {}
추상 메서드란?
- 몸체 없는 메소드
- 공통된 기능의 이름을 갖지만 정의할 수 없는 메서드
-추상 메소드의 선언부에 abstract 키워드 사용
- 상속 받은 자식 클래스에서 해당 메서드를 정의하도록 강제함 → 오버라이딩 강제화
[접근제한자] abstract 반환형 메소드명(자료형 변수명);
#예제
[Parent] Animal 추상 클래스
package pkg2.dto;
/* 추상 클래스 */
public abstract class Animal {
// 공통적인 속성(필드)
private int eyes; // 눈 개수 저장
// 기본 생성자
public Animal() { /* super(); */ }
// 매개 변수 생성자
public Animal(int eyes) {
this.eyes = eyes;
}
public int getEyes() {
return eyes;
}
public void setEyes(int eyes) {
this.eyes = eyes;
}
@Override
public String toString() {
return eyes + ""; // int + String == String
}
// 공통된 기능(메서드)
/* 추상 메서드 */
public abstract void move();
public abstract void eat();
public abstract void sleep();
}
[Child1] Cat
package pkg2.dto;
public class Cat extends Animal {
// The type Cat must implement the inherited
// abstract method Animal.move()
// -> 상속 받은 move() 구현해야 한다
private int beard; // 수염
// 생성자
public Cat() {
super(); // 부모(Animal) 객체 생성
}
public Cat(int eyes, int beard) {
super(eyes);
this.beard = beard;
}
public int getBeard() {
return beard;
}
public void setBeard(int beard) {
this.beard = beard;
}
@Override
public String toString() {
return "Cat :" + beard + "/" + getEyes();
}
/* Animal로 부터 상속 받은
* abstract 메서드를 구현(오버라이딩)하라고
* 오류가 발생함
* -> 오버라이딩 강제화
*/
@Override
public void move() {
System.out.println("고양이 : 사뿐 사뿐 움직임");
}
@Override
public void sleep() {
System.out.println("고양이 : 엎드려 잠");
}
@Override
public void eat() {
System.out.println("고양이 : 냠냠 먹음");
}
}
[Child2] Fish
package pkg2.dto;
public class Fish extends Animal {
private int gill; // 아가미 개수
public Fish() {
super();
}
public Fish(int eyes, int gill) {
super(eyes);
this.gill = gill;
}
public int getGill() {
return gill;
}
public void setGill(int gill) {
this.gill = gill;
}
@Override
public String toString() {
return "Fish : " + gill + "/" + getEyes();
}
@Override
public void move() {
System.out.println("물고기 : 첨벙첨벙 팔딱팔딱");
}
@Override
public void eat() {
System.out.println("물고기 : 뻐끔뻐끔 입으로 먹음");
}
@Override
public void sleep() {
System.out.println("물고기 : 무섭게 눈뜨고 잠");
}
}
[Service]
package pkg2.service;
import pkg2.dto.Animal;
import pkg2.dto.Cat;
import pkg2.dto.Fish;
public class AbsService {
/**
* 추상 클래스 객체 생성 확인
*/
public void test1() {
// Animal a = new Animal();
//Cannot instantiate the type Animal
// -> Animal은 객체화 할 수 없다
// 왜 ? 추상 클래스라서
Cat c = new Cat();
Fish f = new Fish();
// 오버라이딩한 추상 메서드 호출
c.move();
c.eat();
c.sleep();
f.move();
f.eat();
f.sleep();
}
}
[Run]
package pkg2.run;
import pkg2.service.AbsService;
public class AbsRun {
public static void main(String[] args) {
AbsService service = new AbsService();
service.test1();
}
}
#결과

#예제2
[Service]
public void test2() {
// 추상 클래스는 객체 생성은 X
// 대신 참조형 변수는 O
Animal a1 = new Cat(2, 10);
Animal a2 = new Fish(2, 2);
//-> 에러 안남 확인!!
// 추상 클래스를 이용한 객체 배열
// -> 추상 클래스 참조 변수 묶음 -> 문제 없음!
Animal[] animals = new Animal[4];
animals[0] = new Cat();
animals[1] = a1; // a1에 저장된 값 == Cat 객체 참조 주소
// Cat은 Animal 자식 클래스
animals[2] = new Fish();
animals[3] = a2;
// 향상된 for문 -> 동적 바인딩 확인
for(Animal a : animals) {
System.out.println(a.toString()); // a.toString() 출력
a.sleep();
a.move();
a.eat();
}
}
[Run]
package pkg2.run;
import pkg2.service.AbsService;
public class AbsRun {
public static void main(String[] args) {
AbsService service = new AbsService();
service.test2();
}
}
#결과

'BackEnd > Java' 카테고리의 다른 글
| [Java]컬렉션 (0) | 2024.08.12 |
|---|---|
| [Java]다형성 인터페이스 (0) | 2024.08.12 |
| [Java]객체 배열(Object_Array) (0) | 2024.07.31 |
| [Java]다형성 객체 타입에 따른 업/다운 캐스팅 (0) | 2024.07.31 |
| [Java]다형성 (Polymorphism) (0) | 2024.07.31 |