인터페이스

치로·2024년 7월 22일

static

// 하나의 게시물을 표현하기 위한 클래스
public class Article {
private int count; // 전체 글 수
private String category; //카테고리
private String num; // 글 번호
private String title; // 제목
private String regDate; // 날짜
}

  • 멤버 변수는 모든 객체가 독립적으로 갖는 고유 데이터이기 때문에 게시물의 수라는 공유 데이터를 모든 게시물이 삭제 됨
  • 즉, 각각의 객체가 중복된 데이터를 갖는다

1. stsaic이 적용된 변수의 사용

-static이 붙은 멤버 변수는 객체의 개수에 상관없이 단 하나만 생성, 이를 모든 객체가 공유하기 때문에 멤로리를 효율적으로 사용할 수 있음

2. 컴퓨터의 메모리 구조

  • 고정 영역
    -> 코드 영억
    : 프로그램의 코드가 저장되는 영역, 이 영역에 저장된 명령어들을 CPU하나씩 가져가 실행
    -> 데이터 영역
    전역 변수 STAIC으로선언되는 변수가 할당, 이 영역에 할당되는 변수들을 프로그램 시작과 동시에 메모리 공간이 할당되어 종료될까지 남아있게 된다.
  • 동적 영역
    -> 힙 영역
    프로그래머가 원하는 시점에 변수를 할당하고 소멸시키는 영역 메모리 동적 할당시 사용됨. 객체가 생성되는 일임
    -> 스택 영역
    : 함수가 실행될 때 사용되는 파라미터와 자역변수에 대한 메모리 공간, 함수의 종료와 함께 소멸

3. 하나의 프로그램이 사용한하는 메모리 영역

  • 공정 영역
    : 프로그램이 실행되면 실행 파일이 메모리에 로드되면서, 실행 파일의 용량만큼 RAM을 사용
    -> 실행 파일의 크기는 변할 수 없으므로 이 영역의 크기는 고정크기를 갖는다.
  • 동적 영역
    : 프로그래머가 new 키워드를 사용해서 객체나 배열을 생성하면 사용
    -> 또 다른 경우는 메서드가 호출되는 동안 사용될 파라미터와 지역 변수가 생성
    -> 메서드가 종료되나 객체가 더 이상 사용되지 않으면 생성된 변수나 객체는 메모리에서 사라지므로 이 영역은 유동적인 크기를 갖게 됨

4. static 데이터의 생성 위치

  • static 데이터는 메모리의 고정 영역에 쓰임

5. 프로그램이 메모리를 사용하는 순서

  • 최초 실행 시 고정 영여겡 실행 파일 만큼의 메모리를 점유
  • 프로그램이 각종 동작을 수행하는 동안 동적 영역을 사용

6. 멤버 변수와 static 멤버 변수의 차이

  • static 면수는 프로그램의 실행과 동시에 객체 생성 여부와 상관없이 이미 존재하기 때문에 소스 코드에서는 특정 클래스 안에 명시하지만,
    그 클래스를 통해서 생성되는 객체나 그 안에 포함되는 멤버 변수와는 다른 존재임
  • 객체 생성되지 않았더라도 이미 존재하고 있기 때문에 static 변수는 객체의 이름을 통해 접근하는 것이 아니라 클래스의 이름을 통해서 접근해야 함
  • 단, static 변수가 선언된 클래스 안에서는 변수 이름으로 직접 접근이 허용
  • Article 클래스 및 다른 클래스에서 접근하는 경우
    Article.count = 3;
    Article.category = "공지사항";
  • Article 클래스에서 접근하는 경우
    count =5;
    category = "공지사항";

7. static 데이터에 접근하기 위한 메서드

  • 클래스에서 정의하는 일반 멤서드들은 객체의 생성과 동시에 동적 메모리 영역에서 활성화됨
  • 동적 메모리 영역의 입장에서는 고정 메모리 영역의 자원들은 항상 존재
  • 고정 메모리 영역의 자원들이 동적 메모리의 자원들이 항상 존재하는 것이라는 보장을 받지 못함

예시 코드

package Static;

public class Article {
	// 전체 게시물의 수를 표현하기 위한 데이터
	private static int count = 0;
	// 모든 게시물은 하나의 카테고리 안에 존재한다고 가정
	// 게시물의 분류를 구별하기 위한 데이터
	private static String cateory;
	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 변수가 1씩 증가
		// 전체 게시물 수는 모든 객체가 고융하는 값이미로, static으로 선언이 되어야함
		count++;
	}

	public static int getCount() {
		return count;
	}

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

	public static String getCateory() {
		return cateory;
	}

	public static void setCateory(String cateory) {
		Article.cateory = cateory;
	}

	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;
	}

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

public class Main01 {

	public static void main(String[] args) {
		Article.setCateory("자유게시판");
		
		Article a1 = new Article(1, "1번글", "2024-07-20");
		Article a2 = new Article(2, "2번글", "2024-07-21");
		Article a3 = new Article(3, "3번글", "2024-07-22");

		System.out.println(a1.toString());
		System.out.println(a2.toString());
		System.out.println(a3.toString());
		System.out.println("----------------------");
		
		// static 변수의 값을 변경하면, 모든 객체가 영향을 받음
		Article.setCateory("공지사항");
		System.out.println(a1.toString());
		System.out.println(a2.toString());
		System.out.println(a3.toString());
	}

}

0개의 댓글