カテゴリ: COBOL 更新日: 2026/01/10

COBOLのREDEFINES句を完全理解!初心者でもわかる多様なデータ表現と編集の基本

REDEFINESを使った多様なデータ表現と編集
REDEFINESを使った多様なデータ表現と編集

先生と生徒の会話形式で理解しよう

生徒

「先生、COBOLのプログラムで同じメモリ領域を別の形で使うことはできますか?」

先生

「はい、それにはREDEFINES(リディファインズ)句を使います。ひとつのデータを、違う形式で見ることができる便利な機能です。」

生徒

「同じデータを違う形で見る?それってどういうことですか?」

先生

「たとえば、“1234”という数字を、文字列として見ることも、数値として扱うこともできる、という感じです。では、実際の使い方を見てみましょう。」

1. REDEFINES句とは?

1. REDEFINES句とは?
1. REDEFINES句とは?

REDEFINES句(リディファインズ句)とは、COBOLで「同じ領域(メモリ)」に別のデータ定義を重ねるための仕組みです。つまり、一つのデータを違う形で再定義して使えるようにします。

たとえば、ひとつの10文字のデータを、最初の5文字と後ろの5文字に分けて扱ったり、文字としても数値としても操作したりできます。

この機能は、昔の大型汎用機でメモリを節約するためによく使われていましたが、今でも「入力データを多様に解釈する」ときや「ファイルの形式を変換する」ときに便利です。

2. REDEFINES句の基本的な書き方

2. REDEFINES句の基本的な書き方
2. REDEFINES句の基本的な書き方

まずは基本の構文を見てみましょう。


01  ORIGINAL-DATA     PIC X(10).
01  REDEFINED-DATA    REDEFINES ORIGINAL-DATA PIC 9(10).

この例では、ORIGINAL-DATAという10文字の項目を定義し、それと同じメモリ領域にREDEFINED-DATAという数値項目を重ねています。

つまり、ORIGINAL-DATAに文字を入れても、それはREDEFINED-DATAから数値として参照できます。両者は同じ場所を使っているため、データの内容は共有されます。

3. 実際にREDEFINES句を使ってみよう

3. 実際にREDEFINES句を使ってみよう
3. 実際にREDEFINES句を使ってみよう

では、実際にサンプルプログラムで動作を確認してみましょう。


IDENTIFICATION DIVISION.
PROGRAM-ID. REDEFINE-DEMO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  INPUT-DATA        PIC X(10) VALUE "1234567890".
01  NUMERIC-DATA      REDEFINES INPUT-DATA PIC 9(10).
PROCEDURE DIVISION.
    DISPLAY "文字列としての値:" INPUT-DATA
    DISPLAY "数値としての値 :" NUMERIC-DATA
    STOP RUN.

このプログラムの実行結果は次のようになります。


文字列としての値:1234567890
数値としての値 :1234567890

このように、同じ領域のデータを文字としても数値としても扱えるようになります。

4. REDEFINESを使った部分分割の例

4. REDEFINESを使った部分分割の例
4. REDEFINESを使った部分分割の例

REDEFINESは、ひとつの大きなデータを複数の小さなデータに分けて扱うときにも便利です。たとえば、10文字の社員情報を「社員番号」と「部署コード」に分割したい場合です。


01  EMPLOYEE-INFO         PIC X(10).
01  EMPLOYEE-DETAIL REDEFINES EMPLOYEE-INFO.
    05  EMP-ID             PIC X(5).
    05  DEPT-CODE          PIC X(5).
PROCEDURE DIVISION.
    MOVE "A1234HR001" TO EMPLOYEE-INFO
    DISPLAY "社員番号:" EMP-ID
    DISPLAY "部署コード:" DEPT-CODE
    STOP RUN.

出力結果は次の通りです。


社員番号:A1234
部署コード:HR001

このように、REDEFINESを使えば、大きなデータを小さな構造に分けてアクセスすることができます。ファイルの1行にいろいろな情報が詰め込まれている場合などに、非常に役立ちます。

5. REDEFINESと編集記号の組み合わせ

5. REDEFINESと編集記号の組み合わせ
5. REDEFINESと編集記号の組み合わせ

REDEFINES句は、編集記号(EDITED PICTURE)と組み合わせることで、見やすい形式に変換することもできます。

たとえば、内部的には「123456」という数字を保持していても、出力するときに「123,456」とカンマ区切りで見せたいときがあります。


