質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • Swift

    8560questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

static という言葉の意味が分からない。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 7
  • VIEW 4,154

todayske

score 19

私は Swift でアプリを作っています。

static という言葉が、どういう思想のものなのか分からなくて、もやもやしています。
どういう挙動をするかは調べたら色々と調査してもらっている記事があったのですが、何故 Swift がこういう機能を提供しているのかが分かりません。
例えば、こういう風に、インスタンスを作らなくても static なら呼べる、という挙動はなんとなく分かります。

class StaticGuy {
    static var name = "staticな男"
    static func introduce() {
        print("私は\(name)")
    }
}

class NormalGuy {
    var name = "普通の男"
    func introduce() {
        print("私は\(name)")
    }
}

StaticGuy.introduce() // -> 私はstaticな男
NormalGuy().introduce() // -> 私は普通の男


でも、こういうことは分かりません。

  1. ここでいう静的ってどういう意味なのか。
    (いつも同じ結果になる静的なコードと、状況によって違う結果を出す動的なコード、といった類の話は分かります)
  2. static があると何が嬉しいのか。
  3. どういう時は static を使うべきなのか。

例えが適切か分かりませんが、知りたいのはこういうことだと思います。
例|知りたい
Android は「みんな違うから世界は楽しい」というコンセプトだから、色んな端末で動くように、Google が作っている。

例|知りたいことではない
Androidは、色んな端末で動く。

あまり他の言語に精通していないので、できれば Swift の例だと助かりますが、もし他の言語でも考え方のご説明をいただけますと嬉しいです。
上手に聞きたいことを伝えられなくて大変恐縮ですが、「おそらくこういうことが聞きたいのだろう」と思ってくださった方は、お知恵をお貸しいただけますととても助かります。

よろしくお願いいたします。


追記
皆様、ご回答ありがとうございます! おかげさまで大分理解が進んだ気がします。
(どのご回答もとても的確で理解を深めていただいて、ベストアンサーを選ぶのが難しかったのですが、私のレベルで一番理解しやすかったという観点で選出させていただきました)
こういう認識で合っていますでしょうか?

// MARK: 1. 普通の場合
class NormalGuy {
    var name = "普通の男"
    func introduce() {
        print("私は\(name)なので、たくさん生成すると、メモリがとんでもないことになります。")// -> 私は普通の男
    }
}

// これは無駄にメモリの負担が大きい。
for _ in 1...100 {
    NormalGuy().introduce()
}






// MARK: 2. static を使った場合
class StaticGuy {
    static var name = "staticな男"
    static func introduce() {
        print("ふはははは! いくら私を生成しようとも、メモリの負担はあんまり大きくないぞ!! 何故なら私は\(name)だから!")// -> 私はstaticな男
    }
}

// これは、MARK1 よりもメモリの負担が少ない。
for _ in 1...100 {
    StaticGuy.introduce()
}






// MARK: 3. static を使えない場合
// ロックな人は、みんなと同じであることが耐えられないので、名前を個別に設定したい。
// この場合は、やりたいこと的に static にできない。
class RockGuy {
    var name: String
    init(name: String) {
        self.name = name
    }

    func introduce() {
        print("俺はロックな男。その名も、\(name)!")// -> 俺はロックな男。その名も、(それぞれの名前)!
    }
}

