drexqq
[Java, 자바] static 본문
Java의 static에 대해서 알아보자.
static은 정적이라고 생각할 수 있다.
static 또한 변수, 클래스, 메서드에서 사용할 수 있는 점이 final과 비슷하다.
사용처를 알아보자.
package main;
public class MyClass {
private int memNum = 0; //member variable - 객체가 달라지면 초기화
static int staticVar; //static variable - 객체가 달라져도 계속해서 값유지
//메모리영역이 무조건 하나다
public int getMemNum() {
return memNum;
}
public void setMemNum(int memNum) {
this.memNum = memNum;
}
public void method() { //instance method or method
int i = 0; //local - 선언된 블록을 빠져나갔을때 소멸
i = i + 1;
memNum = memNum + 1; //member - 선언한 객체가 가비지콜렉터에 의해 삭제되었을때 소멸
System.out.println("memNum = " + memNum );
staticVar = staticVar + 1; //static - 사라지지 않음
System.out.println("staticVar = " + staticVar);
}
public static void staticMethod() { //class method or static method
System.out.println("MyClass staticMethod() 호출");
// 접근 못하는 요소
// this, super <- 접근불가
}
}
위 코드를 예로 설명하겠다.
method라는 메소드에서
MyClass라는 클래스의 멤버 변수와 static변수를 가지고 연산을 해주었다.
저 상태에서 메인클래스에서 method라는 메서드를 실행시키면 어떻게 될까
MyClass cls = new MyClass();
int m = cls.getMemNum();
System.out.println("m = " + m);
cls.method();
cls.method();
cls.method();
이런 식으로 실행했다고 생각해보자.
결과 값은 동일하게 나온다.
하지만 여기서
MyClass cls2 = new MyClass();
cls2.method();
해당 클래스의 새로운 객체를 생성해서 같은 메서드를 사용하게 된다면 어떻게 될까??
결과는 멤버 변수는 초기화되어서 나오고 static변수는 그전에 연산되었던 값을 그대로 가지고 있어간다.
이유는 소멸되는 시점에 따라서 달라지는데 자바에서 멤버 변수는 가비지 컬렉터에 의해서 자동으로 소멸되지만
static변수는 멤버 변수와 다르게 가비지 컬렉터에 의해서 소멸되지 않고 메모리 영역에 남아있게 된다.
때문에 새로운 객체를 생성한다 해도 static변수는 계속해서 값이 유지되어있다.
이번엔 static메서드를 보자
package main;
public class Member {
public Member() {
System.out.println("Member Member()");
}
public void init() {
System.out.println("Member init()");
}
public void random() {
System.out.println("Member random()");
}
public void input() {
System.out.println("Member input()");
}
public static Member getInstance() {
Member m = new Member();
m.init();
m.random();
m.input();
return m;
}
}
Member클래스의 init, random, input을 실행시켜주려면
Member mem = new Member();
mem.init();
mem.random();
mem.input();
이렇게 객체를 선언하여서 각각 그 메소드를 호출해줄 것이다.
하지만 static메서드는
return 값으로 해당 클래스를 가질 수 있어서
Member mem2 = Member.getInstance();
이런 식으로 사용을 할 수 있게 된다.
하지만 static을 사용할 때는 유의해야 할 점이 있다.
앞서 설명했듯이 프로그램이 종료될 때까지 사라지지 않고 메모리 영역에 남아있기 때문에 메모리 낭비를 초래할 수 있다.
때문에 사용을 할 때 조심해서 사용해보도록 하자
'Back-End > Java' 카테고리의 다른 글
[Java, 자바] ArrayList (0) | 2020.06.08 |
---|---|
[Java, 자바]Generic(제네릭) (0) | 2020.06.08 |
[Java, 자바] final (0) | 2020.06.03 |
[Java, 자바] Overriding(오버라이딩) (0) | 2020.06.03 |
[Java, 자바] OOP(Object Oriented Programming) (0) | 2020.06.01 |