1. 추상 클래스
실체 클래스 : 객체를 직접 생성할 수 있는 클래스
추상 클래스 : 클래스들의 공통적인 특성을 추출해서 선언한 클래스 (객체 직접 생성 불가능)
- 추상은 실체 간에 공통되는 특성을 추출한 것을 뜻 합니다.
- 추상 클래스와 실체 클래스는 상속의 관계를 가집니다.
- 추상 클래스 부모 클래스이고 실체 클래스 자식 클래스입니다.
- 추상 클래스는 new 연산자를 사용해서 인스턴스(객체)를 생성하지 못합니다.
2. 추상 클래스의 용도
1. 필드와 메소드 이름 통일
- 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적으로 사용합니다.
- 상속을 이용함으로써 공통된 필드와 메소드는 통일
2. 시간 절약
- 실체 클래스를 작성할 때 시간을 절약할 수 있습니다.
- 공통적인 필드와 메소드는 추상 클래스에 모두 선언해 두고, 실체 클래스마다 다른 점만 실체 클래스에 선언]
- 설계자가 추상 클래스(규격)를 작성하고, 코더가 실체 클래스를 작성할 때 용이합니다.
3. 추상 클래스 선언
public abstract class 클래스 {
// 필드
데이터타입 필드;
// 생성자
public 클래스(데이터타입 매개변수) {
this.필드 = 매개변수;
}
// 메소드
public 데이터타입 get필드() {
return 필드;
}
}
- 일반 클래스와 마찬가지로 필드, 생성자, 메소드를 선언할 수 있습니다.
- new 생성자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 합니다.
예시
추상 클래스 Grade
public abstract class Grade {
// 필드
private int grade;
// 생성자
public Grade(int grade) {
this.grade = grade;
}
// 메소드
public int getGrade() {
return grade;
}
}
실체 클래스 Student
public class Student extends Grade {
// 필드
private String name;
// 생성자
public Student(int grade, String name) {
super(grade);
this.name = name;
}
// 메소드
public String getName() {
return name;
}
}
실행
// 실체 클래스의 인스턴스(객체) 생성
Student student = new Student(1, "veneas");
int grade = student.getGrade(); // 추상 클래스의 메소드 사용 가능
String name = student.getName();
System.out.println("Grade: "+ grade); // Grade: 1
System.out.println("Name: "+ name); // Name: veneas
4. 추상 메소드
추상 메소드 : 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {}가 없는 메소드
- 추상 클래스를 설계할 때, 하위 클래스가 반드시 실행 내용을 채우도록 강요하고 싶은 메소드가 있을 경우, 해당 메소드를 추상 메소드로 선언합니다.
- 메소드 명을 통일 할 수 있습니다.
추상 메소드 선언
[public | protected] abstract 리턴타입 메소드명(매개변수, ...);
예시
추상 클래스 Computer
public abstract class Computer {
private String modelName;
public Computer(String modelName) {
this.modelName = modelName;
}
// 추상 메소드
public abstract void powerOn();
}
실체 클래스 SamSungGalaxyBook
public class SamSungGalaxyBook extends Computer {
public SamSungGalaxyBook(String modelName) {
super(modelName);
}
@Override
public void powerOn() {
System.out.println("삼성 갤럭시북 ON");
}
}
실체 클래스 LgGram
public class LgGram extends Computer {
public LgGram(String modelName) {
super(modelName);
}
@Override
public void powerOn() {
System.out.println("엘지 그램 ON");
}
}
실행
// 1. 일반적인 인스턴스 생성
SamSungGalaxyBook samSungGalaxyBook = new SamSungGalaxyBook("NT950XCJ-K78A");
LgGram lgGram = new LgGram("17ZD95P-GX56K");
samSungGalaxyBook.powerOn(); // 삼성 갤럭시북 ON
lgGram.powerOn(); // 엘지 그램 ON
// 2. 자동 타입 변환
Computer computer = samSungGalaxyBook;
computer.powerOn(); // 삼성 갤럭시북 ON
computer = lgGram;
computer.powerOn(); // 엘지 그램 ON
'Backend > 객체 지향 프로그래밍' 카테고리의 다른 글
[Java] 인터페이스 익명 구현 객체 (0) | 2022.04.23 |
---|---|
[Java] 객체의 다형성 구현 (인터페이스) (0) | 2022.04.22 |
[Java] 상속과 다형성 (Polymorphism) (0) | 2022.04.19 |
[Java] final 클래스 final 메소드 (0) | 2022.04.18 |
[Java] 클래스 상속 (Inheritance) (0) | 2022.04.17 |