Kotlin入門

このサイトではkotlinを学習しようとしている方へ、kotlinの概要と文法を解説するサイトです。

Kotlin概要

kotlinのメリットとデメリット

とりあえず試したい方へ

とりあえずブラウザ上で試す: インストールしなくてもこちらからブラウザ上で実行可能

https://play.kotlinlang.org/

※Kotlinの公式のドメイン配下にあるサイトなので安全にお試しできます

Kotlinを動かすための開発環境

Android Studioが必要。

言語のビジュアルが見たい方へ

外見はこんな感じ

//this is comment
fun main() {
    var agreement : String = "Hello, world!!!"
    println(agreement)
}

どちらかというとPythonPerlに近い

参考サイト

以下のURLを参考にしました。

参考URL:https://qiita.com/koher/items/bcc58c01c6ff2ece658f

Kotlinの人気急上昇について

以下の記事より、「Kotlin on Android」が正式に決まった

https://blog.jetbrains.com/ja/2017/05/18/767/

Google I/OのキーノートにてAndroidチームはKotlinの公式サポートを発表いたしました。
これはKotlinにとって大きな一歩であり、Androidデベロッパにとって、そしてJetBrainsツールファンに
とって素晴らしいニュースです。

これはつまるところKotlinのバックにgoogleがついたとほぼ同義です。

Kotlinの特徴

  • Javaとの完全互換性

まずはこれ

Kotlin は JetBrains 社が作っている JVM 上で動作する言語で、 "100% interoperable with Jav
(Java と完全に相互運用可能 )" を謳っています。
  • Javaよりすごい

Javaの互換性を保ちながらもJavaよりすごい

Kotlin は Better Java としてかゆいところに手が届くように作られており、一方で Java プログラマが抵抗
感なくすんなりと受け入れられるようにできています

以下のコードを見てわかる通り、面倒で無駄な宣言がなくなりスッキリしている

before(Java)

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world.");
    }
}

after(Kotlin)

//this is comment
fun main() {
    println("Hello, world!!!")
}
  • 複数のOSに対応

SwiftはiOSの事実上の基準となっている言語だが、Androidには対応していない

しかしKotlinは複数のOSに対応可能。

iOSでもAndroidでも同様に動く。

Javaの有償化について

JavaOracle社が開発したプログラミング言語であるため、Kotlinもその影響を受けるのではないか?という懸念があったが

https://teratail.com/questions/135222

Android端末では、アプリはARTと呼ばれるGoogle独自のJVM上で動作しており、そもそもOracleの影響を受けません。

ということで問題なしとのこと。

とりあえず試したい方へ

とりあえずブラウザ上で試す: インストールしなくてもこちらからブラウザ上で実行可能

https://play.kotlinlang.org/

※Kotlinの公式のドメイン配下にあるサイトなので安全にお試しできます

インストール方法:しっかりとインストールしたい人向け

しっかり構築したい方へ

Android Studioのインストールが必要。

合計で20~30分程でできる。

まずはAndroid Studioのインストールの仕方

以下のサイトにアクセスした後

https://developer.android.com/studio

「Download」を押す

規約が出てくるが特に読まなくてもいい奴なので適当にチェックボックス押してダウンロード

ダウンロードには5分程かかった。

Mac, Windowsなどの指定がある方

ダウンロードボタンを押すのではなく「Download options」を押すこと

(万が一通常のDownloadを押してもOSに合わせたandroid studioが入ると思うが...)

その後Mac,Window,Lixux,ChromeOSなどのOSごとの対応が出てくる。

Android Studio.exeを起動

ダウンロードフォルダー配下に移動した(C:\Users(ユーザ名)\Downloads) android-studio-ide-xxx-xxxxxxx-windows.exeを起動する

C:\Users\~~\Downloads\android-studio-2021.1.1.22-windows.exe

Welcome To Android Studio Setup

:NEXT>を押す

Chose Components

Android Virtual Deviceを押したまま

:NEXT>

Install Loaction

「C:\Program Files\Android\Android Studio」を選択したまま

:NEXT>

Chose Start Menu Folder

Android Studio\Android Studio を選択

:NEXT>

インストールが開始される

トータルで5分

最初の1分は全く進まないが、2分ぐらいからいきなり進む。

インストールが完了後は

:NEXT>

Completeing Android Studio Setup

チェックボックスに「start android studio」をいれて「Finish」

初回起動時

Import Android Studio Settings

Do not import settingsを選択

万が一エラーが出た場合は「Setup Proxy」をクリック

Welcomoe

色々書いてあるが全部飛ばして

:Next>

Install Type

Standerdで良い。

:Next>

Select UI theme

DarcualかLightどちらかを選べる

色の好みで好きな方で

verify settings

確認画面

:Next>

Licence

色々インストールするのでそれぞれチェックを入れていかなければいけない

全部押したら「Finish」

installで5分ぐらい

以下の表示が出たら完了

Android SDK is up to date.
Running Intel® HAXM installer
Intel HAXM installed successfully!

AndroiStudio日本語化

次のサイトに行く

https://github.com/yuuna/IDEA_resources_jp

「Clone or download」をクリックし

「download zip」を選択し解凍

解凍後

ZIPファイルを解凍すると「resources_jp.jar」というファイルができます

これを「C:\Program Files\Android\Android Studio\lib」へコピー

完了

https://zesys.net/pc/android/android-studio-localizing-japanese/

Kotlin文法

変数代入

簡単な変数宣言の例(var)

  • 最もしっかりとした書き方
var a: Int = 1
var a = 1

型名は書く必要はない

定数の書き方(val)

いわゆる「const」として扱い、後に変数代入する必要がない場合

val digits = 12

Kotlinで使える型について

Kotlinでは以下の型が使用可能

  • Double

  • Float

  • Long

  • Int

  • Short

  • Byte

  • String

数値型について

  • Int

整数を扱うには最も適切なサイズ

  • Long

整数型では最大のサイズ

  • Double

64bitで小数点付きの数字を扱う際に最も大きいサイズ

  • Float

浮動小数点型

floatは単精度、doubleは倍精度浮動小数点と呼ばれている。

  • 以下二つはあまり使わない

Short 16 Byte 8

文字列型について

String型が使える(ここはJavaとほぼ同じ)

が、これも型推論の機能を使えばよい

var passowrd = "1234"

暗黙的にやるならば以下のようなイメージ

var passowrd : String = "1234"

変数宣言その2

変数の宣言方法

変数の宣言では var命令を用いる

var 変数名: 変数の型 = 初期値 

Kotlinの基本データ型は以下の様になっている

  • Double型は比較的大きい小数点数値で使う

暗黙の型変換(型推論機能)

Kotlinでは初期値から変数の型を推定してくれる。

ex) 以下のように書いてもnはInt型として判断される。

mはDouble型とみなされる。

var n = 10
var m = 1.5

※初期値とデータ型の両方の宣言を省略することはできない

※一度確定した型を変更するような代入ができない

var n = 10 n=11 n = "foo" 

型変換

型同紙に互換性があれば必要にお応じて型を変換することもできる。

Javaでは互換性がある場合は自動で変換できるが、Kotlinでは明示的に変換する必要がある

var a: Float = 1.2 //error(ダブル型であるため) 
var a: Float = 1.2f //Ok 
var b: Double = 10 //error(整数であるため) 
var b: Double = 10 //ok 

そのほかだと、toデータ型 () メソッドを用いて変換できる

var a = 10 
var b: Long = a.toString() 

toLong()以外にも、toBtye() やtoFloat() 等、変換先の型ごとにメソッドが存在する

Any型について

kotlinではすべてのクラスはany型を継承している。

したがって、どんな型でも代入できるような変数を設定したい場合はany型を使用すればよい

定数について

一度定義したら値を変えたくない物はvalで宣言する

再代入する予定のないものは、valを利用するのが基本

val a = 10
a=11 //error

配列については配列そのものを再代入するのはエラーが出る

しかし、配列の中身を変更するのは可能

