[Become a Java-Masta👨‍🏫 4週目]レベル、インタフェース


🎯 n/a.ターゲット


Javaのクラスとインタフェースを勉強します。


📌 勉強する


カテゴリ

  • クラス定義
  • クラス構成
  • クラスの作成
  • 新キーワード
  • このキーワード
  • スーパーキー
  • 抽象クラス


    インタフェース

  • インタフェースの定義
  • インタフェース実装
  • 🇨🇱 カテゴリ


    💡 クラス定義


    Javaでは,クラスは類似の特徴を持つオブジェクトの属性と動作を定義した設計図である.
    この設計図を使用して、同じ特徴を被写体のフレームと同じ役割を果たします.
    オブジェクト:リアルワールドに存在するすべての有無
    属性(名詞型)と行為(動詞型)を持つ.
    ex)自動車(タイプ)
  • 属性:走行距離、車種、色、馬力、、、
  • 行為:起動、閉鎖、走行、、、
  • ex)口座(無形)
  • 属性:口座番号、預金者、残高、振替額、、、
  • 行為:残高照会、送金、送金、、、
  • 類対象フナ餅型枠フナ餅工場生産ライン製品建築設計図建築
    同じクラスから生成されたオブジェクトは、同じプロパティと動作を持ち、各オブジェクトに独自のプロパティ値を持つことができます.
    つまり、同じクラスで作成されたオブジェクトでも違います!
    クラスは、アクセス制御者とともにclassキー定義を使用できます.
    [접근 제어자] class XXX{
        필드
        생성자
        메소드
    }
    public classを使用してクラスを定義する場合は、ソースコード(.java)の名前をクラスの名前で記述する必要があります.
    ex) public class Baemung ==> Baemung.java
    また,クラスを定義する場合,クラス名の頭文字は通常大文字で始まるパスカル記号(PascalCase)を用いる.
    クラスで他のクラスを定義することもできます.
    1つのクラスファイルに複数のクラスが定義されている場合、ソースコードをコンパイルするとき、各クラス。classファイルの生成を確認できます。
    クラスを定義するときに、オブジェクトのプロパティと動作をフィールドとメソッドとして定義できます.
    オブジェクトクラス属性フィールド(クラス変数(静的)、インスタンス変数(非静的)の動作方法
  • 人(対象)
  • プロパティ:名前、年齢
  • 行動:年齢増加、睡眠
  • Person(クラス)
  • Person.java
    public class Person{
        //field
        String name;
        int age;
        
        //constructor
        Person(String name, int age){
            this.name = name;
            this.age = age;
        }
        
        //method
        increaseAge(){}
        Sleep(){}
    }

    💡 クラス構成


    1. フィールド(field)


    クラスのフィールド(field)は、クラスに含まれるメンバー変数(variable)です.
  • クラス変数(静的変数)
  • クラスの状態
  • クラスのメモリ負荷は、
  • を1回のみ割り当てる.
  • インスタンス変数
  • オブジェクトの状態
  • オブジェクト
  • が作成されるたびに、
  • が割り当てられる.

    2.方法(method)


    クラスでは、メソッド(method)は、特定の操作を実行する文の集合です.
  • クラスメソッド(静的メソッド)
  • 類の観点における行為
  • オブジェクトの動作X
  • を認識する必要がある.
  • オブジェクトを作成することなく実行できる操作
  • .
  • インスタンスメソッド(instance method)
  • オブジェクトの観点から見る動作
  • オブジェクトの動作O
  • を認識する必要がある.
  • オブジェクト関連タスク
  • 3.コンストラクション関数(コンストラクション関数)


    クラスの作成時にフィールド(インスタンス変数)値を初期化する特別な方法
    オブジェクトの初期化の多様性の提供

    4.ネストされたクラス

  • クラスのクラス
  • 5. Initializer

  • Static Initializer
    静的実行文:クラスメモリのロード時に自動的に実行
  • Instance Initializer
    {実行文}:オブジェクトの作成時に自動的に実行-->ジェネレータ無効化
  • 💡 クラスの作成

  • 包装声明(0 or 1)
  • package top.sub....; 
    // 물리적 : 폴더
    // 보통 domain name(Unique!) 역순사용
  • 輸入ドア(0から複数)
  • import top.sub...클래스이름; // 소스 클래스명 바로사용
    import top.sub...*; // all classes, interfaces
    (not package) : import단위는 패키지 아님!
    
    현 클래스안에서 참조, 사용하는 클래스가 자신과 같은 패키지가 아닌 경우 명시
    단, java.lang은 자동으로 불러옴
  • クラス定義(1から複数)
  • ** []는 상황에 따라 생략가능함
    
    * 클래스정의
    [접근지정자] [활용지정자] class 클래스명 [extends 부모클래스명] [implements 부모인터페이스명,,,] { } 
    
    // 접근지정자
    (default),public
    
    // 활용지정자
    final : 상속금지
    abstract : 추상클래스 (미완성클래스)
    
    // 클래스명
    명사형, 첫글자 대문자, 카멜표기법
    
    // extends 
    클래스 단일상속
    
    // implements
    인터페이스 다중상속
    
    
    
    * 멤버정의
    [접근지정자] [활용지정자] DataType 변수명 [=초기값];
    
    // 접근지정자
    public,protected,(default),private
    
    // 활용지정자
    static : 클래스멤버
    final : 상수화, 생성자에서 초기화 필수
    static final : 어차피 상수이기 때문에 static으로 사용
    transient : 객체직렬화 대상제외
    
    // 변수명
    명사형, 첫글자 소문자, 카멜표기법
    
    // 초기값
    생략시 default값으로 초기화 (0, null, false)
    
    
    
    * 메소드정의
    [접근지정자] [활용지정자] returnType 메소드명 ([매개변수선언,,,]) [throws Exception,,,] 
    {
        실행문장 
        [return 리턴값]
    }
    
    // 접근지정자
    public,protected,(default),private
    
    // 활용지정자
    static : 객체 생성없이 '클래스이름.메소드이름()'으로 호출 가능, 메소드 내에서 인스턴스 변수 사용 불가
    final : 메소드 재정의 X
    synchronized : 객체 동기화를 위한 잠금
    abstract : 메소드 추상화
    
    // return 리턴값
    void : 없음 -> return문 생략가능
    not void : return값 명시
    
    
    
    * 생성자
    [접근지정자] 클래스명 ([매개변수선언,,,]) [throws Exception,,,] {}
    
    // 접근지정자
    public,protected,(default),private
    

    💡 新キーワード


    オブジェクトを作成するときにnewというキーワードを使用します.
    newキーワードはメモリに空間を割り当て、割り当てられた空間のアドレス値を返します.
    Javaでは、Primitive Type以外のタイプ、すなわちReference Typeの変数を初期化すると、オブジェクトはHeap領域に保存され、Referenceタイプの変数では、新しいキーワードはアドレス値を持ちStack領域に格納されます.
    newキーワードはメモリに空間を割り当て、割り当てられた空間アドレスを返します.
    // 클래스이름 참조변수 = new 생성자호출; -> 객체생성시 초기화를 담당하는 특별한 메소드
    Person p1 = new Person("배문규", 29);
    Person p2 = new Person("정다운", 29);
    上記ソースコードを実行すると、

  • PersonバイトコードはClass Areaにアップロードされます

  • newキーワードはメモリに空間を割り当て,インスタンス変数はheapに昇格する

  • 新キーワードはインスタンス変数のメモリアドレスを返し、Stackにp 1、p 2 reprence変数を格納してアップロードする

  • 💡 このキーワード

  • は、非静的領域(インスタンスメソッド、ジェネレータ、インスタンスイニシエータ)で使用される.
  • 現在生成中、実行中のオブジェクト自体.
  • 使用方法

    1.ゾーン変数とインスタンス変数を区別します。

    void setName(String name){
       this.name=name;
    }

    2.コンストラクション関数がオーバーロードされている場合は、別のコンストラクション関数を呼び出すときに呼び出すことができます。

    this();

    3.自分のオブジェクトをメソッドのパラメータとして渡したり戻したりします。

    XXX(){
       return this; // 자기 자신을 리턴
    }
    
    YYY(){
       obj.zzz(this); // 자기 자신을 매개변수로 전달
    }

    💡 スーパーキー


    これと同様に、
  • は、非静的領域(インスタンスメソッド、ジェネレータ、およびインスタンスイニシエータ)に使用される.
  • 論理概念
  • は、作成および実行中のオブジェクトの親を表すために使用される.
    使用方法

    1.自分のメソッドと親メソッドを区別するための方法(メソッド再定義の場合)

    this.XXX()
    super.XXX()
    
    // 참고로, 메소드 말고 멤버는 개념적으로 구분하지 않음
    // 부모의 멤버는 자식에게도 있기 때문임

    2.子の作成者から親作成者を明示的に呼び出す

    super();
    この3つの概念はsuperにはありません.(ある必要はありません.)

    抽象クラス


    抽象クラスを宣言する方法はclassキーワードの前にabstractを加えて宣言できます.
    抽象クラスは未完了のクラスであり、新しいキーワードで直接オブジェクトを作成することはできません.サブクラスでなければなりません.逆に、サブオブジェクトの参照変数として使用できます.
    インタフェースで宣言できない変数や実装を含む方法.
    抽象クラスは最終的にクラスであるため、単一の継承しかできません.
    抽象クラスは2つに分けることができます.

  • 抽象メソッドのない抽象クラス
  • を使用してクラスオブジェクトの作成を阻止
  • で継承するサブクラスから個別の属性を追加し、オブジェクト
  • を作成します.

  • 抽象メソッドを持つ抽象クラス
  • この抽象クラスを継承するサブクラスにおいて抽象メソッド上書き
  • を行う必要がある.
  • サブクラスに抽象的な方法のオーバーライド強制を提供し、プログラムの安定性を向上させる
  • .
  • の抽象メソッドが存在する場合、クラスは抽象クラス
  • である必要があります.
    参照として、トップレベルを継承する中間クラスで、トップレベルのメソッドを抽象メソッドに上書きできます.
    中間層から最上層にない義務性を下に与えることもできる.

    🇮🇳 インタフェース


    💡 インタフェースの定義


    インタフェースとは、ある機能を使用する標準(約束、方法)である.インタフェースは、機能を使用するユーザの観点と、機能を提供するプロバイダの観点に分けることができる.
    機能ユーザはインタフェースを通じて使用方法を知ることができ,インタフェースの説明に従ってのみ機能を使用することができる.さらに,プロバイダがどのように実現されるかを詳細に知る必要がないため,結合度が低下し,モジュール化できる.
    機能プロバイダの利点は、これらの機能を実現しなければ責任が与えられないが、自分のコードを暴露する必要はないことである.
  • ユーザーの観点:使用方法、承諾
  • プロバイダ観点:実施責任
  • 実装の強制実装により、異なるモジュールが同じインタフェースを継承する場合、ユーザはモジュールを簡単に交換することができる.
    インタフェースを使用して間接クラスに関係を拡張しますが、これらのクラス間には関係が継承されていません.

    💡 インタフェース実装


    クラスの実装にはclassキーワードが使用されますが、インタフェースにはinterfaceというキーワードが使用されます.
    ** []는 상황에 따라 생략가능함
    
    * 인터페이스 정의
    [접근지정자] interface 인터페이스명 [extends 부모 인터페이스명]{ } 
    
    // 접근지정자
    (default),public
    // 클래스는 인터페이스를 상속받을 때 implements키워드를 사용하지만,
    // 인터페이스가 인터페이스를 상속받을 때는 extends키워드를 사용한다.
    
    interface 인터페이스명{
    	// 1. 상수
    	[public static final]타입 상수명 = 상수값;
    	
    	// 2. 추상 메소드
    	[public abstract]타입 메소드명(매개변수);
    
    	// 3. 디폴트 메소드
    	default 타입 메소드명(매개변수){
    		// 구현
    	}
    
    	// 4. 스태틱 메소드
    	static 타입 메소드명(매개변수){
    		// 구현
    	}
    }
    Java 8の前には定数と抽象メソッドしか宣言できません.
    Java 8以降、デバッガとstacticメソッドが追加されました.
  • 定数(絶対値):インタフェースは固定値のみを提供します.
  • 抽象メソッド(強制):インタフェースにブートと継承を提供し、オーバーライドによって実現する.
  • デフォルトメソッド(オプション):overriding
  • をサポートするインタフェースに実装メソッドを提供する
  • 静的方法(絶対):
  • をカバーできないインタフェースに実施方法を提供する.
    抽象クラスは本質的にクラスなので「is-a:~はい~」関係ですので、単一の継承しかできません.
    インタフェースはクラスではないので「has-a:~いいよ~」関係なので多重継承が可能です.
    // Baemung은 사람이며 움직일 수 있고, 들을 수 있고, 개발할 수 있다.
    class Baemung extends Person implements Movable, Hearable, Developable 

    多形性は祖先クラスと祖先インタフェースに同時に適用されます。

    class IronMan implements Heroble, Fightable, Transformable {}
    
    IronMan tony = new IronMan();
    Object obj = tony;
    Heroable hero = tony;
    Fightable fighter = tony;
    Transformable trans = tony;