オブジェクト向け言語


1.対象言語


オブジェクト向け言語は、既存のプログラミング言語とはまったく異なり、既存のプログラミング言語に新しいルールを追加します.ルールを利用してコード間の相互関係を確立し,プログラムを有機的に組織することである.
オブジェクト向け言語の主な特徴は次のとおりです.
-コードの再利用性が高い.
新しいコードを作成する場合は、既存のコードを使用して簡単に作成できます.
-コードの管理は簡単です.
コード間の関係を利用すると、少ないワークロードでコードを簡単に変更できます.
-プログラミングをより確実にします.
制御者と方法を使用して、データを保護し、正しい値を維持し、コード冗長性を解消し、コードの不一致による誤動作を防止することができます.
オブジェクト向けプログラミングでは,プログラマがマクロ的な観点から設計する能力が要求されるため,プログラムの作成が困難である.オブジェクト向けのプログラミングにこだわりすぎて悩むよりも、プログラムの機能性を完成してから、オブジェクト向けにコードを改善する方法を徐々に改善します.

2.クラスとオブジェクト


2-1. クラスとオブジェクトの定義と用途


クラスは、「定義済みオブジェクト」または「オブジェクトの設計図またはフレームワーク」として定義できます.
クラスはオブジェクトを作成するために使用され、オブジェクトはクラス定義で作成されます.
クラスの定義-クラスとは、オブジェクトが定義されていることを意味します。 クラスの用途-オブジェクトの作成にクラスを使用します。

オブジェクトの事前定義は、「実際に存在する」です.私たちの周りに見える書城、椅子、車などが客体です.客体指向理論では,物事という有形のものを客体と見なすだけでなく,概念や論理という無形のものを客体と見なす.
プログラミング内のオブジェクトは、クラスで定義されているようにメモリで作成されます.
オブジェクトの定義-実際に存在します。物事や概念 オブジェクトの用途-オブジェクトの機能と属性によって異なります。 タイプオブジェクト-テーブル、椅子、自動車など 無形オブジェクト-数式、プログラムエラーなどの論理または概念

クラスは、オブジェクト自体ではなくオブジェクトの作成にのみ使用されます.目的の機能オブジェクトを使用するには、まずクラスからオブジェクトを作成します.
JDK(Java Development Kit)はプログラミングに多くの有用なクラス(Java API)を提供しており、これらのクラスを使用して必要な機能のプログラムをより簡単に作成することができます.

2-2. オブジェクトとインスタンス


