Javaオブジェクト向けプログラミング


オブジェクト向けプログラミング(OOP)


オブジェクト向けプログラミングはすべてのデータをオブジェクトと見なし,オブジェクトがプログラミングの中心となる.

出典:生活コード

オブジェクト向けプログラミングの特徴


カプセル化


非表示
  • データとコードの形式
  • データセット構造、ロール、および機能を統合

    継承

  • 子クラスは親の情報
  • を継承する.

    たけいせい

  • オブジェクトは、他のオブジェクト
  • として再編成する.
  • 過負荷、過負荷
  • 抽象化

  • オブジェクトの共通の特徴
  • を抽出および定義する.

    クラスとメソッド、変数

    // MyOOP.java
    public class MyOOP {
        public static void main(String[] args) {
            Print.delimiter = "----";
            Print.A();        
            Print.B();
    
            Print.delimiter = "****";
            Print.A();
            Print.B();
        }
    }
    
    // Print.java
    class Print { // 클래스
        public static String delimiter = ""; // 전역 변수
    
        public static void A() { // 메서드
            System.out.println(delimiter);
            System.out.println("A");
            System.out.println("A");
        }
    
        public static void B() {
            System.out.println(delimiter);
            System.out.println("B");
            System.out.println("B");
        }
    }
    関連性のある重複コードをメソッドに組み合わせる.
    繰返し値は変数に設定され、メソッド内で定義された変数はメソッド外で使用できません.したがって、グローバル変数として宣言すると、管理が容易になります.
    クラスは、これらのメソッドと変数を組み合わせて、より簡潔でより良いコードを記述することができます.また、外部でも使用可能で、単独で作成したり、呼び出して使用したりすることができます.

    ≪インスタンス|Instance|emdw≫



    出典:生活コード
    冷蔵庫を一流に考えましょう.同じ冷蔵庫を複数作ることができ、中にはいろいろな材料が詰まっています.例はコピーした冷蔵庫です.
    同じ冷蔵庫を作るときはnewを貼る.
    // MyOOP.java
    public class MyOOP {
        public static void main(String[] args) {
            Print p1 = new Print();
            p1.delimiter = "----";
            p1.A();        
            p1.B();
    
            Print p2 = new Print();
            p2.delimiter = "****";
            p2.A();
            p2.B();
    
            // Print.delimiter = "----";
            p1.A();
            // Print.delimiter = "****";
            p2.A();
            p1.B();
            p2.B();
        }
    }
    
    // Print.java
    class Print { // 클래스
        public static String delimiter = ""; // 전역 변수
    
        public void A() { // 메서드
            System.out.println(delimiter);
            System.out.println("A");
            System.out.println("A");
        }
    
        public void B() {
            System.out.println(delimiter);
            System.out.println("B");
            System.out.println("B");
        }
    }
    delimiterを交換するたびに面倒なことで、効率がありません.インスタンスを使用すると、より簡単に作業できます.
    インスタンスを使用する前にstaticは常に値が変わらない場合に使用されますが、delimer変数の値が変更されるため、消去されます.Print p1 = new Print();は、Printデータ型のPrintクラスをp 1オブジェクトに含むと言える.
    p 1とp 2のdelimeter変数値を設定することで、同じクラスを迂回することを回避できます.

    static

    class Foo {
        public static String classVar = "I class var"; // static 변수 (클래스 필드)
        public String instanceVar = "I instance var"; // non-static 변수 (인스턴스 필드)
    
        public static void classMethod() { // 클래스의 static 메서드가 클래스의 변수에 접근이 가능할까?
            System.out.println(classVar); // static 메서드는 static 변수에 접근 가능
    //      System.out.println(instanceVar); // 인스턴스 변수에는 접근 불가능
        }
    
        public void instanceMethod() { // 인스턴스 메서드는 클래스의 변수에 접근이 가능할까?
            System.out.println(classVar); // 인스턴스 메서드는 static 변수에 접근 가능
            System.out.println(instanceVar); // 인스턴스 변수에도 접근 가능
        }
    }
    
    public class StaticApp {
    
        public static void main(String[] args) {
            System.out.println(Foo.classVar); // Foo 클래스의 static 변수에 접근 가능
    //      System.out.println(Foo.instanceVar); // 인스턴스 변수에 접근 불가능
            Foo.classMethod(); // static 메서드에 접근 가능
    //      Foo.instanceMethod(); // 인스턴스 메서드에 접근 불가능
    
            // Foo f1, f2 인스턴스 생성
            Foo f1 = new Foo(); 
            Foo f2 = new Foo();
          
            System.out.println(f1.classVar); // I class var
            System.out.println(f1.instanceVar); // I instance var
          
            f1.classVar = "changed by f1";
            System.out.println(Foo.classVar); // changed by f1
            System.out.println(f2.classVar); // changed by f1
          
            f1.instanceVar = "changed by f1";
            System.out.println(f1.instanceVar); // changed by f1
            System.out.println(f2.instanceVar); // I instance var
        }
    
    }

    出典:生活コード
    staticキーワードを使用して、変数またはメソッドの前にstatic変数とメソッドを作成できます.クラスメンバーとも呼ばれ、すべてのオブジェクトがメモリを共有する特徴があります.
    static int num = 0; // static 변수 선언
    public static void static_method(){} // static 리턴 타입 메소드 {}
    静的に宣言された変数およびメソッドは同じメモリを指すため、Foo.classVarおよびインスタンスf1.classVarおよびf2.classVarは同じメモリを使用する.
    静的変数値をf1.classVar = "changed by f1";に変更すると、Fooとf 1、f 2のclassVarは同じ変数値を指します.
    ただし、インスタンスは各異なるオブジェクトであるため、f1.instanceVar = "changed by f1";が作成されると、f 1のinstancevar値のみが変更されます.

    ジェネレータとthis

    // MyOOP.java
    public class MyOOP {
        public static void main(String[] args) {
            Print p1 = new Print("----"); // 인자
            p1.A();        
            p1.B();
    
            Print p2 = new Print("****");
            p2.A();
            p2.B();
        }
    }
    
    // Print.java
    class Print { // 클래스
        public String delimiter = ""; // 인스턴스 변수
        public Print(String delimiter){
            this.delimiter = delimiter; // this.delimiter = 인자 delimiter
        }
        public void A() { // 메서드
            System.out.println(this.delimiter);
            System.out.println("A");
            System.out.println("A");
        }
    
        public void B() {
            System.out.println(this.delimiter);
            System.out.println("B");
            System.out.println("B");
        }
    }
    コンストラクション関数規則
    1.クラス名とメソッド名が同じ
    2.戻りタイプを定義しない
    ジェネレータはnewキーワードを使用するときに呼び出されます.ジェネレータを使用する利点は、オブジェクトの作成に必要な動作を制御できることです.thisキーワードとは、インスタンスの変数名を指し、それを使用しない場合、パラメータとして入力されるdelimiterを指す.
    コンストラクション関数の入力項目がなく、コンストラクション関数の内部に何もない場合はdefaultコンストラクション関数と呼ばれます.クラスにコンストラクション関数が1つもない場合はdefaultコンストラクション関数が自動的に追加されますが、作成したコンストラクション関数がすべて実装されている場合は、コンパイラはdefaultコンストラクション関数を追加しません.

    クラスとインスタンスの使用

    // 기존 코드
    public class AccountingApp {
        public static double valueOfSupply = 10000.0;
        public static double vatRate = 0.1;
        public static double getVAT() {
            return valueOfSupply * vatRate;
        }  
        public static double getTotal() {
            return valueOfSupply + getVAT();
        }
        public static void main(String[] args) {
     
            System.out.println("Value of supply : " + valueOfSupply);
            System.out.println("VAT : " + getVAT());
            System.out.println("Total : " + getTotal());
        }
    }
    // 클래스 활용
    class Accounting {
        public static double valueOfSupply;
        public static double vatRate = 0.1;
        public static double getVAT() {
            return valueOfSupply * vatRate;
        }
        public static double getTotal() {
            return valueOfSupply + getVAT();
        }
    }
    
    public class AccountingApp {
        public static void main(String[] args) {
            Accounting.valueOfSupply = 10000.0;
            System.out.println("Value of supply : " + Accounting.valueOfSupply);
            System.out.println("VAT : " + Accounting.getVAT());
            System.out.println("Total : " + Accounting.getTotal());
        }
    }
    
    // 인스턴스 활용
    class Accounting {
        public double valueOfSupply;
        public static double vatRate = 0.1;
    
        public Accounting(double valueOfSupply) {
            this.valueOfSupply = valueOfSupply;
        }
    
        public double getVAT() {
            return valueOfSupply * vatRate;
        }
    
        public double getTotal() {
            return valueOfSupply + getVAT();
        }
    }
    
    public class AccountingApp {
        public static void main(String[] args) {
            Accounting a1 = new Accounting(10000.0);
    
            Accounting a2 = new Accounting(20000.0);
    
            System.out.println("Value of supply : " + a1.valueOfSupply);
            System.out.println("Value of supply : " + a2.valueOfSupply);
    
            System.out.println("VAT : " + a1.getVAT());
            System.out.println("VAT : " + a2.getVAT());
    
            System.out.println("Total : " + a1.getTotal());
            System.out.println("Total : " + a2.getTotal());
    
        }
    }

    1.利用カテゴリ


    既存のメソッドのみを使用するコードよりも、クラスを使用してよりクリーンなコードを記述することができます.例とは異なり、コードがより多い場合、Accountingのように相互に関連付けられたコードをクラスにグループ化すれば、Accounting.fooなどに容易に分割することができる.

    2.利用例

    valueOfSupplyの値が異なると、計算順序が異なり、クラスのみを書くとコードを整理できません.同じタスクですが、異なる値を使用する必要がある場合は、インスタンスを使用して簡単にクリーンアップできます.例としてAccountingクラスをそれぞれa1,a2とし,パラメータでvalueOfSupply値に設定して整理した.