[JAVA] static

da__ell·2022년 8월 22일
0

JAVA

목록 보기
3/7

처음 자바를 시작하면 보게되는 코드

public class Main {
    public static void main(String[] args) {
    }
}

여기서 static은 무엇을 의미하는 것일까

  1. 변수와 메소드의 키워드이다.
  2. static 키워드를 사용하면 클래스에 종속되기 때문에, 클래스가 메모리에 올라갈 때 생성이 된다.
    때문에 인스턴스(객체)를 생성하지 않고 바로 클래스에서 사용할 수 있다.

예시를 통해 알아보자.

class Car{
	String name; // non-static 변수
    static String color; // static 변수
}

위와 같이 color에만 static 키워드를 부여했다. 그러면 어떤 식으로 활용이 될까

public class Main {
    public static void main(String[] args) {
    Car.color = "흰색";
    System.out.println(Car.color); // "흰색" 출력

    Car.name = "소나타"; // error
    System.out.println(Car.name); // error
    }
}

class Car {
    String name;
    static String color;
}

그러면 다음과 같은 오류가 발생할 것이다.

Main.java:7:8
java: non-static variable name cannot be referenced from a static context

non static 키워드를 가진 변수는 static 메소드인 main에서 활용될 수 없다.

non static을 활용하기 위해서는 객체 즉 인스턴스를 선언해야 활용할 수 있다.

반대로 static 키워드를 가진 변수는 이미 클래스에 종속되어 그 값이 메모리에 올라갔기 때문에 별도로 인스턴스를 생성하지 않고 바로 변수를 호출이 가능하다.

public class Main {
    public static void main(String[] args) {
        Car.color = "흰색";
        System.out.println(Car.color);

        Car carOne = new Car();
        carOne.name = "소나타";
        System.out.println(carOne.name); // "소나타" 출력
    }
}

class Car {
    String name;
    static String color;
}

위와 같이 non-static 키워드를 가진 name 변수는 carOne이라는 인스턴스를 선언하고 해당 인스턴스의 변수에 "소나타"라는 값을 저장하여 활용된다.
non-static은 인스턴스 키워드로 이해하고 static은 class 키워드로 생각하면 이해가 쉬울 것이라 생각한다.
static 변수는 이미 Car 클래스 안에 저장이 되어있기 때문에 다음과 같이 활용할 수도 있다.

public class Main {
    public static void main(String[] args) {
        Car.color = "흰색";
        System.out.println(Car.color);

        Car carOne = new Car();
        carOne.name = "소나타";
        System.out.println(carOne.name);
        System.out.println(carOne.color); 
        // 문법적으로는 Car.color가 더 정확하지만 이해를 돕기위해 활용
    }
}

class Car {
    String name;
    static String color;
}

carOne은 Car 클래스를 틀로하여 만들어졌기 때문에 이미 Car라는 클래스에 color의 값이 저장되어 있으므로 carOne 인스턴스에서 static 변수인 color를 지정하지 않더라도 이미 클래스에 저장된 값이 출력된다.

static은 전역적 키워드 , non-static은 지역적 키워드라고 이해하자.

메소드도 마찬가지다.

public class Main {
    public static void main(String[] args) {
    	Car.color = "흰색";
        Car.printColor(); // "흰색 출력"
        Car.printName(); // error
    }
}

class Car {
    String name;
    static String color;

    void printName(){
        System.out.println(name);
    }
   static void printColor(){
        System.out.println(color);
    }

non-static 키워드를 가진 printName 메소드는 변수와 마찬가지로 인스턴스를 선언하지 않으면 바로 활용될 수 없다.

public class Main {
    public static void main(String[] args) {
        Car.color = "흰색";

        Car carOne = new Car();
        carOne.name = "투싼";
        System.out.println(carOne.name);
        System.out.println(carOne.color);
        // 문법적으로는 Car.color가 더 정확하지만 이해를 돕기위해 활용
        System.out.println("\n");

        Car carTwo = new Car();
        carTwo.name = "소나타";
        System.out.println(carTwo.name);
        System.out.println(carTwo.color);
        // 문법적으로는 Car.color가 더 정확하지만 이해를 돕기위해 활용
    }
}

class Car {
    String name;
    static String color;

    void printName(){
        System.out.println(name);
    }
   static void printColor(){
        System.out.println(color);
    }
}

위와 같이 인스턴스를 여러 개 선언하더라도 고정된 변수나 메소드를 활용한다면 static 키워드를 지정하는 것이 좋다.

정리하자면

  1. static 변수, 메소드는 별도로 인스턴스를 선언하지 않고 바로 활용될 수 있다.
  2. 모든 인스턴스에서 공통된 값을 유지해야 할 때 static 키워드를 가진 변수, 함수를 사용.
  3. static 키워드를 가진 메소드(함수)에서는 non-static 키워드를 사용할 수 없다.
    (non-static은 인스턴스를 생성해야만 존재한다)
    반대로 non-static 변수나 메소드에서는 static이 붙은 변수나 메소드를 호출해서 활용할 수 있다.
    (static 키워드를 가졌다면 이미 메모리에 존재하기 때문)
profile
daelkdev@gmail.com

0개의 댓글