[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게시판";

    📝 コンピュータのメモリ構造

  • コンピュータのオペレーティングシステムは、プログラムの実行に複数のメモリ領域を提供します.
  • メモリ容量は、次の4つの領域に分けられます.

  • コード領域(固定領域)

  • のプログラムコードを格納領域
  • は、この領域に記憶されている命令をCPUが1つずつ実行する.
  • データ領域(固定領域)

  • グローバル変数と、静的として宣言された変数を割り当てます.
  • この領域に割り当てられた変数は、プログラムの起動時にメモリ領域を割り当てる.
    終わるまでここにいます.
  • ヒップ領域(ダイナミック領域)

  • プログラマは、必要に応じて変数の領域
  • を割り当てる除去する.
  • メモリ動的割り当て時に使用します.
  • オブジェクトの領域を生成します.
  • スタック領域(ダイナミック領域)

  • 関数の実行時に使用するパラメータと領域変数のメモリ領域
  • 関数の終了とともに消失した.
  • プログラムが使用するメモリ領域


  • 固定領域


  • プログラムが実行されると、実行可能ファイルがメモリにロードされます.
    実行可能ファイルと同じ容量の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の貼り付けを検討します.