[Java] 추상 클래스(abstract class)

지니·2024년 10월 9일

JAVA

목록 보기
1/9
post-thumbnail

1. 추상 클래스란?


사전적으로 '추상' 이라는 것은 실체 간에 공통되는 특징을 추출한 것을 의미한다. 즉, 추상 클래스라는 것은 클래스들의 공통적인 특징(필드, 메소드)들을 추출해 선언한 클래스를 의미한다.

  • 추상 클래스 내에서 생성자를 선언할 수 있다.
  • 추상 클래스 내에서는 추상 메소드를 0개 이상 포함하면 되고, 구현이 있는 일반적인 메소드도 포함한다.
  • 인스턴스 생성이 불가능한 클래스(미완성된 클래스이므로)이다.

2. 추상 클래스를 사용하는 이유


추상 클래스는 객체를 생성할 수 있는 클래스가 아니다.
⁉️그렇다면 왜 사용할까?

(1) 다형성 적용

부모 클래스를 나타내는 역할로 이용한다. 즉, 실체 클래스를 만들기 위한 부모 클래스로 사용되는 것이다.

(2) 통일성

추상 클래스를 이용해 동일한 필드와 메서드 이름을 통일할 수 있다.

  실체 클래스를 설계하는 사람이 여러명인 경우, 각각의 클래스마다 필드와 메서드가 각기 다른 이름을 가지게 된다.

  예를 들어, 어떤 사람들이 자동차 실체 클래스를 설계할 때 '시동을 킨다'는 메서드를 설계한다고 생각하자. 이때, A는 시동을 키는 메서드의 이름을 on()으로 B는 engineOn()이라고 이름을 붙였다. 자동차는 모두 시동을 켜야한다는 동일한 기능임에도 다른 이름을 가지고 있는 것이다.

  결과적으로 데이터와 기능(시동을 킨다는)이 모두 같음에도 다른 이름을 갖게 되는 경우 객체마다 사용하는 방법이 달라지게 된다. 이 때, 추상 클래스를 이용해 동일 필드와 메소드 이름을 통일할 수 있다.

(3) 시간 절약

공통적인 필드와 메소드는 추상클래스로 선언하고, 다른 부분만 실체 클래스로 선언하면 실체 클래스를 작성할 때 시간 절약이 된다

📌 결과적으로 추상 클래스는
    1) 보다 구조적으로 객체를 설계하게 함
    2) 프로그램의 유지보수성을 올려줌
    3) 프로그램에 어떠한 기능을 수정할 때 보다 유연하게 수행할 수 있게 해줌


3. 추상 메서드


추상 클래스에서만 선언할 수 있고, 메소드의 선언부만 있는 메서드이다.

  • 추상 메서드는 반드시 재정의를 통해 구현을 해야 메모리에 할당된다. 즉, 강제성을 부여하기 위해서 추상 메서드를 선언한다.
  • 자식 클래스에서 오버라이딩 되어 실행 내용 결정

4. 추상 클래스 문법


Java에서는 abstract이라는 키워드를 붙여 컴파일러에게 추상 클래스와 추상 메서드라는 것을 알려준다.

(1) 추상 클래스의 선언

abstract class 클래스명{
			abstract 리턴타입 메서드명(매개변수,...);
			일반 메서드 선언 가능.
		}

(2) 추상 클래스 구현

/* Electronics.java */
// 추상 클래스
public abstract class Electronics {
	//	구체적인 구현부가 없음
	//	추상 메서드는 반드시 재정의하라는 강제성을 부여하기 위해서 사용
	public abstract void on(); // 추상 메서드
	public abstract void off(); // 추상 메서드

	public void welcome() { // 인스턴스 메서드
		System.out.println("저희 제품을 사용해 주셔서 감사합니다");
	}
}

/* Refrigerator.java */
// 추상 클래스 상속
public class Refrigerator extends Electronics {
	// 상속 받은 추상 클래스의 추상 메소드는 반드시 오버라이딩 해야한다.
	@Override
	public void on() {
		System.out.println("냉장고 작동을 시작합니다.");
	}

	@Override
	public void off() {
	}
}

/* Airconditioner.java */
// 추상 클래스 상속
public class Airconditioner extends Electronics {
	// 상속 받은 부모(추상) 메서드를 직접 구현
	@Override
	public void on() {
		System.out.println("에어컨이 켜졌습니다.");
	}

	@Override
	public void off() {
		System.out.println("에어컨을 껐습니다.");
	}
}

/* Test.java */
public public class Test {
	public static void main(String[] args) {
    	// 추상 클래스를 상속한 자식 클래스를 객체로 초기화
		Refrigerator rf = new Refrigerator();
		Airconditioner ac = new Airconditioner();

		// 같은 on()이라는 기능이지만
		// 각각의 클래스에서 어떻게 선언했는지에 따라서
		// 다른 결과를 도출해냄
		rf.welcome();
		rf.on();
		rf.off();

		ac.welcome();
		ac.on();
		ac.off();
	}
}

5. 추상 클래스 궁금한 점


추상 클래스를 공부하면서 생성자와 관련해 의문이 생겼다.

🤔 생성자는 객체 초기화 메소드인데 객체를 만들지 못하는 추상 클래스는 왜 생성자를 포함할 수 있는 것일까❓

자식 클래스가 객체를 생성할 때 부모 생성자가 자동으로 호출되므로 반드시 생성자가 있어야 한다.
즉, 자식 클래스가 올바르게 동작할 수 있게 도와주는 역할이기 때문이다.

0개의 댓글