추상클래스
추상클래스는 클래스를 정리하고 규격화하기 위하여 만들어졌습니다.
자주 사용하는 값을 변수로 지정하여 변수 값만 변화시키면 그 변수를 사용하는 곳은 모두 변하는 것처럼, 추상 클래스도 클래스 내부의 필드와 생성자를 변경하면 상속받은 클래스를 일일이 수정할 필요 없다는 것입니다.
예를 들어 손으로 사용하는 드라이버 클래스와 전동드라이버 클래스가 있다고 합시다.
public class ScrewDriver {
//필드
String user;
//생성자
public ScrewDriver(String user){
this.user = user;
}
//메소드
public void screwIn(){
}
}
public class ElectricDriver {
//필드
String users;
//생성자
public ElectricDriver(String users){
this.users = users;
}
//메소드
public void screw(){
}
public void drill(){
}
}
각 드라이버는 나사를 박는 기능을 공통으로 가지고 있습니다.
이 공통기능(메소드)을 묶어 추상 클래스를 만들어 선언하고, 이것을 상속받으면 자식 메소드들은 자동으로 상속받습니다.
네이밍은 개발하는 사람마다 다 다릅니다. .
그래서 필드 매개변수 값도 user, users로 다르고, 메소드 명도 screwIn과 screw로 차이가 있는데요.
추상 클래스를 통해 이것을 통일 시킬 수 있습니다.
사용방법
추상 클래스는 클래스명 앞에 abstract 를 통해 선언하면 됩니다.
public abstract class Driver {
//필드
public String user;
//생성자
public Driver(String user){
this.user = user;
}
//메소드
public void screwIn(){
System.out.printLn("드라이버로 나사를 박습니다.");
}
}
public class ScrewDriver extends Driver {
public ScrewDriver(String user){
super(user);
}
}
public class ElectricDriver extends Driver {
public ElectricDriver(String user){
super(user);
}
public void drill(){
}
}
screwDriver와 ElectricDriver의 공통 부분인 driver를 추상화하여 추상클래스를 만들었습니다.
추상클래스를 통해 필드명과 메소드가 부모클래스에서만 작성되었고, 필드명도 통일되었습니다.
public class Main {
public static void main(String[] args) {
Screwdriver screwDriver = new ScrewDriver();
screwDriver.screwIn(); // 출력 : 드라이버로 나사를 박습니다.
Electricdriver electircDriver = new ElectricDriver();
electircDriver.screwIn(); // 출력 : 드라이버로 나사를 박습니다.
electircDriver.drill(); // drill 메소드도 실행됨
}
필요하다면 자식 클래스 객체를 생성하여 메소드를 불러올수 있으며, 상속의 기본 특성을 이용해 자식 클래스에만 있는 메소드를 불러오는것도 가능합니다.
일반 상속과 다른 점은 '규격화'와 관련된 추상 메소드를 사용할 수 있다는 것입니다.
추상메소드
추상클래스 내부에는 자식들에게 정의를 강제하는 추상 메소드도 존재합니다.
무슨 말이냐면, 부모가 추상메소드로 정한 것이 있으면, 자식들은 반드시 그 메소드(행위)에 대한 내용을 재정의해야만 합니다.
사용방법은 간단합니다. 부모메소드에서 앞 부분에 abstract 만 붙이면 됩니다.
public abstract class Driver {
//필드
public String user;
//생성자
public Driver(String user){
this.user = user;
}
//메소드
public void screwIn(){
System.out.printLn("드라이버로 나사를 박습니다.");
}
public abstract void turnRight(){
}
}
드라이버를 오른쪽으로 돌리라는 trunRight 추상메소드가 추가되었습니다.
별도로 {} 안에는 작성되는 내용은 없고, 자식 클래스들은 모두 추상메소드를 재정의 해야만 합니다.
만일 자식 클래스에서 재정의 하지 않으면 컴파일 오류가 발생합니다.
public class ScrewDriver extends Driver {
public ScrewDriver(String user){
super(user);
}
@Override
public void turnRight(){
System.out.println("드라이버를 오른쪽으로 돌립니다.");
}
}
public class ElectricDriver extends Driver {
public ElectricDriver(String user){
super(user);
}
public void drill(){
}
@Override
public void turnRight(){
System.out.println("전동드라이버 버튼을 눌러 오른쪽으로 돌립니다.");
}
}
이렇듯 자식 클래스에서 turnRight() 메소드를 재정의 하였습니다.
추상메소드는 꼭 필요한 기능을 강제로 구현하게끔 만드는 규격화 기능을 가지고 있습니다.
정리
이렇듯 추상클래스는 각기 다른 클래스의 공통된 필드, 메소드를 통합하고, 기능 구현을 강제하는 역할을 합니다.
'Language > JAVA' 카테고리의 다른 글
String 클래스 파고들기 - 객체의 특성 및 더하기 연산의 버전별 차이 (0) | 2024.04.09 |
---|---|
String 클래스 파고들기 - String 생성과 byte 변환시 주의점 (0) | 2024.04.05 |
자바가 돌아가는 동작 원리 (0) | 2024.03.06 |
자바에서의 Call by value 와 Call by reference (1) | 2024.03.06 |
기본형 타입과 참조형 타입 (0) | 2023.02.21 |
남에게 설명할 때 비로소 자신의 지식이 된다.
포스팅이 도움되셨다면 하트❤️ 또는 구독👍🏻 부탁드립니다!! 잘못된 정보가 있다면 댓글로 알려주세요.