추상클래스(abstract class)
추상클래스란?
- abstract class 클래스이름 {}
- 미완성 메서드(추상메서드)를 포함하고 있다는 의미.
- 추상 클래스는 미완성의 클래스이기 때문에 객체 생성이 불가능하다.
- 추상 클래스는 객체 생성이 안될 뿐 참조 변수로 사용이 가능하다.
- 다형성을 적용해서 자식 객체를 참조할 수 있다.
- 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다.
- 추상 클래스를 부모 타입으로, 객체로 생성될 실체 클래스가 자식 타입으로 구현되어 추상 클래스의 모든 특성을 물려받을 수 있다.
- 추상 클래스는 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없고 부모 클래스로만 사용된다.
- 관련 있는 클래스들의 공통된 필드와 메소드의 이름을 통일할 수 있다.
- 추상 클래스를 상속받는 자식 클래스를 작성하는 시간을 절약할 수 있다.
- 유지 보수와 코드 관리가 편해진다.
추상메서드(abstract method)
- abstract 리턴타입 메서드이름();
- 메서드는 선언부와 구현부로 구성되어 있지만, 추상메서드는 선언부만 작성하고 구현부는 없다.
- 추상 클래스에 선언된 메소드가 자식 클래스마다 실행 내용이 달라야 하는 경우 추상 메소드를 선언할 수 있다.
- 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만 작성하고 실제 내용은 상속받는 클래스에서 구현하도록 비워둔다.
- 추상 클래스를 상속하는 자식 클래스는 반드시 추상 메소드를 오버라이딩 해야 한다.
public abstract class Sports { // 참여하는 사람의 수 private int numberOfPlayers; public Sports() { } public Sports(int numberOfPlayers) { super(); this.numberOfPlayers = numberOfPlayers; } public int getNumberOfPlayers() { return numberOfPlayers; } public void setNumberOfPlayers(int numberOfPlayers) { this.numberOfPlayers = numberOfPlayers; } // 스포츠 마다 적용될 룰을 추상 메소드로 정의 public abstract void rule() ; }
public class BasketBall extends Sports { public BasketBall() { } public BasketBall(int numberOfPlayers) { super(numberOfPlayers); } @Override // 추상메서드 구현 public void rule() { System.out.println("BasketBall의 선수의 수는 " + super.getNumberOfPlayers() + "명, 공을 던져서 링에 넣어야한다."); } } public class FootBall extends Sports { public FootBall() { } public FootBall(int numberOfPlayers) { super(numberOfPlayers); } @Override // 추상메서드 구현 public void rule() { System.out.println("FootBall의 선수의 수는 " + super.getNumberOfPlayers() + "명, 공을 차서 골대에 넣어야한다."); } }
추상클래스의 작성
- 여러 클래스의 공통적으로 사용되는 클래스를 바로 작성하거나, 기존의 클래스의 공통적인 부분을 뽑아 추상 클래스로 만들어 상속하도록 하는 경우가 있다 .
- 추상클래스도 생성자가 있어야 한다.
'Java' 카테고리의 다른 글
객체(Object) - 내부 클래스(inner class) (0) | 2022.09.26 |
---|---|
객체(Object) - 인터페이스(interface) (0) | 2022.09.25 |
객체(Object) - 다형성(polymorphism) (1) | 2022.09.23 |
객체(Object) - 제어자(modifier) (0) | 2022.09.22 |
객체(Object) - package & import (0) | 2022.09.21 |