クラスからオブジェクトを作成するプロセスをクラスのインスタンス化(instactiate)と呼び、あるクラスから作成されたオブジェクトをクラスのインスタンス(instance)と呼ぶ.
インスタンスとオブジェクトは同義語であるため、2つの用語の使用を厳密に区別する必要はないが、コンテキストによって区別することが望ましい.
たとえば、「テーブルはインスタンス」です.さらに重要なのは「テーブルは客体」「テーブルはテーブル類の対象」さらに重要なのは「テーブルはテーブル類の例」です.そう言えばもっと自然だ.
import java.io.FileWriter;
import java.io.IOException;
public class OthersOOP {
	public static void main(String[] args) throws IOException {
		// FileWriter 타입의 변수f1을 생성 하고 f1은 FileWriter의 복제본이다
		FileWriter f1 = new FileWriter("Data.txt");
		f1.write("Hello");
		f1.write(" Java");
		f1.close();
		
		FileWriter f2 = new FileWriter("Data2.txt");
		f2.write("Hello");
		f2.write(" Java");
		f2.close();
	}
}
インスタンスは参照変数でのみ処理できますが、参照変数のタイプはインスタンスのタイプと一致する必要があります.
  • 参照変数を宣言するときは、変数のタイプとしてクラスの名前を使用するため、クラスの名前は参照変数のタイプです.
    したがって、新しいクラスを作成することは、新しい参照タイプを追加することに相当します.
  • 2-3. オブジェクトのコンポーネント-属性と機能


    オブジェクトはプロパティと機能の2つのコンポーネントで構成され、通常、オブジェクトには複数のプロパティと複数の機能があります.すなわち,オブジェクトは属性と機能の集合といえる.また、オブジェクトが持つ属性および機能は、オブジェクトのメンバ(구성원, member)と呼ばれる.
    オブジェクト-複数のプロパティと複数の機能のセット。 属性と機能-メンバー(メンバー、メンバー)

    クラスはオブジェクトを定義するため、クラスはオブジェクトのすべての属性と機能を定義します.クラスからオブジェクトを作成すると、クラスで定義された属性と機能を持つオブジェクトが作成されます.
    属性と機能には以下のような意味を持つ様々な用語があり、今後は主に「属性」ではなく「メンバー変数」、「機能」を「方法」ではなく「メンバー変数」を使用する。 属性(property)-メンバー変数(membervariable)、属性(attribute)、フィールド(field)、ステータス(state) 機能(function)-メソッド、関数(function)、動作(behavior)

    オブジェクト向けプログラミングは,属性と機能をそれぞれ変数と方法として表す.
    プロパティ->メンバー変数(variable) 機能(function)->メソッド(method) チャネル->int channel チャンネルを上げる

    上で分析した内容に基づいて、以下のようにTvクラスを作成します.
    class Tv {
       
       String color;	// 색상
       Boolean power;	// 전원상태
       int channel;		// 채널
       
       void power()   { power = !power; }
       void channelUp()   { channel++; }
       void channelDown()   { channel--; }
    }
    各変数の資料型は、属性値に適したものを選択します.電源ステータス(Power)の場合.onとoffの2つの値があるのでboolean型と宣言します.
    Power()の「Power=!power;' この記事では、powerの値をtrueからfalse、falseからtrueに変更します.Powerの値にかかわらず、逆の値に変更すればよいのでif文を使用する必要はありません.

    2-4. インスタンスの作成と使用


    TvクラスはTv設計図を作成しただけであることを宣言し、製品(Tv)を使用するにはTvインスタンスを作成する必要があります.クラスからインスタンスを作成する方法はいくつかありますが、通常は次のとおりです.
    클래스명 변수명;		// 클래스의 객체를 참조하기 위한 참조변수를 선언
    변수명 = new 클래스명();	// 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
    
    Tv t;		// Tv클래스 타입의 참조변수 t를 선언
    t = new Tv();	// Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

    例6-1

    class Tv {
    	// Tv의 속성(멤버변수)
    	String color;	// 색상
    	Boolean power;	// 전원상태
    	int channel;	// 채널
    
    	// Tv의 기능(메서드)
    	void power()	{ power = !power; }	// Tv를 켜거나 끄는 기능을 하는 메서드
    	void channelUp()	{ channel++; }	// Tv의 채널을 높이는 기능을 하는 메서드
    	void channelDown()	{ channel--; }	// Tv의 채널을 낮추는 기능을 하는 메서드
    	}
    
    class Tvtest {
    	public static void main(String args[]) {
    		Tv t;				// Tv인스턴스를 참조하기 위한 변수 t를 선언
    		t = new Tv();		// Tv인스턴스를 생성한다.
    		t.channel = 7;		// Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
    		t.channelDown();	// Tv인스턴스의 메서드 channelDown()을 호출한다.
    		System.out.println("현재 채널은 " + t.channel + "번 입니다.");
    	}
    }
  • インスタンスは参照変数のみで処理できます.参照変数のタイプはインスタンスのタイプと一致する必要があります.
  • 例6-2

    class Tv {
    	// Tv의 속성(멤버변수)
    	String color;	// 색상
    	Boolean power;	// 전원상태(on/off)
    	int channel;	// 채널
    	
    	// Tv의 기능(메서드)
    	void power() { power = !power; }	// TV를 켜거나 끄는 기능을 하는 메서드
    	void channelUp()  { ++channel; }	// TV의 채널을 높이는 기능을 하는 메서드
    	void channelDown() { --channel; }	// TV의 채널을 낮추는 기능을 하는 메서드
    }
    
    public class TvTest2 {
    	public static void main(String[] args) {
    		Tv t1 = new Tv();	// Tv t1; t1 = new Tv(); 와 동일
    		Tv t2 = new Tv();
    		
    		t1.power = true; // t1.power()메서드를 이용할 수도 있다.
    		t2.power = true;
    		System.out.println(t1.power);
    		System.out.println(t2.power);
    		
    		t1.channel = 7;	// channel 값을 7으로 한다.
    		t2.channel = 7;
    		System.out.println("t1의 channel값을 " + t1.channel + "로 변경하였습니다.");
    		System.out.println("t2의 channel값을 " + t2.channel + "로 변경하였습니다.");
    		
    		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
    		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    
    		t1.channelUp();
    		t2.channelDown();
    		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
    		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    	}
    }

    例6-3

    class Tv {
    	// Tv의 속성(멤버변수)
    	String color;	// 색상
    	Boolean power;	// 전원상태(on/off)
    	int channel;	// 채널
    	
    	// Tv의 기능(메서드)
    	void power() { power = !power; }	// TV를 켜거나 끄는 기능을 하는 메서드
    	void channelUp()  { ++channel; }	// TV의 채널을 높이는 기능을 하는 메서드
    	void channelDown() { --channel; }	// TV의 채널을 낮추는 기능을 하는 메서드
    }
    
    public class TvTest3 {
    	public static void main(String[] args) {
    		Tv t1 = new Tv();	// Tv t1; t1 = new Tv(); 와 동일
    		Tv t2 = new Tv();
    		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
    		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    		
    		t2 = t1;	// t1이 저장하고 있는 값(주소)를 t2에 저장한다.
    		t1.channel = 7;	// channel 값을 7으로 한다.
    		System.out.println("t1의 channel값을 " + t1.channel + "로 변경하였습니다.");
    		
    		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
    		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
    	}
    }
    t 1は、インスタンスのアドレスを格納する参照変数である.この文を実行すると、t 2が持つ値は失われ、t 1に格納された値はt 2に保存されます.これにより、t 2はt 1が参照したインスタンスを同時に参照し、t 2が元に参照したインスタンスは使用できなくなる.

    2-5. オブジェクト配列


    大量のオブジェクトを処理する場合、オブジェクトを配列で処理することもできます.これを「オブジェクト配列」と呼びます.ただし,オブジェクトはオブジェクト配列に格納されるのではなく,オブジェクトのアドレスを格納する.実際、オブジェクト配列は、参照変数を組み合わせた参照変数配列である.
    Tv tv1, tv2, tv3; // Tv의 객체. tv1,2,3선언
    Tv[] tvArr = new Tv[3]; // 위 코드를 배열로 표현.(길이가 3인 Tv타입의 참조변수 배열)
    オブジェクト配列の作成は、オブジェクトを処理するための参照変数が作成されただけで、オブジェクトは保存されていません.オブジェクトを作成し、オブジェクト配列の各要素に格納することを忘れないでください.よくこんな間違いを犯す.
    Tv[] tvArr = new Tv[3]; // 객체배열 선언과 생성
    
    // 객체를 생성해서 배열의 각 요소에 저장
    tvArr[0] = new Tv();
    tvArr[1] = new Tv();
    tvArr[2] = new Tv();
    アレイの初期化ブロックを投影する場合は、次の行に簡略化できます.
    Tv[] tvArr = { new Tv(), new Tv(), new Tv()};
    処理するオブジェクトの数が多い場合はfor文を使用します.
    Tv[] tvArr = new Tv[100];
    
    for(int i=0; i<tvArr.length; i++) {
    	tvArr[i] = new Tv();
    }

    例6-4

    class Tv2 {
    	// Tv2의 속성(멤버변수)
    	String color;
    	boolean power;
    	int channel;
    	
    	// Tv2의 기능(메서드)
    	void power() { power = !power;}
    	void channelUp() { ++channel;}
    	void channelDown() { --channel;}
    }
    
    class TvTest4 {
    
    	public static void main(String[] args) {
    		Tv2[] tvArr = new Tv2[3];	// 길이가 3인 Tv객체배열
    		
    		// Tv2객체를 생성해서 Tv2객체 배열의 각 요소에 저장
    		for(int i=0; i < tvArr.length; i++) {
    			tvArr[i] = new Tv2();
    			tvArr[i].channel = i+10; // tvArr[i]의 channel에 i+10을 저장
    		}
    		for(int i=0; i < tvArr.length; i++) {
    			tvArr[i].channelUp(); // channelUp메서드 호출로 인해 channel이 1 증가
    			System.out.println("tvArr[" + i + "].channel=" + tvArr[i].channel);
    		}
    	}
    }

    2-6. クラスの別の定義


    カスタムタイプ


    プログラミング言語で提供される資料型に加えて、プログラマーは相互に関連する変数を組み合わせて、カスタムタイプと呼ばれる新しいタイプを追加することもできます.
    他のプログラミング言語でもカスタムタイプを定義する方法が提案されており,Javaのようなオブジェクト向け言語ではクラスがカスタムタイプである.基本型の個数は8個としたが,参照型の個数はプログラマが新しいタイプを追加できるためとした.
    時間を表すために,一人一人が3つの変数を生成した.
    int hour1, hour2, hour3;
    int munute1, minute2, minute3;
    float second1, second2, second3; // 1/100초까지 표현하기 위해 float으로 함.
    配列で表す.
    int[] hour = new int[3];
    int[] minute = new int[3];
    float[] second = new float[3];
    このようにすると、時、分、秒は互いに分離されるので、プログラム実行中に時、分、秒が混在して不正確なデータになる可能性があります.この場合、時間、分、秒を組み合わせたカスタムタイプ、すなわちクラスを定義して使用する必要があります.
    class Time {
    	int hour;
        	int minute;
            float second;
    }

    3.変数と方法


    3-8. 基本パラメータと参照パラメータ


    メソッドを呼び出すと、Javaはパラメータとして指定した値をメソッドのパラメータにコピーし、メソッドに渡します.パラメータのタイプが[基本](Basic)の場合は[基本](Basic)の値がコピーされますが、[参照](Reference)の場合はインスタンスのアドレスがコピーされます.
    メソッドのパラメータを基本として宣言すると、保存された値のみが取得され、参照として宣言されると、保存された値のアドレスがわかります.したがって、値の取得だけでなく、値の変更もできます.
    基本パラメータ-変数の値のみを読み込むことができます。(read only) 参照型パラメータ-変数の値を読み取り、変更できます。(read & write)

    例6-9

    class Data { int x;}
    
    public class PrimitiveParamEx {
    
    	public static void main(String[] args) {
    		Data d = new Data();
    		d.x = 10;
    		System.out.println("main() : x =" + d.x);
    		
    		change(d.x);
    		System.out.println("After Change(d.x)");
    		System.out.println("main() : x = " + d.x);
    	}
    	static void change(int x) { // 기본형 매개변수
    		x = 1000;
    		System.out.println("change() : x = " + x);
    	}
    }
    changeメソッドではmainメソッドから渡されるd.xの値を1000に変更しますが、mainメソッドではd.xの値はです.
    「d.x」の値は変更されず、メソッド内のパラメータxの値を変更します.つまり、オリジナル以外のコピーは変更されず、オリジナルには何の影響もありません.これにより、基本パラメータは変数に格納されている値のみを読み取ることができ、変更することはできません.
    changeメソッドを呼び出すと、changeメソッドのパラメータxに「d.x」がコピーされます。 changeメソッドのxの値を1000に変更 changeメソッドが終了すると、パラメータxがスタックから削除されます
    class Data { int x;}
    
    public class ReperenceParamEx {
    
    	public static void main(String[] args) {
    		Data d = new Data();
    		d.x = 10;
    		System.out.println("main() : x = " + d.x);
    		
    		change(d);
    		System.out.println("After Change(d)");
    		System.out.println("main() : x = " + d.x);
    	}
    	static void change(Data d) { // 참조형 매개변수
    		d.x = 1000;
    		System.out.println("change() : x = " + d.x);
    	}
    }