추상은 실체 간의 공통되는 특성을 추출한 것을 말한다.
예를 들어 새, 물고기 등의 공통적인 특성은 동물이라는 것이다. 동물이 어떤 실체가 있다기보다는 그 공통되는 특성을 묶은 것이다.
이러한 공통적인 특성을 필드와 메소드를 선언한 클래스를 추상클래스라고 한다.
추상 클래스의 용도는 공통된 필드와 메서드의 이름을 통일할 목적이나 실체 클래스를 작성할 때 시간 절약의 목적이 있다고 한다.
같은 기능을 하는 필드임에도 불구하고 다른 이름을 가지고 있으면 객체마다 사용 방법이 다르게 된다. 이를 방지하기 위한 목적이 있다.
그리고 추상클래스로 공통되는 부분을 작성해 두면 그렇지 않았을 때는 필요할 때마다 작성해야 하지만 추상클래스를 사용하면 한 번만 작성하면 되기 때문에 코드 작성에 있어서 시간이 절약이 된다.
추상 클래스를 선언할 때는 abstract를 사용한다. abstract를 붙이면 new 연산자를 사용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.
추상 클래스 사용
<추상클래스>
public abstract class Phone{
//필드
public string user;
//생성자
public Phone(String user){
this.user = user;
}
//메서드
public void turnOn(){
System.out.println("turn on");
}
public void turnOff(){
System.out.println("turn off");
}
}
<실체 클래스> - > 추상클래스를 상속받아 사용
pubic class SmartPhone extends Phone{
public SmartPhone(String user){
super(user);
}
public void internetSearch(){
System.out.println("internet search");
}
}
<사용 클래스>
public class Example{
publoc static void maint(String[] args){
//Phone을 new 연산자로 객체 생성해서 사용할 수 없음
SmartPhone sp = new SmartPhone("yeon");
sp.turnOn();
sp.internetSearch();
sp.turnOff();
}
}
<출력 결과>
turn on
internet search
turn off
추상메소드 재정의
추상클래스를 사용할 때 메서드의 선언만 같게 하고 다른 기능을 해야 할 때가 있다. 그럴 때 추상 메서드를 사용한다.
<추상클래스> - > ring() 추상 메서드 추가
public abstract class Phone{
//필드
public string user;
//생성자
public Phone(String user){
this.user = user;
}
//메서드
public void turnOn(){
System.out.println("turn on");
}
public void turnOff(){
System.out.println("turn off");
}
pubic abstract void ring(); //추상 메소드
}
<실체 클래스 > -> 메소드 재정의하기 ①
pubic class SmartPhone extends Phone{
public SmartPhone(String user){
super(user);
}
public void internetSearch(){
System.out.println("internet search");
}
@Override
public void ring(){
System.out.println("trrrrrr");
}
}
<실체 클래스 > -> 메소드 재정의하기 ②
pubic class Phone2G extends Phone{
public Phone2G(String user){
super(user);
}
public void internetSearch(){
System.out.println("internet search");
}
@Override
public void ring(){
System.out.println("Brrrrrr");
}
}
<사용클래스>
public class Example{
publoc static void maint(String[] args){
Phone2G p2 = new Phone2G("yeon");
p2.ring();
SmartPhone sp = new SmartPhone("gil");
sp.ring();
System.out.println("---------");
//변수의 자동타입 변환
Phone ph =null;
ph = new Phone2G("yeon");
ph.ring();
ph = new SmartPhone("yeon");
ph.ring();
System.out.println("---------");
//메소드의 다형성
ringABell(new Phone2G("yeon"));
ringABell(new SmartPhone("yeon"));
}
public static void ringABell(Phone ph){
ph.ring();
}
}
<출력결과>
Brrrrrr
trrrrrr
---------
Brrrrrr
trrrrrr
---------
Brrrrrr
trrrrrr
댓글