티스토리 뷰
728x90
반응형
추상 클래스
- 하나 이상의 추상 메서드를 포함하는 클래스입니다.
- 추상 메서드란 선언부만 존재하며 본체는 없는 함수입니다.
- 해당 메서드 앞에 abstract 라는 키워드를 붙이며 추상 메서드가 포함되어 있다면 클래스 또한 추상 클래스이어야 하므로 클래스명 앞에 abstract 키워드가 있어야 합니다.
- 어떠한 추상 클래스를 상속받은 자식 클래스에서 추상 메서드를 구현하지 않는다면 자식 클래스 또한 추상 클래스가 되어야 합니다.
- 객체를 생성할 수 없다는 점을 제외하고는 일반 클래스와는 다른점이 없으며, 멤버 변수와 일반 메서드를 가질 수 있습니다.
// 객체 생성 불가능
Animal animal = new Animal();
추상 클래스의 목적
추상 클래스는 일반 클래스와 달리 객체를 생성할 수 없다고 했는데 어떠한 목적을 가지고 있는지 살펴보자
- 공통된 필드와 메소드를 통일하는 용도
- 여러명의 개발자들이 Animal을 상속 받아 각자만의 실체 클래스를 구현하게 되면 각 개발자마다 변수명과 메서드명은 각각 다른 이름으로 구현이 될것입니다. 이렇게 되면 나중에 유지보수가 힘들고 통일성이 없게됩니다.
- 실체 클래스 구현시 시간을 절약한다.
- 동물에 대한 클래스를 구현해야하는데 어떤 동물일지 모를 경우 동물 추상 클래스를 상속받으면 동물에 대한 공통적인 필드와 메서드만 구현을 하면된다. 이때 오버라이딩을 하여 구현에 집중을 할 수 있습니다.
- 규격에 맞는 실체 클래스 구현
- 설계를 담당하시는 개발자분께서 규격에 맞는 구현 클래스를 작성하게 되면 해당 규격에 맞는 구현 클래스를 작성할 수 있습니다.
추상 클래스 사용 방법
- 추상 메서드는 접근 지정자로 private를 사용할 수 없는데 그 이유는 구현을 강제화하는데 자식 클래스에서 구현을 할 수 없기때문입니다.
- public, protected는 사용할 수 있고 생략을 한다면 default(같은 패키지에서만 접근 가능)가 됩니다.
- dog, cat1, cat2 객체를 생성할때마다 추상 클래스의 생성자 호출 후 자식 클래스의 생성자 호출됨
- super()메서드
public abstract class Animal {
// 멤버 변수
public String name;
public int age;
// 생성자
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
// 일반 메서드
public void breath(){
System.out.println("숨을 쉰다.");
}
// 추상 메서드
abstract void sound();
}
public class Dog extends Animal{
public Dog(String name, int age) {
super(name, age);
}
@Override
void sound() {
System.out.println("멍멍!");
}
}
public class Cat extends Animal{
public Cat(String name, int age) {
super(name, age);
}
@Override
void sound() {
System.out.println("야옹 야옹!");
}
}
public class Example {
public static void main(String[] args) {
Animal dog = new Dog("코코", 2);
Animal cat1 = new Cat("나비", 1);
Animal cat2 = new Cat("톰", 3);
// 이름 : 코코, 나이 : 2
System.out.println("이름 : " + dog.name + ", 나이 : " + dog.age);
// 이름 : 나비, 나이 : 1
System.out.println("이름 : " + cat1.name + ", 나이 : " + cat1.age);
// 이름 : 톰, 나이 : 3
System.out.println("이름 : " + cat2.name + ", 나이 : " + cat2.age);
dog.breath(); // 숨을 쉰다.
dog.sound(); // 멍멍!
cat1.breath(); // 숨을 쉰다.
cat1.sound(); // 야옹 야옹!
cat2.sound(); // 야옹 야옹!
}
}
추상 클래스의 메서드 구현 강제화
- 추상 클래스에서 추상 메서드를 선언했다면 추상 클래스를 상속 받는 자식 클래스에서 추상 메서드는 반드시 구현을 해야하지만 일반 메서드는 필요시에 구현을 하면 됩니다.
- Animal을 상속받은 Cat 클래스는 일반 메서드인 breath는 구현을 하지 않은것을 확인할 수 있습니다.
public abstract class Animal {
// 멤버 변수
public String name;
public int age;
// 생성자
public Animal(String name, int age) {
System.out.println("추상 클래스의 생성자 호출");
this.name = name;
this.age = age;
}
// 일반 메서드
public void breath(){
System.out.println("숨을 쉰다.");
}
// 추상 메서드
abstract void sound();
}
public class Cat extends Animal{
public Cat(String name, int age) {
super(name, age);
System.out.println("자식 클래스의 생성자 호출");
}
@Override
void sound() {
System.out.println("야옹 야옹!");
}
}
728x90
반응형
'JAVA > JAVA기본' 카테고리의 다른 글
JAVA - 인터페이스란? (0) | 2022.01.26 |
---|---|
JAVA - Object 클래스란? (0) | 2022.01.16 |
JAVA - 다이나믹 메소드 디스패치란? (0) | 2022.01.11 |
JAVA - 상속이란?(feat.extends, super) (0) | 2022.01.11 |
JAVA - Class란? (feat.인스턴스, 메서드, 생성자, this) (0) | 2022.01.04 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- microkernel architecture
- java userThread와 DaemonThread
- 자바 백엔드 개발자 추천 도서
- 서비스 기반 아키텍처
- spring boot excel download paging
- spring boot redisson destributed lock
- spring boot redisson sorted set
- spring boot poi excel download
- spring boot 엑셀 다운로드
- redis sorted set
- 트랜잭셔널 아웃박스 패턴 스프링부트
- spring boot redis 대기열 구현
- transactional outbox pattern
- redis 대기열 구현
- redis sorted set으로 대기열 구현
- space based architecture
- 공간 기반 아키텍처
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- @ControllerAdvice
- polling publisher spring boot
- transactional outbox pattern spring boot
- 레이어드 아키텍처란
- service based architecture
- pipe and filter architecture
- 람다 표현식
- java ThreadLocal
- pipeline architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- spring boot redisson 분산락 구현
- spring boot excel download oom
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함