[JAVA] 추상화와 추상클래스

JoJo·2023년 7월 5일
0
post-custom-banner

💡 추상화


📌 추상화란?

우리는 보통 알고는 있지만 정확하게 표현하기 힘든 것들을 중요한 부분이나 특징점을 잡아 설명하고는 하는데, 이것을 '추상적으로 표현한다' 즉, '추상화한다' 라고 하며 객체지향의 개념에서 추상화는 중요한 개념중에 하나입니다.


📌 추상화를 하는 이유

추상화를 통해 잘 설계했다면 여러개의 클래스를 정의했을 때, 중복 코드가 줄어듭니다.

코드가 간결해지기 때문에 생산성 증가, 가독성 증가, 에러 감소, 유지보수 및 시간 단축 등의 효과가 있습니다.

잘 만들어진 슈퍼 클래스 덕분에 코드의 재사용성이 증가합니다.



💡 추상 클래스


📌 추상 클래스란?

선언되어 있으나 구현되어 있지 않은 메소드로 abstract로 선언합니다. (몸체(중괄호)가 없음)

구현되어있지 않기 때에 객체를 생성할 수 없고, 반드시 상속적인 관계를 가지고있는 자식클래스(실체클래스)에서 오버라이딩 해야만 사용할 수 있습니다.

반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해 놓으면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의해야 합니다.


📌 추상 메소드

추상 메소드(abstract method)란 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드를 의미합니다.

자바에서 추상 메소드를 선언하여 사용하는 목적은 추상 메소드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함입니다.


📌 추상 클래스 문법


🧷 추상 메소드를 포함하는 추상 클래스

abstract class shape { // 추상클래스 선언
	public Shape() {}
    public void paint() {
    	draw();
    }
    abstract pulbic void draw(); // 추상 메소드
}

🧷 추상 메소드가 없는 추상 클래스

abstract class shape { // 추상클래스 선언
	String name;
    public void load(String name) {
    	this.name = name;
    }
}

* 메소드에서 abstract 를 생략할 수 있다.



💡 추상클래스 사용 목적

추상 메소드가 포함된 클래스를 상속받은 자식 클래스가 반드시 추상 메소드를 구현하도록 하기 위함입니다.

만약 일반 메소드로 구현한다면 사용자에 따라 해당메소드를 구현할 수도 있고 안할수도 있습니다.

하지만, 추상 메소드가 포함된 추상 클래스를 상속받은 모든 자식 클래스는 추상 메소드를 구현해야만 인스턴스를 생성할 수 있으므로, 반드시 구현하게됩니다.


📌 공통된 필드와 메서드를 통일할 목적

추상클래스에서 미리 정의한 필드와 메서드가 있다면, 실체클래스는 추상클래스의 필드와 메서드명을 변경할 수 없고 무조건 해당 명명으로 구현해야합니다.

따라서,필드와 메서드 이름을 통일하여 유지보수성을 높이고 통일성을 유지할 수 있습니다.


📌 구현의 강제성을 통한 기능 보장

추상클래스와 추상메소드를 선언하면 추상클래스를 상속받는 자식 클래스는 반드시 추상 메소드를 구현해야합니다.

추상 메소드를 통한 강제구현은 기존 프로그램 스펙에서 수정하거나 기능을 추가할 때 일어날 수 있는 문제되는 점을 미리 방지함으로써 보다 안정적이고 구조적으로 프로그래밍 할 수 있게 도와줍니다.

* 이러한 특성은 인터페이스(interface)에도 똑같이 적용된다!

📌 규격에 맞는 실체클래스 구현

실제 프로젝트에서 어플리케이션 아키텍쳐(Application Architecture)가 설계해 놓은 추상 클래스를 상속받으면, 개발자는 프로젝트에서 필요하고 공통적으로 들어가야하는 필드와 메서드를 오버라이딩해서 큰 설계를 생각할 필요 없이 구현만 하면 됩니다.

이렇게 하면 초기 설계 시간이 절약되고, 구현에만 집중할 수 있게 된다는 장점이 있습니다.


쉽게 말해서, 추상클래스는 재사용성, 생산성, 유지보수 및 프로그램마다 다르게 코딩하기 위해서 사용합니다!

💡 추추상클래스 오류메세지

package com.kh.day08.oop.abstractptpkg;

class Line extends Shape {
	// 4. The type Line must implement the inherited abstract method Shape.draw() 
    // => 추상메소드를 오버라이딩 해야함!, 하지 않을거면 class 앞에 abstract 붙여야함.
	@Override
	public void draw() {
		
	}
}

public abstract class Shape {
	
	public Shape() {}
	
	public void paint() {}
	abstract public void draw();
	// 오류메세지 정리
	// 1. Abstract methods do not specify a body 
    // => 추상클래스는 바디(몸체)가 존재해선 안된다. 
    // => {} 없애고 ; 작성.
	// 2. The abstract method draw in type Shape can only be defined by an abstract class 
    // => 추상메소드가 있으면 클래스도 추상클래스여야 함!
	// 3. The type Shape must be an abstract class to define abstract methods 
    // => 추상메소드를 정의하려면 추상클래스여야 함! 
    // => class 앞에 abstract를 붙여야 함!
}
profile
꾸준히
post-custom-banner

0개의 댓글