public class Article{
private static int count; // 전체 글 수
private static String category // 카테고리
private int num; // 글 번호
private String title; // 제목
private String regDate; // 날짜
// Article 클래스 및 다른 클래스에서 접근하는 경우
Article.count = 3;
Article.category = "공지상항";
// Article 클래스에서 접근하는 경우
count = 3;
category = "공지사항";
클래스에서 정의하는 일반 메서드들은 객체의 생성과 동시에 동적 메모리 영역에서 활성화 된다.
-> 동적 메모리 영역의 입장에서는 고정 메모리 영역의 자원들은 항상 존재한다.
-> 고정 메모리 영역의 자원들은 동적 메모리의 자원들이 항상 존재하는 것이라는 보장을 받지 못한다.
그러므로 객체의 생성과 상관없이 static 변수에 접근하기 위한 메서드를 만들 필요가 있는데, 메서드의 정의 과정에서 static 키워드를 사용하면 static 자원에 접근하기 위한 메서드를 만들 수 있다.
메모리 영역의 차이 때문에 static 메서드는 동적 메모리 영역의 멤버변수를 사용하거나, static이 아닌 일반 멤버함수를 호출할 수 없다.
고정 영역
-> static 변수와 static 멤버함수가 생성된다.
-> 이 영역의 자원들은 프로그램이 실행되는 동안 항상 존재한다.
-> 동적 메모리 영역의 자원들은 항상 존재하는 것이 아니기 때문에 static 멤버 함수는 동적 메모리 영역의 멤버변수를 사용하거나, static이 아닌 일반 멤버함수를 호출할 수 없다.
동적 영역
-> 객체, 객체 안에 멤버변수, 메서드, 메서드가 호출되었을 때 사용되는 지역변수 등이 생성된다.
-> 이 영역의 자원들은 생성과 제거가 유동적으로 반복된다.
-> static 자원은 항상 존재하는 것이므로 동적 영역에서는 static 변수를 활용하거나, static 멤버함수를 호출할 수 있다.
public class Article {
// static은 모든 객체가 공유하는 값이다.
// static값은 클래스 이름을 통해서 접근해야 하며, 객체의 생성 여부에 상관없이 사용이 가능하다.
// 전체 게시물의 수를 표현하기 위한 데이터
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 변수가 1씩 증가한다.
// 전체 게시물 수는 모든 객체가 공유하는 값이므로, static으로 생성되어야 한다.
count++;
}
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 string) {
Article.category = string;
}
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 "글 분류 = " + 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-0711");
Article a2 = new Article(2, "두 번째 글", "2023-0712");
Article a3 = new Article(3, "세 번째 글", "2023-0712");
System.out.println(a1.toString());
System.out.println(a2.toString());
System.out.println(a3.toString());
// static 변수의 값을 변경하면 모든 객체가 영향을 받는다.
Article.setCategory("공지사항");
System.out.println(a1.toString());
System.out.println(a2.toString());
System.out.println(a3.toString());
}
}