본문 바로가기
Language/Java

[Java] 자바기초 - 객체지향(OOP) - 추상화(Abstraction)

by J4J 2020. 12. 23.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 객체지향 프로그래밍의 특징 중 하나인 추상화에 대해 적어보는 시간을 가져보려고 합니다.

 

 

추상화란?

 

추상화라고 하는 것은 목적과 관련이 없는 것을 제거하고 필수적인 요소만을 표현해 둔 것을 말합니다.

 

예를 들어 초코빵과 크림빵을 만든다고 가정해 보겠습니다.

 

두 빵을 만들 때 빵 표면을 무엇으로 만들지, 빵 속을 무엇으로 채울지에 대한 것은 필수적인 요소라고 할 수 있습니다.

 

그리고 이 요소들에 대해 빵마다 정의를 해보자면 초코빵일 땐 빵 표면은 밀가루, 속은 초콜릿으로 하고 크림빵일 땐 빵 표면은 쌀가루, 속은 크림이라고 할 수 있습니다.

 

하지만 뜬금없이 빵을 얼마나 빨리먹을 수 있는지에 대한 것은 빵을 만들 때 필수적인 요소가 아닙니다.

 

이처럼 프로그래밍을 할 때도 특정 객체에 대한 변수 및 메서드들을 사전에 명시해두고 객체를 정의할 때 명시해둔 기능들에 대해서 필수적으로 정의하기 위해 추상화를 사용합니다.

 

추상화를 사용하는 이유는 무엇일까요?

 

제일 명확한 이유는 추상화라는 개념에도 나와있듯이 용도에 맞는 필수적인 요소들을 강제적으로 포함시키기 위해서입니다.

 

물론 추상화를 사용을 하지 않아도 원하는 기능을 구현하기에는 문제가 없을 것입니다.

 

하지만 메서드들의 개수가 적으면 문제가 되지 않겠지만 10개 정도만 되어도 동일한 기능에 대해 객체마다 이름이 다를 수도 있고 어떤 객체에서는 해당 기능을 빼먹는 상황이 발생할 수 있습니다.

 

프로그래밍을 할 때는 정말 사소한 것도 큰 문제를 발생시킬 수 있는데 이런 것들도 충분히 문제를 발생시킬 수 있고 유지보수 등에 있어서도 큰 차이를 발생시킵니다.

 

 

사용 방법

 

자바에서 추상화를 표현하기 위해 사용되는 대표적인 것들은 abstract와 interface가 있습니다.

 ※ abstract와 interface에 대해 모른다면? [Java] 자바기초 - 추상클래스와 인터페이스(abstract/interface)

 

위의 예시를 코드로 표현해보겠습니다.

 

package oop;

public interface Bread { // 나 빵이라는 객체는!
	public void innerMaterial(); // 속 재료를 정의해야 된다!
	public void outerMaterial(); // 표면 재료를 정의해야 된다!
}

 

package oop;

public class ChocoBread implements Bread{
	
	@Override
	public void innerMaterial() {
		System.out.println("속 재료는 초코입니다.");
	}
	
	@Override
	public void outerMaterial() {
		System.out.println("표면 재료는 밀가루입니다.");
	}
	
	public void eatingTime() { // 초코빵은 먹는 시간도 필요해
		System.out.println("초코빵은 1초컷");
	}
	
	public static void main(String[] args) {
		ChocoBread chocoBread = new ChocoBread();
		
		chocoBread.innerMaterial(); // 속 재료는 초코입니다.
		chocoBread.outerMaterial(); // 표면 재료는 밀가루입니다.
		chocoBread.eatingTime(); // 초코빵은 1초컷
	}
}

 

package oop;

public class CreamBread implements Bread {
	
	@Override
	public void innerMaterial() {
		System.out.println("속 재료는 크림입니다.");
	}
	
	@Override
	public void outerMaterial() {
		System.out.println("표면 재료는 쌀가루입니다.");
	}
	
	public static void main(String[] args) {
		CreamBread creamBread = new CreamBread();
		
		creamBread.innerMaterial(); // 속 재료는 크림입니다.
		creamBread.outerMaterial(); // 표면 재료는 쌀가루입니다.
	}
}

 

 

이처럼 Bread라는 인터페이스를 생성하여 속 재료와 표면 재료는 정의해야 된다고 미리 표현을 해둡니다.

 

그리고 초코빵과 크림빵을 정의할 때 인터페이스를 상속받아 속 재료와 표면 재료에 대해 각각 정의를 해주고 만약 객체별 부가적인 기능을 추가하고 싶다면 초코빵에서 한 것처럼 메서드를 따로 정의해주면 됩니다.

 

 

정리

 

추상화는 필수적인 요소들을 강제성을 띄워 정의하기 위해 사용
유지보수는 덤
자바에선 abstract와 interface가 추상화를 표현하는 대표적인 기법

 

 

 

이상으로 객체지향 프로그래밍의 특징 중 하나인 추상화에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

728x90
반응형

댓글