C#のTrimとは?空白・改行を削除する使い方をTrimStart/TrimEndとの違いまで解説
はじめに
C#で文字列を扱うとき、入力値やファイルの読み込み結果に余計な空白、タブ、改行が含まれていることがあります。そのまま比較や保存を行うと、見た目は同じでも別の文字列として扱われ、思わぬ不具合につながることがあります。
そこでよく使われるのが、Trimメソッドです。C#のTrimは、文字列の先頭と末尾にある不要な空白文字を削除するための基本的なメソッドです。
この記事では、C#のTrimとは何か、空白や改行を削除する使い方、TrimStartやTrimEndとの違い、指定した文字を削除する方法、実務での活用例までわかりやすく解説します。
1. C#のTrimとは?
1-1. Trimは文字列の先頭と末尾の空白を削除するメソッド
C#のTrimは、文字列の先頭と末尾にある空白文字を削除するメソッドです。
たとえば、次のような文字列があるとします。
C#string text = " Hello ";
この文字列にTrim()を使うと、前後の空白が削除されます。
C#string result = text.Trim();
Console.WriteLine(result);
実行結果は次のようになります。
C#Hello
ここで重要なのは、Trimが削除するのは文字列の「先頭」と「末尾」にある空白だけという点です。文字列の途中にある空白は削除されません。
C#string text = " Hello World ";
string result = text.Trim();
Console.WriteLine(result);
実行結果は次のとおりです。
C#Hello World
HelloとWorldの間にある空白は残ります。
1-2. Trimで削除できる文字の範囲
Trim()を引数なしで使うと、文字列の前後にある空白文字が削除されます。代表的な削除対象には、次のようなものがあります。
| 文字 | 内容 |
|---|---|
| 半角スペース | |
| タブ | \t |
| 改行 | \n |
| キャリッジリターン | \r |
| 全角スペース | |
C#のTrim()は、単純な半角スペースだけでなく、タブや改行などの空白文字も削除できます。そのため、ユーザー入力やテキストファイルの読み込み結果を整形するときによく使われます。
1-3. Trimは元の文字列を変更せず新しい文字列を返す
C#の文字列であるstringは、不変オブジェクトです。つまり、一度作成した文字列の中身は変更されません。
Trim()を呼び出しても、元の文字列そのものが書き換わるわけではありません。空白を削除した新しい文字列が戻り値として返されます。
C#string text = " C# ";
text.Trim();
Console.WriteLine(text);
このコードの実行結果は次のようになります。
C#C#
Trim()を呼び出しているにもかかわらず、textの中身は変わっていません。削除後の文字列を使いたい場合は、戻り値を変数に代入する必要があります。
C#string text = " C# ";
text = text.Trim();
Console.WriteLine(text);
実行結果は次のようになります。
C#C#
1-4. Trimがよく使われる場面
C#のTrimは、次のような場面でよく使われます。
| 場面 | 使用例 |
|---|---|
| フォーム入力 | 名前やメールアドレスの前後空白を削除する |
| ログイン処理 | 入力されたIDの余計な空白を取り除く |
| CSV読み込み | 項目の前後にある空白を削除する |
| DB登録前 | 不要な空白を除去してデータを保存する |
| 文字列比較 | 比較前に前後の空白を削除して表記ゆれを防ぐ |
たとえば、ユーザーがメールアドレスを入力するときに、誤って前後に空白を入れてしまうことがあります。
C#string email = " user@example.com ";
string normalizedEmail = email.Trim();
このようにTrimを使うことで、不要な空白を取り除いた状態で処理を進められます。
2. C#のTrimの基本的な使い方
2-1. Trim()の構文
C#のTrim()の基本構文は次のとおりです。
C#文字列.Trim()
具体的には、次のように使います。
C#string result = text.Trim();
Trim()は、対象の文字列から先頭と末尾の空白文字を削除し、その結果を新しい文字列として返します。
2-2. 文字列の前後にある半角スペースを削除する例
まずは、半角スペースを削除する基本例を見てみましょう。
C#string text = " apple ";
string result = text.Trim();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[apple]
角かっこを付けて表示すると、前後の空白が削除されたことがわかりやすくなります。
2-3. タブや改行を含む文字列を削除する例
Trim()は、半角スペースだけでなく、タブや改行も削除できます。
C#string text = "\t\n C# Trim \r\n";
string result = text.Trim();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[C# Trim]
\tはタブ、\nは改行、\rはキャリッジリターンを表します。これらが文字列の先頭や末尾にある場合、Trim()によって削除されます。
2-4. Trimの戻り値を変数に代入する方法
Trim()の結果を利用するには、戻り値を変数に代入します。
C#string input = " sample ";
string trimmedInput = input.Trim();
Console.WriteLine(trimmedInput);
また、元の変数に代入し直すこともできます。
C#string input = " sample ";
input = input.Trim();
Console.WriteLine(input);
どちらの書き方でも問題ありません。元の値も残しておきたい場合は別の変数に代入し、不要であれば同じ変数に代入し直すとよいでしょう。
3. Trimで空白・改行を削除するサンプルコード
3-1. 先頭と末尾の空白を削除するコード
次のコードでは、文字列の先頭と末尾にある空白を削除しています。
C#string message = " Hello C# ";
string result = message.Trim();
Console.WriteLine($"変換前: [{message}]");
Console.WriteLine($"変換後: [{result}]");
実行結果は次のようになります。
C#変換前: [ Hello C# ]
変換後: [Hello C#]
Trim()を使うことで、前後の不要な空白だけが削除されています。
3-2. 改行コードを含む文字列を削除するコード
テキストファイルや複数行の入力を扱う場合、文字列の前後に改行コードが含まれることがあります。
C#string text = "\r\nHello\r\n";
string result = text.Trim();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[Hello]
Windows環境の改行では\r\nが使われることがありますが、Trim()はこれらの改行文字も削除できます。
3-3. タブ文字を含む文字列を削除するコード
タブ区切りのテキストやコピーした文字列には、前後にタブ文字が含まれていることがあります。
C#string text = "\t\tC#\t\t";
string result = text.Trim();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[C#]
タブ文字が先頭や末尾にある場合も、Trim()で削除できます。
3-4. ユーザー入力値にTrimを使う実用例
ユーザー入力では、意図せず前後に空白が入ることがあります。たとえば、コンソールから名前を入力してもらう場合を考えます。
C#Console.Write("名前を入力してください: ");
string? input = Console.ReadLine();
string name = input?.Trim() ?? "";
Console.WriteLine($"こんにちは、{name}さん");
この例では、Console.ReadLine()の結果に対してTrim()を使っています。
Console.ReadLine()はnullを返す可能性があるため、input?.Trim()のようにNull条件演算子を使っています。inputがnullの場合は、?? ""によって空文字に変換しています。
4. TrimStart・TrimEndとの違い
4-1. TrimStartは先頭の空白だけを削除する
TrimStart()は、文字列の先頭にある空白文字だけを削除するメソッドです。末尾の空白は削除されません。
C#string text = " Hello ";
string result = text.TrimStart();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[Hello ]
先頭の空白だけが削除され、末尾の空白は残っています。
4-2. TrimEndは末尾の空白だけを削除する
TrimEnd()は、文字列の末尾にある空白文字だけを削除するメソッドです。先頭の空白は削除されません。
C#string text = " Hello ";
string result = text.TrimEnd();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[ Hello]
末尾の空白だけが削除され、先頭の空白は残っています。
4-3. Trim・TrimStart・TrimEndの違いを比較表で整理
Trim、TrimStart、TrimEndの違いは次のとおりです。
| メソッド | 削除対象 | 使用例 |
|---|---|---|
Trim() | 先頭と末尾の空白 | 入力値全体の前後空白を削除したい場合 |
TrimStart() | 先頭の空白 | 行頭のインデントだけ削除したい場合 |
TrimEnd() | 末尾の空白 | 行末の改行や空白だけ削除したい場合 |
基本的には、前後両方の空白を削除したい場合はTrim()を使います。先頭だけ、または末尾だけを削除したい場合は、TrimStart()やTrimEnd()を使います。
4-4. 使い分けの判断基準
使い分けの判断基準は、どの位置の空白を削除したいかです。
前後の空白をすべて削除したい場合は、Trim()を使います。
C#string result = text.Trim();
先頭だけ削除したい場合は、TrimStart()を使います。
C#string result = text.TrimStart();
末尾だけ削除したい場合は、TrimEnd()を使います。
C#string result = text.TrimEnd();
フォーム入力値やメールアドレス、ユーザーIDなどを整形する場合は、前後の空白を削除することが多いため、Trim()がよく使われます。
一方、ログやファイルの行末だけを処理したい場合は、TrimEnd()の方が適していることがあります。
5. 指定した文字をTrimで削除する方法
5-1. Trim(char[])で特定の文字を削除する
Trim()は、空白文字だけでなく、指定した文字を削除することもできます。
構文は次のとおりです。
C#文字列.Trim(削除したい文字)
たとえば、文字列の前後にある*を削除する場合は、次のように書きます。
C#string text = "***Hello***";
string result = text.Trim('*');
Console.WriteLine(result);
実行結果は次のようになります。
C#Hello
指定した文字が文字列の先頭や末尾に連続している場合、それらが削除されます。
5-2. 特定の記号や文字を前後から削除する例
たとえば、前後にハイフンが付いた文字列からハイフンを削除したい場合は、次のようにします。
C#string text = "---CSharp---";
string result = text.Trim('-');
Console.WriteLine(result);
実行結果は次のようになります。
C#CSharp
URLやコード、区切り文字付きのデータを扱うときに便利です。
C#string value = "/users/";
string result = value.Trim('/');
Console.WriteLine(result);
実行結果は次のようになります。
C#users
5-3. 複数の文字を指定して削除する例
複数の文字を削除対象にしたい場合は、複数の文字を指定できます。
C#string text = ":::Hello---";
string result = text.Trim(':', '-');
Console.WriteLine(result);
実行結果は次のようになります。
C#Hello
この例では、文字列の先頭と末尾にある:と-が削除されます。
別の書き方として、文字配列を渡すこともできます。
C#string text = "***Hello###";
char[] trimChars = { '*', '#' };
string result = text.Trim(trimChars);
Console.WriteLine(result);
実行結果は次のようになります。
C#Hello
5-4. 文字列の途中にある文字は削除されない点に注意
Trimで指定した文字が削除されるのは、先頭と末尾にある場合だけです。文字列の途中にある文字は削除されません。
C#string text = "***Hello***World***";
string result = text.Trim('*');
Console.WriteLine(result);
実行結果は次のようになります。
C#Hello***World
先頭と末尾の*は削除されますが、HelloとWorldの間にある***は残ります。
文字列の途中にある文字も削除したい場合は、TrimではなくReplaceなどを使います。
C#string text = "***Hello***World***";
string result = text.Replace("*", "");
Console.WriteLine(result);
実行結果は次のようになります。
C#HelloWorld
6. Trimを使うときの注意点
6-1. Trimは文字列の中間にある空白は削除しない
Trim()は、文字列の先頭と末尾にある空白を削除するメソッドです。文字列の中間にある空白は削除されません。
C#string text = " Hello World ";
string result = text.Trim();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[Hello World]
HelloとWorldの間にある複数の空白はそのまま残ります。
文字列中のすべての空白を削除したい場合は、Replaceを使います。
C#string text = " Hello World ";
string result = text.Replace(" ", "");
Console.WriteLine(result);
実行結果は次のようになります。
C#HelloWorld
ただし、この方法では単語間の空白も削除されるため、用途に注意が必要です。
6-2. nullに対してTrimを使うと例外が発生する
Trim()は文字列インスタンスに対して呼び出すメソッドです。そのため、対象の変数がnullの場合にTrim()を呼び出すと、NullReferenceExceptionが発生します。
C#string? text = null;
string result = text.Trim();
このコードはエラーになります。
nullの可能性がある文字列にTrimを使う場合は、事前にnullチェックを行う必要があります。
C#string? text = null;
string result = text == null ? "" : text.Trim();
または、Null条件演算子を使って次のように書けます。
C#string? text = null;
string result = text?.Trim() ?? "";
6-3. 全角スペースが削除されるケースと確認方法
C#のTrim()は、全角スペースも空白文字として扱います。そのため、文字列の先頭や末尾に全角スペースがある場合、削除されます。
C#string text = " こんにちは ";
string result = text.Trim();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[こんにちは]
ただし、見た目では半角スペースと全角スペースの違いがわかりにくいことがあります。確認したい場合は、文字コードを表示すると判断しやすくなります。
C#string text = " こんにちは ";
foreach (char c in text)
{
Console.WriteLine($"{c} : U+{(int)c:X4}");
}
全角スペースはU+3000として表示されます。
6-4. Replaceとの違いを理解する
TrimとReplaceは、どちらも文字列を整形するときに使われますが、役割が異なります。
Trimは、先頭と末尾の文字を削除します。
C#string text = " A B C ";
string result = text.Trim();
Console.WriteLine(result);
実行結果は次のようになります。
C#A B C
一方、Replaceは文字列中の一致した文字や文字列を置換します。空文字に置換すれば削除として使えます。
C#string text = " A B C ";
string result = text.Replace(" ", "");
Console.WriteLine(result);
実行結果は次のようになります。
C#ABC
前後だけを整えたい場合はTrim、文字列全体から特定の文字を削除したい場合はReplaceを使います。
7. Trimでよくあるエラーと対処法
7-1. NullReferenceExceptionが発生する原因
Trimでよくあるエラーが、NullReferenceExceptionです。
C#string? name = null;
string result = name.Trim();
このコードでは、nameがnullであるにもかかわらずTrim()を呼び出しているため、例外が発生します。
Trim()は、あくまで文字列オブジェクトに対して実行するメソッドです。変数がnullの場合は、メソッドを呼び出す対象が存在しないためエラーになります。
7-2. nullチェックやNull条件演算子を使った対処法
nullの可能性がある文字列には、nullチェックを入れましょう。
C#string? name = null;
if (name != null)
{
name = name.Trim();
}
空文字に変換したい場合は、三項演算子を使えます。
C#string? name = null;
string result = name == null ? "" : name.Trim();
より簡潔に書くなら、Null条件演算子とNull合体演算子を組み合わせます。
C#string? name = null;
string result = name?.Trim() ?? "";
この書き方なら、nameがnullの場合は空文字が代入され、nullでない場合だけTrim()が実行されます。
7-3. 思ったように空白が消えない場合の確認ポイント
Trim()を使っても思ったように空白が消えない場合は、次の点を確認しましょう。
| 確認ポイント | 内容 |
|---|---|
| 空白が文字列の途中にないか | Trimは中間の空白を削除しない |
| 戻り値を代入しているか | Trim()だけ呼んでも元の文字列は変わらない |
対象がnullではないか | null.Trim()は例外になる |
| 削除したい文字を正しく指定しているか | 記号や特殊文字は引数で指定する必要がある |
| 見えない文字が含まれていないか | タブ、改行、全角スペースなどを確認する |
たとえば、次のコードはTrim()の戻り値を代入していないため、期待通りに動きません。
C#string text = " test ";
text.Trim();
Console.WriteLine($"[{text}]");
正しくは次のように書きます。
C#string text = " test ";
text = text.Trim();
Console.WriteLine($"[{text}]");
7-4. デバッグで文字列の中身を確認する方法
空白や改行は見た目ではわかりにくいため、デバッグ時は角かっこで囲んで表示すると便利です。
C#string text = " test ";
Console.WriteLine($"[{text}]");
実行結果は次のようになります。
C#[ test ]
また、各文字の文字コードを確認すると、見えない文字の正体を調べられます。
C#string text = "\t test \n";
foreach (char c in text)
{
Console.WriteLine($"'{c}' : U+{(int)c:X4}");
}
タブはU+0009、改行はU+000A、キャリッジリターンはU+000Dとして確認できます。
8. TrimとReplace・Regexの違い
8-1. Replaceは文字列中の特定文字を置換・削除する
Replaceは、文字列の中にある特定の文字や文字列を別の文字列に置き換えるメソッドです。
空文字に置き換えることで、削除として使えます。
C#string text = "A B C";
string result = text.Replace(" ", "");
Console.WriteLine(result);
実行結果は次のようになります。
C#ABC
Trimが先頭と末尾だけを対象にするのに対し、Replaceは文字列全体を対象にします。
C#string text = " A B C ";
Console.WriteLine(text.Trim());
Console.WriteLine(text.Replace(" ", ""));
実行結果は次のようになります。
C#A B C
ABC
8-2. Regexは複雑な空白削除に向いている
Regexを使うと、正規表現によって複雑な条件で空白を削除できます。
たとえば、連続する空白を1つにまとめる場合は次のように書けます。
C#using System.Text.RegularExpressions;
string text = "Hello World";
string result = Regex.Replace(text, @"\s+", " ");
Console.WriteLine(result);
実行結果は次のようになります。
C#Hello World
\s+は、1つ以上の空白文字を表します。半角スペース、タブ、改行などをまとめて処理したい場合に便利です。
文字列の前後だけでなく、文字列全体の空白ルールを細かく制御したい場合は、Regexが向いています。
8-3. Trim・Replace・Regexの使い分け
Trim、Replace、Regexは、目的によって使い分けます。
| 方法 | 主な用途 | 特徴 |
|---|---|---|
Trim | 前後の空白削除 | シンプルで読みやすい |
Replace | 特定文字の置換・削除 | 文字列全体を対象にできる |
Regex | 複雑なパターンの削除・置換 | 柔軟だがやや複雑 |
前後の空白だけを削除したいなら、Trimが最も簡単です。
C#string result = text.Trim();
文字列全体から半角スペースを削除したいなら、Replaceを使います。
C#string result = text.Replace(" ", "");
複数種類の空白をまとめて処理したいなら、Regexを使います。
C#string result = Regex.Replace(text, @"\s+", " ");
8-4. 目的別のおすすめ削除方法
目的別に整理すると、次のようになります。
| 目的 | おすすめの方法 |
|---|---|
| 前後の空白を削除したい | Trim() |
| 先頭の空白だけ削除したい | TrimStart() |
| 末尾の空白だけ削除したい | TrimEnd() |
| 文字列中の半角スペースをすべて削除したい | Replace(" ", "") |
| タブや改行も含めて複雑に削除したい | Regex.Replace() |
| 連続する空白を1つにまとめたい | Regex.Replace(text, @"\s+", " ") |
まずはTrimで対応できるかを考え、文字列の途中も処理したい場合はReplaceやRegexを検討するとよいでしょう。
9. 実務で使えるTrimの活用例
9-1. フォーム入力値の前後空白を削除する
Webアプリやデスクトップアプリでは、フォームに入力された値の前後に空白が入ることがあります。
C#string userName = inputUserName.Trim();
string email = inputEmail.Trim();
ログインIDやメールアドレスの前後に空白があると、認証や検索で一致しない原因になります。DBに保存する前や比較する前にTrim()を使うことで、不要なトラブルを防げます。
C#string inputEmail = " user@example.com ";
string normalizedEmail = inputEmail.Trim();
if (normalizedEmail == "user@example.com")
{
Console.WriteLine("一致しました");
}
9-2. CSVやテキストファイル読み込み時に整形する
CSVファイルでは、カンマの前後に空白が入っていることがあります。
C#string line = " apple, banana , orange ";
string[] values = line.Split(',');
for (int i = 0; i < values.Length; i++)
{
values[i] = values[i].Trim();
}
foreach (string value in values)
{
Console.WriteLine($"[{value}]");
}
実行結果は次のようになります。
C#[apple]
[banana]
[orange]
Splitした後に各要素へTrim()を使うことで、項目ごとの前後空白を削除できます。
9-3. DB登録前に不要な空白を取り除く
データベースに登録する値は、できるだけ整形しておくことが大切です。
C#string name = inputName.Trim();
string address = inputAddress.Trim();
string phoneNumber = inputPhoneNumber.Trim();
前後に余計な空白が残ったまま登録すると、検索条件に一致しなかったり、画面表示が崩れたりすることがあります。
特に、名前、メールアドレス、電話番号、商品コード、会員番号などは、登録前にTrim()で整形することがよくあります。
C#var user = new User
{
Name = inputName.Trim(),
Email = inputEmail.Trim(),
PhoneNumber = inputPhoneNumber.Trim()
};
9-4. 比較処理の前にTrimで表記ゆれを防ぐ
文字列比較では、見た目では同じでも前後に空白があると別の文字列として扱われます。
C#string a = "C#";
string b = " C# ";
Console.WriteLine(a == b);
実行結果は次のようになります。
C#False
比較前にTrim()を使うと、前後の空白による表記ゆれを防げます。
C#string a = "C#";
string b = " C# ";
Console.WriteLine(a == b.Trim());
実行結果は次のようになります。
C#True
ただし、すべてのケースで勝手にTrim()してよいわけではありません。パスワードのように空白自体が意味を持つ可能性がある値では、要件に応じて慎重に扱いましょう。
10. C#のTrimに関するよくある質問
10-1. Trimで改行は削除できる?
はい、削除できます。
Trim()は、文字列の先頭や末尾にある改行文字も削除できます。
C#string text = "\nHello\n";
string result = text.Trim();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[Hello]
\nだけでなく、\r\nのような改行コードも削除対象になります。ただし、文字列の途中にある改行は削除されません。
10-2. Trimで全角スペースは削除できる?
はい、C#のTrim()では全角スペースも削除できます。
C#string text = " Hello ";
string result = text.Trim();
Console.WriteLine($"[{result}]");
実行結果は次のようになります。
C#[Hello]
全角スペースは見た目で判別しにくいため、削除されないように見える場合は、文字コードや角かっこ付きの出力で確認するとよいでしょう。
10-3. Trimで文字列の中の空白も削除できる?
いいえ、Trim()では文字列の中にある空白は削除できません。
C#string text = " A B C ";
string result = text.Trim();
Console.WriteLine(result);
実行結果は次のようになります。
C#A B C
文字列中の空白も削除したい場合は、Replaceを使います。
C#string text = " A B C ";
string result = text.Replace(" ", "");
Console.WriteLine(result);
実行結果は次のようになります。
C#ABC
タブや改行も含めて処理したい場合は、Regexを使う方法もあります。
10-4. TrimとTrimStart・TrimEndはどれを使えばよい?
前後の空白を削除したい場合は、Trim()を使います。
先頭の空白だけ削除したい場合は、TrimStart()を使います。
末尾の空白だけ削除したい場合は、TrimEnd()を使います。
多くの入力値整形では、前後両方の空白を削除したいことが多いため、まずはTrim()を使う場面が多いです。
C#string result = input.Trim();
行末の改行だけを削除したい場合などは、TrimEnd()の方が適していることもあります。
C#string result = line.TrimEnd();
10-5. nullや空文字にTrimを使ってもよい?
空文字にTrim()を使うことはできます。
C#string text = "";
string result = text.Trim();
Console.WriteLine(result);
この場合、結果も空文字になります。
一方、nullに対してTrim()を使うとNullReferenceExceptionが発生します。
C#string? text = null;
string result = text.Trim();
nullの可能性がある場合は、次のように書くと安全です。
C#string? text = null;
string result = text?.Trim() ?? "";
また、空白だけの文字列かどうかを確認したい場合は、string.IsNullOrWhiteSpace()を使うと便利です。
C#string? text = " ";
if (string.IsNullOrWhiteSpace(text))
{
Console.WriteLine("null、空文字、または空白のみです");
}
まとめ
C#のTrimは、文字列の先頭と末尾にある空白文字を削除するための基本的なメソッドです。半角スペースだけでなく、タブ、改行、全角スペースなども削除できます。
Trim()は前後の空白を削除し、TrimStart()は先頭のみ、TrimEnd()は末尾のみを削除します。用途に応じて使い分けることで、文字列処理をより正確に行えます。
また、Trim()は元の文字列を直接変更するのではなく、新しい文字列を返します。そのため、結果を利用するには変数へ代入する必要があります。
C#string text = " C# Trim ";
text = text.Trim();
文字列の途中にある空白を削除したい場合はReplace、複雑な空白処理を行いたい場合はRegexを使うとよいでしょう。
フォーム入力、CSV読み込み、DB登録前の整形、文字列比較など、実務でもTrimは非常によく使われます。C#で文字列処理を行うなら、Trim、TrimStart、TrimEndの違いをしっかり理解しておきましょう。

