자바 기초 (11). 추상 클래스
추상클래스가 무엇이고, 왜 사용하는지에 대해 알아보도록 하자
0. 들어가기전에
여러 클래스의 공통된 특성(필드, 메서드)를 추출해서 선언한 것을 추상클래스 라고 한다.
추상 클래스 :
- 실체 클래스 (객체 생성용 클래스)들의 공톡적인 특성 ( 필드, 메서드 ) 을 추출하여 선언함
- 추상 클래스와 실체 클래스는 부모, 자식 클래스로서 상속 관계를 갖는다.
- 실체 클래스는 실제 객체를 생성할 정도의 구체성을 가진 반면, 추상 클래스는 아직 메서드와 내용이 추상적이기 때문에 객체를 생성할 수 없다
ex) Bird.class, Fish.class, Cat.class 이러한 실체 클래스마다 공통된 특성(필드, 메서드)이 존재 한다. 이러한 특성을 Animal.class 라는곳에 추출하여 선언하면된다. 그러면 이 실체들은 Animal 클래스를 상속 받으므로써 그 기능들을 고스란히 다시 사용할 수 있게 된다.
음 위만 보면 일반 클래스 상속과 다를것이 없어 보이는데 왜 사용 할까??.
1. 추상 클래스의 용도
- 실체 클래스에서 반드시 존재해야 할 필드와 메서드의 선언(실체 클래스의 설계 규격!!(규칙) - 객체 생성은 불가)
- 실체 클래스에는 공통된 내용은 빠르게 물려 받고, 다른 점만 선언 하면 되므로 시간이 절약된다.
이정도로는 난 잘 이해가 안갔다. 개인적으로 내가 몸으로 깨닫지 못하면 습관을 버리지 않는 타입이라,, 그래서 아래 블로그를 참고 하였다.
위의 블로그 대로 라면, 추상클래스는 __규격__을 설정하여 협업의 소통의 용이성을 위한 목적이 큰 클래스인것 같다.
2. 추상 클래스 선언
abstract 키워드 상속을 통해 자식 클래스만 만들 수 있게 만든다. 부모로서의 역할만 수행 ( = __new 연산자 __) 사용 불가
public abstract class 클래스 {
// 필드
// 생성자 : 생성자는 new로 쓰는거 아닌가??? 아래 설명
// 메서드
}
- 추상 클래스도 일반 클래스와 마찬가지로 멤버들을 선언할 수 있다.
- 직접 객체를 생성할 수 없지만 자식 객체 생성될 때 객체화가 된다. 즉,( 자식 클래스에서 추상클래스에 super(..)를 통해 생성자를 호출할 수 있다.)
아래 예제를 통해 사용법을 조금더 알아보자
추상클래스 Phone.class
public abstract class Phone {
public String owner;
public Phone(String owner){
this.owner = owner;
}
public void turnOn(){
System.out.println("폰 전원 on");
}
public void turnOff(){
System.out.println("폰 전원 off");
}
}
Ipone.class
public class Ipone extends Phone{
// 부모의 Phone의 생성자를 호출해줘야 한다.
public Ipone(String owner){
super(owner);
}
public void faceTime(){
System.out.println("페이스 타임을 시작합니다.");
}
}
PhoneExample.class
public class PhoneExample{
public static void main(String[] args){
//Phone phone = new Phone(); 사용 불가
Ipone ipone12 = new Ipone("한승우");
ipone12.turnOn();
ipone12.faceTime();
ipone12.turnOff();
}
}
3. 추상 메소드와 재정의
- 메서드 선언만 통일하고 실행 내용은 실제 클래스마다 달라야 할때 사용 ( 메서드에 중괄호를 사용 안함 )
- ( 구체적으로 어떤 내용을 작성해야 될지 결정할 수 없기 때문에 요런식으로 씀 )
- abstract 키워드로 선언되고 중괄호가 없는 메서드
- 하위 클래스는 반드시 재정의 해서 실행 내용을 채워야 한다.
모든 포유류는 운다 맞나? 그렇다고 가정하고 아래예제를 만들어 보자
Mammals 클래스
public abstract class Mammals{
// 울긴 우는데 소는 음메 개는 멍멍 하고 운다 그렇기 떄문에 아래와 같이 사용한다.
public abstract void sound();
}
Dog 클래스
public class Dog extends Mammals {
// sound 를 재정의 안하면 컴파일 에러 발생
@Override
public void sound(){
System.out.println("멍멍");
}
}
지금까지 추상 클래스를 알아봤다. 추상 클래스 또한 위처럼 사용될때 다형성을 위해 사용되는것을 확인할 수 있었다. 이번 포스트에선 사실 개념보다 왜 abstract class를 사용하는지 그 이유에 대해 이해하는것이 중요한 포스팅이라고 생각된다.