Swiftのstaticとclassの違いとは?初心者向けにやさしく解説!
生徒
「Swiftでstaticとclassの違いがいまいち分かりません。どっちを使えばいいのか迷います…」
先生
「それはとても大切なポイントですね。staticとclassは似ているようで実は役割が少し違うんですよ。」
生徒
「えっ、どっちもクラスの中で使って、共通の機能を作るんじゃないんですか?」
先生
「たしかに両方とも『インスタンス(実体)を作らなくても使える』点では似ていますが、classにはオーバーライドという強力な特徴があります。それを軸に見ていくと違いが分かりやすいですよ!」
1. staticとclassは何が違うの?
staticとclassは、どちらも「インスタンス化せずに使えるメソッドやプロパティ」を定義するために使います。これはつまり、「わざわざnewで作らなくても、クラス名だけで呼び出せる便利な機能」です。
たとえば、計算機アプリで「足し算」や「引き算」のような処理は、個々のインスタンスごとに持つ必要はありません。そんなときに便利なのがstaticやclassです。
2. staticは固定されたメソッドやプロパティ
staticを使うと、そのメソッドやプロパティは「変更されない固定のもの」になります。つまり、サブクラス(子クラス)で上書きできないのが特徴です。
例を見てみましょう。
class Animal {
static func sound() {
print("なんらかの動物の鳴き声")
}
}
class Dog: Animal {
// staticはオーバーライド(上書き)できないのでエラーになる
// override static func sound() {
// print("ワンワン")
// }
}
Animal.sound() // → なんらかの動物の鳴き声
Dogクラスでsoundメソッドを上書きしようとするとエラーになります。これがstaticの「変更できない」特徴です。
3. classは上書きできるメソッドやプロパティ
一方でclassを使うと、そのメソッドやプロパティはサブクラスで上書きできるようになります。つまり、overrideキーワードを使えば、動作を変えることができるのです。
class Animal {
class func sound() {
print("なんらかの動物の鳴き声")
}
}
class Dog: Animal {
override class func sound() {
print("ワンワン")
}
}
Dog.sound() // → ワンワン
Animal.sound() // → なんらかの動物の鳴き声
このように、親クラスと子クラスで異なる動作をさせたいときはclassを使います。
4. いつstatic、いつclassを使うべき?
変更されたくない機能であればstaticを使いましょう。たとえば定数や共通ユーティリティのように、「決まった処理だけを提供したい」ときに向いています。
拡張性をもたせたい場合にはclassを使います。サブクラスごとに処理を変えたいとき、つまりオーバーライド可能にしたいときに適しています。
5. staticとclassの使い分け 具体例
例えば、動物園のアプリを作るとしましょう。すべての動物に共通する「登録番号のフォーマット」は変更されたくないのでstaticで定義します。一方、動物の「鳴き声」は種類ごとに違うのでclassで定義します。
class Animal {
static let registerPrefix = "ZOO-"
class func sound() {
print("...")
}
}
class Cat: Animal {
override class func sound() {
print("ニャー")
}
}
print(Animal.registerPrefix + "001") // → ZOO-001
Cat.sound() // → ニャー
6. staticとclassの共通点と違いのまとめ表
| 特徴 | static | class |
|---|---|---|
| インスタンス不要で呼び出せる | ○ | ○ |
| サブクラスでオーバーライドできる | × | ○ |
| Swiftの構造体(struct)でも使える | ○ | × |
| 変更を防ぎたいとき | ◎ | △ |
| 拡張性を持たせたいとき | × | ◎ |
7. 構造体(struct)ではstaticしか使えない?
ここも大事なポイントです。Swiftではstruct(構造体)の中ではclassキーワードは使えません。つまり、構造体ではstaticしか使えないのです。
struct Utility {
static func showMessage() {
print("こんにちは!")
}
}
Utility.showMessage() // → こんにちは!
クラスと構造体の違いを意識しながら、適切に使い分けましょう。
まとめ
Swiftでクラスを扱うときに欠かせない要素として、staticとclassの使い分けがあります。両者はよく似た書き方を持ち、どちらもインスタンス化せずに利用できるという共通点がありますが、それぞれが担う役割は実に違いが大きく、特にアプリの構造設計や拡張性に関わる重要な選択になります。たとえば、共通の値や変わらない処理を提供したいときにはstaticを使うことで、変更されない安定した振る舞いをクラス全体に持たせることができます。これにより、意図しないオーバーライドを防ぎ、一定の動作を確保できます。一方で、さまざまな動物を扱うアプリやユーザーの種類によって動作が異なるシステムでは、classを使ってメソッドをオーバーライドできるようにすることで、柔軟な振る舞いの変更を実現できます。
また、構造体ではstaticのみが使えるという点も非常に重要です。構造体はクラスとは異なり継承ができないため、そもそもclassキーワードを使う場面が存在しません。この違いは、Swiftという言語が持つ特徴や設計思想にも深く関係しており、構造体を軽量で安全に扱うための工夫ともいえます。構造体の用途に合った静的な機能を提供したい場合、staticの特性はとても扱いやすく、単純なユーティリティや便利関数をまとめるときに大変役立ちます。こうして比較すると、staticとclassは単純な言葉の違い以上にコード全体の設計や管理に影響を及ぼすことがわかります。
実際の開発では、アプリ全体で共有したい値や振る舞い、計算処理、フォーマットをstaticで記述し、種類ごとに異なる挙動や将来的な仕様変更を想定した処理はclassを選択することで、より自然なデザインが実現できます。さらに、Swiftは型ごとに安全性を重視した設計がなされているため、どのキーワードを使うかでエラーの有無や将来的な変更のしやすさが変わる点も見逃せません。オーバーライドする必要がない場面でclassを使うと、意図せず子クラスで動作を変えられてしまう可能性があり、逆に拡張性が必要な場面でstaticを使ってしまうと柔軟性が損なわれます。そのため、両者の違いを正しく理解しておくことは、Swiftで安全かつ効率的なコードを書くうえで欠かせないスキルといえます。
サンプルコードで理解を深める
最後に、staticとclassの動きをまとめたサンプルコードを紹介します。上書きできるかどうかの違いがより分かりやすくなるはずです。
class Vehicle {
static func companyName() -> String {
return "Swift Motors"
}
class func fuelType() -> String {
return "Unspecified"
}
}
class ElectricCar: Vehicle {
override class func fuelType() -> String {
return "Electric"
}
}
print(Vehicle.companyName()) // Swift Motors
print(ElectricCar.fuelType()) // Electric
このように、企業名など「絶対に変更されたくない情報」はstaticで固定し、車種ごとに異なる特徴を持たせたい部分はclassで柔軟に変更できます。この考え方を理解しておくことで、アプリ全体の構造設計や再利用性が大きく向上します。
生徒
「staticとclassって、見た目が似ているから混乱していましたけど、役割がぜんぜん違うことがよく分かりました!」
先生
「その気づきはとても大切ですね。特にオーバーライドできるかどうかは、設計の段階で大きな意味を持ちます。」
生徒
「構造体ではstaticしか使えないっていうのも、理由を聞くと納得できました。軽量構造に合っているんですね。」
先生
「そうなんです。Swiftは型の使い分けがとても重要なので、こうした基礎をしっかり理解しておくと応用が効きやすくなりますよ。」
生徒
「今日学んだことを意識してコードを書けば、もっと読みやすくて安全なプログラムが作れそうです!」
先生
「その調子です。書くときだけでなく、誰かのコードを読むときにも役立つ知識なので、ぜひ繰り返し使って慣れていきましょう。」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Swiftのstaticとclassの違いは何ですか?初心者にも分かりやすく教えてください
Swiftのstaticは固定された機能で、classはオーバーライド可能な機能です。どちらもインスタンス化せずに使えますが、拡張性の有無が最大の違いです。
Windowsで始めるiPhoneアプリ開発入門|Swiftの基本と仕組みを1時間で攻略
Windowsで始めるiPhoneアプリ開発入門|Swiftの基本と仕組みを1時間で攻略
「iPhoneアプリを作りたいけれど、Macを持っていないから諦めている」そんな方のための画期的な入門講座です。実は、プログラミングの本質を学ぶのに高価な機材は必要ありません。本講座では、Windowsパソコンを使用し、クラウド環境を活用してAppleの最新言語Swift(スウィフト)の基礎を最短距離でマスターします。
Windowsで実現する開発環境
【つくるもの】
ブラウザ上で動作する「スマート・計算ツール」や「データ判定プログラム」をゼロから作成します。変数の扱いや条件分岐など、iPhoneアプリの内部で動くロジックを自分の手で構築する感動を体験してください。
【開発環境】
ブラウザだけでSwiftが動くプロ仕様のオンラインエディタ(Replit等)を使用します。面倒な設定は一切不要。今あるWindows PCで、プロのエンジニアと同じコードを書き始められます。
この60分で得られる3つの理解
OSの壁を越え、クラウドを活用してスマートに学習を開始する「現代的な開発スタイル」を習得します。
iPhoneアプリ特有のデータの扱い方や、Appleが推奨する「安全で美しいコード」の書き方を学びます。
将来的にiOSエンジニアとして副業・転職するために必要な準備や、Mac選びのポイントを伝授します。
※本講座は、将来的にiPhoneアプリ開発で収益化や転職を目指したい未経験者のためのエントリー講座です。マンツーマン形式により、Windows環境ならではの疑問にもその場でお答えし、あなたの理解度に合わせて進行します。
Windowsで始めるiPhoneアプリ開発入門