COBOLのCALL BY REFERENCEとCALL BY CONTENTの違いを完全解説!初心者向けにやさしく解説
生徒
「先生、COBOLのCALL文では、BY REFERENCEとかBY CONTENTって出てきますが、どういう意味ですか?」
先生
「とても大事なところですね。これは、データの渡し方の違いを表す指定です。つまり、プログラム間でどうやって情報を受け渡すか、ということを決めているんですよ。」
生徒
「なるほど…でもイメージがわきません。違いをやさしく教えてください!」
先生
「もちろんです。日常の例を交えながら、CALL BY REFERENCEとCALL BY CONTENTの違いをわかりやすく説明していきましょう!」
1. CALL BY REFERENCEとCALL BY CONTENTとは?
COBOLのCALL文では、サブルーチンにデータ(変数)を渡すとき、BY REFERENCE(バイ・リファレンス)またはBY CONTENT(バイ・コンテント)を使って、渡し方を指定することができます。
簡単に言うと、次のような違いがあります:
- BY REFERENCE:「本物の箱」を渡す(変更可能)
- BY CONTENT:「箱の中身のコピー」を渡す(変更不可)
ここでいう「箱」とは変数そのもの、「中身」はその値を指します。
たとえば、お弁当箱を貸す場面を想像してみてください。
- BY REFERENCE:お弁当箱ごと友達に渡す。中身を食べられたり、詰め直されたり、変更される。
- BY CONTENT:お弁当の中身だけを取り分けて渡す。自分の箱には影響がない。
これが、CALL BY REFERENCEとCALL BY CONTENTの基本的な考え方です。
2. CALL BY REFERENCEの特徴と使い方
CALL BY REFERENCE(参照渡し)は、呼び出し元の変数の「場所」そのものを渡す方法です。サブルーチン内で変更すると、呼び出し元の変数にも影響が及びます。
構文は次のようになります:
CALL 'UPDATE-PROG' USING BY REFERENCE USER-AGE
サブルーチン側:
LINKAGE SECTION.
01 AGE-IN PIC 99.
PROCEDURE DIVISION USING AGE-IN.
ADD 1 TO AGE-IN
EXIT PROGRAM.
実行結果:
USER-AGE = 20 → CALL実行後 → USER-AGE = 21
このように、呼び出し先で変数の中身を変更すると、呼び出し元の変数にも変更が反映されます。
3. CALL BY CONTENTの特徴と使い方
CALL BY CONTENT(値渡し)は、変数の「中身だけのコピー」を渡します。サブルーチン内で値を変更しても、元の変数には影響しません。
構文は次のようになります:
CALL 'UPDATE-PROG' USING BY CONTENT USER-AGE
サブルーチン側:
LINKAGE SECTION.
01 AGE-IN PIC 99.
PROCEDURE DIVISION USING AGE-IN.
ADD 1 TO AGE-IN
EXIT PROGRAM.
実行結果:
USER-AGE = 20 → CALL実行後 → USER-AGE = 20(変わらない)
このように、サブルーチン内で変更があっても、呼び出し元には一切影響しません。
4. COBOLにおけるデフォルトの渡し方
COBOLでは、特に指定しない場合、CALL BY REFERENCEがデフォルトとなります。
つまり、次のように書いた場合:
CALL 'TEST-PROG' USING MY-DATA
これは内部的に次のように扱われます:
CALL 'TEST-PROG' USING BY REFERENCE MY-DATA
したがって、意図しないデータの変更を防ぎたい場合は、明示的にBY CONTENTを指定するのが安心です。
5. CALL BY REFERENCEとCONTENTの使い分け例
COBOLプログラミングでは、次のように使い分けるのが一般的です:
- BY REFERENCE:結果を呼び出し元に返したい場合(計算結果など)
- BY CONTENT:参照だけしたい、変更されたくない値を渡すとき(設定値など)
たとえば「社員の給与計算」で、基準の税率はBY CONTENTで渡して変更させず、給与額はBY REFERENCEで渡してサブルーチンで計算・更新させる、というような使い方です。
6. CALL BY REFERENCEとCONTENTのまとめ図
イメージしやすくするために、図で違いをまとめます:
【BY REFERENCE】
┌──────────────┐
│呼び出し元の変数(箱)│←─────────────┐
└──────────────┘ │
↑ │
(中身が変わる) │
│ │
┌──────────────┐ CALLで渡す
│呼び出し先の変数(同じ箱)│─────────────┘
└──────────────┘
【BY CONTENT】
┌──────────────┐
│呼び出し元の変数(箱)│
└──────────────┘
│
(変わらない)
│
┌──────────────┐
│呼び出し先の変数(コピー)│
└──────────────┘
7. CALL BY VALUEとの違いは?
COBOLにはCALL BY VALUEという別の渡し方もありますが、これは主にCOBOLとCなどの外部言語との連携で使われる特殊な方法です。通常のCOBOLアプリケーションではあまり使われません。
初心者の方は、CALL BY REFERENCEとCALL BY CONTENTの違いをしっかり理解することが大切です。
まとめ
COBOLのCALL BY REFERENCEとCALL BY CONTENTは、サブルーチンにデータを渡す際の基本的かつ重要な仕組みであり、それぞれの特徴を理解することでプログラム全体の安全性や可読性が大きく向上します。参照渡しと値渡しの違いは、一見すると単純に思えますが、実務に踏み込むほどその使い分けの重要性が深まっていきます。参照渡しは「実体そのもの」を渡すため、サブルーチン側での変更がそのまま呼び出し元へ反映されるという特徴があります。これは計算結果や更新処理を行う場面で非常に便利であり、COBOLでもっとも一般的に使われる渡し方です。
一方で、値渡しは「中身のコピー」を渡す方法であり、サブルーチン側でいくら値を変更しても呼び出し元には影響が出ません。変更されると困る設定値や基準情報、読み取り専用データを扱う場面では非常に重宝され、安全に処理を進められる大切な方法です。こうした動作の違いは、業務システムの安定性や正確な処理に直結するため、初心者であっても必ず理解しておきたい基礎知識です。
また、COBOLでは指定がない場合はBY REFERENCEがデフォルトで適用されるため、無意識のうちに値が変更されるトラブルが発生する可能性があります。そのため、意図しない書き換えを防ぐためにも、BY CONTENTを明示する習慣を身につけておくと安心です。特に大規模なシステム開発においては、データの渡し方を正しく設計することが品質保守やバグ防止に大きく寄与します。
さらに、CALL BY VALUEについても触れましたが、これはCOBOL単体ではあまり使用されないものの、外部言語との連携を行う際に重要な要素になります。幅広い応用を目指す場合、BY REFERENCE、BY CONTENT、BY VALUEの三つを正しく理解しておくことで、安全で堅牢なプログラム設計ができるようになります。
サンプルプログラム:RESPONSE-CODEで渡し方の変化を確認する
IDENTIFICATION DIVISION.
PROGRAM-ID. CALL-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-AGE PIC 99 VALUE 30.
01 WS-STATUS PIC X(20).
PROCEDURE DIVISION.
CALL "AGE-UP" USING BY REFERENCE WS-AGE WS-STATUS
DISPLAY "参照渡し後 年齢: " WS-AGE
DISPLAY "参照渡し後 状態: " WS-STATUS
MOVE 30 TO WS-AGE
CALL "AGE-UP" USING BY CONTENT WS-AGE WS-STATUS
DISPLAY "値渡し後 年齢: " WS-AGE
DISPLAY "値渡し後 状態: " WS-STATUS
STOP RUN.
IDENTIFICATION DIVISION.
PROGRAM-ID. AGE-UP.
DATA DIVISION.
LINKAGE SECTION.
01 LK-AGE PIC 99.
01 LK-STATUS PIC X(20).
PROCEDURE DIVISION USING LK-AGE LK-STATUS.
ADD 5 TO LK-AGE
MOVE "年齢更新済み" TO LK-STATUS
EXIT PROGRAM.
上記のように、参照渡しではLK-AGEを変更するとそのままWS-AGEに反映されますが、値渡しではLK-AGEがコピーとして扱われるため、WS-AGEには影響がありません。一方で、文字列である状態情報も参照渡しの場合は書き換わりますが、値渡しであれば安全に扱うことができます。こうした動作の違いを理解しておくと、プログラムの誤動作や意図しない更新ミスを防ぐことができるため、非常に重要な知識となります。
実務では、社員情報、顧客データ、売上計算、金額更新といった場面で参照渡しが多く使われ、一方で定数設定、基準値、変わっては困る管理コードなどは値渡しが選ばれます。場面に応じて正しく使い分けることが、COBOLプログラミングにおける安定した処理の鍵になります。今回学んだ内容は、COBOL初心者が最初に理解すべき重要テーマであり、業務システムでも頻繁に登場するため、繰り返し練習しながら身につけると良いでしょう。
生徒
「今日の内容を学んで、BY REFERENCEとBY CONTENTの違いがようやく理解できました!」
先生
「よかったです。特に参照渡しは値が変わるので、慎重に使う必要がありますからね。」
生徒
「値渡しはコピーなので、サブルーチンの中で変更しても安心なんですよね?」
先生
「その通りです。設定値や基準値など、変更されたくないデータにはとても有効です。」
生徒
「参照渡しと値渡しを使い分けることで、安全で正確なプログラムが作れると感じました。」
先生
「その感覚は大切ですね。COBOLではデータの扱い方が処理の結果を大きく左右しますから、今回の理解はとても重要です。」
生徒
「もっと練習して、間違えないように書けるようになりたいです!」
先生
「ぜひ続けてください。渡し方を正しく理解すれば、どんなサブルーチンでも自在に扱えるようになりますよ。」