val a = arrayof(1, 2, 3) 

a = arrayof (4, 5, 6) 
//エラー 

a[2] = 4
//OK

文字列と数値

リテラルとは?

ソースコードに書かれた具体的な値のこと

Kotlinの数値リテラル

主に使う数値リテラル

var a = 1001 //10新数 
var b = 0x0F //16新数
var c = 0b10101 //2新数 0bスタ 
var d = 1.23 // 少数 
var e = 1.23e+5 //指数

Kotlinの数値とアンダーバー

数値に入るは処理の上では無視される

したがって、桁区切りとして活用が可能

var a = 1000 
var b = 1_000 
var c = 0x3E8

したがって、上記の変数はすべて同じ値を意味する

  • サンプルコード
var a = 1000 
var b = 1,000 
var c = 0x3E8 
print(a)
print (b)
print(c)
>> 1000 
>> 1000 
>>1000 

サフィックスについて

文字や数値の後ろに付けて意味を付与する仕組み

var a = 10L 
//Long 

var b = 10F 
//Float 

var b = 10f 
//Float 

//サンプルコード

var a = 10L 
//Long! 

var b = 10f 
//Float

print (a::class)
>> class kotlin. lang  

print (b::class)
>> class kotlin. float 

文字列リテラルについて

文字列リテラルについて

Kotlinは二種類の文字列リテラルを持つ

  • エスケープ文字を含む文字列

  • 改行やタブなど任意の文字列を含む文字列

//サンプルコード

