= 추상 (abstract)
- abstract 기본 특징
1) abstract는 클래스와 메서드에서 사용 가능하다.
2) 클래스들의 공통되는 특성을 가지고있는 추상 적인 것을 의미한다.
3) 객체를 직접 생산 할 수 있는 클래서 : 실체 클래스 / 공통적인 특성을 추출해서 선언한 클래스 : 추상 클래스
4) 추상 메서드가 있는 클래스는 반드시 추상 클래스여야 한다.
5) 추상 클래스에서도 멤버변수, 일반 메서드, 생성자 선언 가능!
6) 추상 클래스에서 재정의를 강요할 메서드가 있다면, 해당 메서드를 추상 메서드로 선언합니다.
부모클래스에 abstract를 붙였으면, 자식 클래스에서 abstract 클래스 내부의 메서드들을 필수로 오버라이딩해주어야합니다.
(오버라이딩이 없으면 오류발생하기 때문에, 메서드 실수 방지 가능)
또한 메서드 앞에 abstract가 붙었다면, {}의 값은 사용하지 않습니다 (오버라이딩으로 어짜피 재정의해줘야하기 때문입니다.)
< abstract를 사용하지 않았을 때의 예제 >
오버라이드의 실수로, 메서드를 잘못 실행 시킬 수 있는 예제입니다.
public class HeadStore {
//추상클래스 사용 X
public void apple() {
System.out.println("지점에서 가격을 제시하세요");
}
public void banana(){
System.out.println("지점에서 가격을 제시하세요");
}
public void melon() {
System.out.println("지점에서 가격을 제시하세요");
}
public void grape() {
System.out.println("지점에서 가격을 제시하세요");
}
}
====================================================================================
public class SeoulStore extends HeadStore{
public void apple() {
System.out.println("서울 지점 사과는 500원 입니다.");
}
public void banana() {
System.out.println("서울 지점 바나나는 600원 입니다.");
}
public void melon() {
System.out.println("서울 지점 멜론은 700원 입니다.");
}
//만약 grape 오버라이딩 해오는 것을 빼먹었다면?
}
< MainClass >
public class MainClass {
public static void main(String[] args) {
//프로그래머가 실수로 오버라이딩을 빼먹었다면,
//바로 잘못된 메서드의 실행으로 이어질 수 있습니다.
SeoulStore s = new SeoulStore();
s.apple();
s.banana();
s.melon();
s.grape();
}
}
<출력값>
포도의 값은 제시되지 않게 되는게 가장 큰 문제다! 메서드의 오류를 줄이기 위해서 abstract를 사용한다.
< abstract를 사용할 때의 예제 >
아래의 예제를 확인하면, abstract의 일반변수, 일반메서드 생성자의 유형을 모두 다루고 있으며,
abstarct로 메서드 실수없이 완벽하게 메서드 실행이 이루어지는 예시입니다.
< 부모클래스 >
package abd_good;
public abstract class HeadStore {
//추상클래스에는 일반변수, 일반메서드, 생성자 모두 가질 수 있습니다.
private String name = "호식이 과일가게"; //일반변수
public HeadStore() {
System.out.println("추상클래스의 생성자 호출");
}
public abstract void apple();
public abstract void banana();
public abstract void melon();
public abstract void grape();
public void peach() {
System.out.println("복숭아는 모두 1000원");
}
public String getName() {
return name;
}
}
< 상속 클래스 >
public class SeoulStore extends HeadStore{
@Override
public void apple() {
System.out.println("서울 지점 사과는 500원 입니다.");
}
@Override
public void banana() {
System.out.println("서울 지점 바나나는 600원 입니다.");
}
@Override
public void melon() {
System.out.println("서울 지점 멜론은 700원 입니다.");
}
@Override
public void grape() {
System.out.println("서울 지점 포도는 700원 입니다.");
}
}
--------------------------------------------------------------
public class BusanStore extends HeadStore{
@Override
public void apple() {
System.out.println("부산 지점 사과는 500원 입니다.");
}
@Override
public void banana() {
System.out.println("부산 지점 바나나는 600원 입니다.");
}
@Override
public void melon() {
System.out.println("부산 지점 멜론은 700원 입니다.");
}
@Override
public void grape() {
System.out.println("부산 지점 포도는 700원 입니다.");
}
}
< MainClass >
public class MainClass {
public static void main(String[] args) {
//1. 추상메서드는 오버라이딩이 강제화 되기 때문에,
//프로그래머의 실수를 줄일 수 있음.
///2. 추상메서드의 사용은 다형성의 원리를 안전하게 실행시켜주는 기능.
SeoulStore s1 = new SeoulStore();
System.out.println(s1.getName());
s1.apple();
s1.banana();
s1.melon();
s1.grape();
s1.peach(); //오버라이딩으로 인해서 사용가능
System.out.println("---------------------");
BusanStore b1 = new BusanStore();
System.out.println(b1.getName());
b1.apple();
b1.banana();
b1.melon();
b1.grape();
b1.peach();
}
}
= 총정리 =
1.클래스 내부 메서드에 abstract가 붙는다면, 클래스 앞에도 abstract 붙어야한다.
(추상 메서드를 사용하고 싶을 때는, 클래스도 추상 클래스가 되어야 한다는 의미이다)
2. 클래스에 abstract가 붙으면, 자식클래스는 오버라이딩 필수 (상속이 무조건 필요하다)
3. 추상메서드는 일반메서드, 일반멤버변수, 생성자에 사용 가능
4. 추상메서드는 멤버변수 뒤의 {}중괄호 사용 X (오버라이딩 해야하니까)
'수업 복습하기 > Java' 카테고리의 다른 글
Day 15 - 예외(Exception) (0) | 2021.09.10 |
---|---|
Day 15 - 인터페이스(Interface) (0) | 2021.09.08 |
Day 13 - Final (변수, 클래스, 메소드) (7) | 2021.09.06 |
Day 13 - 정적 멤버 (Static) (0) | 2021.09.06 |
Day 12 - 다형성 (casting, instanceof) (2) (0) | 2021.09.02 |