손영배 블로그 누구나 쉽게 이해하고 습득하기
추상클래스(abstract) 본문
추상클래스의 개념 : 실체 간에 공통되는 특성을 추출한 것을 말한다. 예를 들어 새, 곤충, 물고기 등의 실체에서 공통되는 특성을 추출해보면 동물이라는 공통점이 있다. 이와 같이 실체들의 공통되는 특성을 가지고 있는 추상적인 것이라고 볼 수 있다.
그래서 공통적인 특성을 추출해서 선언한 클래스를 추상클래스라고 한다. 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있다. 추상 클래스가 부모이고 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고 추가적인 특성을 가질 수 있다. 여기서 특성이란 필드와 메소드들을 말한다.
추상 클래스는 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다. 다시 말해서 추상 클래스는 new 연산자를 사용해서 인스턴스를 생성시키지 못 한다.
Animal animal = new Animal(); // X
추상 클래스는 새로운 실체 클래스를 만들기 위해 부모 클래스로만 사용된다. 크드로 설명하면 추상클래스는 extends 뒤에만 올 수 있는 클래스이다.
class Ant extends Animal { ... } // O
추상 클래스를 왜 쓰는가?
첫번째. 실체 클래스들의 공통된 필드와 메소드의 이름을 동일한 목적
- 실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다. ----> 추상클래스를 상속함으로써 필드와 메소드 이름을 통일시킬 수 있다.
두번째, 실체 클래스를 작성할 때 시간을 절약
- 공통적인 필드와 메소드는 추상 클래스에 모두 선언해 두고, 실체 클래스마다 다른 점만 실체 클래스에 선언하게 되면 실체 클래스를 작성하는데 시간을 절약할 수 있다.
추상클래스 예제
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("폰 전원 끕니다."); }
}
public class SmartPhone extends Phone {
//생성자
public SmartPhone(String owner) { super(owner); } //추상클래스인 부모 생성자 호출
//메소드
public void internetSearch() { System.out.println("인터넷 검색을 합니다."); }
}
public class PhoneExample {
public static void main(String[] args) {
//Phone phone = new Phone();
SmartPhone smartPhone = new SmartPhone("홍길동");
smartPhone.turnOn();
smartPhone.internetSearch();
smartPhone.turnOff();
}
}
추상 메소드와 오버라이딩
추상클래스는 실체 클래스가 공통적으로 가져야 할 필드와 메소드들을 정의해 놓은 추상적인 클래스이므로 실체 클래스의 멤버(필드, 메소드)를 통일화하는데 목적이 있다고 위에서 설명했다. 모든 실체들이 가지고 있는 메소드의 실행 내용이 동일하다면 추상 클래스에 메소드를 작성하는 것이 좋을 것이다. 하지만, But 메소드의 선언만 통일화하고 실행 내용은 실체 클래스마다 달라야 하는 경우가 있다. 동물의 소리 함수를 각기각 다르게 내야 되는 상황
이런 경우를 위해서 추상 클래스는 추상메소드를 선언할 수 있다. 추상 메소드는 추상 클래스에서만 선언할 수 있는데, 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드를 말한다. 추상 클래스를 설계할 때, 하위 클래스가 반드시 실행 내용을 채우도록 강요하고 싶은 메소드가 있을 경우, 해당 메소드를 추상 메소드로 선언하면 된다. < 자식 클래스는 반드시 추상 메소드를 재정의(오버라이딩)해서 실행 내용을 작성해야 하는데, 그렇지 않으면 컴파일 에러가 발생한다. 이것이 추상메소드의 위력이다.
[public | protected] abstarct 리턴타입 메소드명(매개변수, ...);
//추상 메소드 선언
public abstract class Animal { //추상 클래스
public String kind;
public void breathe() { System.in.out("숨을 쉽니다"};
public abstarct void sound(); //추상 메소드
}
//추상 메소드 오버라이딩
public class Dog extends Animal {
pubilc Dog() { this.kind = "포유류";}
@Overrid
public void sound() { System.in.out("멍멍"); };
}
public class AnimalExample{
public static void main(String[] args){
Dog dog = new Dog();
dog.sound();
Animal animal = null;
animal = new Dog();
aniaml.sound();
animalSound(new Dog());
}
public static void animalSound(Animal animal){
animal.sound();
}
}
'Interview' 카테고리의 다른 글
JVM이 뭐에요? (0) | 2019.08.31 |
---|---|
그래서 추상클래스(abstract)와 인터페이스(interface)의 차이가 뭔데요? (0) | 2019.08.31 |
인터페이스(interface)란? (0) | 2019.08.31 |
제네릭이 무엇인가? (0) | 2019.08.30 |
GET방식과 POST 방식의 차이에 대해서 (0) | 2019.06.19 |