본문 바로가기
Java Spring/Spring과 객체지향

[스프링과 객체지향 1편] 객체지향과 다형성

by 그냥노깡 2022. 6. 25.

 

 

스프링은 객체지향의 특성을 살려 웹 애플리케이션을 개발할 수 있도록 도와주는 프레임워크이다.

그렇기 때문에 우리가 스프링을 사용하는 이유를 알기 위해서, 스프링을 더 잘 사용하기 위해서

먼저 객체지향에 대한 이해가 필요하다.

 

객체지향 프로그래밍 (OOP)

: 프로그램을 단순히 코드를 위에서 아래로 순차적인 실행으로 개발하는 것이 아니라,

'역할'과 '책임'이 부여된 객체들의 '협력' 관점에서 프로그램을 설계하고 개발하는 것을 말한다.

 

객체지향의 특징 네 가지

본 내용은 추후에 <객체지향의 사실과 오해> 책 내용을 정리할 때 더 자세히 쓸 예정이다.

이 글에서는 다형성이 가장 중요하다는 것만 알고 넘어가자.

 

- 추상화

- 캡슐화

- 상속

- 다형성

 

왜 객체지향적으로 프로그램을 설계하고 개발해야 하는가?

: 프로그램을 객체지향적으로 설계하고 개발하면, 프로그램이 유연해지고 변경에 용이해진다.

 

여기서, 유연하고 변경에 용이하게 만들어주는 객체지향의 특성은 '다형성(Polymorphism)' 이다.

 

다형성(Polymorphism)

다형성은 상속, Overloading, Overriding을 통해 같은 모양의 코드가 다른 행위를 하도록 만들 수 있다는 객체지향의 특성 중 하나이다.

 

다형성을 이용하면, 코드 상에서 '역할(인터페이스)'과 '구현(객체)'를 분리할 수 있다.

 

역할과 구현을 분리

- 클라이언트는 대상의 역할(인터페이스)만 알면 된다.

- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.

- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.

- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.

 

Java 언어의 다형성

다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경가능하다.

 

대표적으로 Java의 기본 문법인 오버라이딩을 이용하면,

코드 상에서는 인터페이스 또는 상위 클래스의 메소드를 호출하는 것처럼 보이지만, 런타임에서는 오버라이딩된 구현 객체 또는 하위 객체의 메소드를 호출하여 실행한다.

 

//선언은 List interface로, 실제 구현체는 ArrayList
List<Integer> list = new ArrayList<>();
//add() 함수를 호출하면 구현체인 ArrayList의 Override된 add()함수가 호출된다.
list.add(5);

 

객체와 협력

결국 객체들은 서로 협력한다.

그래서 항상 객체들은 요청을 보내는(메소드를 호출하는) 클라이언트와 응답을 하는 서버로 구분된다.

 

다형성을 이용하면 클라이언트는 대상(서버)의 역할(인터페이스)만 알면 되고, 내부 구현은 알 필요가 없다.

그렇기 때문에 내부 구현이 변경된다 한들, 클라이언트의 코드는 바뀔 필요가 없다.

 

다형성의 본질

- 인터페이스를 구현한 객체 인스턴스를 실행시점에 유연하게 변경할 수 있다.

- 다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야 한다.

- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.

 

 

정리

Java와 같은 객체지향언어로 개발할 때, 다형성을 통해 역할과 구현을 분리할 수 있다.

이를 통해 변경에 용이하고, 확장이 편리한 설계와 개발을 할 수 있다.

내부 구현이 바뀌더라도 그 메소드를 호출하는 클라이언트의 코드는 바뀔 필요가 없어진다.

 

다형성의 한계

내부 구현이 아닌 아예 역할(인터페이스)가 바뀌면, 프로그램 전체에 큰 변경이 필요해질 수 있다.

따라서, 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.

 

클라이언트에 영향을 미치지 않는 안정적인 API를 만드는 것이 좋은 개발자의 역할이다.

 

 

 


[참고 Reference]

스프링 핵심 원리  - 기본편, 김영한

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

객체지향의 사실과 오해, 조영호

http://www.yes24.com/Product/Goods/18249021