2021. 11. 17. 02:00ㆍ[JAVA]
1. Static
Java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다. 이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필요.
[Static의 메모리]
일반적으로 개발자가 만든 Class는 Static 영역에 생성되고, new 연산을 통해 생성한 객체는 Heap영역에 생성된다. 객체의 생성시에 할당된 Heap영역 메모리는 GC(Garbage Collector)를 통해 수시로 관리를 받는다. 하지만 Static 키워드를 통해 Static영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만, Garbage Collector의 관리 영역 밖에 존재하므로 Static을 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채로 존재하므로 자주 많이 Static에 할당한다면 시스템 퍼포먼스에 악영향을 주게 된다.
[Static 변수 특징]
1. Static 변수는 클래스 변수이다.
2. 객체를 생성하지 않고도 Static 자원에 접근이 가능하다.
Static 변수와 Static 메소드는 Static 메모리 영역에 존재하므로 객체가 생성되기 이전에 이미 할당되어 있다. 그렇기 떄문에 객체의 생성없이 바로 사용할 수 있다.
2. Static 변수(정적 변수)
Static 변수 : 메모리에 고정적으로 할당되어, 프로그램이 종료될 때 해제되는 변수
Java에서 Static 변수는 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 변수로, 메모리에 한번 할당되므로 여러 객체가 해당 메모리를 공유하게 된다.
Ex) 세상 모든 사람의 이름이 'Doby'인 세상세 살고 있다고 가정한다.
public class Person {
private String name = "Doby";
public void printName() {
System.out.println(this.name);
}
}
위와 같이 코딩했을 경우에 100명의 Person 객체를 생성하면 "Doby"라는 같은 값을 갖는 메모리가 100개나 중복해서 생성되게 된다. 이러한 경우에 static을 사용하여 여러 객체가 하나의 메모리를 참조하도록 하면 메모리 효율이 더욱 높아진다. 또한 "Doby"라는 이름은 변하지 않는 값이니 final 키워드를 붙여주며, 일반적으로 Static은 상수의 값을 갖는 경우가 많아 public으로 선언을 하며 사용한다. 이러한 이유로, 일반적으로 static 변수는 public 및 final과 함께 사용되어 public static final로 활용 된다.
public class Person {
public static final String name = "Doby";
public void printName() {
System.out.println(this.name);
}
}
3. Static 메소드 (정적 메소드)
Static Method는 객체의 생성 없이 호출이 가능하지만 지양하고 있는 방식.
왜냐면 Static Method를 사용하기 위해서는 참조하는 변수도 모두 Static 메모리에 올라간 변수여야 한다.
즉 static method에서 사용하는 변수가 모두 정적 변수여야 한다는 것.
그러면 많은 변수가 static으로 할당되게 되는데 이것은 1. static 변수는 변하지 않는 값을 지정한다. 2. 너무 많은 Static변수는 메모리 누수에 원인이다. 3. 할당되지 않은 메모리 영역에 접근을 하므로 문제 발생과 같은 이유로 사용하지 않는편이다.
대신 Util과 관련된 함수들을 모아논다 ex) Date- SimpleDateFormat과 같은 날짜를 가져오는 함수
4. 실제 Static 변수와 Static 메소드의 활용
1) Static 변수
일반적으로 상수들만 모아서 사용하며 상수의 변수명은 대문자와_를 조합하여 이름 짓는다. 또한 상속을 방지하기 위해 final class 선언을 한다.
public final class AppConstants {
public static final String APP_NAME = "MyApp";
public static final String PREF_NAME = "MyPref";
}
2) Static 메소드
마찬가지로 상속을 방지하기 위해 final class로 선언을 하고, 유틸 관련된 함수들을 모아둔다.
import java.text.SimpleDateFormat;
import java.util.Date;
import android.util.Patterns;
public final class CommonUtils {
public static String getCurrentDate() {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
return dateFormat.format(date);
}
public static boolean isEmailValid(String email) {
return Patterns.EMAIL_ADDRESS.matcher(email).matches(); }
}
'[JAVA]' 카테고리의 다른 글
TDD란? - Test-Driven-Development (0) | 2022.01.28 |
---|---|
[Java] 인터페이스와 추상클래스의 차이 (0) | 2021.11.16 |
[JAVA] String 문자열과 StringBuilder, StringBuffer의 비교 (0) | 2021.11.16 |
[Java] Java파일의 컴파일 과정 (0) | 2021.11.16 |
[Java] 직렬화(Serialization) (0) | 2021.11.16 |