# 導入 最近話題になることが増えている、Jetbrains社の開発したオープンソースのプログラミング言語「Kotlin」で、初めてプログラミングをするというひとのための記事です。 来年以降桐光学園を受験するひとや電子工学部に興味のある在校生に向けたものにしては難易度が高くなってしまっていますが、Scratchや簡単なプログラムを書けるようになり次に何をすればいいかわからないひとへの指針のようなものも最後にまとめてあります。少しでも今後のプログラミング学習の助けになれば幸いです。 # はじめに 手を動かすことで記憶に残りやすくなると思うので本記事内で紹介するすべてのサンプルコードは単体で動くようにしてあります。(一部意図したエラーが発生するものや表示がないものもあることに注意してください。前後の文章をよく読んで実行するようにしましょう。) # 前提条件 - Scratch等で条件分岐・繰り返しなどを理解していること # Kotlinを動かしてみよう まずはコードの意味は理解していなくてよいのでKotlinを動かしてみましょう。 下のサイトでコードを書いていきます。 [https://play.kotlinlang.org/](https://play.kotlinlang.org/) ```kotlin fun main() { println("Hello, world!!!") } ``` このコードを実行すると以下のように画面に「Hello World」と表示されます。 ![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8995a7c5-b2da-443a-9443-712835728b82/Untitled.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8995a7c5-b2da-443a-9443-712835728b82/Untitled.png) ここから、このコードがどういう意味なのかを理解していきましょう。 # 2. 関数 ## 関数を定義する とてもざっくり説明すると、「関数」とは、プログラムの塊のことです。 先程のコードでいうと ```kotlin fun main() { } ``` という部分が関数の骨組みです。 まずは `fun` という部分です。関数をかくことを「関数を定義する」といいますが、 `fun` と書くことにより「ここから関数の定義が始まるよ!」とコンピューターに伝えています。 次に、 `main()` は関数の名前です。プログラムの塊をこれからたくさん作っていくので区別するために名前をつけます。 「なぜ `()` とつけるのだろう?」と思ったのではないでしょうか。 これは、この次に説明する、「変数」というものにも関数と同じように名前をつけるため、それが関数なのか、変数なのかを区別するために `()` をつけています。 そして、実際の関数の中身を囲うように `{}` を使います。 この関数の定義はたくさん書くので覚えようとしなくてもいずれ覚えられるので心配ありません。 ### 練習1 testという名前の関数を作成してください。 ## 関数を実行する さて、プログラムの塊をつくっても、だれも実行しなければただの塊です。関数を実行するには、シンプルに `関数名+()` というように書きます。 ```kotlin fun main() { println("Hello, world!!!") } ``` 最初に書いたこのコードの `println()` はprintln関数を実行していたのです。println関数は `()` の中に入っているものを表示するという関数です。なので、このコードでは 「Hello World」と表示されているのです。 また、main関数はプログラムが実行されるとき自動的に最初に実行されるため呼び出さなくても動きます。 ※1 ここでは `()` の中に文字列が入っていますが、これは「引数」というもので、後ほど説明するのでここでは理解していなくて大丈夫です。 ※2 「""」が無視されていますがこれについても後ほど説明します。 ## 関数を省略する 内容が少ない場合は「{}」を省略することができます。 ```kotlin fun main() { sum() } fun sum() = println(500, 200) ``` ### 練習2 greetという名前で「Hello!」と表示する関数を作成し、main関数から実行してください。 # 変数 データを保存するための箱のようなイメージです。数字や文字列、真偽値(○×のようなもの)を保持することができます。 ## 変数を宣言・代入する ```kotlin fun main() { val number = 100 } ``` 上のような書き方で使います。 `val` でこれから変数を宣言することを書き、次に変数名「number」、「=」を挟んでいれたいデータを書きます。 また、変数にデータを入れることを「変数にデータ(ここでは300)を代入する」、変数を作成することを「変数を宣言する」といいます。 `val` のかわりに `var` を使うことが可能で、 `val` だと不可変、 `var` だと可変になります。 ## 変数の「型」 プログラムでは各データの種類ごとに固有の「形」があり、宣言時にそれを指定する必要があります。 数値であれば `Int` 、文字列であれば `String` 、真偽値は `Boolean` という記述を変数名のあとに `:` を書き、指定します。 先程、文字列の「Hello World」を表示したいときに「"Hello World"」と書いたのは、文字列とその他を区別するためです。 ```kotlin fun main() { val k = 300 val l = "300" val m = true val n = "true" } ``` 上のコードのように文字列に「""」をつけることで数値なのか、また真偽値なのかがわかるようになっています。 通常はコンピュータが自動で型を認識してくれるため、省略できますが今後必要になることがあるので覚えておきましょう。 ```kotlin fun main() { val number: Int = 300 } ``` しっかりと合う形の箱でないと代入することができません。 たとえば以下のコードではエラーが発生します。 ```kotlin fun main() { var number: Int = 500 number = "Hello" } ``` ## 配列(Array/List) さて、数学等で使う集合のようなものをプログラム内でしようするために配列型というものがあります。 数値や文字列などを順番つきのリストとして保持します。 ```kotlin fun main() { val employees = listOf("Tanaka","Haruko","Yuto","Maruko","Hanazawa") val arrayEmployees = arrayOf("Tanaka", "Haruko", "Maruko", "Yuto") } ``` ここでは社員の名前のリストを「employees」配列にいれています。 ## ペア(Pair) ペアはKey-Value形式(名称-中身)の型です。たとえば以下のように「Tanaka Taro」という名前をペアにして保存しています。 ```kotlin fun main() { val name = pairOf("Tanaka", "Taro") val name2 = "Tanaka" to "Taro" } ``` ## マップ(Map) ```kotlin fun main() { val employees = mapOf( 2520 to "Tanaka Taro" ) } ``` ### 練習3 # 四則演算 プログラムの根本の考えとして「面倒なものはコンピューターにやらせよう」というものがあると思います。 身の回りでよくみる四則演算等をプログラムで書いてみましょう。 ```kotlin fun main() { val a = 100 + 200 val b = 300 - 200 val c = 20 * 50 val d = 80 / 4 val e = ( 30 + 40 ) * 20 println(a, b, c, d) } ``` 和と差はそのまま、 「+」「-」を使って計算します。積と商はキーボードで「×」「÷」を入力できないためかわりに「*(アスタリスク)」「/(スラッシュ)」を用います。 算数・数学と同じように「()」をつけると優先して計算されます。掛け算割り算、引き算足し算も数学と同じく優先順位がありますが、基本的にはあまり気にせず、「()」を使うようにしましょう。 また、四則演算で「変数aに5を[足す・引く・かける・割る]」という処理はよく行うため省略した書き方があります。 ```kotlin fun main() { var a = 300 var b = 200 a = a + 100 b += 100 } ``` 上のbように `+=` という書き方で代入する方法を使うようにしましょう。 # 引数 さて、もう一度最初のコードを見てみましょう。 ```kotlin fun main() { println("Hello World") } ``` printlnは関数だという話を先程しましたが、なぜ「()」の中に文字列である「Hello World」が入っているのでしょうか。 これは引数(ひきすう)という概念で、関数内で計算や処理をさせるために値を関数に渡すことのできる機能です。 ```kotlin fun println(text: String) { // 文字列を表示する処理 } ``` 内部の処理はわかりませんがpritnln関数をとても簡単にすると上の用になっているはずです。 最初に説明した `()` の中に、「受け取る変数名: 型」のように書きます。 こうすることで ```kotlin fun main() { sum(20, 30) } fun sum(a: Int, b: Int) { // 和を表示する println(a + b) // こう書くこともできる val c = a + b println(c) } ``` 20と30の和、「50」が表示されます。 他にも、 `varargs` というキーワードを先頭に付与することで任意の数の引数を受け取ることができます。 ```kotlin fun main() { average(4, 6, 7, 5, 3) } fun average(vararg args: Int) { val ave = args.sum() / args.size println(ave) } ``` # 返り値 戻り値は関数が実行されたときに結果などの値を返す(返されたその値のこと)というものです。 ```kotlin fun main() { val sum = sum(100,200,300) } fun sum(vararg args: Int): Int { return args.sum() } ``` 上のように `fun sum()` などのあとに `: Int` というふうに返す値の型を宣言します。その後、関数内で `return 内容` で値を返します。 # 条件分岐 次は条件分岐です。様々な状況によって処理を分けたいときに使います。Scratchをやったことのある人には簡単かもしれません。 条件分岐には `if` を用います。 `if` の後に `(true)` というように真偽値を入れ、その後の「{}」内に「()」が真(true)だったときに実行する内容を書きます。 ```kotlin fun main() { if (true) { } } ``` また、「()」内が偽(false)であった場合の処理を書きたい場合は `else {}` のように記述します。 ```kotlin fun main() { if (false) { } else { } } ``` さらに条件分岐をさせたい場合は `else` の後に `if` を続けます。 ```kotlin fun main() { if (false) { } else if (true) { } } ``` しかし、このままでは常にどちらか(どれか)一つのものになってしまいます。そこで「論理演算」というものを行います。これは数学でいう命題と証明のようなもので、2つ(以上)の値を比較した結果をtrue/falseに変換します。 ## 論理演算 ### `==` 等しい 左右の要素が等しいときに「true」、それ以外の場合は「false」を返します。 ```kotlin fun main() { println(3 == 3) } ``` ### `!=` 等しくない 左右の要素が等しくないときに「true」、それ以外の場合は「false」を返します。 ```kotlin fun main() { println(1 != 2) // true } ``` ### `!` 否定(NOT) この演算子の右側の式を評価したのち、その逆の値を返します。 ```kotlin fun main() { println(!true) // false } ``` ### `&&` かつ(AND) 左右どちらもの式がtrueだったときのみtrueを返します。 ```kotlin fun main() { println(true&&true) // true println(true&&false) // false println(false&&false) // false } ``` ### `||` または(OR) 左右どちらかの式がtrueだったときにtrueを返します。 ```kotlin fun main() { println(true&&true) // true println(true&&false) // true println(false&&false) // false } ``` # 繰り返し プログラムの醍醐味、繰り返しです。 ```kotlin fun main() { for ( i in listOf(1,2,3,4,5)) { println(i) } } ``` `for` ではじめ、「()」の中に `i` (任意の変数名。慣例は i )、 `in` 、リストの順に書きます。 Kotlinではリストの要素の数だけ繰り返しが行われ、毎回のループで `i` にリストの要素が入ります。 上のループではいかのようなイメージです。 ```kotlin fun main() { println(1) println(2) println(3) println(4) println(5) } ``` ## 範囲 しかし、Forループはとても良く使うため、 `listOf(...)` の部分は省略して「範囲」というもので表すことができます。 以下のように、 1から5を表すには 1..5と書きます。 ```kotlin fun main() { for ( i in 1..5) { println("Hello") } } ``` 「..」以外にも、終わりの数を含めない `until` (`0 until 100`であれば100は含まれない)や、 ## 省略 また、上のように中身が一行の場合は下のコードのように省略することができます。 ```kotlin fun main() { for ( i in 1..5) println(i) } ``` # null安全 ## エルビス演算子 # 型チェック(is) # 環境構築 ここからはKotlin Playgroundでの継続は厳しい内容が増えてきます。実際にたくさんのコードを書きはじめる前に自分のコンピューター上でオフラインでも動く開発環境を準備していきましょう。 エディタはIntelliJ IDEAをおすすめします。しかし、ある程度PCの性能が求められるソフトのため、本当にPCの性能が低い場合はVSCodeを使用しましょう。 IntelliJ IDEA [https://www.jetbrains.com/ja-jp/idea/](https://www.jetbrains.com/ja-jp/idea/) ![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5eb6a21c-4a24-4211-8bde-945b63862825/Untitled.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5eb6a21c-4a24-4211-8bde-945b63862825/Untitled.png) 上のタブで該当するものを選択し、コミュニティーの方のダウンロードボタンを押してください。 インストール後、下記URLより日本語化プラグイン(EAP)がインストールできます。 [https://plugins.jetbrains.com/plugin/13964-japanese-language-pack-eap](https://plugins.jetbrains.com/plugin/13964-japanese-language-pack-eap) VSCode [https://code.visualstudio.com/](https://code.visualstudio.com/) # クラス(むずくね...?書く??) 多くのひとが躓く概念です。僕も正直なところあまり理解できていないのですが、ざっくりとしたイメージから紹介します。 クラスはたいやきなどの型のイメージです。 ## クラス内関数 ### 「This」 ## コンストラクタ ### プライマリコンストラクタ ## オブジェクト ### コンパニオンオブジェクト ## インスタンス化 ## インターフェース ## 抽象クラス ## データクラス # 継承 継承は「オブジェクト指向」という考え方に基づいた概念で、同じコードを複数コピー・ペーストすることのないように、クラスを生成し、それを継承したりすることにより # 多態性 # 拡張関数 便利な機能としてKotlinでは既存のクラスの関数を拡張することができます。 # 外部ライブラリの使用 ## Gradle ## JDA # ソースコード管理 ## GitHub # 番外編 ## 書籍 - やさしいKotlin入門 - Kotlin in Action ## 今後のロードマップ # まとめ さて、いかがでしたでしょうか。ある程度前提知識を必要とした説明になってしまいましたが上に紹介した書籍などを確認していただければと思います。 このチュートリアルが一通り終わったら自分で環境構築をして楽しいKotlinライフを始めましょう。