본문 바로가기
JAVA

[JAVA] 추상 클래스와 추상 메소드 정리

by IT 정복가 2023. 8. 23.
728x90

'추상'은 사전적 의미로 실체 간에 공통되는 특성을 추출한 것이라고 말한다.

예를 들어 새, 곤충, 물고기 등의 공통점은 동물이다. 

여기서 동물은 실체들의 공통되는 특성을 가지고 있는 추상적인 것이라고 볼 수 있다.

 

추상 클래스

객체를 생성할 수 있는 클래스를 실체 클래스라고 한다면

이 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스를 '추상 클래스'라고 한다.

쉽게 말하면, 추상 클래스는 실체 클래스의 부모 역할을 한다.

https://butter-shower.tistory.com/79

예를 들어 Bird, Insect, Fish와 같은 실체 클래스에서 공통되는 필드나 메소드를 따로 선언한 Animal 클래스를 만들 수 있고, 이것을 상속한 실체 클래스를 만들 수 있다.

 

추상 클래스는 실체 클래스의 공통되는 필드나 메소드를 추출해서 만들었기 때문에

new 연산자를 사용하여 객체를 직접 생성할 수 없다.

 Animal animal = new Animal();  // 이게 안된다는 뜻이다.

추상 클래스는 실체 클래스의 extends 뒤에만 올 수 있다.

class Fish extends Animal{
	//...
}

추상 클래스 선언

클래스 선언에 abstract 키워드를 붙이면 추상 클래스 선언이 된다. 

public abstract class 클래스명{
    //필드
    //생성자
    //메소드
}

추상 클래스도 일반적인 클래스들 마냥 필드, 생성자, 메소드를 선언할 수 있다.

 

예제)

Phone.java (추상 클래스)

public abstract class Phone {
	//필드 선언
	String owner;
	
	//생성자 선언
	Phone(String owner){
		this.owner = owner;
	}
	
	//메소드 선언
	void turnOn() {
		System.out.println("전원을 켭니다.");
	}
	
	void turnOff() {
		System.out.println("전원을 끕니다.");
	}
}

위의 Phone 클래스는 모든 전화기의 공통 필드와 메소드만 뽑아내어 추상 클래스로 만든 것이다.

 

SmartPhone.java(실체 클래스)

public class SmartPhone extends Phone{

	//생성자 선언
	SmartPhone(String owner) {
		//Phone 생성자 호출
		super(owner);
	}
	
	void internetSearch() {
		System.out.println("인터넷 검사를 합니다.");
	}
}

실체 클래스는 추상 클래스인 Phone으로부터

공통 필드와 메소드를 물려받고 본인만의 필드와 메소드를 선언할 수 있다.

 

PhoneExample.java(메인 클래스)

public class PhoneExample {

	public static void main(String[] args) {
//		Phone p = new Phone(); 추상 클래스는 new를 사용할 수 없다.
		
		SmartPhone sp = new SmartPhone("홍길동");

		sp.turnOn();
		sp.internetSearch();
		sp.turnOff();
	}

}


추상 메소드와 재정의

자식 클래스들이 가지고 있는 공통 메소드를 뽑아내어 추상 클래스로 작성할 때,

메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라져야 하는 경우가 많다.

 

예를 들어

Animal이라는 추상 클래스에서 sound()라는 메소드를 선언했지만

자식 클래스인 Dog, Cat, Bird의 소리는 다 다르기 때문에 추상 클래스에서 동일하게 작성할 수 없다.

 

이런 경우를 위해 아래와 같이 추상 메소드를 선언할 수 있다.

abstract 리턴타입 메소드명(매개변수);

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

일반 메소드 선언과의 차이점은 abstract 키워드가 붙고, { }가 없다.

 

그렇기 때문에 추상 메소드는 자식 클래스에서 반드시 오버라이딩 해서  실행 내용({ })를 채워야 한다.

추상 클래스 Animal의 sound( )라는 추상 메소드가 있다면 Dog에서 '멍멍' Cat에서 '야옹'으로 재정의 해야 한다.

https://butter-shower.tistory.com/79

 

예제)

Animal.java(추상 클래스)

public abstract class Animal {
	public void breathe() {
		System.out.println("숨을 쉽니다.");
	}
	
	public abstract void sound(); //추상 메소드는 { }가 없다!!
}

 

Dog.java

public class Dog extends Animal{

	// 추상 메소드 재정의
	@Override
	public void sound() {
		System.out.println("멍멍");
		
	}

}

 

Cat.java

public class Cat extends Animal{

	//추상 메소드 재정의
	@Override
	public void sound() {
		System.out.println("야옹");
		
	}

}

 

AbstractMethodExample.java(메인 클래스)

public class AbstractMethodExample {

	public static void main(String[] args) {
		Dog dog = new Dog();
		dog.breathe();
		dog.sound();
		
		System.out.println();
		
		Cat cat = new Cat();
		cat.breathe();
		cat.sound();

	}

}

 

728x90