쌩로그

Controller 구현 ( for. 객체지향적인 코드) - 번외 본문

Project/Solo - Blog프로젝트(그냥 Toy 레알 장난감)

Controller 구현 ( for. 객체지향적인 코드) - 번외

.쌩수. 2023. 5. 18. 18:58
반응형

나는 진짜 ㄹㅇ 조만간 잘 될 사람이다.

어차피 잘 될 것이고, 지금도 어떻게든 잘 되고 있다..
여튼간에 나는 어잘될사다.


목차

  1. 포스팅 개요
  2. 본론
  3. 요약

1. 포스팅 개요

각 메서드의 매개변수를 Object타입의 가변인자로 주려다가 마주한 문제가있고, 그에 대한 생각을 쓰는 글이다.

그리고 스프링을 하면서 자바 개념이 더 깊어진다...

2. 본론

저번에 포스팅했던 Controller 구현 ( for. 객체지향적인 코드) 에서 컨트롤러를 인터페이스화 해서 CSR방식SSR방식의 반환타입이 다르기 때문에, 모든 클래스의 조상인 Object를 받았는데, 다음 문제는 매개변수쪽이었다...

나의 생각은 일단 그냥 메서드의 매개변수로 (Object...objects)를 주면, 당연히 되겠지 했는데 아니었다..

그래서 곧바로 글쓰러 달려온 것이다.

원래 추상메서드를 구현하려면 선언부가 동일해야하는 건 알았다..
근데 반환타입도 Object로 되는 판국에... 매개변수도 당연히 되겠지 했는데, 이건 당연히 안되더라...
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

한번 보면.

지금 메서드의 매개변수로 (Object...objects)를 주었다.

그냥 Dto를 받아보려고 하기 전에 위 사진을 보면 매개변수를 역시 (Object...objects)로 주었는데, 경고는 나지만, 뻘건 느낌표는 나지 않는다.

그런데 여기는 뻘건 느낌표가 나온다... 그리고 아래는 오류 메세지인데,

Object... 타입으로 받지 않아서 오류가 난다고 얘기하고 있고, 이 부모클래스의 메서드가 오버라이드 되지 않았다고 알려주고있다.

그럼 Dto 하나만 받는다고 가정하고 (Object obj)를 인터페이스에 매개변수로 주었다.

이렇게 주고, 구현한 메서드를 보러가보면...

역시 에러가 뜨고, 아래의 메세지는 Object...obj를 줬을 때와 동일한 메세지를 전달하고 있다.

흠...

그래서 찾아보니 Controller는 굳이 인터페이스로 두지 않는 다는 말이 있긴하다.

흠...🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔

그럼 내가 할 수 있는 방법은 두가지다...

  1. 이 두 컨트롤러의 매개변수를 동일하게 하거나,
  2. 인터페이스를 구현하는 것이 아닌 각각 따로 구현하던가...

그래서 괜히 했나 싶기도 하지만, 어차피 내 학습용이라 1번을 최대한 해보고, 2번으로 갈아타던가 해야겠다...
어차피 과정은 남길거니깐.. 만약 1번에서 2번으로 갈아탔다면 왜 갈아탔는지에 대한 얘기도 할 것이니...

이번엔 그냥 매개변수로 가능한지 아닌지가 확인이 필요했었는데, 안 되면 안 되는대로 OK이다...

이참에 메소드 오버라이딩에 대해 한번 더 짚어보고 간다..
오버라이딩의 조건은

  1. 선언부가 동일해야한다.
  2. 예외의 범위를 부모클래스의 메서드보다 같거나 좁아야한다.
  3. 접근제어자의 범위가 부모클래스의 메서드보다 같거나 넓어야 한다.

그런데 지금 1번이 깨졌다.. 왜냐하면 반환타입이 달라졌기 때문이다...

그런데 찾아보니깐 지금 이걸 가능케 한 개념이 공변반환타입이었다..

공변반환타입은 JDK 1.5부터 나온 내용인데,
부모 클래스의 메서드에서 특정반환타입이 지정되어있으면, 자식클래스에서 메서드를 오버라이딩 할 때, 부모클래스의 메서드의 반환타입과 더불어서 하위타입으로도 반환할 수 있게 하는 것이다.

그래서 되었던 것이다.

참고내용은 다음과 같다.
참고
그리고 자바의정석 3판 9장 Object쪽.

그럼 결국 반환타입은 어떻게 가능하다지만,,, 매개변수는 다형성을 적용 못 한다는 얘기이다.

여튼 나는 할 수 있는 방법 두 가지 중 1번으로 밀어보겠다...

3. 요약

메서드 구현체의 반환타입은 어떻게 해결했다 할지라도 매개변수는 진짜 그대로 써야한다.

그리고 오버라이딩할 때, 메서드의 선언부가 같아야 함에도 불구하고, 다른 타입으로 반환될수 있던것은 공변반환타입이라는 개념덕분이었다..

4. 끝

-끝-

728x90
Comments