1. static의 정의
1) 뜻 : 정적인 (움직임이 없다)
2) 특징 : 공유
static 붙은 필드/메서드는 프로그램 실행 시 * 모두 static 영역에 할당되고
종료시 사라지게 됨
-> 프로그램 실행 중에는 절대 없어지지 않음 == 정적
<-> 객체가 생겼다/사라졌다 함 --> Heap 영역(동적)
- static 붙은 필드 / 메서드는
**프로그램 실행 시**
클래스명.필드명 / 클래스명.메서드명() 이름으로
static 영역에 할당(생성) 되어지고 어디서든 클래스명.필드명 / 클래스명.메서드명()으로
호출 가능한 상태가 됨!!
| stack | 다시쓰기 |
| Heap | - 동적 메모리 영역 - 프로그램 실행 중 객체가 생성/소명하는 영역 - new 연산자를 이용해 클래스에 정의된 내용대로 객체(instance)를 생성 - 소멸 : Garbage Collection이 일정 시간 마다 사용되지 않는 객체를 소멸(메모리 반환) |
| Static | - 정적 메모리 영역 - 프로그램 실행 시 static 키워드가 붙은 필드 / 메서드를 static 영역에 할당(생성) - 어디서든 공유 가능 (단, public일 경우) - 클래스명.필드명 / 클래스명.메서드명() 으로 호출 |
#예제
[기능]
package field.pkg3;
public class Korean {
// 필드
// static 변수 ( == 클래스 변수 )
// -> 어디서든 접근 가능하게 public 작성
public static int nationlCode = 82; // 국가코드
public static int nationalCode;
// 인스턴스 변수
// -> 만들어진 인스턴스(객체)만 사용 가능한 변수
// -> 캡슐화 원칙에 의해서 private 설정
private String name; // 이름
private String id; // 주민 등록 번호
// private 필드 간접 접근 방법 (getter/setter)
// name의 getter
public String getName() {
return name;
}
// id의 getter
public String getId() {
return id;
}
// name의 setter
public void setName(String name) {
// 매개 변수 : 전달 받은 값을 저장하는 변수
// this : (해당 클래스) 해당 객체
this.name = name;
}
// id의 setter
public void setId(String id) {
this.id = id;
}
}
[실행1]
package field.pkg3;
public class StaticTestRun {
public static void main(String[] args) {
// Korean 객체 2개 생성
Korean k1 = new Korean();
k1.setName("김철수");
k1.setId("991004-1234567");
Korean k2 = new Korean();
k2.setName("박영희");
k2.setId("991004-1234567");
//--------------------------------------------------
System.out.println("[생성된 객체의 필드 값 확인]");
System.out.printf("k1 : %d / %s / %s \n", k1.nationlCode, k1.getName(), k1.getId() );
System.out.printf("k2 : %d / %s / %s \n", k2.nationlCode, k2.getName(), k2.getId() );
//--------------------------------------------------
System.out.println("\n\n[static 변수 값 변경 확인]");
// static은 값을 공유하고 있기 때문에
// 한 번만 바꾸면 공유하는 모든 객체의 값이 변경된다!!
k1.nationlCode = 10;
// k2.nationalCode = 10; // 불필요한 코드
System.out.printf("k1 : %d / %s / %s \n", k1.nationlCode, k1.getName(), k1.getId() );
System.out.printf("k2 : %d / %s / %s \n", k2.nationlCode, k2.getName(), k2.getId() );
}
}
#결과

[실행2]
// 왜 k1.nationalCode / k2.nationalCode에 노란줄이 떠있을까??
// The static field Korean.nationalCode
// should be accessed in a static way
//-> 정적 방식으로 접근하는 게 좋아~
// -> static 영역에 생성된 이름으로 호출하는 게 좋다!
System.out.println("\n\n");
System.out.println("[static에 선언된 이름 사용하기]");
System.out.println("Korean.nationalCode : " + Korean.nationlCode);
System.out.println("-- 값 변경 --");
Korean.nationalCode = 1;
System.out.println("Korean.nationalCode : " + Korean.nationalCode);
System.out.println(k1.nationalCode);
System.out.println(k2.nationalCode);
#결과

2. final 변수
final 변수 == 상수
static 변수 == 공유하는 변수
// static fianl 또는 final static
→ 공유 가능한 상수
→ 무슨 용도??
전체적으로 사용되면서 변하면 안되는 값
ex)
Math.PI (원주율)
Integer.MAX_VALUE (int 최대값)
Integer.MIN_VALUE (int 최소값)
System.out.println(Math.PI);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
#결과

'BackEnd > Java' 카테고리의 다른 글
| [Java]매개 변수의 다형성 (Polymorphism) (0) | 2024.07.30 |
|---|---|
| [Java]OOP 메서드(method) (0) | 2024.07.25 |
| [Java]OOP_필드(Field) (1) | 2024.07.23 |
| [Java]OOP_클래스 (1) | 2024.07.23 |
| [Java]객체지향언어(OOP) 정의 및 Account (0) | 2024.07.23 |