언어(Language)/Java

[Java] 자바 추상화(Abstraction) 개념 정리 및 활용

잇트루 2022. 9. 18. 02:00
반응형

추상화 (Abstraction)

‘추상’이라는 용어는 사물이나 표상을 어떤 성질이나 공통성, 본질에 착안하여 이를 추출하고 파악하는 것이다. 즉, 자바에서 추상화에 대한 핵심 개념으로는 공통성과 본질을 모아 추출하는 것에 있다.

 

추상화의 공통성과 본질을 모아 추출하는 것은 객체의 공통적인 속성과 행위를 추출하여 정의하는 것을 말한다. 이는 기존 클래스들의 공통적인 요소를 모아 상위 클래스를 만들어 내는 기술이다.

 

예를 들어, 자동차와 오토바이 객체가 존재한다고 가정하면, 자동차와 오토바이의 공통적인 속성과 행위를 생각할 수 있다. 속성에는 제조업체, 가격, 모델명 등이 있을 수 있고, 행위로는 시동을 거는 행위, 앞으로 가는 행위, 정지하는 행위, 뒤로 가는 행위 등이 있다.

이러한 공통적인 속성과 행위들을 모아 이동수단이라는 클래스를 담을 수 있는 것이다.

 

공통적인 속성과 행위를 모아 정의하면, 반복적인 코드를 줄일 수 있고, 보다 효과적인 클래스 간의 관계를 설정하여 유지보수가 용이해진다.

 

abstract 제어자

abstract는 ‘추상적인’이라는 뜻을 가진 용어로, 자바 언어에서 내포하는 의미는 ‘미완성’이라 정리할 수 있다.

abstract는 클래스와 메서드를 형용하는 키워드로 사용하며, 이를 추상 메서드(abstract method), 추상 클래스(abstract class)라 부른다. 클래스에 추상 메서드가 포함되어 있는 경우, 해당 클래스는 자동으로 추상 클래스가 된다.

abstract class AbstractClassEx { // 추상 클래스
    abstract void abstractMethod(); // 메서드 바디가 없는 추상 메서드
}

즉, 추상 메서드는 충분히 구체화되지 않은 미완성된 메서드이며, 미완성 메서드를 포함하는 클래스는 미완성된 클래스를 의미하는 추상 클래스가 된다.

 

따라서 추상 클래스는 객체 생성이 불가능하다.

// 객체 생성 불가능 (에러 발생)
AbstractClassEx abstractObject = new AbstractClassEx();

 

추상 클래스 메서드 (Abstract Method)

추상 클래스는 미완성 메서드인 추상 메서드를 포함하고 있는 클래스이다. 추상 메서드는 메서드 시그니처만 존재하고, 바디는 선언되어 있지 않은 상태를 뜻한다.

또한, 이러한 구조를 가진 추상 클래스는 객체를 생성하는 것이 불가능하다.

 

추상 클래스는 상속 관계에 있어 새로운 클래스를 작성하는 데 매우 유용하다.

메서드의 내용은 상속받는 클래스에 따라 종종 달라질 수 있다. 따라서 클래스에서 선언부 만을 작성하고, 실제 구체적인 내용은 상속을 받는 하위 클래스에서 구현하도록 비워두면 상황이 변하더라도 유연하게 대응할 수 있다.

abstract class Human {
    public String country;
    public abstract void greetings();
}

class Korean extends Human {
    public Korean() {
        this.country = "대한민국";
    }

    public void greetings() {
        System.out.println("안녕하세요");
    }
}

class American extends Human {
	public American() {
		this.country = "미국";
	}

	public void greetings() {
		System.out.println("Hello");
	}
}

위 코드와 같이 Human이라는 추상 클래스를 만든 뒤, 국가별 인사말을 나타내기 위해 greetings 메서드를 추상 메서드로 만들었다. 이후 Korean 클래스와 American 클래스를 생성하여 Human 클래스를 상속받으면 추상 메서드를 활용할 수 있다.

 

메인 메서드에서의 사용은 다음과 같이 할 수 있다.

class GreetingsEx {
    public static void main(String[] args) {
        Human korean = new Korean();
        American american = new American();

        korean.greetings();
        american.greetings();
    }
}
// 출력
안녕하세요
Hello

추상 클래스를 상속받은 클래스는 메서드 오버라이딩을 통해 추상 메서드를 각각 상황에 맞는 메서드로 탈바꿈이 가능하다.

반응형