객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면,
이 실체 클래스들의 공통적인 특성을 추출해 선언한 클래스를 추상 클래스 라고 한다.
추상 클래스와 실체 클래스는 상속의 관계에 있어, 실체 클래스는 추상 클래스의 모든 특성을 물려받는다.
추상 클래스는 실체 클래스들을 추출해서 만들었기 때문에 직접 객체를 생성하지 못한다.
즉 , new( ) 연산자를 사용할 수 없다.
추상 클래스의 용도는 다음과 같다.
- 실체 클래스의 필드와 메소드의 이름을 통일화
- 시간 절약(추상 클래스로 설계 규격을 만들고, 상속해서 구체적인 클래스를 만들도록 지시함으로써)
추상 클래스는 abstract 키워드를 붙여 선언한다.
public abstract class Animal{
public String name;
public int age;
public Animal(String name){
this.name = name;
}
public void Eat(){
System.out.println("냠냠");
}
}
Animal 추상 클래스는 name 과 age 필드와 문자열을 매개 변수로 하는 생성자, 그리고 Eat 메서드를 가지고 있다.
Cat 클래스는 Animal 추상 클래스를 상속받는 자식 클래스이다.
public class Cat extends Animal{
Cat(String name){
super(name); // super를 이용해 Animal 생성자를 호출하고 있다.
}
}
앞서 말했듯이 추상 클래스는 new( ) 연산자를 통해 직접 객체를 생성할 수 없다.
그렇기 때문에 자식 클래스의 객체를 생성해서 부모 클래스인 추상 클래스의 메소드를 사용한다.
public class Test{
public static void main(String[] args){
//Animal animal = new Animal() 불가. 추상 클래스는 객체 직접 생성불가
Cat cat = new Cat();
cat.Eat(); //자식클래스 객체 이용해서 부모 추상 클래스의 메서드 이용
}
}
//결과 : 냠냠
추상 클래스를 사용하다 보면 메소드의 선언만 통일화 하고, 실행 내용은 실체 클래스마다 달라져야하는 경우가 있다.
예를 들어 Animal 부모 추상클래스에 sound 메서드가 있을 때 강아지는 멍멍, 고양이는 야옹 소리를 내야한다.
그렇다고 sound() 메서드를 실체 클래스 위에 직접 작성하도록 하면, 잊어버리고 작성하지 않는 경우가 생겨
동물은 소리를 낸 다는 것에 위배되는 상황이 올 수도 있다.
이런 경우를 위해 우리는 추상 메서드를 이용할 수 있다.
추상 메서드는 추상 클래스에서만 선언할 수 있는 메서드로, 선언만 하고 실행 내용인 { }가 없는 메서드이다.
public abstract class Animal{
public String name;
public int age;
public Animal(String name){
this.name = name;
}
public abstract void sound();
public void Eat(){
System.out.println("냠냠");
}
}
추상 메서드를 선언했으나, 실행 내용은 적지 않았다.
이러한 추상 메서드는 추상 클래스를 상속받는 자식 실체 클래스에서 재정의해주어야한다.
public class Cat extends Animal{
public void sound(){
System.out.println("야옹"); //부모 클래스의 추상 메서드 재정의
}
}
public class Dog extends Animal{
public void sound(){
System.out.println("멍멍"); //부모 클래스의 추상 메서드 재정의
}
}
만약 부모 클래스에 추상 클래스가 있음에도 재정의 하지 않으면 에러가 발생한다.
그리고 추상 메서드를 하나라도 가지고 있는 클래스는 추상 클래스이므로 반드시 abstract 키워드가 붙어야 한다.
public class Test{
public static void main(String[] args){
Dog dog = new Dog();
Cat cat = new Cat();
dog.sound(); //오버라이딩 "멍멍"
cat.sound(); //오버라이딩 "야옹"
Animal animal = null;
Animal animal = dog; //부모 타입으로 자동 타입 변환했기 때문에
animal.sound(); //자식 메서드 접근 불가하나 오버라이딩으로 접근
// "멍멍"
Animal animal = cat; //부모 타입으로 자동 타입 변환했기 때문에
animal.sound(); //자식 메서드 접근 불가하나 오버라이딩으로 접근
// "야옹"
}
}
public class Test(){
public static void main(String[] args){
animalSound(new Dog()); //Animal 클래스 타입으로 자동변환
animalSound(new Cat()); //매개변수의 다형성을 이용한 것.
}
public static void animalSound(Animal animal){
animal.sound();
}
}
//결과 : 멍멍
// 야옹
'Dev > Java' 카테고리의 다른 글
[Java Exception] java.lang.NullPointerException (0) | 2022.10.27 |
---|---|
[Java] 인터페이스 (0) | 2022.08.06 |
[Java] 다형성 (0) | 2022.07.21 |
[Java] 접근 제한자 / 싱글톤 패턴 / Getter , Setter (0) | 2022.07.19 |
[Java] final 키워드 (0) | 2022.07.16 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!