PR

【ABAP】3分で理解する初期化命令:CLEAR/FREE/REFRESH

ABAP

ABAPにおけるCLEAR命令/FREE命令/REFRESH命令は、データオブジェクト(変数・構造・内部テーブル)の初期化を行う命令です。

参考 データオブジェクトとは?

命令基本的な機能内容の影響データオブジェクトの存在影響
CLEAR命令データオブジェクトの内容を初期化内容が初期値にリセットデータオブジェクトは存在し続ける
REFRESH命令内部テーブルの内容を初期化内容が初期値にリセットデータオブジェクト(内部テーブル)は存在し続ける
FREE命令データオブジェクトのメモリを解放不適用データオブジェクトが削除される

このページでは、ABAP初心者向けにわかりやすくサンプルコード付きで3つの命令の基本的な使い方・違いや使い分けを解説します。

このページで学べる内容
  • CLEAR命令の使い方
    • オプション:WITH
  • REFRESH命令の使い方
  • FREE命令の使い方
  • CLEAR/REFRESH/FREEの相違点

SAPエンジニアやABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。

参考 ABAPの基本構文ルール

スポンサーリンク

ABAPにおける初期化とは?

ABAPにおける「初期化」とは、データオブジェクト(変数や内部テーブルなど)をそのデータ型のデフォルト状態、つまり「宣言したときの状態」に戻す操作を指します。

参考 変数 / 内部テーブル

例えば、数値型の変数を初期化するとその値は0に、文字列型の変数を初期化するとその値は空文字列になります。また、内部テーブルを初期化すると、そのテーブルのすべての行が削除されます(=テーブルは空になります)。

初期化の重要性

  1. データの整合性を保つ: 変数を再利用する場合、前の残留データが新しい結果に影響を与える可能性があります。初期化を適切に行うことで、データの整合性と予測可能性を維持することができます。
  2. エラーの防止: 初期化されていない変数は未定義の状態になり得るため、予期しない動作やエラーを引き起こす可能性があります。初期化により、このような問題を防ぐことができます。
  3. リソースの管理: 大きなデータ構造やメモリを大量に消費するオブジェクト(例えば内部テーブル)を使用する場合、初期化を行うことで不要なメモリを削除できるため、パフォーマンスが改善します。

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の値は空文字列になります。

VALUEオプションを用いてABAPで変数を宣言・初期化した場合、その変数は宣言時に指定した値で初期化されます。しかし、その後でCLEAR命令を使用した場合、変数はそのデータ型のデフォルト値(初期値)に設定されます。

内部テーブルを初期化した場合はこちら↓。

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の全ての行を削除し、テーブルを空の状態に戻しています。

CLEAR命令との相違

REFRESH命令は、内部テーブルに対しては基本的にCLEAR命令と同じ動きをしますが、一部異なるのが「ヘッダー付き内部テーブル」に対する処理です。

ヘッダー付き内部テーブルというのは、内部テーブル+構造(作業エリア)が合体した内部テーブルのこと。

REFRESH命令では、このヘッダー付き内部テーブルの「内部テーブル」部分を初期化するのに対して、CLEAR命令では「構造(作業エリア)」部分を初期化します。

上記のような処理を行うことから、変数・構造の初期化はCLEAR命令を。内部テーブルの場合にはREFRESH命令を用いると言うのがひと昔前のABAPの定説でしたが、今ではヘッダー付き内部テーブルがそもそも利用されなくなったため、使い分けは不要となっています。

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をはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?

あなたの技術、もっと価値ある場所で活かしませんか?
SAPエンジニアのキャリア支援はこちらから↓

No.1 > 外資系・IT業界などハイクラスの転職なら【アクシスコンサルティング】blank
4人に1人のコンサルタントが選ぶパートナー!
ビッグ4やアクセンチュアへの転職を実現し年収1000万へ。

No.2 > IT・Web転職特化エージェント【レバテックキャリアblank
blank
サービス利用者数20万人突破。

平均年収アップ率77%であなたの転職成功を保証します。

No.3 > blankリクルートエージェント
blank
\転職支援実績NO.1/

応募が殺到しすぎるが故に・・・非公開にせざるを得ない魅力的な求人が多数!

読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
ABAPSAP
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました