Kotlinのgetter・setterのカスタマイズ方法をわかりやすく解説!初心者向け完全ガイド
生徒
「Kotlinで変数にアクセスするときに、自動で何か処理をしたりできるって聞いたんですが、本当ですか?」
先生
「はい、それはgetter(ゲッター)とsetter(セッター)という機能で実現できます。Kotlinではこの2つを簡単にカスタマイズできるんですよ。」
生徒
「えっ、なんだか難しそう…。具体的にどういうことか教えてもらえますか?」
先生
「もちろんです!実際のコードを見ながら、Kotlinのgetterとsetterの仕組みをやさしく解説していきましょう。」
1. getterとsetterとは?
getter(ゲッター)は「値を取り出すときの動作」、setter(セッター)は「値を入れるときの動作」です。
例えば、「年齢」という変数があったとして、値を取り出すときや変更するときに、ただデータを扱うだけでなく、チェックしたり加工したりする処理を追加できます。
家で言えば、「冷蔵庫(変数)」にある「ジュース(値)」を取るときに、冷たさを確認したり、注いだ量を記録したりするようなイメージです。
2. Kotlinではプロパティに自動でgetter・setterがついている
Kotlinで変数(プロパティ)を定義すると、自動的にgetterとsetterが生成されます。以下のようなコードでも、裏ではgetterとsetterが動いています。
class User {
var age: Int = 20
}
このとき、user.ageと書けばgetterが呼ばれ、user.age = 25とすればsetterが使われます。
3. getterをカスタマイズする方法
getterをカスタマイズすれば、プロパティの値を取り出すときに、ちょっとした処理を追加できます。例えば、内部では全部小文字で保存しておいて、取り出すときだけ大文字に変えるということができます。
class Person {
var name: String = "taro"
get() = field.uppercase()
}
fieldは、実際の値そのものを指します。これを加工して返すことができるのがポイントです。
fun main() {
val person = Person()
println(person.name)
}
TARO
4. setterをカスタマイズする方法
setterでは、値が代入されるときに条件をチェックしたり、自動的に加工して保存することができます。以下は、マイナスの年齢が入らないように制限する例です。
class Member {
var age: Int = 0
set(value) {
field = if (value >= 0) value else 0
}
}
fun main() {
val member = Member()
member.age = -5
println(member.age)
}
0
このように、setterで条件をつけることで、不正な値が入らないように安全に管理できます。
5. getter・setterの両方をカスタマイズする例
getterとsetterを同時にカスタマイズすれば、保存するときと取り出すときに別々の処理を入れることもできます。以下の例では、値を保存するときは小文字に変換、取り出すときは大文字にして返すようにしています。
class UserName {
var name: String = ""
get() = field.uppercase()
set(value) {
field = value.lowercase()
}
}
fun main() {
val user = UserName()
user.name = "Sakura"
println(user.name)
}
SAKURA
このように、Kotlinのプロパティではgetter・setterをカスタマイズすることで、データの整形や検証が簡単にできるのが大きな特徴です。
6. Kotlinでのfieldとは?初心者でもわかる解説
fieldというキーワードは、getter・setterの中で使われる特別なものです。これはそのプロパティ自体の「中身の値」を表します。
例えると、nameという引き出しの中に入っているメモ用紙そのものがfieldです。getterではこのメモを取り出して読む、setterではこのメモを書き換える、というイメージです。
7. Kotlinでプロパティに対するアクセス制限をつけるには?
Kotlinでは、getterとsetterに対してアクセス制限(privateやpublic)を個別に設定できます。以下はsetterだけをprivateにして、外から変更できないようにする例です。
class Score {
var points: Int = 0
private set
}
このようにすることで、値の読み取りは可能でも、外部から変更できない安全なプロパティを作れます。
まとめ
Kotlinにおけるgetterとsetterのカスタマイズは、単に値の取得や設定を行うだけでなく、データの整形や検証、安全性の確保といった目的でも活躍します。特にKotlinは、プロパティに対してデフォルトでgetter・setterを自動生成してくれるため、初学者でも気軽に使い始めることができます。この記事では、自動生成の基本から始まり、getterの加工処理、setterによる条件チェック、さらに両方を組み合わせた応用例までを丁寧に解説してきました。
実務でも、入力チェックや表示形式の統一、ロジックの共通化などに使われることが多いため、覚えておくと非常に便利です。例えばユーザー名を入力する際に、保存時は小文字、表示時は大文字に変える処理をgetter・setterで自然に記述できます。また、マイナスの値や不正な値を防ぐガードとしても強力です。
fieldという特別なキーワードについても紹介しましたが、これはgetter・setterの内部でのみ使える「実際の値そのもの」を指す重要な存在です。このfieldを使って、無限ループを防ぎながら値を操作できるため、getter・setterをカスタマイズする際には欠かせません。
さらに、アクセス制限を活用することで、getter・setterの片方にだけprivateを付けたりして、外部からのアクセスをコントロールすることも可能です。たとえば、得点やIDなど外部から書き換えられては困るデータを、読み取り専用にすることで安全性が保たれます。
以下は、記事内容の総まとめとして、簡単なgetter・setterの応用例です。
class Product {
var price: Int = 0
set(value) {
field = if (value >= 0) value else 0
}
var label: String = "sample"
get() = field.replaceFirstChar { it.uppercaseChar() }
}
fun main() {
val p = Product()
p.price = -100
p.label = "banana"
println("価格:${p.price}円")
println("商品名:${p.label}")
}
価格:0円
商品名:Banana
この例では、マイナスの価格が入らないようにしつつ、商品ラベルの最初の文字だけを大文字に変換しています。getterとsetterの両方の機能を活かして、安全で見やすいデータ管理を行う構成になっています。
Kotlinのgetter・setterは、表面的にはシンプルに見えますが、活用すればするほど便利な存在です。初心者のうちから意識的に取り入れておくことで、コードの品質を高める力になります。小さな工夫が将来の大きな差になりますので、ぜひ手を動かして慣れていってください。
生徒
「今回の記事で、getterとsetterってすごく自由に使えるってことがよくわかりました!」
先生
「そうですね。データの取り出しや代入に、ルールや条件を付けたいときにとても役立ちますよ。」
生徒
「fieldっていう特別なキーワードが出てきたときは、ちょっとドキッとしましたけど、実はそんなに難しくないんですね。」
先生
「はい、getterやsetterの中でだけ使える”そのプロパティの実体”と思えばいいですよ。覚えておくと便利です。」
生徒
「あと、マイナスの年齢を防ぐコードとか、商品名を整えるのも全部getter・setterでできるんですね!」
先生
「その通りです。条件付きの代入や、表示用の加工など、ちょっとした工夫を加えたいときにぴったりです。」
生徒
「今後、クラスを作るときには、まずプロパティに何かルールが必要かどうか考えてみるようにします!」
先生
「素晴らしい心構えですね!その積み重ねが、安全で読みやすいコードにつながっていきますよ。」