TypeScriptでアクセス修飾子を使う方法を徹底解説!初心者向けオブジェクト指向入門
生徒
「TypeScriptでクラスを勉強しているのですが、アクセス修飾子という言葉を見ました。これは何ですか?」
先生
「アクセス修飾子は、クラスの中の変数やメソッドに対して、外からどこまで見えるかを決めるルールのことです。」
生徒
「外から見えるかどうかを決めるって、具体的にはどういうことですか?」
先生
「例えば、お財布の中身は自分だけが見られるようにしたいですよね。でも、自己紹介で名前は誰にでも言えます。そういう公開範囲をプログラムで表すのがアクセス修飾子です。」
1. アクセス修飾子とは?
TypeScriptのアクセス修飾子とは、クラスで定義したプロパティ(変数)やメソッド(関数)に対して「どこからアクセスできるか」を指定するための仕組みです。アクセス修飾子を使うことで、プログラムの設計をわかりやすく整理し、誤って大事な情報を外部から変更されないように守ることができます。
代表的なアクセス修飾子は以下の3種類です。
- public:誰でも自由にアクセスできる(デフォルト)
- private:同じクラスの中からしかアクセスできない
- protected:同じクラスと、そのクラスを継承した子クラスからアクセスできる
このように、アクセス修飾子はクラス設計において「情報をどこまで公開するか」を決める、とても重要な役割を持っています。
2. publicの使い方
public(パブリック)は最もオープンな修飾子です。指定しなくても自動的にpublicになります。クラスの外部から自由に呼び出したり変更できるので、ユーザーに公開したい情報や機能に使います。
class User {
public name: string;
constructor(name: string) {
this.name = name;
}
public greet() {
console.log("こんにちは、" + this.name + "です。");
}
}
let user = new User("太郎");
console.log(user.name);
user.greet();
こんにちは、太郎です。
この例では、nameもgreetもpublicなので、外部から自由に呼び出すことができます。
3. privateの使い方
private(プライベート)はクラスの外からアクセスできないようにする修飾子です。財布の中身や暗証番号のように、外から直接見られたくないデータを守るために使います。
class BankAccount {
private balance: number;
constructor(initialBalance: number) {
this.balance = initialBalance;
}
public getBalance() {
return this.balance;
}
public deposit(amount: number) {
this.balance += amount;
}
}
let account = new BankAccount(1000);
// console.log(account.balance); ← エラー!外から直接アクセスできない
account.deposit(500);
console.log(account.getBalance());
1500
balanceはprivateなので、外から直接見ることはできません。残高を知りたいときは、publicなgetBalance()を通じて確認する必要があります。
4. protectedの使い方
protected(プロテクテッド)は、同じクラスとその子クラスからだけアクセスできる修飾子です。例えば、親から子にだけ伝えたい秘密の情報のように使えます。
class Person {
protected age: number;
constructor(age: number) {
this.age = age;
}
}
class Student extends Person {
public showAge() {
console.log("年齢は" + this.age + "歳です。");
}
}
let student = new Student(20);
// console.log(student.age); ← エラー!外からは見えない
student.showAge();
年齢は20歳です。
この場合、ageはprotectedなので、クラスの外部からは直接アクセスできませんが、Studentのような子クラスの中では使うことができます。
5. アクセス修飾子を使うメリット
アクセス修飾子を正しく使うことで、プログラムを安全かつ理解しやすく設計できます。具体的なメリットは以下の通りです。
- データの保護:大事な情報を外部から直接変更されないようにできる
- 使いやすさの向上:必要な機能だけを公開して、シンプルな使い方を提供できる
- 拡張性:protectedを使うことで、子クラスに必要な情報を渡しながら、外部には隠せる
このように、アクセス修飾子はTypeScriptのオブジェクト指向プログラミングを学ぶうえで欠かせない基本的な概念です。しっかり理解しておくと、実際の開発で役立ちます。
まとめ
TypeScriptにおけるアクセス修飾子について振り返ると、クラス内部の情報をどこまで公開し、どこまで隠すのかという考え方が、オブジェクト指向の基礎として非常に重要であることがわかります。とくに、public・private・protectedという三つの修飾子は、クラス設計の安全性や見通しのよさを大きく左右し、コード全体の構造を理解しやすくするための根本的な仕組みです。外部にそのまま公開してよい情報はpublicを使い、外部から絶対に触られたくない値にはprivateを使い、さらに継承関係の子クラスには知らせたいが外部には隠したい情報にはprotectedを使う、というように、目的によって適切な修飾子を選ぶことが大切です。また、アクセス修飾子を適切に使うことで、予期しない値の変更や誤った操作を防ぎ、クラスの内部構造を安全に保つことができます。 さらに、実際のコードで見ると理解が深まり、アクセス修飾子がどのように振る舞うのかがはっきりと見えてきます。開発現場では、外部に公開すべきではないデータや、継承先にだけ知らせたい情報を整理するために活用されます。この整理がしっかりしていると、他の開発者がコードを読むときにも意図を誤解しにくくなり、長期的なメンテナンスの面でも大きな効果を発揮します。また、アクセス範囲をあらかじめ決めておくことで、自分自身も誤って内部データに触れてしまうことを避けられ、より正確な構造のクラスを作れるようになります。オブジェクト指向の理解を深めるうえでも欠かせない概念です。 以下では学習内容を整理しながら、アクセス修飾子の使い方が自然に身につくようにサンプルコードを用意しました。public・private・protectedがどのように機能し、どのように役割を分担しているのかを再確認しながら読み進めてみてください。
サンプルプログラム:アクセス修飾子を使ったユーザー管理クラス
class Member {
public name: string;
private secretCode: string;
protected level: number;
constructor(name: string, code: string, level: number) {
this.name = name;
this.secretCode = code;
this.level = level;
}
public showName() {
console.log("ようこそ、" + this.name + "さん。");
}
public checkCode() {
return "認証コードは非公開です。";
}
}
class PremiumMember extends Member {
public showLevel() {
console.log("会員ランクは「" + this.level + "」です。");
}
}
let member = new Member("太郎", "XYZ123", 1);
member.showName();
console.log(member.checkCode());
let premium = new PremiumMember("花子", "ABC789", 3);
premium.showLevel();
この例では、公開してよい名前はpublicで扱い、絶対に外部に触れられたくない認証コードはprivateで保護し、会員ランクのように子クラスに継承させたい情報はprotectedで管理しています。実務の場面でも、こういった設計の考え方は非常に重要で、公開範囲の整理によって安全なクラス構造が生まれます。それぞれの修飾子が持つ役割を理解しながら設計することで、堅牢で整ったオブジェクト指向プログラムを組み立てる力が育ちます。
生徒
「アクセス修飾子はただの設定だと思っていましたが、実際にはクラスの安全性や使いやすさを左右する大事な仕組みなんですね。」
先生
「そうです。どの情報を公開し、どの情報を隠すかを決めることで、プログラムの全体像がすっきり見えるようになりますよ。」
生徒
「privateとprotectedの違いもよくわかりました。特に継承の場面ではprotectedが活躍しそうです!」
先生
「その通りです。継承関係を意識すると、protectedは非常に便利な仕組みになります。設計次第でより柔軟に扱えるようになりますよ。」
生徒
「これからクラスを書くときは、まず公開範囲を意識して設計してみます!」