반응형
final
- 변경 불가의 의미를 담고 있는 키워드
- 클래스 필드의 final 변수는 선언과 동시에 초기화 하거나 생성자를 통한 초기화를 해야 함( 인스턴스 생성만 하면 기본 값 0이 필드에 들어가기 떄문에)
(1) 선언과 동시에 초기화 하기
private final int NON_STATIC_NUM = 1;
(2) 생성자를 이용해 초기화 하기
private final String NON_STATIC_NAME;
public Test(String nonStaticName) {
this.NON_STATIC_NAME = nonStaticName;
}
(3) static field에 final사용
private static final int STATIC_NUM = 1;
생성자의 이용한 초기화는 불가능.
static은 프로그램이 시작 될 때 할당 되기 때문에 초기화가 되지 않은 상태로 선언된 것과 동일하다.
생성자는 인스턴스가 생성되는 시점에 호출이 되기 때문에 그 전에는 초기화가 일어나지 못하여
생성자를 이용한 초기화는 불가능하다.
static
- 정적 메모리 영여에 프로그램이 시작할 때 할당을 하는 키워드
- 인스턴스를 생성하지 않고도 사용할 클래스의 멤버(필드, 메소드)에 지정할 수 있음
- 여러 인스턴스가 공유해서 사용할 목적의 공간
◇ static 필드 흐름 살펴보기 ◇
1 . class StaicFieldTest 생성 후 작성
public class StaticFieldTest {
(1) non-static 필드와 static 필드 선언하기
private int nonStaticCount;
private static int staticCount;
(2) non-static 필드에 대한 값 확인
public int getNonStaticCount() {
return this.nonStaticCount;
}
(3) static 필드에 대한 값 확인
public int getStaticCount() {
return StaticFieldTest.staticCount;
} => static 필드에 접근하기 위해서는 클래스명.필드명으로 작성
(4) 두 필드 값을 1씩 증가시키기 위한 용도의 메소드 생성
public void increaseNonStaticCount() {
this.nonStaticCount++;
}
public void increaseStaticCount() {
StaticFieldTest.staticCount++;
}
2 . class StaticMethodTest 생성 후 작성
(5) 호출할 메소드 작성
public class StaticMethodTest {
private int count;
public void nonStaticMethod() {
this.count++;
System.out.println("nonStaticMethod 호출 됨...");
} => 인스턴스 생성 후 사용 가능한 메소드이ㅣ 때문에 this에는 주소값만 있음.
public static void staticMethod() {
System.out.println("staticMethod 호출 됨...");
} => 인스턴스를 생성하지 않고 사용하는 메소드이기 때문에 this에는 주소가 들어갈 수 없음
반응형
3 . Application class 생성 후 메인메소드에서 호출 후 출력
StaticFieldTest sft1 = new StaticFieldTest();
(1) 두 필드가 가지고 있는 값 확인
System.out.println("non-static field : " + sft1.getNonStaticCount());
System.out.println("static field : " + sft1.getStaticCount());
◇ 실행 결과
non-static field : 0
static field : 0
(2) 두 필드의 값 1씩 증가 후 값 확인
StaticFieldTest의 1씩 증가시키기 위한 용도로 작성한 메소드 호출
↓
sft1.increaseNonStaticCount();
sft1.increaseStaticCount();
System.out.println("non-static field : " + sft1.getNonStaticCount());
System.out.println("static field : " + sft1.getStaticCount());
◇ 실행 결과
non-static field : 1
static field : 1
(3) 새로운 StaticFieldTest 인스턴스 생성하여 값 확인
StaticFieldTest sft2 = new StaticFieldTest();
System.out.println("non-static field : " + sft2.getNonStaticCount());
System.out.println("static field : " + sft2.getStaticCount());
◇ 실행 결과
non-static field : 0
static field : 1
- 인스턴스 변수의 경우에는 stf1 과 stf2 두 개의 인스턴스가 서로 값을 공유하지 못하여 새로운 인스턴스를 생성할 때마다 0으로 초기화 된다.
- static 필드의 경우 클래스 변수 자체가 프로그램을 종료할 때까지 유지되고 있기 때문에 새로운 인스턴스를 생성하여도 값을 유지하고 있다
- 여러 개의 인스턴스가 같은 공간을 공유할 목적으로 필드에 static 키워드를 사용한다.
- static 메소드를 호출할 때는 인스턴스를 생성하지 않고 호출하는 방식으로 사용해야한다.
4. class StaticMethodTest의 작성한 메소드 호출
StaticMethodTest smt = new StaticMethodTest();
smt.nonStaticMethod();
StaticMethodTest.staticMethod();
=> static 메소드를 호출할 때는 인스턴스를 생성하지 않고 호출하는 방식으로 사용해야한다.
◇ 실행 결과
nonStaticMethod 호출 됨...
staticMethod 호출 됨...
반응형
'프로그래밍 > java' 카테고리의 다른 글
[자바JAVA] 객채 배열(초기화, 저장구조) (0) | 2022.07.11 |
---|---|
[자바JAVA] 변수의 종류(지역변수, 전역변수, 매개변수, 클래스 변수) (0) | 2022.07.07 |
[자바JAVA] 파라미터(parameter)_가변파라미터 (0) | 2022.07.07 |
[자바JAVA] 오버로딩 (Overloading) (0) | 2022.07.07 |
[자바JAVA] 객체 지향 언어(OOP) & DTO 작성 방법 (0) | 2022.07.07 |