[JAVA] static과 접근 제한자
static이란?
정지상태, 고정된, 변화가 없는
클래스가 로딩될때 static 선언된 자원들은 JVM(Java Virtual Machine) 에서 메모리에 딱 한번 올라감
(= 즉 Static 변수는 클래스가 사용되기 전 미리 메모리에 올라감)
static을 사용하면 객체 생성할 필요없이 공용된 자원을 사용함으로써 메모리를 효율적으로 사용할 수 있지만 무분별한 사용은 프로그램에 악영향을 미침
왜 main 앞에 static이 붙여질까?
- 프로그램이 실행될때 인스턴스를 생성하지 않고 바로 실행되어야 하기 때문에 static이 붙는다.
class Test {
public static void main (String[] args) {
System.out.println("실행")
}
}
Static 장단점
<장점>
1. Static은 공용 자원이기 때문에 생성할때마다 인스턴스가 메모리에 올라가는 것이 아니라 고정 메모리
(= 제대로 사용한다면 메모리 효율적 사용 가능)
2. Static 속도가 빠름, 객체 생성하지 않고 바로 사용하기 때문에
<단점>
1. Static은 미리 메모리를 할당 받기 때문에 무분별한 Static 사용은 메모리 낭비될 가능성 존재
2. 잘못된 Static 사용은 디버깅이 어려움
3. Static method에서는 static 변수만 사용 가능
public static final
"static"
- 해당 데이터의 메모리 할당을 컴파일 시간에 할 것을 의미
- 즉, 런타임 중에 필요할때마다 동적으로 할당 및 해제되는 동적데이터와는 기능과 역할이 구분
- static 데이터는 프로그램 실행 직후부터 끝날때까지 메모리 수명이 유지
- "public static final " -> 인스턴스가 만들어질때마다 새로 메모리를 잡고 초기화 시키는게 아니라 사용할 해당 멤버 변수의 데이터와 그 의미, 용도를 고정시킨다는 의미!
ex) Error 발생 - 해결방법 출처
/Solution.java:15: error: non-static method solution(String) cannot be referenced from a static context
solution("AABA");
원인? static method안에 non static method가 들어있기 때문에 발생하는 오류임
해결방법 (1) error method를 static으로 선언 (2) 객체 선언 후 메소드 호출
JVM(Java Virtual Machine) <복습>
1. Method Area
- JVM이 실행될 때 생성
- Type 정보를 가지고 있는 영역 -> 7개의 정보를 저장(ex. Class Variable)
- Class Variable -> Static Variable , Static 변수는 Class Variable에 저장
- 어디서나 공유해서 쓸 수 있다는 변수 의미하고 Static 변수는 클래스가 사용되기 전 미리 메모리에 올라감
2. Heap Area
- 인스턴스와 배열을 저장하는 영역
- 데이터가 동적으로 생성, 소멸됨
- JVM이 Heap 영역에 메모리 할당
접근 제한자
- 멤버들은 객체 자신들의 속성이자 대외적으로 좋은 것이 아니기 때문에 프로그래머가 객체의 멤버들에게 접근 제한을 걸 수 있음
- 접근의 범위를 지정해주는 제어자들 -> public, protected, default, private
- public -> 완전한 공개, 접근의 제한이 전혀 없는것, 어느 프로젝트던지 접근 가능
- protected -> 패키지에 관계없이 상속관계에 있는 자식 클래스를 접근할 수 있도록 해줌, 상속관계 있으면 무조건 접근가능!
- default -> 한 패키지 내에서 모두 접근 가능, protected 보다 더 좁은 범위
- private -> 한 클래스 안에서만 접근이 가능
- getter()와 setter을 사용하면 private 필드를 우회하여 가져오거나 변경가능
<출처>
1. www.youtube.com/watch?v=ji7UznXBwfs
2. cloudstudying.kr/lectures/201
3.