for name in ["カールスバーグ宮崎", "ヤスオ", "ジョセフ伊藤", "エンジェル桜木"] {
    RockGuy(name: name).introduce()
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

クラスは、オブジェクトの設計図のようなものです。
1つのクラスから、複数のオブジェクトを生成でき、各オブジェクトの状態(変数の値、メソッドの実行状況)などは基本的に独立しています。またオブジェクトは新たに生成されたり、削除されたりします。そういう意味でオブジェクトは動的(Dynamic)なものです。

Static(静的)はDynamicの対語で、クラスという常に存在していて1つしかないもの(出来たり消えたりしないので静的な存在)の変数やメソッドをシステム全体で使えるようにしたものがStaticです。

Staticの使い方については、以下の記事に詳しく説明されています(SwiftではなくJavaですが)
あなたの知らないJava staticの使い方

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/02 17:20

    ご回答ありがとうございます!
    > 1つのクラスから、複数のオブジェクトを生成でき、各オブジェクトの状態(変数の値、メソッドの実行状況)などは基本的に独立しています。またオブジェクトは新たに生成されたり、削除されたりします。そういう意味でオブジェクトは動的(Dynamic)なものです。
    こちら、大変分りやすかったです。
    ご紹介いただいた記事も拝見し、とても勉強になりました。こういうことが知りたかったので、大変ためになりました。

    キャンセル

+3

イメージぐらいは伝わるかな という内容でざっくり書いておきます。


ここでいう静的ってどういう意味なのか。
(いつも同じ結果になる静的なコードと、状況によって違う結果を出す動的なコード、といった類の話は分かります)

オブジェクトを自分で生成するか(動的)、事前(プログラム実行時?)に生成してもらうのか(静的)


static があると何が嬉しいのか。

自分でオブジェクトを生成しなくても、参照出来る点
例えば、オブジェクトを生成する意味がない定数クラスを毎回生成してからじゃないと定数を取得出来ないというようなことがなくなる。


どういう時は static を使うべきなのか。

オブジェクトを複数作る必要性のなく、いろいろなところからアクセスされるような場合?
例えば、定数クラス。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/02 17:28

    ご回答ありがとうございます!
    一点質問なのですが、
    >> どういう時は static を使うべきなのか。
    > オブジェクトを複数作る必要性のなく、いろいろなところからアクセスされるような場合?
    > 例えば、定数クラス。
    この場合、Swift だと struct を使った方が良いと思っていたのですが、そんなことはないですか?

    キャンセル

  • 2017/08/02 19:54

    私も詳しくはありませんが、以下にclass と struct のどちらを使うべきなのかが書かれています。
    少し長いですが面白い記事だと思います。
    http://cockscomb.hatenablog.com/entry/choosing-between-classes-and-structures

    キャンセル

  • 2017/08/04 09:30

    この記事読んだことあります! すごく勉強になりました!
    基本的に「値を持たせておくものは struct」だと理解しているのですが、これでいいのかちょっと疑問に思いながら使っています笑

    キャンセル

  • 2017/08/04 09:43

    構造体(struct)は、どちらかと言えばデータモデルの要素のほうが強いので
    値を持たせておくもの という意味では間違っていないのですが、構造を表す以外には不向きかもしれません。
    あとは構造体だと継承出来ないので、動物という構造体を用意して、猫や犬みたいな派生を継承して作成するような場合はclassにする必要があったと思います。

    キャンセル

checkベストアンサー

+2

1.ここでいう静的ってどういう意味なのか。
(いつも同じ結果になる静的なコードと、状況によって違う結果を出す動的なコード、といった類の話は分かります) 
2.static があると何が嬉しいのか。 
3.どういう時は static を使うべきなのか。

すべてのインスタンスで共通な変数はstaticを付けないと、インスタンスの生成のたびにインスタンスの個数分データがメモリに書き出されるのでメモリの無駄使いになります。
インスタンスメソッドの場合は、インスタンスからメソッド定義への参照を保持するだけなので、たいしたオーバーヘッドにはなりませんが、インスタンスの状態に依存しない処理であることを明確にできます。逆にインスタンスの状態に依存する処理をstaticに定義することはレシーバで複数のクラスのインスタンスが絡む処理をのぞいて基本的にないです。

また、staticなメソッドは実行前にメモリや値が確保できているどうかを検証しているため、実行前にバグがないかをある程度検証できます。staticな関数の中で、staticではない変数(つまりインスタンス変数)などを記述した場合、それらはインスタンスが生成されるまで使えない変数なので、IDEなどで、エラーを教えてくれます。

つまり、変数の場合は実際にパフォーマンスに影響して、関数の場合は、そのコードを読む人にインスタンスの状態依存の処理ではないことを明示的に伝えたいときや、staticな処理に対して誤って動的なパラメータを記述してしまうミスを防ぐために書いたほうがいいものです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/02 17:24 編集

    ご回答ありがとうございます!
    static 変数についても、関数についても大変分かりやすく、理解につながりました。

    > つまり、変数の場合は実際にパフォーマンスに影響して、関数の場合は、そのコードを読む人にインスタンスの状態依存の処理ではないことを明示的に伝えたいときや、staticな処理に対して誤って動的なパラメータを記述してしまうミスを防ぐために書いたほうがいいものです。
    こちらのまとめが特に、大変分かりやすかったです。
    変数について、追記に理解したことを書いてみたので、間違っていたらご指摘いただけますと嬉しいです。

    キャンセル

+2

ここでいう静的ってどういう意味なのか。
→メモリ上にずっといるので実体外のやつら
とても勉強になるので下のURLを見てください https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1088372670

static があると何が嬉しいのか。
→Enumなど多くの場所で使うものなどを定義すれば便利

どういう時は static を使うべきなのか。
→共通処理など
staticで置いとけば一つの領域から呼び出されるため実体生成いくつも生成していろいろな場所から呼び出さなくてよい
デザインパターンとかで調べてみてください Singletonなど
http://www.techscore.com/tech/DesignPattern/Singleton.html/ ← Singleton概念
http://qiita.com/codelynx/items/a936afe0a45d4cf5abfb ← Singleton Swift

staticは便利なものですが使い方がとても難しいものなのでもっと調べてみてください。
Cなどのメモリ管理が大切な言語を学ぶか情報処理をもう少し学びメモリの動きを理解すればより楽しくなると思います。

説明が下手なので他の回答者様助けてください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/02 17:38

    ご回答ありがとうございます。
    ご紹介いただいた知恵袋の投稿も拝見し、とても勉強になりました。
    Singleton についても最近学び、なんとなく雰囲気が分かってきました。

    > Cなどのメモリ管理が大切な言語を学ぶか情報処理をもう少し学びメモリの動きを理解すればより楽しくなると思います。
    こちら、アドバイスありがとうございます。
    たぶんこれが、理解できなかった根本的な原因なのかなと思いました。
    「メモリの話が色んな記事で見るけど、まあそんなに問題ないし、とりあえずスルーしよう」という精神が、この無理解に繋がっていた気がします。
    これを機に、ちゃんと学びます!

    キャンセル

同じタグがついた質問を見る

  • Swift

    8560questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています