【プログラミング用語】初心者でもわかる!class(クラス)とは?

10 min
プログラミングのクラスとは!?

こんにちは、たいちです。(@taichi_swift_

https://apple-taichi.com/wp-content/uploads/2020/04/confusedMan.png

たかし

プログラミングで出てくるクラスって何!?なんなの!?

このお悩みを今すぐ解決します。

本記事の内容

・プログラミングを便利にする「クラス」とは?

本記事の読者

・クラスって何!?どうやって使うの?!と思っている人

クラスを使いこなせるようになると、より楽しくプログラミングができるようになるよ!

https://apple-taichi.com/wp-content/uploads/2020/04/download20200402004030.png

たいち

class(クラス)とは

クラスとは、同じような処理を集めた箱のようなものです。アプリケーションやソフトを開発するとき、ほぼ必ずといっていいほど使われます。

言い換えると、データの「設計図」です。

一部のプログラミング言語で登場する機能なので、全てのプログラミング言語に搭載されているわけではないようです。

【Swift Playgroundでの使用例】
ボタンやテキストはclass(クラス)で作られています。
だから、後から簡単にカスタマイズできます。

主に、プロジェクト指向という概念を取り入れたプログラミング言語ででてくるよ

https://apple-taichi.com/wp-content/uploads/2020/04/download20200402004030.png

たいち

例えば、日記の1ページ分の設計図(クラス)を作ってみます。

日記の設計図を考えるときは、まずは全ての日記に共通する項目(全ての日記に必要な項目と捉えてもOK)を書き出してみます。

  • 日付
  • タイトル
  • 本文
  • 筆者

…こんなかんじですね

そして、この項目それぞれのデータ型*を決めます

  • 日付: 日付を表す型(SwiftだとDate型 ※プログラミング言語によって異なる)
  • タイトル: 文字列型
  • 本文: 文字列型
  • 筆者: 文字列型

データ型っていうのは、データの種類を表す型のこと。文章や数字などの型があるよ!

https://apple-taichi.com/wp-content/uploads/2020/04/download20200402004030.png

たいち

さて、これで日記の設計図はできました。

日記の設計図の中には、日付、タイトル、本文、そして筆者の名前がまとまっていますね。この設計図を「クラス」、日付、タイトル、本文、そして筆者をそれぞれ「プロパティ」と呼びます。そしてそれぞれ、

  • 日記クラス
  • 日記クラスのプロパティ

…こんな風に呼ぶこともあります。

用意された既存のクラスと自作クラス

プログラミング言語側で用意された既存のクラスと、自分で作って決めるクラスがあります。

たとえばSwiftのフレームワーク(便利なソースコードのまとまり)である「UIKit」に含まれているUIButtonはクラスです。クラスで設計されているおかげで、UIButtonというクラス(設計図)を呼び出し、ボタンの見た目や色やアクションなどを設定するだけで使えるようになります。

class(クラス)の使い方

ここではSwiftにおけるclassについて説明します。
※他のプログラミング言語だと書き方の文法が異なる場合があります。

class(クラス)を定義する方法

Swiftを例にクラスを定義する方法を解説していきます。シンプルかつ簡単で、プログラミング初心者の方でも安心して使える構造になっています。


クラスの使い方の流れは下記の通りです。

  1. STEP

    class を書く

    class

  2. STEP

    名前をつける

    class Diary
  3. STEP

    値を入れる箱を作る

    class Diary {
        var date: Date
        var title: String
        var body: String
        var author: String
    }
  4. STEP

    イニシャライザを作る

    class Diary {
        var date: Date
        var title: String
        var body: String
        var author: String
    
        init(date: Date, title: String, body: String, author: String) {
            self.date = date
            self.title = title
            self.body = body
            self.author = author
        }
    }

ちなみにクラスを決めることをクラスの宣言・定義ともいうよ

https://apple-taichi.com/wp-content/uploads/2020/04/download20200402004030.png

たいち

それではそれぞれ説明していきます。

class クラスの名前 {
// 内容(プロパティ, メソッドの定義)
}

※クラス名は最初の1文字を大文字にする「アッパーキャメル」という書式で記述するのが一般的です。

 次に、日記に持たせたい値と、その形式を日本語で書き出してみましょう。

class 日記 {
    日付: 日付を表す型(SwiftだとDate型 ※プログラミング言語によって異なる)
    タイトル: 文字列型
    本文: 文字列型
    筆者: 文字列型
}



このままでは当然コンピューターが理解してくれないので、プログラミング言語に置き換える必要があります。
Swift言語で書いてあげると…

class Diary {
    var date: Date
    var title: String
    var body: String
    var author: String
}

これだけだとエラーになってしまいます。エラーになってしまう理由は別記事に書きますね。

クラス内のプロパティが var 〇〇 = 〇〇の形になっていません。その代わりに、var title: String…のように、プロパティの名前とデータ型だけ指定しています。インスタンスを生成するときにイニシャライザを使って好きな値を入れるためです。

イニシャライザを作ってみましょう。

//イニシャライザの作り方
init(title: String, body: String, author: String) {
    self.title = title
    self.body = body
    self.author = author
}

これをDiaryクラスに合体させます。

class Diary { //← class キーワードとクラス名(Diary)
    var date: Date //Date型(日付型)の、dateという名前のプロパティ(変数)を入れる箱を用意する。
    var title: String //String型(文字列型)の、title(タイトル: 題名)という名前のプロパティを入れる箱
    var body: String //String型の、body(本文)という名前のプロパティを入れる箱
    var author: String //String型の、author(筆者)という名前のプロパティを入れる箱
//↓ init() {} (イニシャライザを設定。)
    init(date: Date, title: String, body: String, author: String) { //()の中身は、実体を作って使うときに使います。(後述します。)
        self.date = date
        self.title = title
        self.body = body
        self.author = author
    }
}

クラスは、インスタンスを生成した時に全てのプロパティに値を設定します。一部のプロパティに最初から決めた値を持たせている場合、そのプロパティはイニシャライザを使ってインスタンス生成時に値を入れなくても値が入ります。

いわゆる初期値です。

class Diary {
    var date: Date = Date() //←はデータ型だけでなく、最初から値が決まっている。
    var title: String
    var body: String
    var author: String
    init(title: String, body: String, author: String) { //date: Date  ←必要ない
        //self.date = date ← var date: Date = Date()で値が最初から入っているからいらない。
        self.title = title
        self.body = body
        self.author = author
    }
}
var date: Date //←データ型を指定しただけ。イニシャライザでインスタンス化する時に個別に値を決める。
var date: Date = Date() //最初から値が設定されている。イニシャライザ, init()で設定しなくて大丈夫

この例ではdate(日付)というプロパティを、(インスタンスを生成した瞬間の日付) に設定しています。

日記を書くことに例えると、書いた日付が自動的に保存されるというイメージになります。
※プログラミング的にいうとインスタンスを生成するプログラムの処理を実行した瞬間!

まとめます。
クラスのプロパティに値を設定すると、

  • イニシャライザ init(date: Date)のdate: Dateを書く必要がなくなり、
  • {}の中でも self.date = date と書く必要がなくなる。
  • その代わり、インスタンスには自動でdateが設定される。

さて、クラスの作り方について長々と書いてしまいましたが、
ここからはクラスをインスタンス化(実体化)して使う方法を解説します。

クラスの基本的な使い方

インスタンスとは何かについては、 後日別記事に詳しく書こうと思います。

クラスは変数や定数などのまとまりですが、あくまでも設計図、データを入れる箱のまとまりです。

設計図(クラス)
日記の設計図(クラス)

日記を書くとき、タイトル、本文にそれぞれ枠がありますよね。
その枠をクラス、そして実際に書かれた日記をインスタンスと呼びます。

日記のインスタンスの例
日記の枠を埋めて、インスタンスを生成した例

それでは、クラスからインスタンスを作る方法を解説します。

さっき作ったDiaryというクラスのインスタンスを生成してみるよ。

https://apple-taichi.com/wp-content/uploads/2020/04/download20200402004030.png

たいち

  1. STEP

    クラス名の後に()を付ける

    Diary()
  2. STEP

    ()の中にイニシャライザを書き、枠を埋める。

    Diary(title: String, body: String, author: String)
    
    //init()の中身を書いて、型に合わせて中身を流し込む。  ↓
    Diary(title: "今日の出来事", body: "あつまれどうぶつの森を6時間プレイした!", author: "たいち") // ← インスタンス(日記)の完成!✨
    Xcodeでは補完機能が働いてくれます。
    あとは、ブロックに合わせて文字列を入れるだけです。

    String(文字列)型は、Swiftでは “” (ダブルクオーテーション)で囲むよ!”こんにちは”や、”1000″もString型だよ!

    https://apple-taichi.com/wp-content/uploads/2020/04/download20200402004030.png

    たいち

具体的に説明していきます。

それぞれ解説します。
①Diaryという名前のクラスのインスタンスを作りたい場合、まずは、クラス名に()をつけます。

Diary()

②イニシャライザは一つのクラスにつき複数作れます。Diaryは、(title: String, body: String, author: String)というイニシャライザが設定されているので、

Diary(title: String, body: String, author: String)) 
//↑イニシャライザをそのまま描いただけで、まだインスタンスにはなってないよ

