TroubleShooting & Study/SpringBoot

[다형성] Interface를 통해 여러 타입 처리하기

DH_0518 2024. 5. 13. 11:33

이전글: https://kdh0518.tistory.com/entry/Reflection-%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98-%EC%A0%9C%EB%84%A4%EB%A6%AD%EC%9C%BC%EB%A1%9C-%EC%97%AC%EB%9F%AC-%ED%83%80%EC%9E%85-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0-feat-Lombok

 

[Reflection] 리플렉션 & 제네릭으로 여러 타입 처리하기 (feat. Lombok)

현재 개발 중인 서비스는 모바일 화면을 기준으로 개발하다 보니 cursor-based 무한스크롤 방식으로 조회하는 기능이 많다.cursor-based로 구현할 때 항상 마지막 cursor를 구한 후 클라이언트와 주고받

kdh0518.tistory.com

 

 

 

 

Reflection의 단점

 

 

이전 글에서는 파라미터로 들어오는 다양한 타입들을 처리하기 위해 Reflection을 사용했다. 그런데 Reflection은 이전 글에서도 다뤘었지만, 다음과 같은 단점이 있다.

 

 

Reflection 단점

  • 컴파일 시점에 타입 확인이 불가능하여 컴파일 시에 타입 확인이나 예외 검사를 할 수 없다. 즉 런타임 시에만 확인이 가능하므로 위험하다
  • 클래스, 메서드, 필드 등을 접근하여 직접 이용하기 때문에, OOP의 특징인 추상화를 위반한다
  • 불변 객체든, private field든 어떤 곳이든 접근하여 필드를 바꿀 수 있으므로 주의해야 한다
  • Reflection이 생성하는 객체에 대한 정보는 JVM에 캐시되어 있지 않기 때문에, 초기 생성시 많은 자원이 필요하다(단, 한번 캐싱된 이후로는 일반 객체와 큰 차이가 없다)
  • 런타임시 Java 보안 관리자에게 일부 권한을 부여 받는데, 이는 보안 취약점이 될 수 있다

실제로 이전글에서 Reflection을 사용해서 메서드를 구현할 때, 컴파일 시점에 예외 검사를 할 수 없어 계속 에러가 발생했었고, 매우 불안정하다고 느꼈다. 이렇게 한번 불안정하다 생각되니 계속 사용할 수 없어서 결국 다른 방법을 찾아봐야했다

 

 

 

 

 

 

 

 

다형성

 

 

먼저 리플렉션을 사용했던 이유를 생각해보면, 공통된 필드값(userShortsId)과 메서드(getUserShortsId)를 가지고 있는 다양한 타입의 클래스를 인자로 받기 위해 사용했었다. 그렇다면 리플렉션을 사용하지 않고 공통된 property를 가지고 있는 클래스들을 인자로 받는 방법이 무엇이 있을까?

 

 

다형성

  • 하나의 객체가 여러 개의 자료형 타입을 가질 수 있는 것
  • 즉, 같은 자료형에 여러가지 타입의 데이터를 대입하여 다양한 결과를 얻어낼 수 있는 성질로, 클래스가 상속 관계에 있을때 나타나는 다채로운 성질을 말한다
  • 대표적으로 오버로딩, 오버라이딩, 업캐스팅, 다운캐스팅, 인터페이스, 추상메소드, 추상클래스 등이 존재
  • ** 자식 클래스/인터페이스로 생성한 객체의 자료형은 부모 클래스/인터페이스를 통해 사용하는 것이 가능하다

이렇게 자바에서는 다형성을 통해 부모 클래스/인터페이스로 자식 클래스/인터페이스의 객체를 사용할 수 있다는 중요한 특징이 있다. 이를 통해 리플렉션을 대체해보자

 

 

 

Reflection 코드

reflection

리플렉션을 사용한 코드에서는, 'getUserShorts()' 메서드를 가진 T가 인자로 넘어올 것을 예상하여서 코드를 작성하고 있다. 이때 T에 해당하는 메서드가 없으면 Exception이 발생하게 된다. 당연히 이 예외는 런타임시에 발생하므로 컴파일 단계에서 확인하지 못하기에 안정적인 서버 운용이 힘들다

 

 

 

Interface 코드

interface
interface를 사용한 코드

'상속'과 '인터페이스' 둘 다 다형성을 활용할 수 있지만, 인터페이스가 좀 더 확장성에 열려있고 의존성을 줄일 수 있기에 인터페이스를 사용하였다.

 

Reflection을 사용한 코드와 다르게, 다형성을 활용한 코드에서는 CursurProperty를 상속/구현하고있는 T만을 인자로 받고있고, CursorProperty 인터페이스를 구현하는 T에서는 무조건 'getCursor()' 메서드를 구현해야 하기 때문에 메서드가 존재하지 않을 걱정을 하지 않아도 된다.

또한 cursor의 타입이 정해져있지 않기에 Long타입 뿐만 아니라, 다른 다양한 커서가 올 수 있는 장점 또한 존재한다.

 

 

이런 조건을 만족하지 않으면 컴파일시에 확인이 가능하므로 더욱 안정적인 서버 운용이 가능한 것이다..! 다형성 최고!

 

 

 

 

 

 

 

 

 

 

 

 

Reference

 

💠 자바의 다형성(Polymorphism) 완벽 이해하기

다형성 (Polymorphism) 다형성(多形性) 이란, 그 자체의 의미를 표준 국어사전에서 찾아보면, '같은 종의 생물이면서도 어떤 형태나 형질이 다양하게 나타나는 현상' 이라 정의되어 있다. 이를 프로

inpa.tistory.com

 

05-08 다형성

객체 지향 프로그래밍의 특징 중에는 **다형성(polymorphism)**이 있다. 도대체 다형성은 무엇이고 이게 왜 필요한 걸까? 예제를 통해 차근차근 알아보자. 앞서 작성한…

wikidocs.net