[JAVA]静的キーワード&コンピュータのメモリ構造
📝 static
つまり、すべてのオブジェクトが共有する値です.
使わなくてもいいです.
静的サンプル
投稿を表すクラスがあります.
public class Article{
private int num; // 글 번호
private String title; // 제목
private String regDate; // 날짜
}
クラスに新しい投稿を登録するたびに、合計を表すcountとカテゴリ情報を含む変数が追加されます.public class Article{
int count; // 전체 글 수
String category; // 카테고리
private int num; // 글 번호
private String title; // 제목
private String regDate; // 날짜
}
これにより、完全な文章数、カテゴリ情報が宣言され、複数のオブジェクトが作成されると、次の問題が発生しました.
public class Main {
public static void main(String[] args) {
Article a1 = new Article(1, "첫번째 글제목", "20XX-01-01");
a1.category = "공지사항";
a1.count++;
Article a2 = new Article(2, "두번째 글제목", "20XX-01-02");
a2.category = "공지사항";
a1.count++;
a2.count = a1.count;
Article a3 = new Article(3, "세번째 글제목", "20XX-01-03");
a3.category = "공지사항";
a1.count++;
a2.count++;
a3.count = a2.count;
System.out.println(a1.toString());
System.out.println(a2.toString());
System.out.println(a3.toString());
}
}
👉 実行結果Article [count=3, category=공지사항, num=1, title=첫번째 글제목, regDate=20XX-01-01]
Article [count=3, category=공지사항, num=2, title=두번째 글제목, regDate=20XX-01-02]
Article [count=3, category=공지사항, num=3, title=세번째 글제목, regDate=20XX-01-03]
このコードのように、オブジェクトを生成するたびにcount、category変数を変更する手間が発生します.また,重複するコードが多いため,悪いコードと考えられる.
メンバー変数はすべてのオブジェクトに固有のデータであるため、
共有データはすべての投稿に公開されます.
すなわち,各オブジェクトに重複するデータがある.
これらの問題を解決するには、次の手順に従います.
すべてのオブジェクトで共通に使用する必要がある値にstaticを付けます.
public class Article{
static int count; // 전체 글 수
static String category; // 카테고리
private int num; // 글 번호
private String title; // 제목
private String regDate; // 날짜
}
オブジェクトの数にかかわらず、静的メンバー変数は1つしか作成されません.すべてのオブジェクトが共有されているため、メモリを効率的に使用できます.
public class Main {
public static void main(String[] args) {
Article.category = "공지사항";
Article a1 = new Article(1, "첫번째 글제목", "20XX-01-01");
Article.count++;
Article a2 = new Article(2, "두번째 글제목", "20XX-01-02");
Article.count++;
Article a3 = new Article(3, "세번째 글제목", "20XX-01-03");
Article.count++;
System.out.println(a1.toString());
System.out.println(a2.toString());
System.out.println(a3.toString());
}
}
きれいになったけどcount++; 毎回面倒をかける.->オブジェクトを作成するたびにArticleを使用します.countが1つ増えるごとに、いっそジェネレータにこの行を入れればいいのです.
最終コード
public class Article {
static int count; // 전체 글 수
static String category; // 카테고리
private int num; // 글 번호
private String title; // 제목
private String regDate; // 날짜
public Article(int num, String title, String regDate) {
this.num = num;
this.title = title;
this.regDate = regDate;
count++;
}
public String toString() {
return "Article [count=" + count
+ ", category=" + category
+ ", num=" + num
+ ", title=" + title
+ ", regDate=" + regDate + "]";
}
}
public class Main {
public static void main(String[] args) {
Article.category = "공지사항";
Article a1 = new Article(1, "첫번째 글제목", "20XX-01-01");
Article a2 = new Article(2, "두번째 글제목", "20XX-01-02");
Article a3 = new Article(3, "세번째 글제목", "20XX-01-03");
System.out.println(a1.toString());
System.out.println(a2.toString());
System.out.println(a3.toString());
}
}
👉 実行結果Article [count=3, category=공지사항, num=1, title=첫번째 글제목, regDate=20XX-01-01]
Article [count=3, category=공지사항, num=2, title=두번째 글제목, regDate=20XX-01-02]
Article [count=3, category=공지사항, num=3, title=세번째 글제목, regDate=20XX-01-03]
メンバー変数と静的メンバー変数の違い
メンバー変数は、オブジェクトの作成時に作成されるため、各オブジェクトには異なるメンバー変数があります.
価格は維持できます.
静的変数は、常にすべてのオブジェクトが1つのストレージスペースを共有します.
共通の価値を持つ.
オブジェクトが作成されていなくても静的変数は既に存在するため
名前ではなくクラスの名前でアクセスする必要があります.
// Article 클래스 및 다른 클래스에서 접근하는 경우
Article.count = 9;
Article.categoty = "공지사항";
// Article 클레스에서 접근하는 경우
count = 15;
categoty = "Q&A게시판";
📝 コンピュータのメモリ構造
コード領域(固定領域)
データ領域(固定領域)
終わるまでここにいます.
ヒップ領域(ダイナミック領域)
スタック領域(ダイナミック領域)
プログラムが使用するメモリ領域
固定領域
プログラムが実行されると、実行可能ファイルがメモリにロードされます.
実行可能ファイルと同じ容量のRAMを使用します.
実行可能ファイルのサイズは可変であるため、この領域のサイズは一定のサイズを有する.
これらの分野のリソースは、プログラムの実行時に常に存在します.
ダイナミックゾーン
プログラマがnewキーを使用してオブジェクトまたは配列を作成する場合に使用します.
(お尻領域)
メソッド呼び出し中にパラメータと領域変数が作成されます.(スタック領域)
メソッドがオブジェクトを終了または使用しなくなった場合に作成される変数または
オブジェクトがメモリから消えるため、領域はフローティングサイズになります.
プログラム使用メモリの順序
💥 静的メソッド&静的変数
メモリ領域の違いにより、静的メソッドは動的メモリ領域の
メンバー変数は使用できません.また、静的でない通常のメンバー変数も呼び出すことはできません.
メソッドの定義中に静的キーワードを使用して静的リソースにアクセス
上記の方法を作成できます.
固定領域
静的メンバー関数では、動的メモリ領域のメンバー変数を使用できます.
非静的な一般メンバー関数を呼び出すことはできません.
ダイナミックゾーン
これを使用するか、静的メンバー関数を呼び出すことができます.
public class Article{
private static int count;
public static void setCount(int count) {
Article.count = count;
}
public static int getCount() {
return Article.count;
}
}
📙 整理する
ターゲットの意味メンバー変数-すべてのオブジェクトで共通に使用されるクラス変数になります.クラス変数はインスタンスを作成する必要はありません.クラスはメモリにロードされたときに生成されます.メソッド-オブジェクトを作成せずに呼び出す静的メソッドになります.静的メソッドでは、インスタンスメンバーを直接使用することはできません.
いつ静的に貼りますか?
statcの貼り付けを検討します.
Reference
この問題について([JAVA]静的キーワード&コンピュータのメモリ構造), 我々は、より多くの情報をここで見つけました https://velog.io/@hyun_ha/JAVA-static-키워드-컴퓨터의-메모리-구조テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol