アンセケターメンはてなエディション

いつどこで誰に見られても恥ずかしいコードが置かれています

C#erのKotlin/Android入門記 #1 組み込み型

はじめに

自称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でテーブルを作るのに消耗したので今回はここまで。