Object OCP

만약 Object 가 없고, 또 Object 가 제공하는 toString() 이 없다면 서로 아무 관계가 없는 객체의 정보를 출력하기 어려울 것이다. 여기서 아무 관계가 없다는 것은 공통의 부모가 없다는 뜻이다. 아마도 다음의 BadObjectPrinter 클래스와 같이 각각의 클래스마다 별도의 메서드를 작성해야 할 것이다.

public class BadObjectPrinter {

		public static void print(Car car) { //Car 전용 메서드
			String string = "객체 정보 출력: " + car.carInfo(); //carInfo() 메서드 만듬
			System.out.println(string);
		}

		public static void print(Dog dog) { //Dog 전용 메서드
			String string = "객체 정보 출력: " + dog.dogInfo(); //dogInfo() 메서드 만듬
			System.out.println(string);
		}
}

다행히도 자바에는 객체의 정보를 사용할 때, 다형적 참조 문제를 해결해줄 Object 클래스와 메서드 오버라이딩 문제를 해결해줄 Object.toString() 메서드가 있다. (물론 직접 Object 와 비슷한 공통의 부모 클래스를 만들어서 해결할 수도 있다.)

  public class ObjectPrinter {
      public static void print(Object obj) {
				String string = "객체 정보 출력: " + obj.toString();
				System.out.println(string);
      }
}

ObjectPrinter 는 구체적인 것에 의존하는 것이 아니라 추상적인 것에 의존한다.

추상적: 여기서 말하는 추상적이라는 뜻은 단순히 추상 클래스나 인터페이스만 뜻하는 것은 아니다. AnimalDog , Cat 의 관계를 떠올려보자. Animal 같은 부모 타입으로 올라갈수록 개념은 더 추상적이게 되고, Dog , Cat 과 같이 하위 타입으로 내려갈 수록 개념은 더 구체적이게 된다.

스크린샷 2025-03-09 오후 8.09.51.png

ObjectPrinterObject 를 사용하는 구조는 다형성을 매우 잘 활용하고 있다. 다형성을 잘 활용한다는 것은 다형적 참조와 메서드 오버라이딩을 적절하게 사용한다는 뜻이다.

ObjectPrinterprint() 메서드와 전체 구조를 분석해보자.

OCP 원칙 기본편에서 학습한 OCP 원칙을 떠올려보자.