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
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 구현 (1) (0) | 2021.07.12 |
---|---|
[JAVA] 인터페이스 (0) | 2021.07.12 |
[JAVA] 타입변환과 다형성(polymorphism) (2) (0) | 2021.07.08 |
[JAVA] 타입변환과 다형성(polymorphism) (1) (0) | 2021.07.07 |
[JAVA] final 클래스와 final 메소드 (0) | 2021.07.06 |