경계의 경계

자바의 추상화 본문

Java

자바의 추상화

gigyesik 2024. 2. 6. 02:43

추상화 (Abstraction) 란 무엇인가

추상화는 객체 지향 프로그래밍의 또다른 하나의 축이다. 메인 아이디어는 ‘특정 데이터를 연관 있는 유저에게만 제공하자’.

즉 유저에게 연관되는 데이터만 제공하고, 연관되지 않는 데이터는 감추는 과정이다.

자바의 추상화 유형에는 2가지가 있다.

  • 데이터 추상화 (Data Abstraction) : 임의의 데이터 타입을 정의하여 구현을 감추는 방법이다.
  • 동작 추상화 (Control Abstraction) : 메서드를 매핑하여 동작만 보여주고 구현은 감추는 방법이다.

자바의 추상화

자바는 객체 지향 프로그래밍 언어로서, 추상화를 직접적인 기능으로 제공한다.

그것은 ‘abstract’ 키워드를 사용한 추상 클래스의 구현 기능이다.

abstract class AbstractClass {
    abstract void method();
}

public class ConcreteClass extends AbstractClass {
    @Override
    void method() {
        System.out.println("Concrete Class Method");
    }

    public static void main(String[] args) {
        ConcreteClass cc = new ConcreteClass();
        cc.method(); // Concrete Class Method
    }
}

자바의 추상 클래스

  • 자바의 추상 클래스는 ‘abstract’ 키워드로 시작하며, 내부의 변수나 메서드를 초기화할 수 없다.
  • 추상 메서드는 정의만 하고 구현할 수 없고, public 메서드는 추상 클래스 내에서 구현할 수 있다.
  • 생성자와 정적 메서드를 가질 수 있다.
  • final method 를 가질 수 있다.
  • abstract 는 추상화되었다는 키워드이므로, 다른 접근 제어자와 함께 쓰일 수 없다. 예시는 아래와 같다.
    • abstract final
    • abstract static
    • abstract private

추상 클래스의 활용

추상 클래스를 자동차에 비유해본다.

  • 자동차에는 모델명, 색상 등의 속성과 출발, 정지 등의 기능이 있다.
  • 운전자들은 자신의 자동차가 내부적으로 어떻게 동작하는지에는 관심이 없고, 자동차의 외관과 기능에만 관심이 있다.
  • 이 때 활용하는 것이 추상 클래스이다.
    • 자동차라는 공통적인 속성을 묶어서 관리할 수도 있고
    • 사용자에게 구체적인 동작이 다른 부분을 표현해줄 수도 있다.
abstract class 자동차 {
    abstract String 모델명();
    abstract String 색상();
    abstract void 출발();
    abstract void 정지();
}

class A자동차 extends 자동차 {
    String 모델명() { 
        // A자동차 이름 출력
    }

    String 색상() {
        // A자동차 색상 출력
    }

    void 출발() {
        // A 자동차의 출발 메커니즘
    }

    void 정지() {
        // A 자동차의 정지 메커니즘
    }
}

class B자동차 extends 자동차 {
    // ...
}
  • 위 코드에서 A자동차와 B자동차는 모두 자동차라는 공통적인 속성을 가지고 있다.
  • A, B 각 운전자들은 자신의 자동차에만 관심이 있으므로 자신의 자동차에 해당하는 정보만 보여주면 된다.
  • C, D 자동차가 새로 출시되더라도 기존 자동차와 동일한 형식을 유지하여 고객들에게 정보를 제공할 수 있다.

추상 클래스와 인터페이스

차이점

추상 클래스와 인터페이스의 차이는 대표적으로 일부의 구현이라도 존재하는가 여부이다. 일부라도 구현이 존재할 수 있는 것이 추상 클래스이다.

  • 추상 클래스는 추상, 비 추상 메서드를 모두 가질 수 있지만, 인터페이스는 추상 메서드만 가질 수 있다. (JDK 9 이후에는 일부 수정이 있다)
  • 추상 클래스는 final 키워드 변수를 선언할 수 있고, 인터페이스는 default 키워드가 사용되므로 final이 생략된다.
  • 추상 클래스는 정적, 동적 변수를 모두 가질 수 있으나, 인터페이스는 정적 변수만 가질 수 있다. (JDK 8 이후 일부 수정이 있다)
  • 추상 클래스는 인터페이스를 상속받을 수 있지만, 인터페이스는 추상 클래스를 상속받을 수 없다.
  • 추상 클래스는 상속시 extends 키워드를, 인터페이스는 상속시 implements 키워드를 사용한다.
  • 추상 클래스는 다른 클래스나 인터페이스를 상속받을 수 있지만, 인터페이스는 다른 인터페이스만 상속받을 수 있다.
  • 추상 클래스의 멤버 변수는 private, protected 제어자를 사용할 수 있지만, 인터페이스는 public 만 사용할 수 있다.

사용처

  • 인터페이스에는 객체의 정의, 즉 속성과 추상 메서드만을 담는다.
  • 추상 클래스에서 그 중 일부를 구현한다.
  • 본 클래스에서 추상 클래스의 나머지 구현을 끝낸다.

추상화 (Abstraction) 와 캡슐화 (Encapsulation) 의 차이

  • 추상화는 데이터를 추출하는 과정이고, 캡슐화는 데이터를 감싸는 과정이다.
  • 추상화는 인터페이스 레벨에서 이뤄지고, 캡슐화는 구현 단계에서 이뤄진다.
  • 추상화는 데이터의 상세를 감추고, 캡슐화는 데이터의 상세를 일정하게 유지한다.
  • 추상화는 추상 클래스와 인터페이스로 구현하고, 캡슐화는 접근 제어자로 구현한다.
  • 추상화는 추상화된 데이터만 유저에게 제공하고, 캡슐화는 정의된 데이터만 getter, setter 메서드를 통해 유저에게 제공한다.

References

'Java' 카테고리의 다른 글

자바의 객체 지향 프로그래밍  (0) 2024.02.06
자바의 캡슐화  (2) 2024.02.06
자바의 다형성  (0) 2024.02.04
자바의 상속  (0) 2024.02.04
자바의 인터페이스  (0) 2024.02.04