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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

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

Q&A

解決済

4回答

1972閲覧

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

todayske

総合スコア36

Swift

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

7グッド

14クリップ

投稿2017/08/02 01:22

編集2017/08/02 08:44

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

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

Swift

1class StaticGuy { 2 static var name = "staticな男" 3 static func introduce() { 4 print("私は\(name)") 5 } 6} 7 8class NormalGuy { 9 var name = "普通の男" 10 func introduce() { 11 print("私は\(name)") 12 } 13} 14 15StaticGuy.introduce() // -> 私はstaticな男 16NormalGuy().introduce() // -> 私は普通の男

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

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

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

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

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


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

Swift

1// MARK: 1. 普通の場合 2class NormalGuy { 3 var name = "普通の男" 4 func introduce() { 5 print("私は\(name)なので、たくさん生成すると、メモリがとんでもないことになります。")// -> 私は普通の男 6 } 7} 8 9// これは無駄にメモリの負担が大きい。 10for _ in 1...100 { 11 NormalGuy().introduce() 12} 13 14 15 16 17 18 19// MARK: 2. static を使った場合 20class StaticGuy { 21 static var name = "staticな男" 22 static func introduce() { 23 print("ふはははは! いくら私を生成しようとも、メモリの負担はあんまり大きくないぞ!! 何故なら私は\(name)だから!")// -> 私はstaticな男 24 } 25} 26 27// これは、MARK1 よりもメモリの負担が少ない。 28for _ in 1...100 { 29 StaticGuy.introduce() 30} 31 32 33 34 35 36 37// MARK: 3. static を使えない場合 38// ロックな人は、みんなと同じであることが耐えられないので、名前を個別に設定したい。 39// この場合は、やりたいこと的に static にできない。 40class RockGuy { 41 var name: String 42 init(name: String) { 43 self.name = name 44 } 45 46 func introduce() { 47 print("俺はロックな男。その名も、\(name)!")// -> 俺はロックな男。その名も、(それぞれの名前)! 48 } 49} 50 51for name in ["カールスバーグ宮崎", "ヤスオ", "ジョセフ伊藤", "エンジェル桜木"] { 52 RockGuy(name: name).introduce() 53}
ahoahomarumaru, ogakuzuko, shippei, taichi_dm_, Bongo, ks-cap, hyumayamaguchi👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

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

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

投稿2017/08/02 01:59

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

todayske

2017/08/02 08:20

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

0

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


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

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


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

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


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

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

投稿2017/08/02 02:10

YasuhiroMiyake

総合スコア1336

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

todayske

2017/08/02 08:28

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

2017/08/04 00:30

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

2017/08/04 00:43

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

0

ここでいう静的ってどういう意味なのか。
→メモリ上にずっといるので実体外のやつら
とても勉強になるので下の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 04:11

tomopunyu

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

todayske

2017/08/02 08:38

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

0

ベストアンサー

1.ここでいう静的ってどういう意味なのか。

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

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

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

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

投稿2017/08/02 02:07

編集2017/08/02 02:09
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

todayske

2017/08/02 08:26 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問