내부클래스에는 왜 static이 권장되나요?
내부 클래스가 외부 클래스의 멤버를 쓸 일이 없는데 !
static
을 붙이지 않으면 (non-static)
내부 클래스에 외부 클래스의 숨은 외부 참조가 붙어있어 시간적/공간적 복잡도가 증가하여 성능 문제 발생
외부 참조 때문에 가비지 컬렉션이 제대로 이루어지지 않아 메모리 누수가 발생할 수 있음
내부 클래스가 non-static이면 외부 참조를 한다.
(그래서 내부에서 this
를 통해 외부의 필드를 가져올 수 있게 된다.)
외부 참조를 하지 않으면, 내부에서 외부 클래스로 this
를 통한 참조가 불가능해진다.
내부 클래스가 non-static 이면 외부 클래스가 가비지 컬렉션 대상에서 제외된다.
한번 쓰고 사라져도 될 객체가 계속 남아있어 메모리에 치명적이다.
static 한 내부 클래스는 외부 클래스와 연관이 없기 때문에
일회성으로 사용될 수 있는 외부 클래스는 가비지 컬렉션이 정상적으로 회수해갈 수 있다.
내부 클래스에서 외부 클래스의 필드를 사용할 일이 없는 경우 static 키워드를 붙여 선언해야 한다.
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();
}
}
출처: https://mangkyu.tistory.com/47 [MangKyu's Diary:티스토리]
이런식이라면 전역 변수도 마찬가지!
static 변수는 일반적으로 상수들만 모아서 사용하며 이 역시도 상속을 방지하기 위해 final class
로 선언하여 변수들을 모아준다.
public final class AppConstants {
public static final String APP_NAME = "MyApp";
public static final String PREF_NAME = "MyPref";
}
출처: https://mangkyu.tistory.com/47 [MangKyu's Diary:티스토리]
클래스 안의 클래스를 생성할 때 static을 붙이지 않으면 숨은 외부 참조가 붙게 된다.
외부 참조가 붙게 되면 GC의 대상에서 제외되기 때문에 한 번 쓰고 없어져도 될 객체가 남아있어 메모리 누수가 발생하게 된다.
따라서 static을 붙여 외부 참조가 붙지 않게 하는 것이 메모리 누수 관리에 좋다.
인상깊어요 >_<