일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Spring Cloud
- 비동기
- Java
- 코딩테스트
- 자바
- JavaScript
- spring security
- 프로그래머스
- docker
- leetcode
- Spring
- 자바스크립트
- 도커
- map()
- STS
- OAuth
- 스프링부트
- GIT
- 스프링
- gitlab
- IntelliJ
- 스프링 클라우드
- spring boot
- EUREKA
- map
- jQuery
- SpringBoot
- 유레카
- JS
- date
- Today
- Total
RATSENO
[JAVA]추상 클래스 본문
추상 메서드(abstract method)
추상 메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미합니다.
자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가
반드시 추상 메소드를 구현하도록 하기 위함입니다.
이러한 추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않습니다.
바로 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것입니다.
abstract 반환타입 메소드이름();
추상 클래스(abstract class)
추상 클래스는 0개 이상의 추상 메소드(아직 구현되지 않은 메소드) 를 가지고, 일반 메소드, 일반 변수 또한 가질 수 있습니다.
이러한 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해줍니다.
즉, 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 합니다.
abstract class 클래스이름 {
...
abstract 반환타입 메소드이름();
...
}
이러한 추상 클래스는 동작이 정의되어 있지 않은 추상 메소드를 포함하고 있으므로, 인스턴스를 생성할 수 없습니다.
추상 클래스는 먼저 상속을 통해 자식 클래스를 만들고, 만든 자식 클래스에서 추상 클래스의 모든 추상 메소드를 오버라이딩하고 나서야 비로소 자식 클래스의 인스턴스를 생성할 수 있게 됩니다.
추상 클래스의 가장 핵심은 추상 메서드로 작성되있는 내용을
자식클래스에서 반드시 오버라이딩 해야되는 강제성 입니다.
여러 스타일의 개발자들이 같은 동작을 하는 메서드를 다양한 방식으로 구현할 수 있기 때문에
공통적인 메서드를 구현하도록 강제성을 부여하게 되면, 프로젝트 유지보수와 관리에 유용합니다.
여기서 가장 중요한 포인트는 공통적인 이라는 단어입니다.
만약 회원에 관련된 클래스들을 생성하려고 했을 때 네이버회원, 다음회원, 구글회원 등 여러개의 도메인들 중에
공통적인 내용인 회원이라는 부분을 추상클래스로 만들어 상속을 강제하였을때 가장 유용하게 효과적으로 사용될수 있습니다.
간단한 예를 들어 보겠습니다.
abstract class AbstractParent {
//추상 메서드
abstract String speak();
//일반 메서드
public String action() {
return "행동";
}
}
우리의 추상클래스인 AbstractParent 는 speak()라는 추상메서드를 가지고 있습니다.
speak()라는 이름에서 알수있듯이 이 메서드는 무엇인가 말한다는 기능을 할것 같습니다.
말한다는 동작을 우리는 개발자이니 String 타입의 문자열을 반환하는것으로 정의하였습니다.
각각의 개발자들은 자신들의 업무에 맞게 speak()라는 기능을 구현하려고 합니다.
개발자1, 개발자2, 개발자3...등등 각자의 스타일대로 speak(), speakkk()라고 기능을 구현하려고 했으나
마침 AbstractParent라는 추상 클래스를 발견하게 됩니다.
그래서 개발자1은 AbstractParent 클래스를 상속받아 새로운 클래스(자식클래스)를 생성하였습니다.
public class Child1 extends AbstractParent{
@Override
String speak() {
return "저는 아들입니다.";
}
}
AbstractParent 를 상속받게된 Child1 클래스는 자신이 구현하고 싶은 speak() 메서드를 구현합니다.(오버라이딩)
개발자2도 AbstractParent 클래스를 상속받아 새로운 클래스(자식클래스)를 생성하였습니다.
package study.abstarct.test;
public class Child2 extends AbstractParent{
@Override
String speak() {
return "저는 딸입니다.";
}
}
개발자2 또한 자신이 구현하고 싶은 speak() 메서드를 구현합니다.(오버라이딩)
AbstractParent 을 상속받은 Child1, Child2 클래스를 이용하여 speak() 메서드를 호출해보고
AbstractParent 클래스에 구현되어있는 일반 메서드인 action()메서드를 호출해 보겠습니다.
public class AbstractTest {
public static void main(String[] args) {
Child1 child1 = new Child1();
Child2 child2 = new Child2();
System.out.println(child1.speak());
System.out.println(child2.speak());
System.out.println(child1.action());
System.out.println(child1.action());
//저는 아들입니다.
//저는 딸입니다.
//행동
//행동
}
}
speak() 메서드를 각각의 Class로 생성된 인스턴스로 호출하게 되면
각각의 Class에서 구현한 기능이 동작하게 됩니다.
또한 AbstractParent 상속받았기 때문에 action()메서드도 당연히 사용할 수 있기때문에
AbstractParent 라는 추상클래스를 확장(extends)하게된다는 것입니다.
이것이 추후에 포스팅하게될 인터페이스(interface)와의 차이점이라고 할 수 있겠습니다.
추상 메소드의 사용 목적
자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함입니다.
만약 일반 메소드로 구현한다면 사용자에 따라 해당 메소드를 구현할 수도 있고, 안 할 수도 있습니다.
하지만 추상 메소드가 포함된 추상 클래스를 상속받은 모든 자식 클래스는 추상 메소드를 구현해야만 인스턴스를 생성할 수 있으므로, 반드시 구현하게 됩니다.
'DEV > JAVA' 카테고리의 다른 글
CompletableFuture<T> -1 (0) | 2021.03.14 |
---|---|
[JAVA]TreeSet (0) | 2020.02.05 |
[JAVA]Map 컬렉션 - HashMap (0) | 2020.02.05 |
[JAVA]Map 컬렉션 (0) | 2020.02.05 |
[JAVA]인터페이스 (0) | 2019.12.26 |