static은 '정적인, 움직이지 않는다'라는 뜻이다.
# static 변수
* static 변수를 “정적 변수”라고도 한다.
* static 키워드를 이용하여 선언한 변수는 해당 클래스의 모든 객체들에 의해 공유된다.
* static으로 선언한 변수는 메모리할당이 한 번만 이루어진다. (메모리 효율적)
* 모든 객체의 공통으로 사용하는 데이터를 관리할때 사용한다.
멤버변수에 static 키워드가 붙으면 인스턴스화를 하지 않고 사용이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class B { static int count = 0; int cnt = 0; public B() { count++; cnt++; System.out.println("static B : "+count); System.out.println("B : "+cnt); } public static void main(String[] args) { B b1 = new B(); B b2 = new B(); B b3 = new B(); } } | cs |
결과는 count=3, cnt=1이다.
count는 static 변수라 메모리가 공유되어 있어서 증가가 되지만
cnt는 b1, b2, b3가 각각 새로운 클래스 인스턴스화 되어 메모리 영역이 다르다.
# static 메소드
* static 메소드를 “정적 메소드” 라고도 한다.
* 정적 메소드는 객체가 생성되지 않는 상태에서 호출되는 메소드이다.
* 정적 메소드 안에서는 정적 변수와 지역 변수만 사용할 수 있다.
* 정적 메소드 안에서는 인스턴스 메소드를 호출하지 못한다.
* 정적 메소드는 this 키워드를 사용할 수 없다. this를 참조할 인스턴스가 없기 때문이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class E { int e=3; static int r =4; public static void e() { System.out.println("hello"); //e=4; (e는 인스턴스 변수이므로 클래스 인스턴스화를 해야 사용가능하다) new E().e=4; r =5; //static 변수이므로 사용가능 } public static void main(String[] args) { E.e(); } } | cs |
static 변수는 static 메서드에서 사용가능하지만
인스턴스 변수는 static 메서드에서 사용 불가능하다.
# static 키워드의 사용범위
1. 모든 인스턴스에 공통적으로 사용해야 할 경우 static을 붙인다.
인스턴스를 생성하면, 서로 독립적이기 때문에 서로 다른 값을 유지하므로 각 인스턴스들이 공통값을 유지하기 위해서는 static을 사용한다.
2. static 키워드가 붙은 멤버변수나 메서드는 인스턴스(객체화)를 생성하지 않아도 사용할 수 있다.
static 변수와, 메서드는, 클래스가 메모리에 올라갈 때 자동으로 생성된다.
3. static이 붙은 메서드에서는 인스턴스 변수(not static)를 사용할 수 없다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 사용하는 것을 고려한다.
메서드 작업하면서 인스턴스 변수가 필요 하다면 static을 사용할 수 없지만, 인스턴트 변수가 필요 없다면 static을 사용한다.
왜냐하면 메서드 호출시간이 짧기때문에 효율성이 좋아지기 때문이다.
# 참고사이트
https://mainia.tistory.com/83
https://dev-jangwon.github.io/java/2017/06/26/java-static/
https://includestdio.tistory.com/14
https://clairdelunes.tistory.com/43
'Java' 카테고리의 다른 글
[자바/JAVA] String, StringBuilder, StringBuffer 차이 정리 (0) | 2019.03.03 |
---|---|
[자바/JAVA] String to int, int to String 변환하는 방법 (0) | 2019.03.03 |
자바(Java) final 키워드 개념 및 사용법 (0) | 2019.02.28 |
자바(java) 프로그램 코드의 시간 측정 방법 (0) | 2019.02.28 |
[Java] 데이터 자료형(byte, char, int long, float, long) 최대값, 최소값 확인 방법 (0) | 2019.02.28 |