-
(김영한의 자바 기본) 6 - static개발/Java 2024. 10. 23. 16:59
public class Data3 { public String name; public static int count; //static public Data3(String name) { this.name = name; count++; } }
- static 은 주로 멤버변수와 메서드에 사용한다.
- static 키워드를 사용하면 공용으로 사용하는 변수를 만들 수 있다.
- 멤버 변수에 static 붙이면 static 변수, 정적 변수, 클래스 변수라 한다.
- static 이 붙은 정적 변수에 접근하려면 Data3.count 와 같이 클래스명 + .(dot) + 변수명 으로 접근하면 된다.
※ Data3 생성자와 같이 자신의 클래스에 있는 정적 변수라면 클래스명 생략은 가능하다.
■ 멤버 변수(필드) 종류
public class Data3 { public String name; public static int count; //static }
name 과 count 모두 Data3의 멤버변수이나,
static 의 여부에 따라 인스턴스 변수, 클래스 변수로 나뉜다.
1. 인스턴스 변수
- static 이 붙지 않은 변수 (=name)
- static 이 붙지 않은 멤버 변수는 인스턴스(객체)를 생성해야 사용 가능하고, 인스턴스에 소속됨 (=인스턴스 변수)
- 인스턴스를 만들 때마다 새로 만들어짐
2. 클래스 변수
- static 이 붙은 멤버 변수 (=count)
- 클래스 변수, 정적 변수, static 변수로 쓰인다.
- 인스턴스와 무관하게 클래스에서 바로 접근해 사용 가능 (=클래스 변수)
- 자바 프로그램 시작할 때 딱 1개가 만들어지며, 여러 곳에서 공유하는 목적으로 사용된다.
■ 변수와 생명주기
1. 지역 변수(매개변수 포함)
- 스택 프라임 안에 보관
- 메서드 종료되면 스택 프라임 제거 -> 지역 변수도 제거
- 생명 주기가 짧음
2. 인스턴스 변수
- 인스턴스에 있는 변수
- 힙 영역 사용
- GC 가비지 컬렉션 발생 전까지 생존
- 지역변수보다 생명 주기가 김
3. 클래스 변수
- 메서드 영역의 static 영역에 보관되는 변수
※ 메서드 영역은 프로그램 전체에서 사용하는 공용 공간
- 해당 클래스가 JVM 로딩되는 순간 생성되며, JVM 종료될 때까지 생명 주기 이어짐
- 생명 주기 가장 길다
※ static 정적으로 불리는 이유
힙 영역에 생성되는 인스턴스 변수는 동적으로 생성되고(사용자의 의해) 제거되는 반면,
static 은 프로그램 실행 시점에 만들어지고 종료 시점에 제거되는 용어 그대로 정적이다.
■ 정적 변수(static) 접근법
//추가 //인스턴스를 통한 접근 Data3 data4 = new Data3("D"); System.out.println(data4.count); //클래스를 통합 접근 System.out.println(Data3.count);
1. 인스턴스를 통한 접근 (추천x) : 인스턴스 변수에 접근하는 것처럼 오해의 여지가 있음
2. 클래스를 통한 접근 : 공용 관리 변수이므로 클래스로 접근하는 것을 추천한다.
■ static 메서드(=클래스 메서드) (★)
인스턴스가 필요한 이유는 멤버 변수(인스턴스 변수)등을 사용하는 목적이 큰데,
만약 인스턴스 변수를 사용하지 않는 메서드(기능) 이라면 굳이 인스턴스를 생성하지 않아도 된다.
public class DecoUtil2 { public static String deco(String str) { String result = "*" + str + "*"; return result; } }
따라서 다음 코드와 같이 static 을 붙이게 되면 정적 메서드를 만들 수 있으며,
인스턴스 생성 없이 클래스 명을 통해 바로 호출이 가능하다.
부를 때는 클래스명 + .(dot) + 메서드 명으로 바로 호출이 가능하다.
이렇게 메서드 앞에 static 을 붙이는 것을 정적 메서드 또는 클래스 메서드라고 한다.
클래스 메서드라는 용어는 인스턴스 생성 없이 마치 클래스에 있는 메서드를 바로 호출하는 것처럼 느껴진다.
※ 인스턴스 메서드
static 이 붙지 않은 메서드이며 인스턴스를 생성해야 호출 가능하다.
■ 정적 메서드 사용법
public class DecoData { private int instanceValue; private static int staticValue; public static void staticCall() { //instanceValue++; //인스턴스 변수 접근, compile error //instanceMethod(); //인스턴스 메서드 접근, compile error staticValue++; //정적 변수 접근 staticMethod(); //정적 메서드 접근 } public void instanceCall() { instanceValue++; //인스턴스 변수 접근 instanceMethod(); //인스턴스 메서드 접근 staticValue++; //정적 변수 접근 staticMethod(); //정적 메서드 접근 } private void instanceMethod() { System.out.println("instanceValue=" + instanceValue); } private static void staticMethod() { System.out.println("staticValue=" + staticValue); } }
static 메서드는 static 만 사용할 수 있다.
- 정적 메서드는 static 이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.
- 정적 메서드는 인스턴스 변수나 인스턴스 메서드를 사용 불가하다.
※ 정적 메서드가 인스턴스 기능 사용하지 못하는 이유
정적 메서드는 클래스 이름을 통해 바로 호출할 수있게 때문에 인스턴스처럼 참조값 개념이 없다.
특정 인스턴스 기능 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출되므로,
정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드 사용이 불가하다.
모든 곳에서 static 호출 가능하다.
- 공용 기능으로 접근 제어자면 허락한다면 클래스를 통해 모든 곳에서 static 호출이 가능하다.
■ 멤버 메서드 종류
1. 인스턴스 메서드 : static 붙지 않은 멤버 메서드
2. 클래스 메서드 : static 붙은 멤버 메서드
static 이 붙지 않은 멤버 메서드는 인스턴스 생성이 필요하며, 인스턴스 소속이다.
static 붙은 멤버 메서드는 인스턴스와 무관하게 클래스에 바로 접근해 사용 가능하고 클래스 자체 소속이다.
■ 정적 메서드 활용
정적 메서드는 객체 생성이 필요 없이 메서드 호출만으로 필요한 기능 수행할 때 주로 사용한다.
ex) 간단한 메서드 하나로 끝나는 유틸리티성 메서드 자주 사용
■ main() 메서드는 정적 메서드
public class ValueDataMain { public static void main(String[] args) { ValueData valueData = new ValueData(); add(valueData); } static void add(ValueData valueData) { valueData.value++; System.out.println("숫자 증가 value=" + valueData.value); } }
인스턴스 생성 없이 실행하는 가장 대표적인 메서드가 main() 메서드이다.
정적 메서드는 같은 클래스 내부에서 정적 메서드만 호출 가능하기 때문에
main() 메서드 같은 클래스에서 호출하는 메서드도 정적 메서드로 선언해 사용했다.
■ static final (상수)
public class FieldInit { static final int CONST_VALUE = 10; final int value = 10; }
CONST_VALUE 는 static 영역에 존재하고 final 키워드를 사용해 초기값 변하지 않는다.
static 영역은 단 하나만 존재하는 영역으로 해당 변수는 JVM 상에서 하나만 존재해서 메모리 효율성을 챙긴다.
이렇게 변하지 않고 항상 일정한 값을 가지는 수를 상수라 하는데,
자바에서는 단 하나만 존재하고 변하지 않는 수를 상수라 한다.
'개발 > Java' 카테고리의 다른 글
(김영한의 자바 기본) 5 - 자바 메모리 구조 (메서드, stack, heap) (1) 2024.10.23 (김영한의 자바 기본) 4 - 접근 제어자 (private, default, protected, public) (0) 2024.10.23 (김영한의 자바 입문) 3 - 내용 정리 (0) 2024.05.28 (Do it 자바) 2 - 변수와 자료형 (1) (0) 2023.05.31 (Do it 자바) 1 - 자바 프로그래밍 시작하기 (2) 2023.05.25