01  SALES-AMOUNT         PIC 9(6) VALUE 123456.
01  SALES-FORMAT REDEFINES SALES-AMOUNT PIC ZZ,ZZZ.
PROCEDURE DIVISION.
    DISPLAY "編集前の数値:" SALES-AMOUNT
    DISPLAY "編集後の出力:" SALES-FORMAT
    STOP RUN.

出力結果は次のようになります。


編集前の数値:123456
編集後の出力:123,456

このように、REDEFINESを使うことで、内部データを再定義して見た目を整えることが簡単にできます。帳票出力や画面表示を整えるときにとても便利なテクニックです。

6. REDEFINESを使うときの注意点

6. REDEFINESを使うときの注意点
6. REDEFINESを使うときの注意点

REDEFINESは便利ですが、使い方を誤るとバグの原因になります。特に気をつけたいポイントを紹介します。

  • データ長を一致させること:再定義する項目は、元の項目と同じバイト数にする必要があります。異なると予期せぬ結果になります。
  • REDEFINESは同じレベルで使う:例えばどちらも01レベルに書く必要があります。
  • 変更が共有される:どちらかのデータを変更すると、もう一方にも影響します。別のメモリではない点に注意しましょう。

つまり、REDEFINESは「同じ箱に違うラベルを貼る」ようなものです。中身は一つだけなので、どちらかのラベルから中身を変えれば、もう一方にも反映されます。

7. 実務での活用例

7. 実務での活用例
7. 実務での活用例

実際の業務システムでは、ファイルの中に「レコードタイプ(種類)」があり、内容の形式が異なるケースがあります。このとき、REDEFINESを使うことで、1つの領域を複数のパターンで解釈できます。


01  FILE-RECORD.
    05  RECORD-TYPE     PIC X(1).
    05  RECORD-BODY     PIC X(19).

01  TYPE-A-RECORD REDEFINES FILE-RECORD.
    05  RECORD-TYPE     PIC X(1).
    05  NAME            PIC X(10).
    05  AGE             PIC 9(2).
    05  CITY            PIC X(7).

01  TYPE-B-RECORD REDEFINES FILE-RECORD.
    05  RECORD-TYPE     PIC X(1).
    05  ITEM-NAME       PIC X(10).
    05  PRICE           PIC 9(5).
    05  UNIT            PIC X(4).

このようにしておけば、RECORD-TYPEが"A"ならTYPE-A-RECORDとして、"B"ならTYPE-B-RECORDとして扱うことができます。複数形式のデータを1つの構造で管理できるのがREDEFINESの強みです。

8. REDEFINESでデータの見方を切り替えよう

8. REDEFINESでデータの見方を切り替えよう
8. REDEFINESでデータの見方を切り替えよう

REDEFINES句は、ひとつのデータを複数の形で扱うための強力なツールです。文字列を数値に変えたり、1つのデータを細かく分解したり、帳票用に整形したりと、幅広い使い道があります。COBOLのデータ構造を理解する上で、とても重要な概念ですので、ぜひ実際に動かして理解を深めてみましょう。

まとめ

まとめ
まとめ

