다잘하고싶어

자바 추상클래스 본문

이론학습/JAVA

자바 추상클래스

챙영잉 2023. 2. 6. 14:03

목차

추상클래스

⇒ 객체를 생성할 수 없는 클래스

⇒ 추상메서드를 갖는 클래스

⇒ 추상메서드 : 내용(구현부)이 없는 메서드

→ 반드시 자식클래스에서 오버라이드 해줘야한다.

⇒ 상속 전용 메서드

클래스 : 설계도 (blueprint)

추상클래스가 왜 필요할까?

  • 추상클래스로 만들면 객체를 생성할 수 없게 막을 수 있다.

  • 자식클래스에서 메서드의 재정의(오버라이드)를 강제할 수 있다.

자식클래스에서 반드시 부모클래스의 추상메서드를 오버라이드 해줘야 한다 → 추상메서드가 일반메서드가 된다 → 객체생성이 가능해진다.

abstract public class Animal {
 
	abstract public void speak();  
}

package test01;

//일반 클래스인데, 추상클래스를 상속
public class Cat extends Animal{

	@Override
	public void speak() {
		System.out.println("냐옹");
		 
	} 
}

추상메소드

  • abstract 키워드 → 일반 클래스는 추상메서드를 가질 수 없으므로 클래스에도 abstract 를 붙여 추상클래스로 만들어준다.
  • ; 으로 종료한다

접근제한자 + 그 외 제한자

  • 접근제한자 : public, (default), protected, private
  • 그 외 제한자(지정예약어) : static, final, abstract
  • 접근제한자와 지정예약어의 순서는 서로 상관이 없다.

만약 추상클래스의 자식클래스도 굳이 객체를 생성할 필요가 없다면?

⇒ 자식클래스도 추상클래스로 만들어준다.

abstract public class Animal {
 
	abstract public void speak();  
}
public abstract class Mammal extends Animal {

}

자식클래스에서 추상클래스에 없는 메서드를 구현한다면?

부모클래스 Animal

abstract public class Animal { 
	abstract public void speak();  
}

자식클래스 Cat

public class Cat extends Animal{

	@Override
	public void speak() {
		System.out.println("냐옹");
		 
	}
	
	public void eat() {
		System.out.println("고양이는 생선을 먹어요");
	}

}

자식클래스 Dog

public class Dog extends Animal {
	@Override
	public void speak() {
		System.out.println("멍멍");
	} 
	 
	public void eat() {
		System.out.println("개는 고기를 먹어요");
	}

}

사용하려고 할 때 에러난다(16번라인) → 왜?

a1은 Animal 클래스를 참조하고 있다.(11번 라인) Animal 클래스가 가지고 있지 않은 메서드(=eat(), 메모리 상에 존재하지 않음) 이므로 사용할 수 없다.

⇒ 해결하기 위해서는?

[방법1]

부모클래스에 추상메서드나 일반메서드 타입으로 정의해두어야 한다. 그래야 부모클래스 타입으로 참조했을 때 메서드사용가능

[방법2]

instanceof 를 사용해서 형변환을 해준다

instanceof 연산자

  • 객체가 해당 클래스로 만든 객체인 경우 ⇒ true
  • 객체가 해당 클래스의 조상클래스로 만든 객체인 경우 ⇒ true
  • 객체가 해당 클래스의 자식클래스로 만든 객체인 경우 ⇒ false
  • 객체가 해당 클래스와 무관한 경우 ⇒ false

instanceof 를 사용한 형변환

public static void main(String[] args) {
		//자식클래스에서 추상클래스에 없는 메소드를 구현한다면?
		Animal a1 = new Cat();

		if(a1 instanceof Cat) {
			Cat c =  (Cat) a1;
			c.eat();
		 }

}

조상클래스에서 일반메서드로 만드는 것 vs 추상메서드로 만드는 것 의 차이

추상클래스는 일반메서드와 추상메서드 둘 다 가질 수 있다. 그렇다면 둘의 차이는?

⇒ 강제성의 차이 (추상메서드는 재정의가 강제됨) ⇒ 오류 방지에 도움

⇒ 부모클래스에서 일반메서드, 추상메서드 둘다 안만들고 자식클래스에서 독립적으로 만들어서 사용하는 경우?

⇒ 다형성을 활용할 수 없다.