
1. static

스태틱 사용 전

스태틱 사용 후
public class Article{
private int count; // 전체 글 수
private String category // 카테고리
private int num; // 글번호
private String title; // 제목
private String regDate // 날짜
}
1-1. static 이해하기
public class Article{
private static int count; // 전체 글 수
private static String category // 카테고리
private int num; // 글번호
private String title; // 제목
private String regDate // 날짜
}
1-2. 컴퓨터의 메모리 구조
고정 영역
코드 영역
-> 프로그램의 코드가 저장되는 영역
-> 이 영역에 저장된 명령어들을 CPU가 하나씩 가져가 실행한다.
데이터 영역
-> 전역 변수와 static으로 선언되는 변수가 할당된다.
-> 이 영역에 할당되는 변수들은 프로그램 시작과 동시에 메모리 공간이 할당되어 종료될 때까지 남아있게 된다.
동적 영역
힙 영역
-> 프로그래머가 원하는 시점에 변수를 할당하고, 소멸시키는 영역
-> 메모리 동적 할당시 사용된다.
-> 객체가 생성되는 영역이다.
스택 영역
-> 함수가 실행될 때 사용되는 파라미터와 지역 변수에 대한 메모리 공간
-> 함수의 종료와 함께 소멸된다.
1-3. 하나의 프로그램이 사용하는 메모리 영역
1-4. static 데이터의 생성 위치
1-5. 프로그램이 메모리를 사용하는 순서
1-6. 멤버변수와 static 멤버변수의 차이
static 변수는 프로그램의 실행과 동시에 객체의 생성 여부와 상관 없이 이미 존재하기 때문에 소스코드에서는 특정 클래스 안에 명시하지만, 그 클래스를 통해서 생성되는 객체나 그 안에 포함되는 멤버변수와는 다른 존재이다.
객체가 생성되지 않았더라도 이미 존재하고 있기 때문에, static 변수는 객체의 이름을 통해 접근하는 것이 아니라, 클래스의 이름을 통해서 접근해야 한다.
단, static 변수가 선언된 클래스 안에서는 변수 이름으로 접근이 허용된다.
-> Article 클래스 및 다른 클래스에서 접근하는 경우
Article.count = 3;
Article.category = "공지사항"
-> Article 클래스에서 접근하는경우
count = 3;
category = "공지사항"
1-7. static 데이터에 접근하기 위한 메서드
클래스에서 정의하는 일반 메서드들은 객체의 생성과 동시에 동적 메모리 영역에서 활성화된다.
-> 동적 메모리 영역의 입장에서는 고정 메모리 영역의 자원들은 항상 존재
-> 공적 메모리 영역의 자원들은 동적 메모리의 자원들이 항상 존재하는 것이라는 보장을 받지 못한다.
그러므로 객체의 생성과 상관없이 static 변수에 접근하기 위한 메서드를 만들 필요가 있는데, 메서드의 정의 과정에서 static 키워드를 사용하면 static 자원에 접근하기 위한 메서드를 만들 수 있다.
public class Article{
private static int count;
public static void setCount(int count){
Article.count = count;
}
public static int getCount(){
return Article.count;
}
}
1-8. static 메서드 사용시의 제약사항
메모리 영역의 차이 때문에 static 메서드는 동적 메모리 영역의 멤버변수를 사용하거나, static이 아닌 일반 멤버함수를 호출할 수 없다.
고정 영역
-> static 변수와 static 멤버함수가 생성된다.
-> 이 영역의 자원들은 프로그램이 실행되는 동안 항상 존재한다.
-> 동적 메모리 영역의 자원들은 항상 존재하는 것이 아니기 때문에 static 멤버함수는 동적 메모리 영역의 멤버변수를 사용하거나, static이 아닌 일반 멤버함수를 호출할 수 없다.
동적 영역
-> 객체, 객체 안의 멤버변수, 메서드, 메서드가 호출되었을 때 사용되는 지역변수 등이 생성된다.
-> 이 영역의 자원들은 생성과 제거가 유동적으로 반복된다.
-> static 자원은 항상 존재하는 것이므로 동적 영역에서는 static 변수를 활용하거나, static 멤버함수를 호출할 수 있다.