책 읽다가 코딩하다 죽을래

[객체지향] 메시지와 메서드의 차이 본문

이론/객체지향

[객체지향] 메시지와 메서드의 차이

ABlue 2023. 3. 13. 21:25

 

🤔 메시지? 메서드?


객체지향 공부를 하다 보면 자주 나오는 단어가 있습니다.

그것은 '메시지''메서드' 인데, 이 단어들이 같은 맥락에서 설명되어있다 보니 두 개의 단어가 비슷한 뜻일 거라고 생각하면서 넘어가거나, 알아내려고 공부해도 계속 헷갈리는 분들이 많을 것입니다.

 

결론부터 말하자면 '메시지' '메서드' 는 같은 개념이 아닙니다.

더욱이 '메시지' '메서드' 를 구분할 수 있어야지 객체지향의 꽃인 다형성을 이해할 수 있을 것입니다.

 

이번 시간에는 이 두 개의 단어가 정확히 무엇이며 간단한 예시를 들어 설명할 테니 잘 따라와 주길 바랍니다.

 

일단 이 두개의 사전적 정의부터 봅시다.

 

메시지객체간의 협력관계에서 상호작용할 수 있는 모든 방법을 말합니다.
메서드수신된 메시지를 처리하기 위한 자신만의 방법을 말합니다.
[오브젝트 2019 저자 조영호]

 

정의를 보면은 확 와닿는 것이 없을 것입니다.

먼저 실생활 예시와 코드를 통해 이 사전적 정의를 풀어보겠습니다.

 

🏃‍♂️ 실생활 예시

 

 



 

짱구는 배가 고픕니다. 먹기 위해 태어났는지 매일 3끼를 먹어도 배가 고픈 짱구입니다. 오늘도 배고픔을 해결하기 위해 짱구는 요리사가 있는 식당을 찾아갔습니다.

 

 

식당에 찾아온 짱구는 요리사에게 주문을 했습니다. 딸기, 파인애플, 초콜릿을 다 먹고 싶었지만 지금은 배고픔을 가장 잘 해결해 줄 수 있는 오믈렛을 주문했습니다.

 

지금까지 실생활에서 벌어질 수 있는 상황을 제시했습니다. 이 상황을 위에 나와있는 메서드와 메시지의 정의를 바탕으로 객체지향 프로그래밍을 시작해보겠습니다.

 

짱구와 요리사를 각각 하나의 객체로 보자면,

여기서 메시지'음식을 주문한다'입니다.

짱구라는 객체가 요리사라는 객체에게 음식을 주문한다 라는 메시지를 보내는 것입니다.

즉 짱구와 요리사는 협력관계이며, 짱구는 음식을 주문한다 라는 메시지를 송신했고 요리사는 메시지를 수신한 것입니다.

 

 

여기서 요리사는 음식을 주문한다라는 메시지를 처리하기 위해 다양한 방법을 사용할 수 있습니다.

 

abstract class Chef{
    abstract string cook();
}

 

class KoreanChef extends Chef{
    @override
    string cook(){
        return "김치찌개";
    }
}

class JapaneseChef extends Chef{
    @override
    string cook(){
        return "초밥";
    }
}

class ChineseChef extends Chef{
    @override
    string cook(){
        return "짬뽕";
    }
}

 

이런 식으로 Chef라는 추상클래스를 만들고 cook이란 추상메서드를 만든 후,  Chef추상 클래스를 상속받은 KoreanChef, JapaneseChef, ChineseChef 클래스에서 cook 메서드를 구체화할 수도 있고,

 

interface FoodLicense{
    string cook();
}

class KoreanChef implements FoodLicense{
    string cook(){
        return "김치찌개";
    }
}

이런 식으로 조리사자격증이란 인터페이스를 만들어서 Chef에게 cook 메서드 구현을 강제시킬 수도 있습니다.

 

class 짱구 {
    string order(Chef chef){
        return chef.cook();
    }
}

그러면 사용하는 쪽에서는 이런 식의 코드가 나올 것입니다.

짱구는 chef에게 cook이라는 메시지를 주는 것이고 chef는 cook이란 메시지를 받는 것입니다.

그러면 cook 메시지를 받은 KoreanChef, JapaneseChef, ChineseChef 들은 서로 자신만의 방법으로 처리할 겁니다.

앞에서 나온 예시에서는 각각 김치찌개, 초밥, 짬뽕이 여기에 해당됩니다.

 

메서드메시지를 받았을 때 그걸 처리하는 로직을 말합니다. 그게 추상클래스의 추상메서드가 될 수도 있고, 인터페이스 메서드가 될 수도 있습니다.

 

☝️ 또한 여기서 중요한 것은 짱구입장에서는 chef가 어떤 chef인지를 모른다는 것입니다. 그저 cook이란 메시지를 주면 이를 받아줄 누군가가 있을 거고 그에 맞는 요리를 반환해 줄 거라는 믿음만이 있을 뿐입니다. 이 부분은 결합도를 공부하실 때 중요한 부분이니 함께 알아가시길 바랍니다.

 

📝 정리

 

객체가 다른 객체와 상호작용할 수 있는 유일한 방법은 메시지를 전송하는 것입니다.

다른 객체에게 요청이 도착할 때 해당 객체는 메시지를 수신합니다.

메시지객체 간의 협력관계에서 상호작용할 수 있는 모든 방법을 말합니다.

이렇게 메시지를 수신한 객체는 스스로의 결정에 따라 자율적으로 메시지를 처리할 방법을 결정합니다.

이처럼 수신된 메시지를 처리하기 위한 자신만의 방법메서드라고 합니다.

 

앞에서 얘기했듯이 메서드와 메시지를 구분하셔야 다형성의 원리를 이해하실 수 있으니 이 부분을 확실히 짚고 넘어가시길 바랍니다.