-
추상클래스(abstract class)spring.project.log 2022. 3. 17. 12:18
추상클래스에 대해 이해해보려고 쓴 글입니다
05-09 추상클래스
추상클래스(Abstract Class)는 인터페이스의 역할도 하면서 클래스의 기능도 가지고 있는 자바의 돌연변이 같은 클래스이다. 혹자는 추상클래스는 인터페이스로 대체하는것 ...
wikidocs.net
https://limkydev.tistory.com/188
[JAVA] 자바 추상클래스란?
[JAVA] 자바 추상클래스란? 추상클래스 이 글 하나로 박살내자. 추상클래스의 문법적인 특징이나, 객체생성이 되고 안되고 이런 특징들이 중요한게 아닙니다. 도대체 추상클래스가 무엇이고 왜
limkydev.tistory.com
이전에 추상클래스에 대해 공부해서 남겨둔 글(notion에서) 가져옴
추상 클래스란 구체적이지 않은 클래스를 의미한다. 독수리, 타조는 구체적인 새를 지칭하는데 새, 포유류 같은 것은 구체적이지 않다.
이런 것을 구현한 클래스를 추상 클래스라고 한다.
추상클래스는 무조건 추상 메서드를 가진다. 만약 추상메서드를 구현하지 않는다면 추상클래스를 상속받은 클래드도 추상 클래스가 된다.
추상 클래스 정의하기
public abstract class Machine{ public abstract void run(); }
추상 클래스는 클래스 앞에 abstract 키워드를 이용해서 정의한다. 추상 클래스는 미완성의 추상 메소드를 포함할 수 있다. 추상 메소드란, 내용이 없는 메소드 이다. 즉 구현이 되지 않은 메소드이다. 추상 메소드는 리턴 타입 앞에 abstract라는 키워드를 붙여야 한다. 추상 클래스는 인스턴스(어떠한 개념을 토대로 생성된 복제본)를 생성할 수 없다.
→ 객체화될 수 없다 (개략적인 설계도를 가지고 실체를 만들 수 없는 것과 같음)
public abstract class Bird { public abstract void sing(); public void fly(){ System.out.println("날다."); } }
추상 클래스를 상속받는 클래스 생성하기
public class Duck extends Bird { @Override public void sing() { System.out.println("꽥꽥!!"); } }
사용하기
Bird는 추상 클래스이므로 객체를 생성할 수 없다.추상 클래스를 쓰는 이유
1. 같은 이름의 필드와 메서드를 통일
실체클래스(추상클래스를 상속받는 인스턴스화 될 수 있는 클래스)는 추상클래스의 필드와 메서드명을 변경할 수 없고 무조건 해당 명명으로 구현해야 한다. 따라서, 필드와 메서드 이름을 통일하여 유지보수성을 높이고 통일성을 유지할 수 있다.
내가 생각해 본 예시)
서로 다른 두 명이 "딱따구리"와 "오리"라는 클래스를 각자 만든다고 가정하자.
두 명은 사람의 "입"에 해당하는 부분을 "부리"나 "입"이라는 필드로 구현할 수 있다.
이 때 추상클래스 "새"가 존재한다면 사람의 입에 해당하는 부분을 "부리"라는 이름의 필드로 정해놓는다면 서로 각기 다른 두명이 "딱따구리"와 "오리"를 구현할 때 "새" 추상클래스를 상속받아 "부리"라고 필드의 네이밍이 강제된다.
abstract 메소드는 인터페이스의 메소드와 마찬가지로 몸통이 없다. 즉 abstract 클래스를 상속하는 클래스에서 해당 abstract 메소드를 구현해야만 하는 것이다.
한편, "펭귄"과 "참새"를 구현한다고 해보자.
메서드의 이름은 fly()이겠지만 fly로 정의되는 동작은 (메서드의 구현부)
펭귄 - 날개를 파닥거린다, 하지만 날지는 못함. 참새 - 날개를 빠르게 움직여서 동작을 매개로 하늘을 남. 일 것이다. 따라서 이런 경우를 위해서 abstract 메서드가 fly라는 이름은 보장하되 메서드가 어떤 동작을 할 것인지는 실체클래스에 넘겨버리는 것이다.
추상 클래스는 일반 클래스와는 달리 단독으로 객체를 생성할 수 없다. 반드시 추상 클래스를 상속한 실제 클래스를 통해서만 객체를 생성할 수 있다. 이건 "추상"이라는 말의 의미를 생각하면 당연한 개념이다. 왜냐하면 "추상"이라는 말은 구체화 될 수 없다는 의미를 가지고 있기 때문에 구체화-인스턴스화로 연결짓는 맥락으로 이해하면 되겠다.
(1을 통해)2. 실체클래스 구현에만 집중할 수 있다
내가 "앵무새" 클래스를 구현해야하는데, "새" 추상클래스를 상속받으면, "새"에 존재하는 필드와 메서드가 "앵무새" 클래스의 필드와 메서드로 오버라이딩 된다. 즉, 강제로 주어지는 필드와 메서드를 가지고 나만의 스타일대로 구현만 하면 된다. "앵무새" 클래스의 설계시간이 절약되고 "앵무새"클래스를 구현하는데 보다 집중할 수 있다.
(2와 상충) 3. 규격에 맞는 실체클래스 구현
하지만 실체클래스에서 자유롭게 클래스를 구현한다는 것은 규격 안에서 허용한다는 것이다. 모두가 약속한 필드와 메서드 그리고 설계 규칙, 즉 규격에 맞는 클래스를 구현해야 한다.
하지만 어떻게?
추상클래스를 상속받은 실체클래스들은 반드시 추상메서드를 재정의(오버라이딩)해서 메서드를 구현해야 한다. 만약 그렇지 않으면 컴파일 에러를 발생시켜 실행조차 못하게 막는다.* 따라서, 강제적으로 추상메서드를 구현해야 한다.(규격화)
* 추가로 공부할 부분 : 컴파일 에러가 왜 발생하는지? 자바 내부 동작을 까보고 구체화해야 할 것 같다.
하지만 이걸 또 파고들면 ^^ 오늘안에 정한 주제에 해당하는 공부를 시간 내에 다 못할 것 같다는 느낌이 뽞 왔다(토끼굴)
일단 참아야지 ~
'spring.project.log' 카테고리의 다른 글
[JAVA] 접근제어자, getter/setter (0) 2022.03.26 오버라이딩(overriding)과 오버로딩(overloading) (0) 2022.03.18 이넘(enum) (0) 2022.03.17 인터페이스(interface) (0) 2022.03.17 spring 첫회의 (0) 2022.03.04