はじめに
自称C#er(C#くらいしかまともに触ったことがないともいう)のアンセケターメンさんが、なんとなくAndroidアプリ開発に手を出してみようと思ったらしく、Kotlin&Androidの学習記録(?)をつけようと思います。
なんでKotlin始めるかっていうと、.NET MAUIのGAが遅れに遅れて2022年の第二四半期になってるせいです。まあC#で書くにしてもAndroidの知識あったほうがいいし?コトリンって響きがちょっとかわいいし?
iOSは……1万円/年くらいのApple税を払わないと7日間しか実機デバッグさせてくれないし、そもそもMacないとできないし(一応持ってるけど)、で無視。
というわけで続くかどうかはわかりませんが入門記1回目。
実行環境
C#と同様に、Kotlinもブラウザ上で簡単に試せる環境が用意されているのでこれを使います。
Kotlin Playground: Edit, Run, Share Kotlin Code Online
Android関連になったらAndroid Studio+実機で。
組み込み型
KotlinはC#と同じく静的型付け言語なのでとりあえず組み込みの型を調べてみました。Javaに変換する都合上、C#でいう値型(構造体とか)をユーザー定義で作成はできないみたい。パフォーマンスが必要な時はC++とNDKを使ってねってことなんでしょうね。
ということで表をドカーン!!!
型 | C# | Kotlin |
---|---|---|
64bit符号付き整数 | long | Long |
64bit符号なし整数 | ulong | ULong |
32bit符号付き整数 | int | Int |
32bit符号なし整数 | uint | UInt |
16bit符号付き整数 | short | Short |
16bit符号なし整数 | ushort | UShort |
8bit符号付き整数 | sbyte | Byte |
8bit符号なし整数 | byte | UByte |
64bit浮動小数点数 | double | Double |
32bit浮動小数点数 | float | Float |
16bit Unicode文字 | char | Char |
真偽 | bool | Boolean |
文字列 | string | String |
符号付き10進数 | decimal | java.math.BigDecimal |
大文字始まりということ以外はほぼ一緒ですね。Byteに符号がついてること以外は。
いや統一感あるのはわかるよ? でもByteってバイトじゃん。0x00~0xFFじゃん。符号付いてるのすげえ違和感。
文字はC#もKotlinも内部的にUTF-16として扱ってるから取っつきやすい。
数値の四則演算
こっちも表をドーン!!!!
演算 | C# | Kotlin |
---|---|---|
加減乗除 | + - * / | 同じ |
剰余 | % | 同じ |
インクリメント | x++ ++x | 同じ |
デクリメント | x-- --x | 同じ |
左シフト | x << y | x shl y x.shl(y) |
右シフト | x >> y | x shr y x.shr(y) |
右論理シフト | なし | x ushr y x.ushr(y) |
ビット演算(AND) | x & y | x and y x.and(y) |
ビット演算(OR) | x | y | x or y x.or(y) |
ビット演算(XOR) | x ^ y | x xor y x.xor(y) |
ビット演算(NOT) | ~x | x.inv() |
条件演算(AND) | x && y x & y |
x && y x and y |
条件演算(OR) | x || y x | y |
x || y x or y |
条件演算(NOT) | !x | 同じ |
代入 | x = y | 同じ |
複合代入(加減乗除) | += -= *= /= %= | += -= *= /= %= |
複合代入(ビット演算) | <<= >>= &= |= ^= | なし |
三項演算子 | x ? y1 : y2 | if(x) y1 else y2 |
比較 | == != | 同じ |
シフト演算とビット演算以外はほぼ同じ。どうやらJavaにはシフト演算子があるらしいけど、なぜKotlinで消えたのかは謎。
そして、三項演算子はなくて、順序は違うけどPythonっぽい書き方になる。
下から数えて3ビット目のビットが立ってるかどうかの判定はこんな感じ。
//Kotlin val a = x.shr(2).and(0b0000_0001) == 1
//C# var a = ((x >> 2) & 0b_0000_0001) == 1;
シフト演算子とビット演算子と条件演算子の優先度を覚えてなくてとりあえず括弧をつけまくるみたいなことにはならないから、これはこれでアリなのかも。というかメソッドチェーンになってるのが個人的に好き。
Markdownでテーブルを作るのに消耗したので今回はここまで。