추상 클래스
추상(abstract) : 실체 간에 공통되는 특성을 추출한 것
추상 클래스 : 실체 클래스들의 공통적인 특성(필드와 메소드)을 추출해서 선언한 클래스.
실체 클래스 : 객체를 직접 생성할 수 있는 클래스
추상 클래스의 용도
① 공통된 필드와 메소드의 이름을 통일할 목적
- 실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다.
- 데이터와 기능이 동일한 필드나 메소드를 추상클래스에서 선언해줌으로써 더 간결하고 효율적인 코드 작성이 가능하다.
② 실체 클래스를 작성할 때 시간 절약
- 공통되는 필드와 메소드를 추상클래스에 선언하면 다른 점만 실체 클래스에 선언하면 되기때문에 시간을 절약할 수 있다.
- 일반적으로 개발 프로젝트에서 설계자와 코더는 다른 일을 수행하는데, 코더가 작성해야 할 클래스가 다수이고 이 클래스들이 동일한 필드와 메소드를 가져야 한다면 , 설계자는 이 내용들을 추려내어 추상 클래스로 설계 규칙을 만드는 것이 좋다.
- 그리고 코더에게 추상 클래스를 상속하는 실체 클래스를 만들도록 요구하면 된다.
추상 클래스 선언
- 추상 클래스를 선언할 때에는 선언에 abstract 키워드를 붙여야 한다.
- abstract가 붙여진 추상클래스는 new 연산자를 이용해서 객체를 만들지 못하고, 상속을 통해 자식 클래스만 만들 수 있다.
- 따라서 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성해야 한다.
- 추상 클래스는 새로운 클래스를 만들기 위해 부모 클래스로만 사용된다. 즉, 실체클래스를 만들 때 extends 뒤에만 붙을 수 있다.
추상 메소드와 재정의
- 추상 클래스에는 메소드가 있을 수도 없을 수도 있다.
- 그런데 만약 추상 메소드가 있다면, 꼭 추상 클래스 안에 선언되어야 한다.
- 추상 클래스에서 메소드의 선언만 통일하고 실행 내용이 실체 클래스마다 다를 경우 추상 메소드를 선언할 수 있다.
- 추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호{}가 없는 메소드이다.
- 자식 클래스(실체 클래스)는 반드시 추상 메소드를 재정의해서 실행 내용을 작성해야 하는데, 그렇지 않으면 컴파일 에러가 발생한다.
위의 예시를 보면, Animal 이라는 추상클래스에서 추상 메소드 sound() 를 선언했다. 이유는 동물들 마다 울음 소리가 다르기 때문에, 이 부분은 하위 클래스 마다 고유한 소리를 내도록, 즉 Dog 클래스 에서는 '멍멍'으로 실행이 되도록, Cat 클래스 에서는 '야옹'이 실행되도록 하기 위함이다. 하위 클래스인 Dog, Cat에서는 sound() 메소드를 재정의해서 사용한다.
※ 추상 클래스에대해 알아보다 인터페이스와의 차이에 대한 내용을 찾게되었는데, 다음에 공부할 내용인 인터페이스라 읽어 보면 좋을 것 같아서 참고용으로 가져와 봤다.
Difference between Abstract Class and Interface in Java
Abstract class vs Interface
- Type of methods: Interface can have only abstract methods. An abstract class can have abstract and non-abstract methods. From Java 8, it can have default and static methods also. From Java 9, it can have private concrete methods as well.
- Final Variables: Variables declared in a Java interface are by default final. An abstract class may contain non-final variables.
- Type of variables: Abstract class can have final, non-final, static and non-static variables. The interface has only static and final variables.
- Implementation: Abstract class can provide the implementation of the interface. Interface can’t provide the implementation of an abstract class.
- Inheritance vs Abstraction: A Java interface can be implemented using the keyword “implements” and an abstract class can be extended using the keyword “extends”.
- Multiple implementations: An interface can extend one or more Java interfaces; an abstract class can extend another Java class and implement multiple Java interfaces.
- Multiple Inheritance: Interface supports multiple inheritance; an abstract class does not support multiple inheritance.
- Accessibility of Data Members: Members of a Java interface are public by default. A Java abstract class can have class members like private, protected, etc.
'Coding > Java' 카테고리의 다른 글
[24] JAVA 타입 변환과 다형성 (0) | 2022.12.06 |
---|---|
[23] JAVA 인터페이스 (0) | 2022.12.04 |
[21] JAVA 타입변환과 다형성 (1) | 2022.12.02 |
[20] JAVA 상속 (0) | 2022.11.30 |
[19] JAVA 패키지와 접근 제한자 (0) | 2022.11.29 |