ABAPにおけるCLEAR命令/FREE命令/REFRESH命令は、データオブジェクト(変数・構造・内部テーブル)の初期化を行う命令です。
参考 データオブジェクトとは?
命令 | 基本的な機能 | 内容の影響 | データオブジェクトの存在影響 |
---|---|---|---|
CLEAR命令 | データオブジェクトの内容を初期化 | 内容が初期値にリセット | データオブジェクトは存在し続ける |
REFRESH命令 | 内部テーブルの内容を初期化 | 内容が初期値にリセット | データオブジェクト(内部テーブル)は存在し続ける |
FREE命令 | データオブジェクトのメモリを解放 | 不適用 | データオブジェクトが削除される |
このページでは、ABAP初心者向けにわかりやすくサンプルコード付きで3つの命令の基本的な使い方・違いや使い分けを解説します。
SAPエンジニアやABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
参考 ABAPの基本構文ルール
ABAPにおける初期化とは?
ABAPにおける「初期化」とは、データオブジェクト(変数や内部テーブルなど)をそのデータ型のデフォルト状態、つまり「宣言したときの状態」に戻す操作を指します。
例えば、数値型の変数を初期化するとその値は0に、文字列型の変数を初期化するとその値は空文字列になります。また、内部テーブルを初期化すると、そのテーブルのすべての行が削除されます(=テーブルは空になります)。
初期化の重要性
- データの整合性を保つ: 変数を再利用する場合、前の残留データが新しい結果に影響を与える可能性があります。初期化を適切に行うことで、データの整合性と予測可能性を維持することができます。
- エラーの防止: 初期化されていない変数は未定義の状態になり得るため、予期しない動作やエラーを引き起こす可能性があります。初期化により、このような問題を防ぐことができます。
- リソースの管理: 大きなデータ構造やメモリを大量に消費するオブジェクト(例えば内部テーブル)を使用する場合、初期化を行うことで不要なメモリを削除できるため、パフォーマンスが改善します。
ABAPでは、この初期化をCLEAR命令/FREE命令/REFRESH命令で行います。
このページでは、これら3つの基本的な使い方と違いをわかりやすくご説明します。
CLEAR命令
ABAPのCLEAR
命令は、指定したデータオブジェクト(変数や内部テーブルなど)をそのデータ型の初期状態に戻すための命令です。
CLEAR <fieldname>.
CLEARに続けて、初期化したいデータオブジェクトを指定するだけでOK。構文の形としてはかなり簡単です。
変数を初期化するサンプルコードがこちら↓。
DATA: lv_num TYPE i VALUE 100, lv_str TYPE string VALUE 'Hello'. CLEAR lv_num. " lv_num becomes 0 CLEAR lv_str. " lv_str becomes ''
参考 DATA命令 / VALUEオプション
このコードでは、数値変数lv_num
と文字列変数lv_str
を初期化しています。CLEAR
命令により、lv_num
の値は0になり、lv_str
の値は空文字列になります。
内部テーブルを初期化した場合はこちら↓。
DATA: lt_table TYPE TABLE OF string, wa TYPE string. APPEND 'Hello' TO lt_table. READ TABLE lt_table INTO wa INDEX 1. CLEAR wa. " wa becomes ''
参考 APPEND命令 / READ TABLE命令
このコードでは、内部テーブルlt_table
から取り出したワークエリアwa
を初期化しています。CLEAR
命令により、wa
の値は空文字列になります。
CLEAR
命令は基本的にどのようなデータ型でも使用可能。その型に対応した初期値(数値の場合は0、文字列の場合は空文字列など)に設定します。
ただし、参照型の変数に対してCLEAR
命令を使用すると、該当の参照は無効になります。
REFRESH命令
ABAPのREFRESH
命令は、内部テーブルの全ての行を削除し、そのテーブルを空の状態(初期状態)に戻す命令です。
CLEAR
命令と異なり、REFRESH
は個々のデータオブジェクト(変数、構造、など)には使用できません。
REFRESH
命令の基本的な構文は以下の通り。
REFRESH <itab>. * <itab>は初期化したい内部テーブル
具体的な使用例はこちら↓。
DATA: lt_table TYPE TABLE OF string. APPEND 'Hello' TO lt_table. APPEND 'World' TO lt_table. * lt_tableには次の2行が存在: 'Hello' and 'World' REFRESH lt_table. " lt_table is now empty
このコードでは、内部テーブルlt_table
に二つの行('Hello'と'World')を追加した後、REFRESH
命令を使用してlt_table
の全ての行を削除し、テーブルを空の状態に戻しています。
FREE命令
ABAPのFREE
命令は、メモリ領域を解放するために使用され、指定したデータオブジェクト(変数、内部テーブル、構造など)を削除します。
これはCLEAR
命令と異なります。CLEAR
はデータオブジェクトを削除するのではなく、その内容を初期化します。
FREE
命令の基本的な構文は以下の通り。
FREE <data_object>. * <data_object>はメモリから解放したいデータオブジェクト
具体的なサンプルコードは↓の通り。
DATA: lt_table TYPE TABLE OF string. APPEND 'Hello' TO lt_table. " lt_tableには'Hello'というレコードが追加 FREE lt_table. " lt_tableが削除され、メモリが解放される WRITE: / 'After FREE:', lt_table[]. " この行で構文エラーが発生。→FREE命令後ではlt_tableはもはや存在しないからです
この例では、FREE
命令を使用してlt_table
を削除した後、WRITE
命令でlt_table
を参照しようとすると、構文エラーが発生します。
これはlt_table
がすでに存在しないためです。したがって、FREE
命令を使用する場合は、その後のコードで対象としたデータオブジェクトを参照しないように注意する必要があります。
【まとめ】CLEAR命令とFREE命令とREFRESH命令の違い
CLEAR命令とFREE命令とREFRESH命令の基本と、その違いを以下に整理します。
命令 | 基本的な機能 | 内容の影響 | データオブジェクトの存在影響 |
---|---|---|---|
CLEAR命令 | データオブジェクトの内容を初期化 | 内容が初期値にリセット | データオブジェクトは存在し続ける |
REFRESH命令 | 内部テーブルの内容を初期化 | 内容が初期値にリセット | データオブジェクト(内部テーブル)は存在し続ける |
FREE命令 | データオブジェクトのメモリを解放 | 不適用 | データオブジェクトが削除される |
CLEAR命令は、指定されたデータオブジェクト(変数、内部テーブル、構造など)の内容を初期化します。つまり→保持していた値を初期値に戻すが、データオブジェクト自体は存続。
REFRESH命令も同様にデータオブジェクトの内容を初期化。そして、これは内部テーブルに対して使用されます。CLEAR命令同様、データオブジェクト(内部テーブル)自体は存在し続けます。
FREE命令は、データオブジェクト自体を削除し、そのメモリ領域を解放します。そのため、この命令を実行した後では、対象としたデータオブジェクトは存在せず、それに対する操作は構文エラーとなります。
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!