본문 바로가기

프로그래밍언어/Java

[Java 중급] Object와 OCP

Object와 OCP


만약 Object 가 없고, Object가 제공하는 toString()이 없다면 서로 아무 관계가 없는 객체의 정보를 출력하기 어려울 것이다. 

 

구체적인 것에 의존


 

public class BadObjectPrinter {

    public static void print(Car car) {
        String string = "객체 정보 출력: " + obj.toString();
        System.out.println(string);
    }
    
    public static void print(Dog dog) {
        String string = "객체 정보 출력: " + obj.toString();
        System.out.println(string);
    }
}

 

이럴 경우 메서드에서 구체적인 타입인 Car, Dog 등을 사용할 것이다. 따라서 이후에 출력해야할 클래스가 늘어난다면 메서드도 계속 늘어나게 된다. 이렇게 특정 클래스(BadObjectPrinter)가 구체적인 특정 클래스(Car, Dog)를 사용하는 것을 Car, Dog 클래스에 의존한다 라고 표현한다. 

다행히도 자바에는 객체의 정보를 사용할 때, 다형적 참조 문제를 해결해 줄 Object 클래스와 메서드 오버라이딩 문제를 해결해 줄 Object.toString() 메서드가 있다. 

 

 

추상적인 것에 의존


public class ObjectPrinter {

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

 

Car, Dog 처럼 구체적인 클래스를 사용하는 것이 아닌, 추상적인 Object를 사용하고 있다. ObjectPrinter는 구체적인 것이 아니라 추상적인 것에 의존한다. 

 

OCP 원칙


개방 폐쇄 원칙에 대해 복습해보자. 

Open: 새로운 클래스를 추가하고, toString()을 오버라이딩해서 기능을 확장할 수 있다. 

Close: 새로운 클래스를 추가해도 Object와 toString() 을 사용하는 클라이언트 코드인 ObejctPrinter는 변경하지 않아도 된다. 

 

추상적인 Object에 의존하면서 OCP원칙을 지킬 수 있다. 덕분에 기능 확장도 가능하고, 클라이언트에는 영향을 주지 않는 코드를 작성할 수 있었다. 

 

 

System.out.println()


System.out.println() 도 Object 매개변수를 사용하고 내부에서 toString()을 호출한다. 그래서 모든 객체의 정보를 편하게 출력할 수 있는 것이다. 

 

자바 언어는 객체지향 언어 답게 언어 스스로도 객체지향의 특징을 매우 잘 활용한다. 그동안 System.out.println()을 개발하면서 정말 많이 사용했다. 그 내부 동작을 이제서야 뜯어봤다니.. 아직 갈 길이 멀다. 

 

 


* 인프런 
'김영한의 실전 자바 - 중급 1편'을 참고하여 작성하였습니다. 

 

'프로그래밍언어 > Java' 카테고리의 다른 글

[Java 중급] 기본형과 참조형의 공유  (0) 2024.08.08
[Java 중급] equals()  (0) 2024.08.08
[Java 중급] toString()  (0) 2024.07.31
[Java 중급] Object 배열  (0) 2024.07.31
[Java 중급] Object 다형성  (0) 2024.07.30