스프링

객체 지향이란

발전생 2022. 1. 25. 17:48

이 글은 김영한 강사님의 강의와 자료를 학습한 뒤 정리하는 글입니다


 

객체 지향이란 논리적으로 같은 것들끼리 묶어서 추상화해 객체를 만들고 관리하는 것이다. 캡슐화를 통해 객체의 속성 중 일부를 감출 수도 있다. 보통 캡슐화라고 하면 속성 중 일부를 private으로 선언해서 다른 객체가 접근할 수 없게 하는 것을 의미한다. 또한 논리 단위인 객체 간에 상속도 가능하다. 생물을 상속하는 동물, 식물을 예로 들 수 있다.

 

이렇게 객체 지향의 특징에는 추상화, 캡슐화, 상속, 다형성이 있다.

 

이제 다형성에 대해 알아보자. 영어로는 polymophism이라고 한다.

위키백과에서 다형성의 정의를 가져왔다.

https://ko.wikipedia.org/wiki/%EB%8B%A4%ED%98%95%EC%84%B1_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)

 

다형성 (컴퓨터 과학) - 위키백과, 우리 모두의 백과사전

프로그램 언어의 다형성(多形性, polymorphism; 폴리모피즘)은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들(상수, 변수, 식, 오브젝트, 함수, 메소드 등)

ko.wikipedia.org

프로그램 언어의 각 요소들(상수변수오브젝트함수메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질

상속은 대표적인 다형성이 이용된 예이다.

A 클래스가 B 클래스를 상속하면 A 클래스에 있던 변수, 상수, 메소드를 B 클래스에서도 사용할 수 있다. 변수, 상수, 메소드 각각이 A type에도 B type에도 속하게 되는 것이다.

메소드 오버라이딩을 하게 되면 부모 클래스에 있는 메소드를 자식 클래스에서 정의한 메소드로 대체해서 사용할 뿐이다.

인터페이스를 구현함으로서 하나의 메소드를 여러 자료형에서 다르게 사용할 수 있다. 이 역시 다형성을 이용한 것이다. 

 

 

좋은 객체지향 프로그래밍은 역할과 구현으로 구분하는 것이다.

역할은 인터페이스를, 구현은 구현 클래스를 말한다.

이렇게 하면 확장이 용이하고 변경도 쉽다. 이때 클라이언트에 영향을 주지 않으며 변경이 가능하다. 여기에서 클라이언트는 웹 브라우저나 어플리케이션보다는 제공되는 메소드를 호출하는 쪽이라고 넓게 보는 게 맞다.

 

어떻게 변경이 쉽고 클라이언트에 영향을 안 미치며 변경이 가능한 지 구체적으로 보자. 서버 쪽에서는 인터페이스 타입 변수를 선언해놓고 거기에 구현체를 할당한다. (스프링에서는 의존관계 주입을 통해 런타임에 구현 객체를 넣어줄 수 있기 때문에 코드 변경이 더 쉬워진다.)

private final MemberRepository memberRepository;
memberRepository = new MemoryMemberRespository();

 

  클라이언트에서는 인터페이스에 정의해놓은 메소드를 보고 사용한다. 내부적으로는 인터페이스를 구현한 클래스에 정의된 메소드가 실행된다. MemoryMemberRepository 구현체 말고 다른 구현체를 사용해야 할 때가 왔다고 하자. DbMemberRepository를 써야 하는데 변경이 간단하다. 위 코드에서 두번째 줄만 수정해서 구현체만 바꿔 끼워주면 된다. 그러면 밑에서 이 인터페이스의 메소드를 사용해서 작동하는 부분들이 새로운 DbMemoryRepository에서 정의한 대로 작동한다. 밑에서 코드를 바꾸지 않아도 되니 편하다. 인터페이스의 힘이다.

 딱 두번째 줄만 바꿔주고 나머지 부분은 변경이 없다. 지금 한 이 코드 수정은 컴포넌트 스캔 대상 변경과 의존관계 자동 주입을 사용하면 필요 없어진다. 코드를 더 관리하기 쉬워진다.

private final MemberRepository memberRepository;
memberRepository = new DbMemberRespository()

 

'스프링' 카테고리의 다른 글

의존관계 주입(DI)을 통해 DIP, OCP 문제를 해결하자  (0) 2022.02.03
SOLID 설계 원칙  (0) 2022.01.25
스프링 부트를 사용하는 이유  (0) 2022.01.25
스프링의 역사  (0) 2022.01.25