そして、title, body, author共にString型(文字列型)なので、それぞれ文字列を渡します。

Diary(title: "今日の出来事", body: "あつまれどうぶつの森を6時間プレイした!", author: "たいち") 
// ↑ インスタンス(日記)の完成!✨

このままでは、Diaryクラスのインスタンスを使うたびに長々としたコードを書かなければならないので、変数や定数にインスタンスをいれてやります。

var diaryData = Diary(title: "今日の出来事", body: "あつまれどうぶつの森を6時間プレイした!", author: String)
//let に置き換えてもOKだよ!

これで、インスタンスを生成することができました。

インスタンスを使ったプログラミングについての記事はまた後日書きます。

class(クラス)を応用する方法

クラスの基本的な使い方がわかったので、実際のプログラミングで活用する方法をみていきましょう!

class(クラス)のメリット

まずはクラスを使うメリットからお話しします。

クラスの凄さは、実際に使ってみたらわかります。
様々なデータ(日記のデータであれば、日付, タイトル, 本文など)をまとめて一つのオブジェクトとして管理できるので、
データの追加や削除が簡単になります。

class(クラス)の機能を拡張させる方法

クラスは、メソッドと呼ばれる処理のかたまりを持たせることもできます。Swiftにおいて関数とメソッドはほぼ同じ意味を持ちます。

