Javaのgetterとsetterとは?書き方や使い方をわかりやすく解説

Javaを学び始めたときに必ず出てくるのが「getter」と「setter」。名前だけ聞くと難しそうに感じますが、実はとてもシンプルで大切な仕組みです。
この記事を読むことで、getterとsetterがなぜ必要なのか、どうやって使うのかが理解でき、自分のコードにもすぐに取り入れられるようになります。
また、実際に自分で手を動かして使えるようになることを目標に、丁寧な解説と豊富なサンプルコード、そして演習問題まで用意しています。
初心者でも「なるほど!」と思える内容に仕上げていますので、ぜひ最後まで読み進めてください。
getterとsetterとは?
Javaでクラスを作るときに、変数を安全に使うための仕組みが「getter(ゲッター)」と「setter(セッター)」です。
簡単にいうと、変数を読み取るためのメソッドがgetter、変数に値を入れるためのメソッドがsetterです。
たとえば、人の名前と年齢を管理したい場合、次のように使います。
public class Person {
private String name;
private int age;
// 名前を取得する(getter)
public String getName() {
return name;
}
// 名前を設定する(setter)
public void setName(String name) {
this.name = name;
}
// 年齢を取得する(getter)
public int getAge() {
return age;
}
// 年齢を設定する(setter)
public void setAge(int age) {
if (age >= 0) {
this.age = age;
} else {
System.out.println("年齢は0以上にしてください");
}
}
}
このように、name
とage
という変数はprivate
で外から直接アクセスできません。その代わりに、getName()
やsetAge()
といったメソッドを通じて安全に操作できるようにします。
この方法を使うと、次のような良いことがあります:
- 変な値(例:マイナスの年齢)が入るのを防げる
- あとで処理を追加しやすい(ログを出すなど)
- クラスの中身を守れて、安全なプログラムになる
「カプセル化」とも呼ばれるこの考え方は、Javaではとても大事です。
カプセル化とは
「カプセル化」とは、クラスの中の変数(フィールド)を他のクラスから直接触れないようにして、安全にデータを扱うための考え方です。
これにより、外部からの不正なアクセスや意図しない変更を防ぎ、プログラムの安定性や信頼性を高めます。
たとえば、ユーザーのパスワードを保存する場合、直接アクセスできるとセキュリティ上のリスクが大きくなります。
そこでprivate
キーワードを使って変数を隠し、代わりにgetterやsetterメソッドを通じて安全にやり取りするのです。
getterとsetterの役割
それぞれの役割は以下の通り。
- getter:変数の中身を取得するためのメソッド
- setter:変数の中身を変更するためのメソッド
この2つのメソッドを使うことで、変数の値を安全かつ柔軟にやり取りできます。
また、変更の履歴を取ったり、入力内容を検証するロジックを追加することも可能になります。
サンプルコードを見てみよう
以下は生徒の名前と年齢を管理するStudent
クラスの例です。
public class Student {
private String name;
private int age;
// getter(取得する)
public String getName() {
return name;
}
public int getAge() {
return age;
}
// setter(設定する)
public void setName(String newName) {
name = newName;
}
public void setAge(int newAge) {
age = newAge;
}
}
このStudent
クラスでは、name
とage
という変数を持っています。でも、どちらもprivate
なので、外から直接は触れません。
その代わりに、getName()
やsetAge()
といったメソッドを通じて、安全にデータをやり取りできます。
こうすることで、たとえば将来的にログを記録したり、年齢が0歳以上かをチェックする処理を追加することも容易になります。
なぜgetterとsetterを使うの?
getterとsetterには、単に値を取り出す・設定する以上の価値があります。以下の3つの理由を知ると、使うメリットがはっきりと見えてきます。
理由1:データを安全に守れる
直接変数にアクセスできないので、間違った値を入れられるのを防げます。たとえば、年齢にマイナスの数字を入れるのはおかしいですよね。
public void setAge(int newAge) {
if (newAge >= 0) {
age = newAge;
} else {
System.out.println("年齢は0以上にしてください");
}
}
このように、setterの中にチェック処理を入れておけば、変なデータをブロックできます。また、データのフォーマットや形式を整える処理もこの中で行うことができます。
理由2:処理を追加しやすい
後からログを出したり、データベースに保存したりと、処理を追加したいときに柔軟に対応できます。直接変数をいじるスタイルだと、こういった変更が非常に難しくなります。
public void setName(String newName) {
System.out.println("名前を変更しています: " + newName);
name = newName;
}
理由3:変更に強いコードになる
変数の名前や型を変えても、getterとsetterの中だけ直せば済むので、他の部分に影響が出にくいです。
たとえば、変数fullName
に名前を変更したとしても、getterとsetterの名前を保てば、既存のコードはそのまま使えます。
getterとsetterの書き方(ルールとポイント)
Javaでは、getterとsetterを使う際に命名規則が存在します。
これはコードの可読性や自動化ツールの連携にも関係する大切なポイントです。
命名ルール
getterはget
を、setterはset
を使って命名します。
- getter:
get
+ 変数名(最初の文字を大文字) - setter:
set
+ 変数名(最初の文字を大文字)
例:
- 変数名が
name
なら →getName()
とsetName()
userName
なら →getUserName()
とsetUserName()
以下は命名ルールの例を示した簡単なサンプルコードです。
public class Product {
private String name;
// getter
public String getName() {
return name;
}
// setter
public void setName(String name) {
this.name = name;
}
}
boolean型の場合
true/false
のようなboolean型は、getterだけ少し違ってis
を使います。
private boolean isPassed;
public boolean isPassed() {
return isPassed;
}
public void setPassed(boolean passed) {
isPassed = passed;
}
クラスの使い方(mainメソッドで試す)
getterとsetterを作ったら、それをどう使うのかも見ておきましょう。
以下の例では、Student
クラスのオブジェクトを生成して、名前と年齢を設定し、それを表示しています。
public class Main {
public static void main(String[] args) {
Student s = new Student();
s.setName("田中太郎");
s.setAge(15);
System.out.println("名前: " + s.getName());
System.out.println("年齢: " + s.getAge());
}
}
このコードを実行すると、次のような出力になります。
名前: 田中太郎
年齢: 15
実際に自分で打ち込んで、動かしてみると理解がグッと深まります。
よくあるミスと注意点
よくあるミスと注意点についてもみていきましょう。
変数をprivate
にし忘れる
getterとsetterを作っても、変数がpublic
だと意味がありません。
なぜなら、public
にしてしまうと外部のクラスから直接その変数にアクセスできてしまうため、getterやsetterを使わずに値を読み書きできてしまいます。
public class Product {
public String name; // ←これが問題
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Main {
public static void main(String[] args) {
Product p = new Product();
p.name = "テレビ"; // setterを使わずに直接アクセスしている
System.out.println(p.name); // getterも使っていない
}
}
このように直接アクセスされてしまうと、後から値のチェックやログ出力などの処理を追加したくても、全てのアクセスを把握・制御できなくなります。カプセル化の効果が失われ、メンテナンス性や安全性が下がってしまいます。
そのため、フィールドは必ずprivate
にして、アクセスはgetter/setterを通じて行うようにしましょう。
setterの中で代入を忘れる
public void setName(String newName) {
// name = newName; を忘れてる!
}
こういったうっかりミスにも注意しましょう。特に初心者のうちは、メソッドの中で何をするか明確に意識するのが大切です。
同じ名前の引数と変数の区別
同じ名前の引数と変数の区別するには、thisをつかいます。
public void setName(String name) {
this.name = name;
}
これもよく出てくる書き方なので覚えておきましょう。
演習問題
演習問題を用意しましたので、ぜひアウトプットしてみてください。
問題1:Bookクラスを作って、タイトル(title)とページ数(pages)を管理しよう。
解答例:
public class Book {
private String title;
private int pages;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
if (pages > 0) {
this.pages = pages;
} else {
System.out.println("ページ数は1ページ以上にしてください");
}
}
}
問題2:Animalクラスを作って、名前と動物の種類を管理しよう。
解答例:
public class Animal {
private String name;
private String type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
問題3:Personクラスに年齢(age)のgetter/setterを作り、負の値を禁止しよう。
解答例:
public class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
if (age >= 0) {
this.age = age;
} else {
System.out.println("年齢は0歳以上にしてください");
}
}
}
よくある質問(FAQ)
Q1:getterとsetterはいつ使うべき?
A:クラスの中の変数を外から触らせたくないときに使います。特に大規模なシステムでは必須です。
Q2:全ての変数にgetter/setterをつけるべき?
A:必要なものだけでOKです。意味なくつけるとコードがごちゃごちゃします。
Q3:自動生成はしてもいいの?
A:EclipseやIntelliJなどのIDEには自動生成機能があるので、使っても問題ありません。効率よく開発を進めるために積極的に活用しましょう。
Q4:getter/setterを書かなくても動くけど?
A:public
にすれば動きますが、セキュリティやメンテナンス性が下がるので避けましょう。
Q5:getter/setterを使わない方法はある?
A:Lombokというライブラリを使えば、アノテーションで自動生成できます。記述量を減らしたい場合には便利です。
まとめ
Javaのgetterとsetterは、「データを守りつつ、必要に応じて安全にアクセスする」ための基本的な仕組みです。
初めは少し面倒に感じるかもしれませんが、慣れてくると設計の幅が広がります。特に、アプリケーションの規模が大きくなるほど、こういった設計の基本が重要になってきます。
この記事では、基本から応用、演習問題、FAQまでカバーしました。
ぜひ自分のプログラムでも実際に書いて、動かして、理解を深めてみてくださいね。