[추상 클래스 정의]
1. 추상 클래스 개요
- 객체를 생성할 수 없는 클래스
- 동일한 목적으로 접근 가능한 자식 클래스들을 정의하기 위해 사용
- 추상 클래스 자체는 내용을 갖지 않으며 상속을 위해 설계 -> 객체 생성을 직접 하지 않음
- 추상 클래스는 일반 메서드나 멤버 변수를 가질 수 있음
- class 앞에 "abstract" 키워드를 추가
- 문법
abstract class 클래스명 {
문장;
}
2. 추상 메서드
- 내용을 갖지 않으며 몸통 부분이 없는 메서드
- 메서드명 앞에 "abstract" 키워드를 추가함
- 추상 메서드를 가지는 클래스는 반드시 추상 클래스여야 함
-> 추상 클래스가 아닌 클래스에서 추상 메서드를 정의할 경우 에러
- 추상 메서드는 실제 내용이 없으므로 호출이 불가능함
- 추상 메서드는 상속을 받는 자식 클래스에서 실제 내용을 구현함
- 추상 클래스의 상속을 받는 클래스에서는 추상 클래스의 메서드를 반드시 오버라이딩해아 함
- 추상 메서드 문법
abstract 반환데이터형 메서드명();
원래는 메서드명() {
문장
}
ex)
abstract class AbstractMain {
abstract void printTest(); -> printTest라는 메서드를 정의
}
class AbstractSub extends AbstractMain { -> AbstractMain 클래스를 상속받아 AbstractSub 클래스 만듬
abstract void printTest() { -> 상속받은 곳에서 메서드를 반드시 구현해주어야 함
System.out.println("Hello! Java");
}
public static void main(String args[]) { -> 실행하기 위해서는 main 필요
AbstractSub test = new AbstractSub();
test.printTest();
}
[추상 클래스와 다형성]
1. 메서드 오버라이딩
- 부모 클래스에 정의된 메서드를 자식 클래스에서 동일한 이름의 메서드로 재정의하는 기법
- 자식 클래스의 객체를 생성 후 오버라이딩 된 메서드 호출 시 부모 클래스의 메서드는 무시되고 자식 클래스의 오버라이딩 된 메서드가 처리됨
- 오버라이딩 된 메서드의 접근 지정자는 부모 클래스의 메서드와 동일하거나 넓은 범위로 설정함
- 부모 클래스의 메서드와 오버라이딩 된 자식 클래스의 메서드는 선언부가 동일해야 함
- 메서드가 동일하기 위한 조건은 메서드명, 매개변수, 반환 데이터형, 접근 지정자를 같도록 함
ex)
- 부모 클래스
class Parent {
public void printTest() {
System.out.println("부모 클래스의 메서드");
}
}
- 자식 클래스에서 메서드 오버라이딩
class Child extends Parent {
public void printTest() { -> 자식 클래스에서 printTest 메서드를 오버라이딩 함
system.out.println("자식 클래스의 메서드");
}
}
- 자식 클래스 객체 생성 후 호출
class Exam {
public static void main(String args[]) {
Child test = new Child();
test.printTest(); //"자식 클래스의 메서드"가 출력됨 -> 부모 클래스에도 있었던 메서드이지만
}
}
2. 추상 클래스 활용
- 클래스 설계 시 상속관계를 활용하는 것이 체계적인 방법
- 비슷한 종류의 클래스를 정의할 경우(일관성 유지 가능)
-> 공통적인 속성 및 메서드를 부모 클래스에서 정의하고 자식 클래스에서 상속받도록 함
- 비슷한 클래스들이 유사한 기능의 메서드를 정의할 경우
-> 완전히 다른 이름보다 동일한 이름으로 선언하여 접근하도록 하는 것이 사용자에게 혼동을 줄일 수 있음
ex)
abstract class Car { -> Car라는 추상 클래스
abstract void moveCar(); -> moveCar라는 추상 메서드 정의
}
class Sedan extends Car { -> Car라는 추상 클래스를 상속받은 Sedan 클래스
void moveCar() {
System.out.println("승용차 이동"); -> 상속받은 클래스에서 moveCar 메서드를 반드시 정의해 주어야 함
}
}
class Truck extends Car { -> Car라는 추상 클래스를 상속받은 Truck 클래스
void moveCar() {
System.out.println("트럭 이동");
}
}
- 추상 클래스와 다형성
비슷한 종류의 클래스를 설계할 경우 공통적인 특성을 갖는 메서드(moveCar)를 부모 클래스에서 정의하고
자식 클래스에서 상속받아 오버라이딩하여 구현하는 것이 체계적인 기법임
[예제 학습] 추상 클래스 활용
class Shape { -> Shape이라는 추상 클래스 만듬. 의미적으로 도형(사각형, 원, 삼각형 등)이라고 생각하기.
-> 공통점 : 꼭지점, 선분 등의 모양을 가짐 .. -> 오각형 등 다른 도형을 만들어야 하는 상황
}
class Rect extends Shape { -> 상속1 : Shape를 상속받은 Rect 클래스
Rect() { -> 생성자
System.out.println("사각형");
}
}
class Oval extends Shape { -> 상속2 : Shape를 상속받은 Oval 클래스
Oval() { -> 생성자
System.out.println("원");
}
}
class Tri extends Shape { -> 상속3 : Shape를 상속받은 Tri 클래스
Tri() { -> 생성자
System.out.println("삼각형");
}
}
[추상 클래스 사용 예]
abstract class CarMain {
abstract void moveCar(); -> 메서드
}
class CarSedan extends CarMain {
public void moveCar() {
System.out.println("승용차 이동");
}
}
class CarTruck extends CarMain {
public void moveCar() {
System.out.println("트럭 이동");
}
}
public class Exam14_1 { -> 클래스 명칭과 동일하기 파일 명칭 작성
public static void main(String[] args) {
CarSedan car1 = new CarSdedan();
car1.moveCar(); -> 승용차 이동
CarTruck car2 = new CarTruck();
car2.moveCar(); -> 트럭 이동
}
}
'프로그래밍 > 자바(java) 융합개발자 2차' 카테고리의 다른 글
[취성패] 자바 배우기 - 선수학습(내부 클래스) (0) | 2020.12.13 |
---|---|
[취성패] 자바 배우기 - 선수학습(인터페이스) (0) | 2020.12.13 |
[취성패] 자바 배우기 - 선수학습(상속과 접근제어) (0) | 2020.12.13 |
[취성패] 자바 배우기 - 선수학습(static) (2) | 2020.12.12 |
[취성패] 자바 배우기 - 선수학습(생성자) (0) | 2020.12.12 |