[JAVA] Static

김윤섭·2023년 9월 7일
0

JAVA

목록 보기
26/27
post-thumbnail

(1) Static

  • 객체간의 공유 자원을 표현
  • 클래스를 설계할 때, 멤버변수 중 모든 객체에서 공통적으로 사용하는 값에 static
  • static이 붙은 멤버변수는 객체의 갯수에 상관없이 단 하나만 생성
  • 모든 객체가 공유 하므로 메모리를 효율적으로 사용 가능

(2) 컴퓨터의 메모리 구조

코드 영역(고정영역)

  • 프로그램의 코드가 저장
  • cpu가 실행

데이터 영역(고정영역)

  • static으로 선언되는 변수가 할당
  • 프로그램 시작과 동시에 메모리 할당 -> 종료될 때까지

힙 영역(동적영역)

  • 프로그래머가 원하는 시점에 변수를 할당하고 소멸시키는 영역
  • 메모리 동적 할당시 사용
  • 객체가 생성되는 영역

스택 영역(동적영역)

  • 함수가 실행될 때 사용되는 파라미터와 지역변수가 할당
  • 함수의 종료와 함께 소멸

(3) 고정영역 vs 동적영역

고정영역
= 프로그램이 실행되면 실행파일이 메모리에 로드되면서, 실행파일의 용량만큼 RAM을 사용

  • 실행 파일의 크기는 변할 수 없으므로 이 영역의 크기는 고정크기를 가짐

동적영역

  • 프로그래머가 new 키워드를 사용해서 객체나 배열을 생성하면서 사용
  • 또 다른 경우는 메서드가 호출되는 동안 사용될 파라미터와 지역변수가 생성
  • 메서드가 종료되거나 객체가 더이상 사용되지 않으면 생성된 변수나 객체는 메모리에서 사라지므로, 이 영역은 유동적인 크기를 가짐

고정영역 vs 동적영역

  • 고정 메모리에 있는 변수는 항상 존재
  • 동적 메모리에 있는 변수는 유동적
  • 동적 메모리의 변수는 있을 수도 있고 없을 수도 있음
  • 그러므로 항상 존재하는 고정 메모리 영역에 있는 변수는 동적 메모리영역에 있는 변수에 갈 수 없음
  • 반대로, 동적 메모리 영역에 있는 변수는 고정 메모리 영역에 갈 수 있음

(4)static 멤버변수

  • static 변수는 프로그램의 실행과 동시에 객체의 생성 여부와 상관없이 이미 존재
    - 소스코드에서는 특정 클래스 안에 명시하더라도, 그 클래스를 통해서 생성되는 객체나 그 안에 포함되는 멤버변수와는 다른 존재
  • static 변수는 객체가 생성되지 않았더라도 이미 존재
    - 이름을 통해 접근하는 것이 아니라, 클래스의 이름을 통해서 접근
    - 단, static 변수가 선언된 클래스 안에서는 변수 이름으로 직접 접근이 허용된다.

💡 예시

  • Article클래스 및 다른 클래스에서 접근하는 경우
	Article.count = 3;
	Article.category = "공지사항";
  • Article클래스에서 접근하는 경우
	count = 3;
	category = "공지사항";

(5) Static 변수의 사용

Static 변수의 생성

public class Article {

	// 전체 게시물의 수를 표현하기 위한 데이터
	private static int count = 0;
	// 게시물의 분류를 구별하기 위한 데이터
	private static String category;
	
	private int num;			// 글 번호
	private String title;		// 제목
	private String regDate;		// 날짜
	
	public Article(int num, String title, String regDate) {
		super();
		this.num = num;
		this.title = title;
		this.regDate = regDate;
        
        count++;
     }
     
	// 게시물이 새로 등록될 때마다, 전체 글 수를 의미하는 count변수가 1씩 증가
	// 전체 게시물 수는 모든 객체가 공유하는 값이므로 static으로

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getRegDate() {
		return regDate;
	}

	public void setRegDate(String regDate) {
		this.regDate = regDate;
	}

	public static int getCount() {
		return count;
	}

	public static void setCount(int count) {
		Article.count = count;
	}

	public static String getCategory() {
		return category;
	}

	public static void setCategory(String category) {
		Article.category = category;
	}

	@Override
	public String toString() {
		return  "글 분류 = " + category
				+ ", 전체 글 수 = " + count
				+ ", Article [num=" + num 
				+ ", title=" + title 
				+ ", regDate=" + regDate + "]";
	}	
}

메인메서드의 구현

public class Main01 {

	public static void main(String[] args) {
		Article.setCategory("자유게시판");
		
		Article a1 = new Article(1, "첫 번째글", "2023-01-02");
		Article a2 = new Article(2, "두 번째글", "2023-01-31");
		Article a3 = new Article(3, "세 번째글", "2023-01-31");
		Article a4 = new Article(4, "네 번째글", "2023-01-31");
				
		System.out.println(a1.toString());
		System.out.println(a2.toString());
		System.out.println(a3.toString());
		
		System.out.println("----------------------");
		Article.setCategory("공지사항");
		
		System.out.println(a1.toString());
		System.out.println(a2.toString());
		System.out.println(a3.toString());
	}
}

💡 결과

글 분류 = 자유게시판, 전체 글 수 = 4, Article [num=1, title=첫 번째글, regDate=2023-01-02]
글 분류 = 자유게시판, 전체 글 수 = 4, Article [num=2, title=두 번째글, regDate=2023-01-31]
글 분류 = 자유게시판, 전체 글 수 = 4, Article [num=3, title=세 번째글, regDate=2023-01-31]
----------------------
글 분류 = 공지사항, 전체 글 수 = 4, Article [num=1, title=첫 번째글, regDate=2023-01-02]
글 분류 = 공지사항, 전체 글 수 = 4, Article [num=2, title=두 번째글, regDate=2023-01-31]
글 분류 = 공지사항, 전체 글 수 = 4, Article [num=3, title=세 번째글, regDate=2023-01-31]

// 글 분류와 전체 글 수는 static영역에서 생성되었기 때문에
// 객체호출 시 입력하지 않아도 자동 생성
profile
안녕하세요

0개의 댓글