자바의 추상화
2024. 2. 6. 02:43ㆍJava
반응형
추상화 (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
반응형