[Way to PM] 백엔드(자바) - 오버라이딩과 다형성

2024. 2. 12. 21:09[Way to PM] 백 엔드

0. 레퍼런스

부트캠프 3주차 퀴즈 간단한 연락처 관리 프로그램

1. WHY - 해당 글 작성을 통해 얻고자 하는 목적

1) 과제를 하면서 알게된 오버라이딩과 다형성에 대해 복기하면서 지식을 더욱 확고히 함.

2. HOW - 문제 해결 과정

1) 문제 상황 발생: 

-하나의 부모클래스를 상속받는 두 개의 하위클래스가 존재하는 상황(각각 다른 멤버 변수를 가짐)

-각각의 하위 클래스에 toString을 오버라이드해서 부모의 멤버변수와 각각의 클래스에 가지고 있는 멤버변수를 반환하도록 재정의

-부모를 참조타입으로 하는 하위클래스의 객체를 변수에 할당하고 toString메서드를 호출했는데 두개의 하위클래스에서 재정의했는데도 충돌이 나지 않고, 부모클래스를 참조타입으로 했는데도 자식클래스에서 재정의한 함수가 호출되어서 의문이 생김

 

2) 문제 원인 탐색: 

-오류가 난 것은 아니라 구글링과 Chat GPT를 통해 의문 해소

 

3) 문제 해결

-객체지향 프로그래밍의 핵심 원칙 중 하나인 다형성이 적용되는 현상으로, 

 

1. 하위 클래스가 상위 클래스의 메서드를 오버라이드(재정의)할 수 있다.

2. 런타임에, Java 가상 머신(JVM)은 객체의 실제 타입을 확인하고, 해당 타입에 맞는 오버라이드된 메서드를 실행합니다. 이는 참조 변수의 타입이 아니라, 실제 객체의 타입에 기반합니다.

3.하지만 오버라이드된 메서드를 제외하고 객체는 참조하고 있는 타입의 class에 있는 필드에 접근이 가능하다.

 

 따라서 오버라이드된 메서드는 다양한 하위클래스에서 재정의되어도 충돌하지 않으며, 메서드가 호출되면 가장 적합하게 재정의된 메서드가 수행된다.

4. WHAT - 작성 코드

1) 1번 하위클래스

@Override
public String toString() {
    return "이름: " + super.getName() + ", 전화번호: " + super.getPhoneNumber() +
            ", 관계='" + relationship + '\'';
}

 

2) 2번 하위클래스

@Override
public String toString() {
    return "이름: " + super.getName() + "전화번호: " + super.getPhoneNumber() +
            "회사='" + company ;
}

 

3) 부모클래스를 참조타입으로 갖는 변수 contact에 하위클래스의 객체를 할당하고 toString메서드를 String 변수 User에 담아 프린트하면 하위클래스에서 정의한 toString메서드가 호출되어 값을 반환한다.

public void searchContact(String name) {
    for (int i =0; i < contacts.size(); i++) {
        Contact contact = contacts.get(i);
        if (contact.getName().equals(name)) {
            String user = contact.toString();
            System.out.println(user);
        } else {
            System.out.println("연락처가 비어있습니다.");
            break;
        }
    }
}
 

5. 배운점 및 자기평가

배운점

1) 생성자 함수를 통한 객체 생성, 할당 과정에서 참조 변수의 클래스 타입과 실제로 참조하는 객체의 차이

(메서드오버라이딩과 아닌 상황에서)

 

 

자기평가

1) 의문점을 명확히하고 바로 적용하고 실행해본다.

2) 그 과정에서 이해도가 높아지고 상대적으로 부족한 부분이 있는데, 부족한 부분에 너무 시간을 쓰지 말고 일단 넘어간다. 다음 프로젝트나 과제 구현시 또 마주치게 될 때 이해도가 자연스레 높아진다.