BackEnd/Java

[Java]다형성 추상클래스

Hojung7 2024. 7. 31. 21:57
추상 클래스란 ?

 

- 몸체 없는 메소드를 포함한 클래스 (미완성 설계도)

 

- 객체로 만들면 안되는 클래스

 

- 클래스 선언부에 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