static method != class method ?

続・大人の事情 - みねこあから続く。

http://d.hatena.ne.jp/odz/20061012/1160671348#c より、

閑話休題id:minekoa さんは Python も使うらしいので、python での class method(レシーバがクラスであるメソッド)、 static method(レシーバの存在しないメソッド)の両者が区別されているから、『「クラス」メメソッドじゃない、「静的」メソッドなんだ!!』なんてことを言うのだと思うのだけれども、

との指摘は残念ながらハズレ。買いかぶりすぎです。あたしは、単に「クラスはオブジェクトの一種文化圏」と「クラスはオブジェクトじゃない文化圏」での、 クラスに紐付いたメソッド(関数)の伝統的呼び名の違いの話しか頭になかったけど(そしてその意味でも間違っていたのがお笑いだけど)、そういや両方ある変な言語もありましたね。(←おい)

static の何が静的かと考えれば、自ずと「静的にメモリ確保」という意味になってくるから、その点Javaのクラスはstatic method と呼んだら違和感あるなぁと odz さんが感じた、という話だということに、Python の static method と class method の話を出されて、ようやく気がついた次第。鈍すぎ。遅すぎ。

ちなみに私が、「Javaプログラマは『クラスのロード』を『メタクラスからのインスタンス作成』」という意識を持ってなきゃ駄目なのかな」という疑問は、あの IT Pro の記事や odz さんの最初のつっこみが、やけにその辺に拘っているように見えたからなのだけれど、じゃなくて、単に「静的メモリ確保」の部分に意義を唱えたかっただったのですね。がってん。

また、static method と class method の差は それをインスタンスを通して呼べるか否かと捉えれば、Java は class method で、C#は static method になるのかな?*1 なんかC++ の「参照」と「ポインタ」の違いみたいで微妙な話。

ちなみにPython流や「インスタンスから呼べるか」流 static なんちゃら と class なんちゃらの使い分けとかは、絶対世の中の同意の取れていない話だと思うのだけど、どうでしょう? C# が自らを static method と呼んでいるのは C++ の系譜であることに厳格であるだけだし、Javaでは(この前まで勘違いしてた身で何を言う、だけれど)、static method と呼んだり class method と呼んだりバラバラ*2です。ここら辺もC++の「参照」と「ポインタ」の使い分けによく似てるな〜。

それ以前に

なんか誤解という話だが、なんというか、「a instance of String」のノリで「a Instance of Class」なら java.lang.Class のインスタンスだろう思ったりするわけで、

の一文が全てを表すように、クラスはオブジェクトであると言い切れない大人の事情 - みねこあ は、いろいろ突っ込みどころありすぎ。かなり浅はかだったなぁと我ながら思う次第です。穴があったら。

*1:C# 2.0はちゃんと知らないので、もう違うかも

*2:odz さんとのやりとりで、逆になぜ「static」とも呼ぶのかが不思議に思えてきたりして。