07
08
728x90

추상 클래스 개념

추상(abstract)

실체들 간에 공통되는 특성을 추출한 것을 말한다.

ex 1.) 새, 곤충, 물고기 -> 동물(추상)

ex 2.) 삼성, 현대, LG -> 회사(추상)

 

추상 클래스(abstract class)

실체 클래스(객체를 만들어 사용할 수 있는 클래스)들의 공통되는 필드와 메소드를 정의한 클래스를 말한다.

추상 클래스는 실체 클래스의 부모 클래스 역할을 할 수 있다.

추상 클래스는 단독으로 객체 생성을 할 수 없고, 부모 클래스로만 사용된다.

 

추상 클래스의 용도

- 실체 클래스의 공통된 필드와 메소드의 이름을 통일할 목적

실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.

- 실체 클래스를 작성할 때 시간을 절약

실체 클래스는 추가적인 필드와 메소드만 선언하면 된다.

- 실체 클래스 설계 규격을 만들고자 할 때

실체 클래스가 가져야할 필드와 메소드를 추상 클래스에 미리 정의해 놓고 실체 클래스는 추상 클래스를 무조건 상속 받아 작성토록 한다.

 

추상 클래스 선언

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

 

예제)

package sec08.exam01_abstract_class;

public abstract class Phone //부모클래스로만 사용 가능
{
	//필드
	public String owner;
	
	//생성자
	public Phone(String owner)
	{
		this.owner = owner;
	}
	
	//메소드
	public void turnOn()
	{
		System.out.println("폰 전원을 켭니다.");
	}
	public void turnOff()
	{
		System.out.println("폰 전원을 끕니다.");
	}
}
package sec08.exam01_abstract_class;

public class SmartPhone extends Phone 
{
	public SmartPhone(String owner)
	{
		super(owner);
	}
	
	public void internetSearch()
	{
		System.out.println("인터넷 검색을 합니다.");
	}
}
package sec08.exam01_abstract_class;

public class PhoneExample 
{
	public static void main(String[] args) 
	{
		//Phone phone = new Phone(); 추상 클래스이기 때문에 실체클래스를 만들 수 없다.
		SmartPhone smartPhone = new SmartPhone("홍길동");
		smartPhone.turnOn();
		smartPhone.internetSearch();
		smartPhone.turnOff();
	}

}

출력 결과

 

추상 메소드와 오버라이딩(재정의)

실행내용을 가지고 있지 않음 / 구체적인 실행내용은 자식클래스에서 작성

추상 메소드는 추상 클래스 안에서만 생성이 가능

메소드 이름은 동일하나, 실행 내용이 실체 클래스마다 다른 메소드가 있을 수 있다.

ex) 동물은 소리를 낸다. 하지만 실체 동물들의 소리는 제각기 다르다.

구현방법

1. 추상 클래스에는 메소드의 선언부만 작성한다. (추상 메소드)

2. 실체 클래스에서 메소드의 실행 내용을 작성한다. (오버라이딩(Overriding))

 

예제)

package sec08.exam02_abstract_method;

public abstract class Animal 
{
	public String kind;
	
	public void breathe() //모든 동물은 숨을 쉼
	{
		System.out.println("숨을 쉽니다.");
	}
	
	public abstract void sound(); //동물마다 소리가 다르기 때문에 추상 메소드로 작성
}
package sec08.exam02_abstract_method;

public class Dog extends Animal
{
	public Dog()
	{
		this.kind = "포유류";
	}
	//animal의 추상메소드를 재정의
	@Override
	public void sound() 
	{
		System.out.println("멍멍");
	}
}
package sec08.exam02_abstract_method;

public class Cat extends Animal
{
	public Cat()
	{
		this.kind = "포유류";
	}
	//animal의 추상메소드를 재정의
	@Override
	public void sound() 
	{
		System.out.println("야옹");
	}
}
package sec08.exam02_abstract_method;

public class AnimalExample 
{

	public static void main(String[] args) 
	{
		Dog dog = new Dog();
		Cat cat = new Cat();
		
		dog.sound();
		cat.sound();
		System.out.println("-------------------------------------");
		
		Animal animal = null;
		animal = new Dog(); //자식객체가 부모타입으로 자동타입변환
		animal.sound(); //메소드가 재정의되면 자식쪽 메소드가 호출됨
		
		animal = new Cat();
		animal.sound();
		System.out.println("-------------------------------------");
		
		animalSound(new Dog());
		animalSound(new Cat());
	}
	public static void animalSound(Animal animal)
	{
		animal.sound();
	}
}

출력 결과

728x90
COMMENT