Static은 고정된이라는 의미를 가지고 있다.
Static 키워드를 사용한다면 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 말한다.
즉, 수명의 주기가 프로그램과 같아 진다는 것이다. 일반적으로 Class는 Static 영역에 생성되고, new 연산을 통해 생성한 Instance는 Heap 영역에 생성된다. Heap영역의 메모리는 Garbege Collector를 통해서 계속해서 관리된다. 하지만 Static 키워드를 통해 생성이 된다면 Static 영역에 할당된 메모리는 모든 객체가 공유하는 특성을 지니며, 이는 Garbege Collecor를 통해서 관리되는 영역이 아니기 때문에 Static을 자주 사용한다면 시스템 성능이 떨어질 수 있다.
Static 변수의 특징 - 즉시 호출 가능
Static 키워드를 사용해 변수와 메서드를 만들 수 있는데 이때 만들어진 멤버들은 instance를 생성하지 않고 바로 호출이 가능하다. 클래스 로더가 클래스를 로딩하여 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있기 때문이다.
package mntdev.core;
class Member{
static String name = "dev";
String name2 = "dev";
}
public class mainClass {
public static void main(String[] args) {
System.out.println(Member.name); //dev 출력
System.out.println(Member.name2); //에러
}
}
위와 같이 Member 클래스를 즉시 호출하여 name을 확인이 가능하다. 하지만 static이 아닌 변수에는 에러가 발생하기 떄문에 static이 아닌 변수를 출력하려면 아래와 같은 코드를 통해 가능하다.
package mntdev.core;
class Member{
static String name = "dev";
String name2 = "dev";
}
public class mainClass {
public static void main(String[] args) {
System.out.println(Member.name);
Member member2 = new Member();
System.out.println(member2.name2);
}
}
Static 변수의 특징 - 메모리 공유
package mntdev.core;
class Member{
static String name = "dev";
String name2 = "dev";
}
public class mainClass {
public static void main(String[] args) {
Member member = new Member();
Member member2 = new Member();
member.name = "hi";
System.out.println(member.name);
System.out.println(member2.name);
//hi, hi
member.name2 = "hi";
System.out.println(member.name2);
System.out.println(member2.name2);
//hi, dev
}
}
위 코드를 봤을때 member에서 static 변수인 name을 변경하면 다른 Instance인 member2에서도 똑같이 name이 변경되지만, static 변수가 아닌 name2를 똑같이 변경한다면 다른 Instance인 member2에는 변경이 되지 않는것을 볼 수 있습니다.
언제 사용할까?
static 키워드는 유틸리티 메서드를 사용하는데 유용합니다.
만약 여러 사용자의 이름, 나이, 성별 등을 출력하는 기능을 만든다면 printMember()라는 메소드를 만들고, static을 붙여준다면 Member.printMember(이름,나이,성별) 을 입력해 편리하게 기능을 사용할 수 있습니다.
package mntdev.core;
class Member{
static void printMember(String name, String age, String gender){
System.out.println("회원의 이름,나이,성별은 : " + name + age + gender);
}
}
public class mainClass {
public static void main(String[] args) {
Member.printMember("dev","26","male");
}
}
참고
'Languege > Java & Spring' 카테고리의 다른 글
[김영한 스프링] 스프링 컨테이너와 빈 (0) | 2022.03.10 |
---|---|
[김영한 스프링] 스프링 핵심 원리 이해 (0) | 2022.03.08 |
좋은 객체 지향 설계의 5가지 원칙 (SOLID 원칙) (0) | 2022.03.01 |
좋은 객체 지향 프로그래밍 (0) | 2022.02.28 |