추상화(Abstract) 란 ?
사전적 의미로 추상(abstract) 은 실체 간에 공통되는 특성을 추출한 것을 말한다. 객체를 생성할 수 있는 클래스를 실체 클래스라고 한다면, 이 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스를 추상 클래스라 한다. 구체적인 개념으로부터 공통된 부분들만 추려내 일반화 할 수 있도록 하는 것을 의미한다. 즉, 일반적으로 사용 할 수 있는 단계가 아닌 미완성적 개념이다. 추상 클래스는 추상 메서드를 포함 할 수 있으며, 추상 클래스는 직접적으로 객체를 생성할 수 없고, 상속을 통한 하위 클래스에서 추상 메서드를 구현하여 사용된다. 예를 들어 Bird, Fish, Mammal 과 같은 실체 클래스에서 공통되는 필드와 메소드를 따로 선언한 Animal 클래스를 만들 수 있고, 이것을 상속해서 실체 클래스를 만들 수 있다.
추상 클래스를 사용하는 이유 ?
추상 클래스는 상속을 강제하기 위한 것이다. 즉, 상위 클래스에는 메소드의 틀만 정의해놓고 그 메소드의 실제 구현부는 해당 메소드를 상속 받은 하위 클래스에서 동작하게끔 하는 것이다. 이러한 이유로 추상 클래스는 보다 구조적이게 객체를 설계하고, 프로그램의 유지보수성을 올려주며, 코드 재사용성과 유연성을 높여준다. 실제로 추상화의 경우 작은 규모의 프로젝트 보다는 대규모 프로젝트에서 자주 사용된다 !
추상 클래스 & 추상 메서드
자바에서는 abstract 키워드를 클래스 명과 메서드 명 앞에 붙임으로서 추상 클래스와 추상 메서드임을 정의한다.
추상 메서드는 구현부가 없기 때문에 괄호 대신에 문장의 끝을 알리는 세미클론(;) 을 적어준다.
구성 | 사용 예 |
[접근제한] abstract void [메서드명]( ); | public abstract void methodExample( ); |
[표 1-1] 추상 메서드의 구성과 예문
구성 | 사용 예 |
[접근제한] abstract class [클래스명]{ } | public abstract class classExample{ } |
[표 1-2] 추상 클래스의 구성과 예문
추상 메서드를 하나라도 가지게 되는 클래스는 바로 추상 클래스가 된다. 이러 추상 클래스 또한 다음과 같이 추상 클래스임을 명시해야 한다.
public abstract class Animal {
protected String name; // 동물의 이름
public Animal(String name) {
this.name = name;
}
// 모든 동물은 소리를 낼 수 있지만, 각 동물마다 소리가 다르므로 추상 메소드로 정의
public abstract void makeSound();
}
class Dog extends Animal {
public Dog(String name) {
super(name); // 부모 클래스의 생성자 호출
}
// Dog 클래스에서 makeSound 메소드 구현
@Override
public void makeSound() {
System.out.println(name + " : 멍멍");
}
}
class Cat extends Animal {
public Cat(String name) {
super(name); // 부모 클래스의 생성자 호출
}
// Cat 클래스에서 makeSound 메소드 구현
@Override
public void makeSound() {
System.out.println(name + " : 야옹");
}
}
class Main {
public static void main(String[] args) {
Animal myDog = new Dog("바둑이");
Animal myCat = new Cat("고먐미");
myDog.makeSound(); // 출력: 바둑이 : 멍멍
myCat.makeSound(); // 출력: 고먐미 : 야옹
}
}
코드에서 볼 수 있듯이 추상 클래스는 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않다. 추상 클래스에도 생성자가 있으며 독립적인 인스턴스 변수 메서드도 가질 수 있다.
'Java' 카테고리의 다른 글
[Java] 내부 클래스(Inner class) (0) | 2024.05.01 |
---|---|
[Java] 인터페이스(Interface) (0) | 2024.04.29 |
[Java] 다형성 (Polymorphism) (0) | 2024.04.26 |
[Java] 오버로딩 & 오버라이딩(Overloading & Overriding) (0) | 2024.04.09 |
[Java] 생성자(Constructor) (0) | 2024.03.31 |