[Java] 다형성의 객체참조

hun·2023년 9월 11일

SpringBoot

목록 보기
6/8

퇴사자의 프로젝트를 인수인계 받아 코드 분석을 하다가
나한테는 생소하고, 신기한 코드를 발견하여 작성한다.

@Setter
@Getter
public class ResCommon {
    private String resultCode = "0000";
    private String resultMessage = "성공";
}
@AllArgsConstructor
@Setter
@Getter
@ToString
public class ResInfo extends ResCommon{
    private String name;
    private String address;
    private Integer age;
}
@RestController
public class InfomationController {

    @GetMapping("/info")
    public ResponseEntity<ResCommon> getInfo() {
        ResInfo resInfo = new ResInfo("hun", "seoul", 30);
        ResCommon resCommon = resInfo;
        
        System.out.println(resCommon.toString());
        
        return ResponseEntity.ok(resCommon);
    }
}

예를들어 이런식으로 요청받은 API를 처리하고 있었다.
어떻게 부모 클래스를 반환하는데, 자식의 인스턴스 변수까지 반환하고 있는지 이해가 안됐었다.

실제 resCommon에 담긴 내용을 보려고 중단점을 걸어 확인해 봤다.

모든 정보가 다 담겨서 들어왔다!!

이걸보고 내가 알고있던 지식에 혼동이 왔다.
분명 업캐스팅 하는경우 부모자식의 변수에 참조가 불가능 했었는데 어떻게 되는거지? 그래서 부모에서 접근 가능한 변수인지 확인했다.

역시나 불가능했다.
이건 내가 알고있는 지식이 맞았다. 또하나의 경우가 있었는데 그건 부모의 매서드를 자식 클래스에서 오버라이드하여 재정의 하는경우는 자식의 매서드를 실행 시키는 것 이다. 코드를 추가해서 테스트를 해봤다

이런식으로 다형성 개념을 활용한 것으로, 코드의 유연성과 확장성을 높여 줬었다.
내가 본 코드는 정말 이해가 안갔어서 열심히 검색하여 이해하게 되었다.

예시 코드에서 ResCommon resCommon = resInfo; 부분은 다음과 같은 원리로 작동한다

  1. resInfoResInfo 클래스의 객체를 생성한다.
  2. ResCommon resCommonResCommon 클래스 타입의 변수를 선언한다.
  3. 생성한 resInfo 객체를 ResCommon 변수에 할당. 이것이 가능한 이유는 resInfo 클래스가 ResCommon 클래스를 상속받았기 때문이다.

결과적으로, resCommon 변수는 ResCommon 클래스 타입이지만 실제로는 resInfo 클래스의 객체를 참조하고 있다. 이를 통해 ResInfo 클래스의 메서드나 필드에 접근할 수는 없지만, resCommon 클래스의 메서드나 필드에는 접근할 수 있다.

물론 이렇게 하는 방법이 맞는지는 모르겠지만, 기회가 된다면 적용할만한 가치가 있다고 생각이 들었다.

profile
짧더라도 확실한 기록

0개의 댓글