[Javaの定式]Chapter 6オブジェクト向けプログラミング(09-10)


Chapter 6. オブジェクト向けプログラミング


09.クラスの定義(1)-データと関数の結合


  • データストレージ形式プログラミング言語におけるデータ処理の発展過程
  • 変数:単一データを格納するスペース
  • アレイ:同じタイプの複数のデータを1つのセットに格納できるスペース
  • 構造体:複数の相互に関連付けられたデータを1つの集合に格納できるスペース
  • クラス:データと関数の結合(構造体+関数)

  • 関数は主にデータを処理するので、多くの場合、データと関数の関係は非常に密接です.

  • Javaなどのオブジェクト向け言語では、相互に関連付けられた変数と関数を共通に処理するために、関数と変数(データ)をクラスに定義できます.

  • クラスは、相互に関連する変数と、それらに対して操作を実行する関数を定義します.

  • C言語では文字列は文字の配列であり、Javaでは文字列はStringというクラスである.
    ▶文字列を単純な文字配列ではなくクラスとして定義するのは、文字列と文字列を扱うために必要な関数を組み合わせるためです
  • public final class String implements java.io.Serializable, Comparable {
    	private char[] value; //문자열을 저장하기 위한 공간
        
        public String replace(char oldChar, char newChar) {
        	...
            char[] val = value; //같은 클래스 내의 변수를 사용해서 작업
            ...
        }
        ...

    10.クラスの定義(2)-カスタムタイプ

  • 사용자정의 타입(user-defined type):プログラミング言語で提供される基本資料型(primitive type)に加え、プログラマは相互に関連する変数を組み合わせて、新しい変数を1つのタイプで追加
  • Javaなどのオブジェクト向け言語のクラスがカスタムタイプ
  • 基本型の個数は8個とするが、参照型の個数が確定していないのはプログラマが新しいタイプを追加できるから
  • ▶ 시간을 표현하기 위해 3개의 변수를 선언
    int hour; //시간을 표현하기 위한 변수
    int minute; //분을 표현하기 위한 변수
    float second; //초를 표현하기 위한 변수, 1/100초 까지 표현하기 위해 float사용
    
    ▶만일 3개의 시간을 다뤄야 한다면 아래와 같음
    int hour1, hour2, hour3;
    int minute1, minute2, minute2;
    float second1, second2, second3;
    
    ▶다뤄야 하는 시간의 개수가 늘어날 때마다 시,,초를 위한 변수도 추가해줘야 하는데 
    데이터의 개수가 많으면 배열로 처리
    int[] hour = new int[3];
    int[] minute = new int[3];
    float[] second = new float[3];
    → 시간 데이터의 개수가 늘어나더라도 배열의 크기만 변경해주면 되므로, 
    변수를 매번 새로 선언해야하는 불편함은 사라짐
    
    ▶하나의 시간을 구성하는 시,,초가 서로 분리되어 있기 때문에 프로그램 수행과정에서
    시,,초가 따로 뒤섞여 올바르지 않은 데이터가 될 가능성이 있기때문에 
    시,, 초를 하나로 묶는 사용자정의 타입, 즉 클래스를 정의하여 사용
    class Time {
    	int hour;
        int minute;
        float second;
    }

    🍉 非オブジェクトコードとオブジェクトコード

    <비객체지향적 코드>
    int hour1, hour1, hour3;
    int minute1, minute2, minute3;
    float second1, second2, second3;
    
    int[] hour = new int[3];
    int[] minute = new int[3];
    float[] second = new float[3];
    
    <객체지향적 코드>
    Time t1 = new Time();
    Time t2 = new Time();
    time t3 = new Time();
    
    Time[] t = new Time[3];
    t[0] = new Time();
    t[1] = new Time();
    t[2] = new Time();
  • 時・分・秒を1単位で組み合わせて処理し、他の時間データと混同することはないが、時間データには別途の制約がある
  • 時、分、秒ともにゼロ以上
  • 時の範囲は0~23、分と秒の範囲は0~59
  • 対象言語で使用する제어자메서드条件コードを簡単に反映できる
  • <조건반영하여 Time클래스 작성>
    public class Time {
    	private int hour;
        private int minute;
        private float second;
        
        //hour의 값을 변경하기 위한 메서드. 지정한 값이 0보다 작거나 23보다 크면 
        //즉, 유효한 값이 아니면 변경하지 않고 메서드를 종료(return)함
        public void setHour(int h) {
        	if(h<0 || h>23) return;
            hour = h; //지정된 값(h)이 유효한 경우에만 hour를 변경
            }
            ...
     }
  • 使用制御者は変数の値を直接変更することを許さず、メソッドによる値変更を記述する
  • 値を変更する場合、条件文で指定した値の有効性をチェックしてから有効値に変更する