Programming/FULL STACK

[JAVA] static과 접근 제한자

RosyPark 2022. 5. 6. 11:06

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.