본문 바로가기

애매한 카테고리

메소드와 함수 (Method and Function)의 차이점

You don't know JS(this와 객체 프로토 타입, 비동기와 성능)편을 읽던 중,

 

여타 언어에서 객체(클래스)에 부속된 함수를 주로 '메소드'라 부르고 자바스크립트 함수 역시 객체의 부속물이라 생각하기에 ... 엄밀히 말해 함수는 결코 객체에 속하는 것이 아니며, 객체 레퍼런스로 접근한 함수를 그냥 메소드라 칭하는건 그 의미를 지나치게 확대해 해석하는 것이다.

 

라는 구절을 읽으며 메소드와 함수의 차이점이 정확히 뭘까?라는 궁금증이 들었다.

 

여태까지는 단순히 어떠한 기능을 하는 코드 조각을 'Java에서는 메소드, JavaScript에서는 함수라고 부른다' 라고 생각해왔다. 구글링을 해보니 스택오버플로우에 동일한 질문이 올라와있어서 이를 참고해서 요약해보았다.

 

링크로 가기 👉 What's the difference between a method and a function?

 

메소드와 함수 (Method and Function)의 차이점

  • 함수가 메소드를 아우르는 포괄적인 용어이다.
  • 함수는 객체로부터 독립적이며, 메소드는 객체에 종속적이다.
  • 메소드는 거의 모든 면에서 함수와 동일하지만, 아래의 2가지 포인트에서 다른 점이 있다.
    1.  메소드는 호출된 객체에 암시적으로 전달된다.
    2.  메소드는 클래스 안에 있는 data를 조작할 수 있다.
  • 기본적으로 두 용어의 뜻은 동일하나 '객체(클래스)로부터 독립적인가 아닌가'가 함수와 메소드를 나누는 기준이다.

 

댓글을 읽던 중 몇가지 흥미로운 댓글을 보아서 내 의견을 생각해보았다.

 

Java의 람다식은 method가 아니라 function 아님?

 

Java의 경우 람다식을 사용할 수 있지만 Java는 메소드를 단독으로 선언할 수 없고 항상 클래스의 구성 멤버로 선언하기 때문에 람다식은 단순히 메소드를 선언하는 것이 아니라 이 메소드를 가지고 있는 객체를 생성해 낸다. 따라서 함수같지만 알고보면 여전히 메소드인 것으로 보인다.

 

"JavaScript: The Good Parts"라는 책을 인용해보면, 자바스크립트에서 함수가 객체의 프로퍼티로 저장된다면 이것은 메소드이다. (메소드는 객체로부터 독립적이지 않다) 함수가 객체의 프로퍼티가 아니라면, 이것은 함수이다.(함수는 독립적이다.)

 

위의 댓글을 읽으면 현재 내가 읽고있는 책 You don't know JS 에서 카일심슨이 주장하는 바와는 다르다. 저 책을 읽지 않아서 부가적인 내용이 더 있는지는 모르겠지만, 카일심슨은 아래 코드의 예를 들면서 그냥 메소드라 칭하는 것은 온당치 않다고 말한다.

 

function foo() {
  console.log("foo");

var someFoo = foo; // 'foo'에 대한 변수 레퍼런스
var myObject = {
    someFoo: foo
};

foo; // function foo(){...}
someFoo; //function foo() {...}
myObject.someFoo; //function foo() {...}

 

someFoomyObject.someFoo 모두 같은 함수를 가리키는 개별 레퍼런스 일뿐, 뭔가 특별한 다른 객체가 '소유한' 함수라는 의미는 아니라는 것이다.

 

아니면 아래와 같이 함수 표현식을 객체 리터럴의 한 부분으로 선언해도 이 함수가 저절로 객체에 달라붙는 것은 아니며 해당 함수 객체를 참조하는 레퍼런스가 하나 더 생기는 것뿐이라고 말한다.

 

var myObject = {
    foo: function() {
        console.log("foo");
    }
};

var someFoo = myObject.foo;

someFoo; // function foo(){..}
myObject.foo // function foo() {..}

 

메소드와 함수 중 무엇으로 부를 것인지가 그렇게 중요한 것은 아닐지 모르지만, 그래도 차이점을 알고 있는 것이 언어를 이해하고 코딩하는데 있어서 더 도움이 될 것 같다.