[디자인 패턴] 구상 클래스(Concrete class)란?

 

 

✍️ 구상 클래스(Concrete class)란?

콘크리트 클래스라고도 불리는 구상 클래스는 디자인 패턴에서 자주 등장하는 용어이기에 가볍게 정리하려 한다.

 

먼저, 구상(Concrete)이란 단어가 꽤나 낯설게 느껴지는데 추상(Abstract)대조적인 단어로 이해하면 쉽다.

추상이 구체적이지 않은 모호한 뜻을 가졌다면, 구상은 구체적이고 명확한 뜻을 가졌다.

 

프로그래밍에서 구상 클래스란 new 키워드로 객체를 생성할 수 있는 클래스를 말한다.

다르게 말하면, 클래스의 모든 메서드를 완벽하게 구현한 클래스라고 할 수 있다.

 

예를 들어, IronMan 클래스의 모든 메서드는 구현되어 있으므로 구상 클래스라 할 수 있다.

public class IronMan {
	public void attack() {
		System.out.println("Iron Man, attack!");
	}

	public void greet() {
		System.out.println("I'm Iron Man");
	}

	public void levelUp() {
		System.out.println("level up!");
	}
}

 

구상 클래스답게 new 키워드로 객체를 생성할 수 있다.

IronMan ironMan = new IronMan();

 

Java의 대표적인 구상 클래스로 ArrayList, LinkedList, HashMap, HashSet

C#의 Dictionary, List가 있다.

 

🍊 추상화

Java의 일부 타입은 자신의 메서드를 완벽하게 구현하지 않았다. 추상화라고도 불리는 이 유연성은 우리가 모델링 하려는 사물들의 공통적인 속성과 기능을 묶어주고 차이점을 버리는 작업을 말한다.

 

Java는 인터페이스추상 클래스로 추상화 기능을 제공한다.

 

👤 추상화 1, 인터페이스

인터페이스는 클래스를 위한 청사진이다. 다른 말로, 구현되지 않은, 서명만이 존재하는, 메서드들의 집합체이다.

여담으로 Java 8부터 인터페이스에 default 메서드가 추가되면서 인터페이스에 메서드의 구현이 가능해졌지만 기본적으로 인터페이스는 미구현 메서드의 집합이라는 전제하에 이해하길 바라니다.

public interface Attackable {
	public void attack();
}
TIP
 
 

Attackable 선언 시 class가 아닌 interface  키워드 사용

 

Attackable은 구현되지 않은 메서드 attack이 있으므로 new 키워드로 객체를 생성할 수 없고 동시에 구상 클래스라고 할 수 없다. 반면 Attackable을 구현한 Hero 클래스는 온전히 구현된 메서드만을 가진 구상 클래스이다.

public class IronMan implements Attackable {
	@Override
	public void attack() {
		System.out.println("Iron Man, attack!");
	}

	public void greet() {
		System.out.println("I'm Iron Man");
	}

	public void levelUp() {
		System.out.println("level up!");
	}
}

 

Java의 대표적인 인터페이스로 Map, List 그리고 Set이 존재한다.

 

👋 추상화 2, 추상 클래스

추상 클래스구현 메서드와 미구현 메서드 모두 가질 수 있는 클래스다.

public abstract class Hero {
	public abstract void greet();
	
	public void levelUp() {
		System.out.println("level up!");
	}
}
TIP
 
 

Hero 선언 시 단순 class가 아닌 abstract class 키워드 사용

 

다시 말하면, Hero 클래스는 미구현 메서드 greet을 포함하기에 new 키워드로 객체를 생성할 수 없다.

 

Java의 대표적인 추상 클래스로 AbstractMap, AbstractList가 존재한다.

 

 

🎓 최종, 구상 클래스

인터페이스, 추상 클래스와 대조적으로, 구상 클래스는 어떠한 미구현 메서드도 포함하지 않는다. 메서드의 구현을 상위 클래스로부터 상속받는지에 관계없이 모두 구현된 메서드라면 구상 클래스다.

 

인터페이스를 구현하고 추상 클래스를 상속받는 구상 클래스는 이전에 살펴본 Iron Man 클래스에도 적용이 가능하다.

public class IronMan extends Hero implements Attackable {
	@Override
	public void attack() {
		System.out.println("Iron Man, attack!");
	}

	@Override
	public void greet() {
		System.out.println("I'm Iron Man");
	}
}

public abstract class Hero {
	public abstract void greet();
	
	public void levelUp() {
		System.out.println("level up!");
	}
}

public interface Attackable {
	public void attack();
}

 

IronMan 클래스는 Attackable 인터페이스의 attack 메서드와, Hero 추상 클래스의 greet 메서드를 모두 구현했고 동시에 Hero 추상 클래스의 levelUp의 구현을 상속받았다.

IromMan 클래스에 구현되지 않은 메서드는 존재하지 않는다. 따라서 new 키워드로 객체를 생성할 수 있는 구상 클래스이다.

IronMan ironMan = new IronMan();.