Objective-Cは、長年にわたりiOSアプリ開発に使われてきたプログラム言語です。
現在は、後継語の「Swift」が登場して世代交代が進んでおり、新しくアプリを作る際にはObjective-Cが選ばれる機会が減ってきています。
「Swiftが主流になった今、Objective-Cを習得する意味なんてあるの?」と思う方もいるでしょう。
しかし、Objective-Cはいまだ価値のある言語なのです!
この記事では、そんなObjective-Cの特徴やSwiftとの違い、将来性や基本構文などを紹介します。
Objective-Cの知識やスキルは、ハイレベルなSwift開発者を目指すための強力な武器になります!
本格的なiOSアプリを開発したい方は、ぜひ参考にしてみてください。
Objective-Cとは
Objective-C(オブジェクティブシー)は、1983年にアメリカのブラッド・コックス氏とトム・ラブ氏によって開発されました。
そして、1988年にスティーブ・ジョブズ氏が立ち上げた、NeXT Computer社のOS「NeXTSTEP」の主要な開発言語に採用。
1995年には同社がObjective-Cの権利を完全に取得し、自社技術として統合しました。
Objective-Cが広く知られるきっかけとなったのは、1997年にApple社がNeXT社を買収し、次世代OS「Mac OS X(現macOS)」の開発言語として採用したことです。
これが後に、iPhone(iOS)開発の基礎となり、Objective-CはApple製品のアプリ開発における主要言語となりました。
2014年にAppleが新言語として「Swift」を開発したことで、現在はObjective-Cの役割も徐々に減りつつあります。
しかし、長年Appleを支えてきた言語なだけあり、Objective-Cは今でもシステムの根幹や既存アプリの保守において欠かせない言語であり続けているのです。
Objective-Cの特徴
ここからは、Objective-Cの特徴を解説していきます。
オブジェクト指向言語である
Objective-Cは、汎用性の高い「C言語」をベースに、オブジェクト指向の先駆けである「Smalltalk(スモールトーク)」の概念を取り入れた言語です。
当時、C言語をオブジェクト指向化した言語としては「C++」も有名でしたが、Objective-Cはそれとは異なる「メッセージング」という独自の考え方で設計されました。
オブジェクト指向とは、プログラムを「オブジェクト(モノ)」として扱い、それらを組み合わせて構築する手法です。
この手法により、一度作ったコードを再利用しやすくなったり、後からの仕様変更に対応しやすくなったりするメリットがあります!
そしてSmalltalkは、Objective-Cの他、さまざまな言語に影響を与えた「オブジェクト指向の元祖」とも言える存在です。
Smalltalkの最大の特徴である「オブジェクトにメッセージを送る」という仕組み(メッセージング)が、後ほど解説するObjective-C独特の「ブラケット構文」のルーツとなっています。
C言語の高速性とSmalltalkの柔軟性を併せ持つObjective-Cは、大人数での大規模開発においても、効率的かつ安定して運用することが可能です!
C言語やSwiftと互換性がある
すでに説明した通り、Objective-CはC言語をベースとして作られているため、C言語との相性が抜群です!
また、後継のSwiftとも高い互換性を持っており、1つのアプリプロジェクトの中でObjective-C、C言語、Swiftのコードを混在させて開発することができます。
つまり、「この機能は過去に作ったObjective-Cの資産をそのまま使い、新しい画面はSwiftで書く」といった柔軟な使い分けが可能!
既存のコードがそのまま使えれば、一から書き直す必要がないので、開発を非常に効率的に進められます。
膨大なノウハウとAppleの公式サポート
後継言語であるSwiftが登場するまで、Objective-CはiOSやmacOSの発展を長年支えてきました。
その結果、膨大なライブラリと開発ノウハウが蓄積されています!
既存のフレームワークや便利なライブラリを活用することで、幅広い分野のアプリ開発にスピーディに対応が可能です。
また、サンプルコードやトラブルシューティングの情報もインターネット上に溢れているため、困ったときに解決策を見つけやすいのも大きなメリット。
さらに、主流がSwiftになった現在でも、AppleはObjective-Cを継続して公式にサポートしています!
その証拠に、OSの根幹をなす標準機能(FoundationやUIKitなど)の多くは、今もObjective-Cで動いているのです。
また、Appleでは「1つのアプリ内でSwiftとObjective-Cを併用すること」を公式に推奨しており、Objective-Cは今も現役の重要な言語と言えます!
Objective-CとSwiftの違い
SwiftはApple社が2014年に発表したプログラミング言語で、Objective-Cの後継です。
どちらもiOSやmacOSなどのAppleプラットフォーム向け開発に使われますが、その特徴は大きく異なります。
| Objective-C | Swift | |
|---|---|---|
| 処理速度 | 高速 (基本計算はC言語と同等) | 非常に高速 (最適化が進んでいる) |
| 安全性 | 低め (ミスが起きやすい面も) | 極めて高い (エラーを防ぐ仕組みがある) |
| 学習難易度 | 高い (独特な記法に慣れが必要) | 低い (直感的で学びやすい) |
| 主な用途 | 既存アプリの保守OSの深い階層 | 最新アプリ開発サーバーサイド |
| メリット | C言語やC++資産をそのまま活用できる仕様が安定しており、変化が少ない | 開発効率が良く、素早く開発できるコードが読みやすく、生産性が高い |
一言で言えば、「Objective-Cは歴史あるC言語の親戚で、Swiftは現代風に使いやすく進化した後継者」といったイメージです。
Objective-CとSwift、どちらを選ぶべき?
「これからiOSアプリ開発をする場合、どちらを習得すればいいの?」と迷う方も多いでしょう。
現在はSwiftが開発のメインですが、現場ではすべてのアプリがSwiftに置き換わったわけではありません。
既存のアプリや安定性を重視するライブラリなど、Objective-Cが現役で活躍している場面も数多くあります!
実際、アプリ開発の現場では両言語を「いいとこ取り」して共存させ、プロジェクトのニーズに合わせて最適な言語を選ぶのが一般的です。
もし迷ったら、以下を参考にしてみてください。
- すでに運用されている大規模なアプリの改修・メンテナンス
- 長年蓄積されたObjective-C製のライブラリや資産をフル活用したい場合
- 新規プロジェクト
- 最新の機能(SwiftUIなど)を使ってスピーディに開発したい場合
- コードの安全性や読みやすさを最優先したい場合
エンジニアとしてのステップアップを目指すなら、「両方のスキルを身につける」のが理想です!
まずはSwiftを習得し、その後にObjective-Cを学ぶことで、Appleのシステムの仕組み(OSの深い階層など)への理解がより深まり、幅広い案件に対応できるエンジニアになれるでしょう。
Objective-Cの需要と将来性
現在、Apple製品の開発メインはSwiftに移り、Objective-Cのシェアは年々低下しています。
しかし、Objective-Cの需要がすぐになくなることはありません!
なぜなら、膨大な数の既存アプリがObjective-Cで書かれているからです。
これらのアプリを維持・管理し、新機能を追加するためには、Objective-Cの知識が不可欠です。
また、長年の実績による「安定性」を重視して、あえてObjective-Cを使い続ける企業もあります。
現在は「すべてをSwiftに置き換える」のではなく、「既存のObjective-Cコードを活かしつつ、新機能はSwiftで書く」という共存スタイルが主流です。
「Objective-Cは古い」と言われることもありますが、実際にはObjective-CとSwiftの両方を使いこなせるエンジニアは非常に重宝されます。
Appleも両言語を混ぜて使う「相互運用」を公式に推奨しています。
両方のスキルを併せ持つことで、OSの深い仕組みまで理解した、より高品質なアプリ開発が可能になるでしょう!
Objective-Cの基礎構文
Objective-CはC言語をベースにしているため、数値の計算や、if(条件分岐)・for(繰り返し)といった基本的な文法は、C言語やJava、JavaScriptなどとよく似ています。
一方で、「オブジェクトに命令を送る」ときの書き方には、Objective-Cならではの特徴があります。
ここからは、初心者がまず押さえておきたいObjective-C特有のポイントを絞って解説します。
文字列(NSString)
まずは、Objective-Cで文字列を扱う「NSString」の書き方を見てみましょう。
NSString *変数名 = @"文字列";Objective-Cでは、NSStringの文字列リテラルを記述するときに、文字列の前に「@」を付けます。
また、NSStringのようなクラス型のオブジェクトを変数で扱う場合は、型名の後ろに「*」を付けます。
具体例は次の通りです。
NSString *message = @"こんにちは!";これは、「こんにちは!」という文字列をmessageという変数に代入するコードです。
なお、@"こんにちは!"はObjective-CのNSStringオブジェクトを表します。一方、"こんにちは!"はC言語の文字列リテラルとして扱われるため、両者は区別して覚えておきましょう。
ログ出力(NSLog)
続いて、プログラムの動作を確認するために、コンソールなどに文字を表示する「NSLog」の書き方を説明します。
NSLog(@"表示したい内容");
変数を混ぜる場合
NSLog(@"結果は %@ です", 変数名);「//」を行の先頭に付けるとコメントとして扱われ、プログラムの実行には影響しません。
また、%@は文字列などのオブジェクトを表示するときに使用する書式指定子です。
具体例を見てみましょう。
// 1. 文字列を変数に代入
NSString *name = @"たろう";
// 2. ログに出力(%@の位置にnameの中身が入る)
NSLog(@"こんにちは、%@さん!", name);このコードを実行すると、「こんにちは、たろうさん!」という内容がログに表示されます。
メッセージ式(ブラケット構文)
他の言語で「メソッドを呼び出す」と表現する処理を、Objective-Cではオブジェクトに「メッセージを送る」と表現します。
Objective-Cでは、メッセージを送るときに「[ ](ブラケット)」を使います。
[相手(オブジェクト) メッセージ(メソッド)];メッセージ式では、呼び出したいメソッドをブラケットで囲みます。
具体例を見てみましょう。
[myDog bark];これは、myDogというオブジェクトに対して、barkというメッセージを送るコードです。「myDogに吠える処理を実行してもらう」と考えるとイメージしやすいでしょう。
引数がある場合
メソッドにデータを渡す場合は、コロン(:)の後ろに値を記述します。
[car driveTo:@"東京"]これは、carオブジェクトに対して、「東京へ移動する」という処理を依頼するイメージです。
複数の引数を渡す場合は、それぞれの引数の前にキーワードを付けます。
[car driveTo:@"大阪" speed:100];この例では、「大阪」という目的地と「100」という速度を指定しています。
driveTo:やspeed:のような部分は、メソッドを識別するためのメソッドセレクタの一部です。複数の引数を持つメソッドでは、それぞれの引数に対応するキーワードを記述します。
プロパティへのアクセス(ドット記法)
Objective-Cでは、プロパティに「ドット記法」を使って簡潔にアクセスできます。
インスタンス名.プロパティ名ドット記法を使うと、@propertyで定義したプロパティの値を取得したり、新しい値を代入したりできます。
たとえば、personというインスタンスにnameというプロパティがある場合、次のように記述します。
person.name = @"たろう";このコードでは、personのnameプロパティに「たろう」という文字列を代入しています。
値を取得する場合は、次のように記述できます。
NSString *myName = person.name;このように、ドット記法を使うことで、プロパティの値を直感的に扱えます。
id型
id型とは、特定のクラスを指定せず、さまざまなObjective-Cオブジェクトを扱える柔軟な型です。
実行時まで扱うオブジェクトの種類が決まっていない場合や、異なる種類のオブジェクトを柔軟に扱いたい場合などに使用されます。
id 変数名 = @"こんにちは";NSStringなどのクラス型では「*」を付けますが、idには付けません。
これは、id自体がObjective-Cのオブジェクトへのポインタを表す型だからです。
たとえば、次のように記述できます。
id value = @"こんにちは";この場合、valueにはNSStringオブジェクトが入ります。
ただし、id型はどのようなオブジェクトでも扱える分、具体的な型がわかりにくくなることがあります。そのため、扱うクラスが明確な場合は、NSString *など具体的な型を指定するのが一般的です。
nil
nilとは、オブジェクトを指していない状態を表す値です。
たとえば、次のように記述できます。
NSString *name = nil;この場合、nameにはオブジェクトが設定されていない状態になります。
Objective-Cでは、通常、nilに対してメッセージを送っても何も起こりません。
たとえば、以下のようなコードでは、nameがnilであっても通常はクラッシュせず、メッセージの結果として0が返されます。
NSString *name = nil;[name length];このように、nilへのメッセージ送信が特別に扱われる点も、Objective-Cの特徴のひとつです。
クラスの基本構造(インターフェースと実装)
Objective-Cでは、クラスのインターフェースと実装を分けて記述する構成が一般的です。
多くの場合、.hファイル(ヘッダファイル)にクラスのインターフェースを記述し、.mファイル(実装ファイル)に具体的な処理を記述します。
それぞれの役割は次の通りです。
| ファイル | 役割 |
|---|---|
.h(ヘッダファイル) | クラスのインターフェース(公開するプロパティやメソッドなど)を記述する |
.m(実装ファイル) | クラスの具体的な処理を記述する |
それぞれの書き方を見ていきましょう。
Person.h(インターフェース)
Personというクラスを作る場合、.hファイルには次のように記述します。
@interface Person : NSObject
@property NSString *name; // 名前というプロパティ
- (void)sayHello; // 挨拶するメソッド
@end@interfaceでクラスのインターフェースを開始し、@endで終了します。
ここでは、Personクラスにnameというプロパティと、sayHelloというメソッドがあることを宣言しています。
Person.m(実装)
.mファイルでは、@implementationを使って具体的な処理を記述します。
@implementation Person
- (void)sayHello {
NSLog(@"こんにちは、%@です。", self.name);
}
@end@implementationで実装を開始し、@endで終了します。
この例では、sayHelloメソッドが呼び出されたときに、self.nameの値を使って「こんにちは、〇〇です。」というメッセージを表示します。
このように、Objective-Cでは「@interface」でクラスの構造や公開するメンバーを宣言し、「@implementation」で具体的な処理を実装するのが基本的な書き方です。
まとめ
Objective-Cは、長年にわたりiOSやmacOSといったApple製品の開発を支え続けてきた、信頼と実績のある言語です。
現在はSwiftへの世代交代が進んでいますが、既存アプリやライブラリのメンテナンスのため、Objective-Cの知識やスキルは今後も不可欠と言えるでしょう。
もし、iOSアプリ開発のノウハウや専門の人材が社内にない場合は、プロに開発を任せるのも1つの手です。
WEB制作会社の「I-SEED」では、豊富な実績とこれまでに培ったノウハウで、お客様のご要望や社内の状況に適したオーダーメイド開発を行っています!
相談や見積もりは無料なので、ぜひ気軽にお問い合わせください。
システム開発のお悩みはI-SEEDにご相談ください
システム開発について以下のようなお悩みをお持ちの場合、ぜひI-SEEDにご相談ください。
- Excelで内製したシステムが業務とマッチしなくなってきた
- 人的コストがかかっている業務をシステム化したい
- 運用中のWebシステムをスマホ対応にしたい
I-SEEDでは、システム開発やWebデザイン、Webマーケティングそれぞれの分野で幅広いスキルと経験を持ったスタッフが、お客様のお悩みをひとつひとつ細かくヒアリング。「使いやすく分かりやすいUI/UX」をモットーに、最適な解決策をご提案します。
メールフォームでのご相談も可能ですので、お気軽にご相談ください。