var msg1 = "こんにちは。\n私はKotlinを学んでます"
var msg2 = """こんにちは
私はKotlinを学んでますが 

// 実行結果

こんにちは。 私はKotlinを学んでます

複数行を表示したい場合

クオーテーションを三つ続けることで複数行テキストを実現できる。

var msg2 = """こんにちは
私はKotlinを学んでます"""

Kotlinで複数行の文字列でタブが入ってしまうとき。

trimMarginメソッドを使うことで先頭のタブを取り除くことができる

fun main(){
    var msg2 = """こんにちは 私はKotlinを学んでます
    を学んでます""".trimMargin() 
    println(msg2)
}

// 実行結果

こんにちは 私はKotlinを学んでいます。

Kotlinの文字列テンプレート

文字列に式を埋め込む場合

fun main {
    var data = array0f (1.2.3)
    println("配列dataの先頭の値は${data[0]}です") 
}

title:Kotlinの文字列リテラルについて【Kotlin入門】

description:文字列リテラルとは、ソースコードに書かれた具体的な値のこと。

category_script:True

Kotlinのnull

参照先を持たないことを意味する値→null

オブジェクトが参照を持たないことを意味する事もある。

Kotlinのオブジェクトの参照とは?

値(オブジェクト)はコンピュータ上のメモリに格納されることで状態を保存できる。 オブジェクトごとにメモリ上のアドレスが入っている状態。

変数はメモリアドレスを参照しており、オブジェクトそのものが入っているわけではない。

そして変数にオブジェクトの参照が設定されていない状態をnullという。

javaでは初期化をおこなわない限り、nullが初期値になっているが、これがエラーの元にもなる。

そこでデフォルトではnullを許容しない様にしている

var foo: String = "foo" 
foo = null 
// Error

しかし、nullを許容したい場合も存在すると思う

その場合は型名の後に?を付けることでnullを許容できる

var foo: String? = "foo" 
foo = null 

このようにnullを許容している型をNullable型(ヌルアボー型)という

null取り扱い注意

nullについては意識的に取り扱わなければならない内容がある。

var a: Int = 1000 
var b: Int = a 
var c: Int?= a
println(a == b)     //true 
println( a === b)   //true 
println( a == c)    //true 
printin( a === c)   //false

変数aを非null型のbとcにそれぞれ代入する。

この時

  • 「同じ値を持つことを確認する==では常にtrueになる」

  • 「同じオブジェクトを参照するかどうかを確認する===ではfalseになる」

この点は直感と反するので注意が必要。

nullableを非null型に代入できない

String?型データをStringに入れることはできない

var fool: String? = "foo" 
var foo2: String = fool 
//エラー 

これはAny型も例外ではない。

nullも許容したいAny型。その場合はAny?型を指定する。

nullable型のメンバにアクセスする際には「?.」を使う

String?の変数にアクセスする場合、「? メソッド」の形式

var a: String? = "foo"
println(a?.length)
var b: String? = null 
println (b?.length) 
//:null 

また、nullableを非null型に強制的に変換する際には!!を使う

var a:String? = "foo" 
println(a)

備考

title:Kotlinのnullの取り扱いについて【Kotlin入門】

description:参照先を持たないことを意味する値→null。オブジェクトが参照を持たないことを意味する事もある。

category_script:True

配列とコレクション

Kotlind複数の要素をまとめて扱うにはJavaと同様にCollectionを扱う

配列

最もシンプルだが、宣言の段階でサイズを決める必要がある。

List

長さが固定でなく、配列よりも柔軟性が高い。(ほぼ配列の上位互換)

Set

リストとほぼ同じだが、重複した要素は登録されない。(集合の概念)

Map(辞書)

キーとバリューの一対一で登録される複数の値 辞書とも呼ばれる。

配列について

サンプルコード

var a = arrayof(1, 2, 3,4) 
var b = intArrayOf(1,2,3)

//nullが入るので型推論が働かないため、方の指定が必要 
var c: Array<String?> = arrayofNulls(3)

//lamda式を利用した、柔軟な初期化 
var d = Array(3, {i ->i*2}) )

println(d) 
// [0, 2,4]  
// 0スタートであることに注意! 

リストのサンプルコード

var list = listOf("あ", "い","う") 

printIn(list)
// ["55","L1","5"] 

setのサンプルコード

出力の段階で重複が排除されていることに注意

var set = setof ("A", "A”, "A", "C", "B") 

println(set) 
//["A", "B", "C"] 

mapのサンプルコード

Kotlinでのdictに当たる。

var map = mapOf("First" to 1, "Second" to 2, "Third" to 3) println(map) 7/{First=1, Second=2, Third= 3} 

変更可能なコレクション

mutableコレクション名Of () 関数を使う

var list = mutableListof (1, 2, 3) 
list[2] = 4 
println(list) 
// [1, 2, 3] 

通常のlistがimutableなわけではない。

var mList = mutableListof (1,2,3) 
var list = listof (1, 2, 3, 4)

//list[2] = 4 /
//error 

mList[2] = 4 
//ok!

list = mList //OK 

備考

title:Kotlinでの配列とリストの違い【Kotlin入門】

description:Kotlind複数の要素をまとめて扱うにはJavaと同様にCollectionを扱う

category_script:True

演算子・制御構文

四則演算や比較などの、値の計算処理を行うための記号

四則演算など基本的なものは他のプログラミング言語と同様

比較演算子 == と ===は挙動が異なる

範囲演算子between

m.nと書くと、m~nの範囲を表すものになる

sqlでのbetween演算子に当たる

val i = 10 

printIn(i in 1..20) 
//true 

両端の値も含むことに注意

1..20であれば、1はtrueになる。

val i = 1 

println(i in 1..20) 
// true 
val i = 20 

println(i in 1..20) 
// true 

小数点でも比較可能

val i = 11.11 

println(i in 1..20) 
// true 

kotliのif文

if文の例

val a = 10 
if (a < 5)
    println("aは5以下です") 
}else if(a <= 10) {
    println("aは10以下です") 
}else{
    println("aは10より大きいです”)
}
//結果:aは10以下です。

if式

ifは式であるので、値を返すことができる。

関数のように実行結果をreturnするのが可能だ。

val a = 10 

var msg = if (a < 5) {
    ("aは5以下です") 
}else if(a <= 10) {
    ("aは10以下です) }
else{
    (aは10より大きいです")
}
printIn (msg) 
//結果:aは10以下です。 
  • if式を用いた場合は何かしらの値が必要になるので、elseが必ず必要

{}の中には複数行の記述も可能であり、その場合は**最後に書いた値を戻り値としてみなす

  • 処理が一行のみならば、 { } は省略可能
val a = 5 
var msg = if(a <= 5 ) "aは5以下です" else "aは10より大きいです” 
println(msg) 
//結果:aは5以下です。 

when it

式の値に応じて処理を分岐させるにはwhen式を使う

switch文の代わりのようなもの

val x = 1 when(x) {
    1 -> println("xは1です) 
    2 -> println("xは1です") 
    else -> {
        printIns("xは1でも2でもない")
    }
}

if式同様に、値を返すことができる

val score = 80 
val msg = when (score) {
    in 100..99 -> "素晴らしい” 
    in 60..98 -> "合格です” 
    !in 60..100 -> "不合格です" 
    else -> "不正な点数です。

型の判定

型での分岐も可能で、is演算子を利用する

val obj: Any = "あいうえお" when (obj) {
    is String -> println("母児数は${obj.length) です")
    else -> println("String型ではないです") 
}

注意 型チェックが行われた後のブロックでは、型変換が行われる!

以下のコードは is Stringで型変換が行われているので

val obj: Any = "あいうえお" 
when (obj) {
    obj is String -> println("母児数は${obj.length)です") else -> println("String型ではないです")
}

以下のコードでは型変換が起きていないのでエラーが発生する。

val obj: Any = "$11535" 
println("moji $(obj.length}") 

備考

title:Kotlinでのif文,if式と条件分岐【Kotlin入門】

description:四則演算や比較などの、値の計算処理を行うための記号。四則演算など基本的なものは他のプログラミング言語と同様。

category_script:True

for ループ

val arr = array0f (1, 2, 3) 
for (item in arr) {
    println(item) 
}

mapのforループ

val map = mapOf ("Firsst" to 1, "Second to 2, "Third” to 3) 
for ( (key, value) in map) {
    println("${key] : ${value}") 
}

配列でもwithIndexメソッドでインデックスと値の組み合わせを取得できる

val list = listof ("to", "\", "3") 
for ((index, value) in list.withIndex()) {
    println("${index} : $ {value}") 
}

範囲を指定したforループ (pythonならrength)

for (i in 1..3) {
    println(i) 
}``` 

### 両端を含めたくない時のforループ 

for (i in 1 until 3) { println(i) }```

インデックスを減少させるforループ

for (i in 3 downTo 1) {
    println(i)
}

for文のステップ数を変化させたい時

ex) 3飛びでループのインデックスを回す

for (i in 1.. 10 step 3) {
    println(i) 
    //11, 4,7,10
}

Kotlinのcontinue

for (i in 1..10) {
    if( i %3 == 0 ) continue 
    println(i) 
    if (i==9) break
}

二重ループで外側のループに出たいとき

二重ループで外側のループに出たいときはラベル構文を用いる

但し、あまり嬉しそうに使うとスパゲッティになりやすいので注意が必要

outer@for (i in 1..3) { 
    for(j in 1..3) { 
        if(i*j > 5) {
            break@outer
        }
        print("${i*j} ")
    }
}

whileループ

条件を満たす間は実行するwhileループ

var i = 1 while (i < 2 ){
    println(i)
    i++ 
}```

### do~whileループ 

do whileループは条件式の判定が処理の後ろになり、必ず一度は処理を通る 

ex) パスワードの入力など 

var i = 1 do{ printIn(i) i++ } while (i < 2 )




title:Kotlinでのfor文の使い方【Kotlin入門】

description:二重ループで外側のループに出たいとき。二重ループで外側のループに出たいときはラベル構文を用いる。但し、あまり嬉しそうに使うとスパゲッティになりやすいので注意が必要 

category_script:True




## 関数

KotlinではJavaと異なり、クラス以外に関数を宣言できる

### 関数の基本

関数を定義するためにはfunキーワードを使用する

関数の定義 

fun 関数名 (仮引数: 引数の型, ...):戻り値の型 { //処理 } //呼び出し 関数名()

仮引数と戻り値の型の宣言は必須。 

戻り値がない場合はUnitを指定するか省略する 

fun getTriangleArea (width: Couble, height: Double):Double { return width * height / 2 } println( getTrianelArea(10, 0, 11,1))




fun sayHello (name: String): Unit { println("Hello, ${name}.") } sayHello("tarou”) // Hello, tarou

### 関数の処理が一行で終わる場合 

returnなどを省略可能である 

fun gettriangleArea (width: Double, height: Double): Double = width * height /2

また、戻り値の型が推論可能である場合, 型を省略することもできる 

fun gettriangleArea (width: Double, height: Double) width * height /2

### 引数のデフォルト値 

引数が省略されたときに設定される引数を「デフォルト値」という。 

fun getTriangleArea (width: Couble=1.0, height: Double=1.5): Double { return width * height / 2 } println( getTriane Area ()) //0.75 println( getTrianel Area (3.0))



### 名前付き引数 

呼び出し側に明示的に引数を指定できる。 

通常の引数と混在させることもできるが、エラーの原因にもなるためなるべく避けた方が

fun getTriangleArea (width: Couble=1.0, height: Double=1.5): Double { return width * height / 2 } println(getTrianelArea(height = 30 width=20 ) println(getTrianelArea (height = 3.0))

必須の引数を先頭に、任意の引数(オプション)は後方に並べる方がよい。

### 可変長引数 

varargキーワードを用いる 

可変長引数は内部的には配列とみなされるので、forループによる処理が可能

fun allSum(vararg values: Int): Int { var result = 0 for (value in values) { result += value return result println( al ISum (2, 3, 4, 2,5)) } }

### スプレッド演算子 

スプレッド演算子を使うことで、配列を可変長引数として使うこともできる

fun allSum(vararg values: Int): Int { var result = 0 for (value in values) { result += value return result } } println( allSum(2, 3,4, 2,5)) //渡したい引数 val arr = int ArrayOf( 1, 1, 1, 1) println(allSum(arr)) println(allSum(4, arr, 3)) //ok


### Kotlinで戻り値を複数定義したい場合 

引数の合計と平均を受け取りたい場合。 

- Pairで括ることで二つの戻り値を返せる。 

- 3つを返す場合はTipleで括る。 

- 3つ以上を返す場合

fun allSum(vararg values: Int): Pair(Int, Double) { var result = 0 var count = 0.0 for (value in values) { result += value count ++ } return Pair (result, result / count) } val (sum, average) = alSUM(1,1,1,1)

printIn(sum) // 4.0

printIn(average) // 1.0

val (, average) = allSum(2, 2, 2, 2) // デメリットは使わない値が帰ってきてしまうこと // averageのみ必要であればこのようにを使う書き方がよい


### 高階関数 

**引数や戻り値に関数を指定する関数**のこと 

例)forEachメソッドなど 関数の引数に関数を渡すには::演算子を用いる

fun show(n: Int){ println(n) } val arr = arrayOf(1,1,1,1) arr.forEach(::show)

forEachメソッドは配列にデフォルトで実装されているメソッドで 
**全ての配列の要素に対して引数で受け取った関数を処理する**

という特徴を持つ

### 匿名関数: ラムダ式 

高階の引数として渡される関数は一度しか使われないケースが多い。 

その場合はラムダ式として、使い捨ての関数を使うのが主流である。

val arr = arrayOf (1, 2, 3, 4)

// 通常のラムダ式 arr.forEach({ n: Int -> println(n) } //1 //2 //3

// 推論可能な型なので、Intを省略できる arr.forEach({ n -> println(n) }

// 引数が単一ならば、引数の指定をitでも可能 arr.forEach({ printin(it) } //1 //2 //3 //4

### ラムダ式の注意点

ラムダ式中でreturnをすると、直情の関数を抜けてしまう。

fun main(){ val arr = arrayof ( 1, 2, 1, 1) arr. for Each { if (it == 3) return // Dreturnid println(it) } } // ここまで飛ぶ

ラムダ式でreturnをするには、**ラベル構文を使用する** 

fun main(){ val arr = arrayof( 1, 2, 1, 1) arr.forEach loop@ { if (it == 3) return@loop println(it) } //ここまで飛ぶ }

あるいは、forEachをラベルとして設定することもできる。 

fun main(){ val arr = arrayof ( 1, 2, 1, 1) arr.for Each { if (it == 3) return@forEach println(it) } // ここまで飛ぶ }

### 高階関数を定義する事も可能

関数の処理時間を計測したい場合、以下のようなbenchmark関数を定義することができる

fun benchmark (unitStr: String, func: ()-> Unit) : String { val start = System.currentTimeMillis() func() val end = System.currentTimeMillis() return (end-start).ToString() + unitStr } var time = benchmark("ミリ秒", { var x = 0 for (i in 1..1_100_000_000) { X++ } println("SLIM " + time) }





title:Kotlinでの関数【Kotlin入門】

description:KotlinではJavaと異なり、クラス以外に関数を宣言できる

category_script:True






## クラスの基本 

Kotlinでクラスを定義するには以下のように書く

class Human { private var name = "名無し" var age = 20 fun intro() { println("私の名前h$ {name} です。${age} 歳です。") } }

アクセス修飾子を利用することもできる。 

アクセス修飾子とは、変数やメソッドのスコープを定義する機能 例) 

class Human { private var name = "名無し" var age = 20 protected fun intro() { println("私の名前h$ {name}です。${age}歳です。") } }



### 基本的なアクセス修飾子 

- public:全てのクラスからアクセス可能 

- protected:定義されたクラスとそのサブクラスからのみアクセス可能 

- internal:同じpモジュール内のクラスからのみアクセス可能

モジュールとは



Kotlinのファイルが一体としてコンパイルされるまとまりのこと 

Eclipseやandroid studioなどでのプロジェクト単位のまとまりのこと


### Javaコードが実行されるまでの流れ 

1. 複数のJavaファイルがまとめてコンパイルされて、クラスファイルになる 

2. Java virtual Machine(JVM) がクラスファイルに記載されたコードを解釈・実行 

3. ここで、クラスファイルはソースコードを実行する過程で生成される中間コードであり、OSに依存しない。

クラスファイルはJVMに読み込まれるので、OSごとの依存が存在しない。また、JVMで動くコードはJava以外にもあり、KotlinもJVMのひとつ。

### プロパティ (フィールド) 

Kotlinではフィールドではなく、プロパティという機能が存在する。(正直どっちも同)

フィールドとは異なり、プロパティはただ単にクラスが持つ変数ではなく、それ自体がアクセサーを持つ。

getter, setterの関数でプロパティを設定する。

var プロパティ名:データ型 - 初期値 getter関数 setter関数


### Kotlinのプロパティのサンプルコード(定義部分) 

fieldはset内の特別な変数名で値の代入を受けたときに実行される。

class Human { var name = "名無し" var age = 20 set (value) { if(value < 0)) { println("年齢が不正です。") }else{ filed = value } } protected fun intro() { println("私の名前h${name}です。${age} 歳です。") } }

以下使用部分。 

setメソッドは代入時に自動的に呼び出される。 

val human = Human () human.intro() //私の名前は名無しです。20際です。 //以下setメソッド起動時の処理 human.age = -1 ///年齢が不正です。 printIn(human.name) //結果:名無し


### 注意点

- アクセサーの引数は慣習的にはvalueを用いる。

- filedはバッキングフィールドと呼ばれる。プロパティの値を格納するために裏側で自動生成されるフィールド
 
- valを使ってプロパティを宣言すると、**読み取り専用のプロパティになる 

- setterを使用することはできず、getterは可能


title:Kotlinのクラスの書き方【Kotlin学習サイト】


description:public:全てのクラスからアクセス可能 - protected:定義されたクラスとそのサブクラスからのみアクセス可能 - internal:同じpモジュール内のクラスからのみアクセス可能

category_script:True