Objective-Cプログラミングの基礎【現役エンジニアがわかりやすく解説】

PROGRAM

Objective-Cプログラミングの基礎を知りたい方に。

この記事を読まれている方は、

  • Objective-Cのプログラミングがどんなものか知りたい
  • Objective-C言語の簡単な書き方が知りたい
  • Objective-Cが使われる場面を知りたい

おそらくこのように考えている方が多いと思います。

この記事を書いている私は、
プログラミング未経験から転職を果たした現役のWeb系エンジニアです。
エンジニア歴は3年ですが、本業とは別にフリーランスの副業で月10万円ほど、多いときで20万円ほどの収入があります。

この記事では、現役のエンジニアが、Objective-Cプログラミングの基礎を解説しています。

プログラミング言語のObjective-Cの特徴

プログラミング言語のObjective-Cの特徴

Objective-Cはプログラミング言語のひとつで、C言語をベースに、Smalltalk型のオブジェクト指向機能を持たせた言語です。
C言語由来の静的型付けとSmalltalk由来の動的型付けの特徴をあわせ持っており、コンパイル言語であって、かつオブジェクト指向型の言語です。

静的型付けの言語とは、簡単に言うと、データを文字列型や数値型、論理型などに分ける必要がある言語のことです。Objective-Cはデータの型を明確にしなくても動きますので、動的型付けの側面もあります。

コンパイル言語とは、プログラムの実行前に、開発者の方でコンパイラーを使って構文チェックなどをしたうえで中間言語に変換しないと動作しない言語のことです。

一方、コンパイル言語と対をなすスクリプト言語とは、プログラム実行前にコンパイルをする必要のない言語のことで、書いた後はすぐにプログラムを実行することができる言語のことです。

一般に、コンパイル言語は、処理速度がスクリプト言語に比べて速くなります。速度が求められる処理では、コンパイル言語が使用されることが多いです。

オブジェクト指向型言語とは、オブジェクトという概念を持つ言語のことで、簡単に言うと、データ構造として、配列や構造体に加えて、オブジェクト(クラス)があるということです。
オブジェクトのおかげで、ソースコードのメンテナンスがしやすかったり、機能の流用ができます。

Objective-Cは、主にMacOSやiOSのアプリの開発に使われています。
統合開発環境(IDE)として、AppleからXcodeというものが提供されています。
XcodeではObjective-CとSwiftのいずれの言語でも開発可能ですが、現在はObjective-CからSwiftへとトレンドが移りつつあります。

Objective-Cは見た目がC言語に近いので、C言語系のエンジニア(ほとんどのエンジニア)にとって馴染み深い言語となっています。
C言語をベースにSmalltalk型のオブジェクト指向が追加されていたり、NS系のクラスが実装されたりというところがC言語とは少し違うところになります。

トレンドはSwiftに移りつつあるのですが、Objective-Cを使い続ける開発者も依然多いようです。
書きやすさから言えばSwiftの方が良く、初心者にもオススメなのですが、熟練のエンジニアにとっては、C言語の方が昔からの付き合いで馴染み深く、逆に使いやすいというところがあるのでしょう。そもそも、Swiftに移行する理由がない、と言うエンジニアもいます。

Objective-CはC言語に近いですが、メモリの自動解放などがありますので、C言語よりははるかに書きやすく、学習コストもやや低いです。
ただ、現在ではAppleがSwiftの使用を推奨しているため、これから学ぶ方にはSwiftをオススメしています。

Objective-Cの用途

Objective-Cの用途

Objective-CはmacOSやiOSのアプリの開発で使うことができます。

IDEとしてはXcodeが使われますが、現在はSwiftを使うこともあれば、Objective-Cを使うこともあるといった感じです。
Objective-Cは、一見するとC言語由来のバリバリの静的型付けの言語に見えますが、動的型付けにも対応しており、使いやすさがあります。

C言語になじみ深いエンジニアだけでなく、初心者から中級者の方にも開発に参加してもらうことができる言語なのではないかと思います。そういった意味では逆にSwiftではない方が良いのかもしれません。

Objective-Cの書き方

Objective-Cの書き方

ここでは簡単に書き方を少しだけ紹介します。実際に始める気になったら、ぜひ参考書などの教材を参考にして、試してみて下さい。

Hello World!を画面に出力する

まずはお決まりのHello World!という文字列を画面に出力する方法から。

#import <Foundation/Foundation.h>
int main(void){
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"Hello World!" dataUsingEncoding: NSUTF8StringEncoding]];
    [pool release];
    return 0;
}

これで出力することができます。
C言語やJavaなどと同じように、main関数を書かなければ動きません。

C言語のまま書くことも可能ですが、ここではNS系のクラスを使って書いています。
NSAutoreleasePoolを使うことでメモリ管理を自動でやってくれます。

コンパイル言語のため、プログラム実行前には必ずコンパイラーを使って中間言語に変換する必要があります。

変数宣言と分岐処理

