-
JAVA - static , 접근제어자CS/JAVA 2024. 6. 3. 21:50
static
static 변수 또는 메서드는 프로그램이 시작할때부터 메모리 공간에 저장되어 전역변수처럼 사용이 된다.
클래스가 있을 때 이 클래스 안의 변수나 메서드를 사용하려면 먼저 객체를 생성해야 한다.
하지만 static변수나 메서드의 경우 객체를 생성하지 않고도 사용할 수 있다.
보통 객체를 생성해야 메모리에 올라가는데, static은 프로그램 시작시 메모리에 올라가기 때문이다.
static을 사용할 때 주의할 점
static 메서드에서는 static이 아닌 변수는 가져다 사용하는 것이 불가능하다.
예시 코드를 보며 이유를 알아보자.
public class Example{ int num01; // Example 객체를 생성해야 메모리에 저장 static int num02; // 프로그램 시작 시 메모리에 저장 void method01(){ System.out.println(num01); System.out.println(num02); } static void method02(){ // 프로그램 시작 시 메모리에 저장 System.out.println(num02); // 함수와 함께 메모리에 저장되므로 ok System.out.println(num01); // static 변수가 아니라서 해당 변수에 대한 정보가 없음 } } public class ExampleMain{ public static void main(String[] args){ Example Ex01; Ex01 = new Example(); //객체 생성 Ex01.num01 = 10; Ex01.method01(); Example Ex02; Ex02.num02 = 20; // 객체를 생성하지 않고도 사용 가능 Ex02.method02(); // 에러 발생 } }이런 코드를 실행시킨다면 metod2에서 오류가 날 것이다.
num02와 method02는 static이기 때문에 Example객체를 생성하지 않아도 메모리에 저장돼있다.
Example 객체를 생성한 후에 method를 호출하면 해당 객체의 num01, num02는 모두 메모리에 있기 때문에 메서드 실행에 아무 문제가 없다,
하지만 method02의 경우 객체를 생성하지 않고 메서드를 실행시켰는데, num02는 static이라 메모리에 저장돼있어 사용 가능하지만 num01은 객체를 생성하기 전까지는 메모리에 존재하지 않아서 사용이 불가능하다.

접근제어자
클래스, 메소드, 인스턴스 및 클래스 변수를 선언할 때 사용됨으로써 외부에서 접근하지 못하도록 제한하는 역할
접근 제어자별 접근 범위 :
같은 클래스 같은 패키지 자식 클래스 전체 public O O O O protected O O O X default O O X X private O X X X 접근제어자는 어떨 때 사용할까?
변수나 메서드를 public으로 해놓으면 아래와 코드처럼 외부에서 접근해 값을 변경할 수 있다.
public class Example{ int age; } public class Main{ public static void main(String[] args){ Example ex = new Example(); ex.age = 4000; //호고곡!!! } }이렇게 아무 값이나 넣으면 안되거나 제한이 필요한 변수나 메서드에 private을 사용하면 외부의 조작을 제한할 수 있다.
public class Example{ private int age; public void setAge(int age){ if(age > 200){ System.out.println("나이는 200살까지만 설정 가능합니다."); this.age = 200; }else{ this.age = age; } } } public class Main{ public static void main(String[] args){ Example ex = new Example(); ex.age=4000; // 접근 불가능 ex.setAge(20); } }그런데, static과 접근제어자를 공부하다보니 의문이 들었다.
private static은 어디에 쓰일까? private은 목적이 접근을 제한하기 위함이고, static은 접근을 허용하는 느낌인데 두 개를 같이 사용하는 일이 있을까?
보통 static 메서드에서 호출되는 변수 또는 메서드에 private + static을 사용한다.
위의 코드를 그대로 가져와서 setAge함수를 static으로 설정하면 age도 static으로 설정해야 한다.
age는 직접 접근이 불가능하게 private으로 했지만, static인 메서드에서 age를 가져다 써야하기 때문에 age를 private+static으로 해야한다.
public class Example{ private static int age; public static void setAge(int age){ if(age > 200){ System.out.println("나이는 200살까지만 설정 가능합니다."); this.age = 200; }else{ this.age = age; } } } public class Main{ public static void main(String[] args){ Example ex = new Example(); ex.age=4000; // 접근 불가능 ex.setAge(20); } }근데 여기서 또 의문이 생긴다!
static 메서드를 메모리에 올릴 때 메서드를 실행하지는 않을텐데 static 변수가 아닌 변수를 가져다 쓴다 해도 객체를 생성해서 메서드를 호출하기 전까지는 괜찮지 않을까?
물론 인텔리제이에서는 메서드 호출 전에도 에러가 뜨지만, 이게 인텔리제이에서 친절하게 알려주는 것인지 자바 자체에서 안되는건지 궁금하다!
'CS > JAVA' 카테고리의 다른 글
JVM(Java Virtual Machine) (4) 2024.09.02 JAVA - Tomcat, Servlet 으로 클라이언트 요청받기 (2) 2024.06.17 JAVA - JDBC 사용해 db서버와 데이터 요청/응답 받기 (1) 2024.06.05 JAVA - 오버로딩, 오버라이딩 (3) 2024.06.04 JAVA - 상속, 생성자 (0) 2024.06.04