COBOLのREDEFINES句について、ここまで学んできた内容をあらためて丁寧に振り返っていきます。ひとつの領域を複数の形で読み替えるという考え方は、初めて触れる人にとってはやや独特に感じられることがあります。しかし、実務で大量のデータを扱う場面や昔ながらの仕組みを維持しながら改修していく場面では、この柔軟な再定義の力がとても頼もしい武器になります。たとえば入力された十文字の情報を文字列として処理したり、数値として解釈したり、あるいは前半と後半に分割したりと、同じ領域から複数の意味を読み取れるのはREDEFINESならではの強みです。さらに規模の大きな業務ファイルでは種類の異なるレコードが一つにまとめられることが多く、そのような場合に複数の構造を重ねて柔軟に読み替える手法は、長い時間をかけて積み上げられたシステムの世界と向き合う上で欠かせない技術です。 また、内部で保持しているデータを編集記号と組み合わせて見やすい形式に整えるという使い方も、帳票や照会画面では非常に役立ちます。業務システムでは、数字をカンマ区切りにしたり、決められた桁数に揃えて出力したりと、読み手にとって理解しやすい形に調整する作業が日常的に発生します。こうした場面でREDEFINESと編集用ピクチャを併用すれば、内部の保持形式を変えずに出力だけ整形することができ、プログラムの修正範囲を必要最小限に抑えることができます。このような仕組みは一見地味に思えるかもしれませんが、大量のデータを扱う現場ではとても大切な工夫となります。 しかしながら便利な機能である一方、どちらのデータ定義も同じ領域を共有しているという点には最大限の注意が必要です。たとえば片方の項目に値を入れれば、もう片方にも影響が及びます。これはまさに「ひとつの箱に複数のラベルを貼っている」ような状態であり、常に中身はひとつしか存在しません。そのため、項目の長さが一致しているかどうか、レベル番号の整合性は取れているか、必要のないタイミングで値を書き換えていないかといった、細かい部分への気配りが非常に重要になります。こうしたポイントを押さえておくことで、意図せずデータが壊れてしまうといった誤りを防ぎ、安定したプログラムを作ることができます。 実際の業務では、レコードタイプごとに構造が変わる複雑なファイルを扱ったり、大きな文字列から決められた範囲だけを切り取って使ったりする場面が日常的に発生します。そうしたとき、複数のフォーマットを自然に切り替えられるREDEFINESは、作業をスムーズに進める上で欠かせない存在となります。特に古くから続く業務システムでは、ひとつのレコードにさまざまな情報が詰め込まれていることも多く、複数の形式を重ねて使える柔軟性は貴重です。一見複雑に見えますが、一度仕組みを理解すると非常に扱いやすく、データの扱い方を広げてくれる大切な概念であることが理解できるはずです。 では、最後に小さなサンプルをもう一度示しつつ、今回の学びをしっかりと締めくくっていきましょう。

サンプルプログラムの再確認


01  SAMPLE-DATA        PIC X(8) VALUE "20240101".
01  SAMPLE-PART REDEFINES SAMPLE-DATA.
    05  SAMPLE-YEAR    PIC X(4).
    05  SAMPLE-MONTH   PIC X(2).
    05  SAMPLE-DAY     PIC X(2).

上記のような構造にしておけば、一つの文字列から年、月、日を自然に分割して扱うことができます。日付処理が必要なプログラムでは、このように元のデータを複数の見方で使える手法が役に立ちます。どの場所から何文字取り出すかがはっきりしている場合には、REDEFINESはとても読みやすく整理された記述となります。

先生と生徒の振り返り会話

生徒

「先生、REDEFINESって最初は難しそうに感じましたけど、ひとつのデータをいろいろな形で使えるってすごく便利ですね。」

先生

「そうですね。特に業務システムでは、多様な形式のデータを効率よく扱える仕組みが必要になります。REDEFINESはその代表的な方法です。」

生徒

「部分的に分けて使える例とか、レコードタイプで構造を切り替える例を見て、実務でもよく使われている理由がわかりました。」

先生

「実際のファイルでは一つの行にたくさんの情報が並んでいることも多いので、同じ領域に複数の構造を持てるのはとても便利です。ただし、影響し合うという点だけは忘れずにね。」

生徒

「はい。データ長を合わせたり、どの構造を使っているかを意識したり、注意すべきポイントもちゃんと覚えておきます!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

COBOLのREDEFINES句とは何ですか?

REDEFINES句は、COBOLで同じメモリ領域を複数の異なるデータ構造として再定義できる機能です。これにより、同じデータを文字列や数値など別の形で扱うことが可能になります。
カテゴリの一覧へ
新着記事
New1
C#
C#のLINQでAny・Allなど条件確認メソッドの使い方を完全ガイド!初心者でもわかるデータ検証
New2
C#
C#のデフォルト引数と名前付き引数の使い方を解説!初心者でも安心のやさしい入門
New3
C#
C#のオブジェクト初期化子を完全ガイド!初心者でもわかる便利な使い方
New4
COBOL
COBOLの帳票出力と編集を完全マスター!条件付き表示で分かりやすい書類を作る方法
人気記事
No.1
Java&Spring記事人気No1
C#
C#でJSONファイルを読み書きする方法(JsonSerializer・Newtonsoft.Json)
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.4
Java&Spring記事人気No4
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.5
Java&Spring記事人気No5
C#
C#のLINQクエリ構文の書き方と基本操作をマスターしよう
No.6
Java&Spring記事人気No6
C#
C#のLINQ(リンク)とは?基本概念とデータ操作を初心者向けに徹底解説!
No.7
Java&Spring記事人気No7
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法
No.8
Java&Spring記事人気No8
C#
C#の非同期処理とUIスレッドをマスター!WPF/WinFormsでアプリが止まる問題を解決