次は少し踏み込んで、変数宣言と分岐処理をしてみます。

#import <Foundation/Foundation.h>
int main(void){
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    NSNumber *age = 19;
    if (age<20) {
        [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"未成年" dataUsingEncoding: NSUTF8StringEncoding]];
    } else {
        [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"成人" dataUsingEncoding: NSUTF8StringEncoding]];
    }

    [pool release];
    return 0;
}

上記の例では、まずageという数値型の変数を作り、その中に19という数値を入れています。
次にageが20未満であれば”未成年”という文字列を、それ以外であれば”成人”という文字列を出力するような分岐処理をしています。

配列と繰返処理

続いて、配列の使い方と繰返処理について、解説します。

ここでは配列を作って、以下のようにデータを出力することにしましょう。

佐藤,田中,小林

これを出力するコードは以下です。

#import <Foundation/Foundation.h>
int main(void){
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    NSArray *students = @[@"佐藤", @"田中", @"小林"];
    
    for (int i = 0; i < students.count; i++) {
        [[NSFileHandle fileHandleWithStandardOutput] writeData: [[students objectAtIndex:i] dataUsingEncoding: NSUTF8StringEncoding]];
        if (i < students.count-1) {[[NSFileHandle fileHandleWithStandardOutput] writeData: [@"," dataUsingEncoding: NSUTF8StringEncoding]];}
    }
    
    [pool release];
    return 0;
}

上記の例では、まず文字列型の配列studentsに「佐藤」「田中」「小林」の3つの文字列を格納しています。
その後、数値型のカウンタ変数iを0に初期セットし、配列studentsの要素の数に到達するまでループでiを1ずつ増やしてまわしていきます。その際に、writeData関数を使い、配列studentsのi番目の要素の値を出力し、最後の要素以外、その後に「,(カンマ)」を出力しています。

構造体の取り扱い

最後に構造体の取り扱い方法について解説します。

ここではエクセルのようなデータを作って、以下のようにデータを出力することにしましょう。

名前:佐藤,性別:男性
名前:田中,性別:女性
名前:小林,性別:女性

これを出力するコードは以下です。

#import <Foundation/Foundation.h>
int main(void){
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    NSDictionary *first_row = @{@"A" : @"佐藤", @"B" : @"男性"};
    NSDictionary *second_row = @{@"A" : @"田中", @"B" : @"女性"};
    NSDictionary *third_row = @{@"A" : @"小林", @"B" : @"女性"};
    NSArray *excel_data = @[first_row, second_row, third_row];
    
    for (int i = 0; i < excel_data.count; i++) {
        [[NSFileHandle fileHandleWithStandardOutput] writeData: [[[excel_data objectAtIndex:i] objectForKey:@"A"] dataUsingEncoding: NSUTF8StringEncoding]];
        [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"," dataUsingEncoding: NSUTF8StringEncoding]];
        [[NSFileHandle fileHandleWithStandardOutput] writeData: [[[excel_data objectAtIndex:i] objectForKey:@"B"] dataUsingEncoding: NSUTF8StringEncoding]];
        [[NSFileHandle fileHandleWithStandardOutput] writeData: [@"\n" dataUsingEncoding: NSUTF8StringEncoding]];
    }
    
    [pool release];
    return 0;
}

上記の例では、まずfirst_row, second_row, third_rowという、キー・値がともに文字列型の連想配列を3つ作り、Aというキー(列)に名前を、Bのキーに性別の値を入れていきます。
そして、それら全てをexcel_dataという連想配列型の配列に入れます。
その後、数値型のカウンタ変数iを0に初期セットし、配列excel_dataの要素の数に到達するまでループでiを1ずつ増やしてまわしていきます。その際に、writeData関数を使い、配列excel_dataのi番目の要素の中のA列とB列の値を出力しています。

まとめ:Objective-CはApple関連の開発ができる言語

まとめ:Objective-CはApple関連の開発ができる言語

Objective-Cの良さを簡単にまとめると、以下のとおりです。

  • 馴染み深いコード ← C言語がベース
  • Appleアプリが作れる ← macOSやiOSのアプリの開発が可能
  • 強い後ろ盾とIDE ← Apple製でXCodeが使える

つまりObjective-Cは、Appleという頼りになる後ろ盾がいて、XcodeというIDEにも恵まれ、Apple製品の様々なアプリが開発でき、かつC言語ベースで多くのエンジニアにとって馴染み深い言語ということになります。

最近ではAppleがSwiftの教育に力を入れていますが、Objective-Cを使うケースもまだまだありますし、C言語に近いので、熟練のエンジニアからは依然支持を受けています。
ただし、トレンドの移り変わりの時期ではあるので、これから学習される方はSwiftの方が良いのではないかと思います。

Objective-Cは静的型付けのオブジェクト指向型言語なので、独学は少し難しいかもしれません。もし独学でできなさそうな方は、プログラミングスクールも手段の一つに入れると良いと思います。