メソッド(関数)を作るときは、

func メソッド名(引数) -> 戻り値 {
    //処理の中身
}


詳しくは別記事で紹介します。
そして、クラス内にメソッドを入れるときは、

class Diary {
    var date: Date = Date()
    var title: String
    var body: String
    var author: String
    
    init(title: String, body: String, author: String) {
        self.title = title
        self.body = body
        self.author = author
    }

    func changeAuthor() {
        self.author = "たいち"
    }
    
    func getStringFromDate() -> String {
        let f = DateFormatter()
        f.dateFormat = "YYYY年MM月dd日"
        
        return f.string(from: self.date)
    }
}

このように、class Diary {} の{}の中に記述します。

実際に日記アプリを作ってみる

ここまで学んだこと +α をつかって、実際に日記アプリを作っていきます。

フレームワークSwiftUIを使用します。

//ここからクラス
class Diary: Identifiable {  //クラスの定義
    var date: Date = Date()  //初期値ありプロパティ
    var title: String        //初期値なしプロパティ
    var body: String
    var author: String
    
    //ここからイニシャライザ
    init(title: String, body: String, author: String) { //初期値なしのプロパティだけ初期化
        self.title = title
        self.body = body
        self.author = author
    }
    
    //ここからメソッド
    func changeAuthor() { //メソッド
        self.author = "たいち"
    }
    //これもメソッド(戻り値がString型)
    func getStringFromDate() -> String {
        let f = DateFormatter()
        f.dateFormat = "YYYY年MM月dd日"
        
        return f.string(from: self.date)
    }
}
//ここまでがクラス

//ビューの宣言
struct DiaryList: View {
    Diaryのインスタンスを2つ作り、配列に代入している
    var diary: [Diary] = [
        Diary(title: "今日の目標", body: "アプリ制作\n筋トレ", author: "たいち"),
        Diary(title: "今日の出来事", body: "あつ盛を7時間プレイした!", author: "かなた")
    ]

    //ビューの見た目部分の宣言
    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            //self.diaryのcount(要素の数)だけ繰り返す。
            ForEach(0..<self.diary.count) { count in
                VStack(alignment: .leading) {
                    HStack {
                        Spacer()
                        Text(self.diary[count].getStringFromDate())
                        //diary[count].getStringFromDate()で、文字列を取得。
                    } 
                    Divider()
                    //diary[count].titleとすることで、diaryのtitle(文字列)を取得し表示する。
                    Text(self.diary[count].title)
                        .font(.headline)
                    Text(self.diary[count].body)
                        .font(.body)
                        .padding(.vertical)
                    HStack {
                        Spacer()
                        Text("筆者:" + self.diary[count].author)
                            .font(.caption)
                    }
                }
                .padding()
                .border(Color.gray.opacity(0.1))
            }
        }
    }
}
//SwiftUI用のプレビュー
struct DiaryList_Preview: PreviewProvider {
    static var previews: some View {
        DiaryList()
    }
}

まとめ

class(クラス)は、プロパティと呼ばれる変数や定数、メソッドと呼ばれる処理のかたまりをまとめて1つのオブジェクトで管理できるようになり便利な機能です。
ぜひ基本の使い方を覚えて自分のプログラミングに活かしましょう!

用語まとめ
  • クラス:プロパティ・メソッドの設計図
  • インスタンス:クラスの設計図を元に、実際の値を流しこんで作った実体。
  • イニシャライザ(コンストラクタ):クラスという設計図に対して、インスタンスの製造方法は複数設定できる。その製造方法のこと。

どんどんつかっていくうちに覚えるので、ぜひ自分のプログラムでも取り入れてみましょう!

関連記事

1 件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です