• [C++] 오버라이딩 사용하는 이유에 대한 정리

    2023. 9. 13.

    by. KAEY

     


    ✨ INTRO 

    오버라이딩과 오버로딩. 언어를 배우다보면 무조건 마주치는 개념인거 같다.

    근데 막상 사용 방법도 알겠고, 형태도 규칙도 알겠다.

    여러 의문이 들었지만, 근데 이걸 왜 써? 아니 어떻게 써? 라는 의문이 들었다.

     

     

    처음 들었던 의문이 이것이다.

    부모클래스에서 info() 라는 메소드를 생성하고 이걸 자식이 상속 받아서 수정할 것이라면.

    굳이 자식클래스에서 다시 오버라이딩을 통한 재정의가 왜 필요한가?

    차라리 자식클래스에서 수정될 내용으로 사용될 메소드를 새로 만드는 것이 효율적이지 않나? 🤔(흐음)

    메소드 이름을 바꿔서 굳이 혼동되느니 구체적으로 메소드 이름을 수정했단 의미로 작성하는게 낫지 않을까? 싶었다.

     

     


    ✨ 마치 이건 인터페이스.

    자바에서 사용하는 인터페이스와 비슷한 개념으로 이해하면 좋을 것 같다.

    내가 알아본 방법과 교육 리더(재캐)님의 방안 두 개의 방안으로 이해를 했다.

     

     

    º (내가 알아봄) 협업의 과정에서 사용한다면..

    학생들의 성적 총합을 받아서 하나의 클래스에서 성적의 평균을 계산하는 클래스를 만든다고 가정했다.

    근데 학생들의 선택 과목을 계산하는 과정에서 만점 점수가 달라서 과목 별 분류가 필요한 상황이다.

    A와 B 개발자는 이 부분을 함께 개발하는데, 하나의 부모 클래스를 선언해서 어느정도 틀을 잡아놓는다고 생각한다.

     

     

    class 학생 {
    protected:
    	string 이름;
       	....
        
    public:
        성적의 합 메소드(){
        	.....
        }
    	
        +@ 의 메소드() {
        	.....
        }
    }

    즉 위에 처럼 대충 어느정도 클래스의 틀을 정해놓고, A는 성적의 합 메소드를. B는 +@ 의 메소드를 개발하는 것이다.

    이렇게 정해놓고 자식 클래스에서 선택 과목 별 자식 클래스를 생성해서 성적의 합을 만들던가 해서, 

    함께 개발하는 과정에서 코드를 합칠 때 오류가 최소한으로 발생하도록 하는 과정에서 큰 도움이 된다고 한다.

     

     

     


    º 리더님을 통한 도출 방안 (코드 간략화 등)

    게임이라 가정하고 부모 클래스에서는 playerInfo() 라는 메소드가 있으며,

    자식 클래스들은 유저의 캐릭터 정보를 가지고 있다.

    만약, 1번부터 50번까지의 유저 정보를 조회하기를 원한다면, 코드의 요구 사항이 50줄이 될 것이다.

    한명 한명 해당 클래스의 playerInfo() 값을 작성해야하기 때문.

     

     

    player1.userInfo();
    player2.userInfo();
    player3.userInfo();
    	......
    player49.userInfo();
    player50.userInfo();

    이렇게 50줄이나 작성하자니 코드를 작성하는 것도 번거롭고 좋지 않다.

     

     

     

    그래서 이러한 오버라이딩을 응용하면 코드가 좀 간략하게 변하게 된다.

    Player* user[50];
    user[0] = &player1
    user[1] = &player2
    .....
    user[49] = &player50

    이렇게 포인터를 이용해서 50명의 유저 정보를 하나 씩 저장해놓는다면,

    이 클래스들 메소드를 조회할 때 반복문을 사용할 수 있게 되어서 굉장히 간략하게 변한다.

     

     

     

        for (int i = 0; i < 50; i++) {
            user[i]->playerInfo();
        }

    이렇게 반복문을 이용하기만 해도, 50명의 정보를 몇 줄만으로 간략하게 요약하기에 굉장히 용이해진다.

    또한 유저마다 playInfo() 메소드의 출력 값이 다르더라도, 오버라이딩을 통해 출력할 수 있다는 장점이 있다.

    즉, user[i] -> playerInfo(); 한 줄이지만, 누군가는 정지된 회원, 탈퇴한 회원 등 다양한 결과를 출력할 수 있다는 것.

     

     

     

        for (int i = 0; i < 50; i++) {
            user[i]->playerInfo();
            user[i]->playerRank();
            user[i]->playerExp();
        }

    물론 위에서 50개의 주솟값을 저장하는 과정이 번거롭지만.. (축약할 수 있는 과정이 있을까? 🤔)

    다른 메소드를 호출하게 될 경우 추가적인 50줄을 작성하지 않고 위에서 처럼 1줄씩만 추가해도 되므로 

    이는 코드를 줄이는 과정에서 굉장히 유용하다고 볼 수 있다.

     

     


    🎉해당 글의 내용은 "포스코 x 코딩온 스마트 팩토리 과정 수업" 에서의 수업 자료 및 실습 과제 등에서 일부 발췌되어 작성 되었습니다.


    댓글 (비로그인 댓글 허용하지 않습니다.)