[Become a Java-Masta👨🏫 4週目]レベル、インタフェース
🎯 n/a.ターゲット
Javaのクラスとインタフェースを勉強します。
📌 勉強する
カテゴリ
抽象クラス
インタフェース
🇨🇱 カテゴリ
💡 クラス定義
Javaでは,クラスは類似の特徴を持つオブジェクトの属性と動作を定義した設計図である.
この設計図を使用して、同じ特徴を被写体のフレームと同じ役割を果たします.
オブジェクト:リアルワールドに存在するすべての有無
属性(名詞型)と行為(動詞型)を持つ.
ex)自動車(タイプ)
同じクラスから生成されたオブジェクトは、同じプロパティと動作を持ち、各オブジェクトに独自のプロパティ値を持つことができます.
つまり、同じクラスで作成されたオブジェクトでも違います!
クラスは、アクセス制御者とともにclassキー定義を使用できます.
[접근 제어자] class XXX{
필드
생성자
메소드
}
public classを使用してクラスを定義する場合は、ソースコード(.java)の名前をクラスの名前で記述する必要があります.ex) public class Baemung ==> Baemung.java
また,クラスを定義する場合,クラス名の頭文字は通常大文字で始まるパスカル記号(PascalCase)を用いる.
クラスで他のクラスを定義することもできます.
1つのクラスファイルに複数のクラスが定義されている場合、ソースコードをコンパイルするとき、各クラス。classファイルの生成を確認できます。
クラスを定義するときに、オブジェクトのプロパティと動作をフィールドとメソッドとして定義できます.
オブジェクトクラス属性フィールド(クラス変数(静的)、インスタンス変数(非静的)の動作方法
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)です.
2.方法(method)
クラスでは、メソッド(method)は、特定の操作を実行する文の集合です.
3.コンストラクション関数(コンストラクション関数)
クラスの作成時にフィールド(インスタンス変数)値を初期化する特別な方法
オブジェクトの初期化の多様性の提供
4.ネストされたクラス
5. Initializer
静的実行文:クラスメモリのロード時に自動的に実行
{実行文}:オブジェクトの作成時に自動的に実行-->ジェネレータ無効化
💡 クラスの作成
package top.sub....;
// 물리적 : 폴더
// 보통 domain name(Unique!) 역순사용
import top.sub...클래스이름; // 소스 클래스명 바로사용
import top.sub...*; // all classes, interfaces
(not package) : import단위는 패키지 아님!
현 클래스안에서 참조, 사용하는 클래스가 자신과 같은 패키지가 아닌 경우 명시
단, java.lang은 자동으로 불러옴
** []는 상황에 따라 생략가능함
* 클래스정의
[접근지정자] [활용지정자] 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メソッドが追加されました.
抽象クラスは本質的にクラスなので「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;
Reference
この問題について([Become a Java-Masta👨🏫 4週目]レベル、インタフェース), 我々は、より多くの情報をここで見つけました https://velog.io/@bae_mung/Become-a-Java-Masta-4주차-클래스-인터페이스テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol