pooney

변수는 크게 인스턴스 변수 , 정적 변수가 존재합니다. 우리가 가장 흔하게 사용하는 변수가 아마도 인스턴스 변수일 것입니다. 인스턴스 변수는 객체 속에 존재하는 변수로 객체가 생성되어야만 사용할 수 있는 변수입니다. 

 

class SubClass{
    String instanceField = "인스턴스 변수";


}

public class Main {
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        System.out.println(subClass.instanceField);
        // [결과] :  인스턴스 변수
    }
}

 

이러한 인스턴스 변수를 사용하는 이유는 흔히 그 객체만이 가져야하는 값을 지니게 하기 위함입니다. 또한 가령예로는 

Book이라는 클래스가 존재한다면 어떠한 책은 빨강 , 다른 책은 노랑, 파랑 각 객체마다 가져야하는 색이 필요하다면 이때 new라는 키워드를 통해 객체를 생성하고 인스턴스 변수를 초기화합니다

 

class Book{
    String color ; //인스턴스 변수

    public Book(String color) {
        this.color = color;
    }
}



public class Main {
    public static void main(String[] args) {
    
    	//객체 생성 및 초기화 
        Book oneBook = new Book("red");
        Book twoBook = new Book("blue");
        Book threeBook = new Book("green");
    }
}

 

 

 

 

 

하지만 만약 각 객체마다 공유 하고자 하는 값이 존재 한다면 어떻게 될까요? 예로 Book이라는 클래스로 객체를 생성하면 카운팅을 하고 싶다 하면 어떻게 할까요? 이때 사용하는것이 static이라는 키워드입니다. 객체는 heep이라는 메모리에 위치하지만 static으로 정의 된 것들은 로딩이 될때  메모리 영역에 위치하게 되고 이러한 값들은 공유가 가능해집니다. 

 

 

class Book{
    String color ;
    static int count;

    public Book(String color) {
        this.color = color;
    }
}



public class Main {
    public static void main(String[] args) {
        Book oneBook = new Book("red");
        oneBook.count++;
        System.out.println(oneBook.count);   // [결과] : 1
        Book twoBook = new Book("blue");
        oneBook.count++;
        System.out.println(oneBook.count);   // [결과] : 2
        Book threeBook = new Book("green");
        oneBook.count++;
        System.out.println(oneBook.count);   // [결과] : 3
    }
}

 

이처럼 값을 공유 하는 것을 확인 할 수가 있습니다. static이라는 키워드는 객체를 생성하지 않고 접근을 하기때문에 클래.정적 변수 또는 클래스.정적 메소드로 접근이 가능 합니다 . 여기서 주의 해야 할 것은 정적 메소드에서는 인스턴스 변수에 접근이 불가능합니다. 그이유는 앞서 설명한 것과 같이 static이라는 키워드가 붙으면 실행과 동시에 메모리에 올리지만 인스턴스 변수 같은 경우에는 아직 메모리에 올라와 있지 않기 때문에 접근이 불가능합니다. 때문에 static은 static이 붙은것만 접근이 가능하다 보면 이해하기 쉬울 것입니다.  만약 static 변수에 복잡한 수식이 들어 있는 값으로 초기화 하고 싶을때는 어떻게 할까요? 인스턴스 변수의 경우 객체를 생성자로 초기화 하면서 할 수 있었지만 static은 객체 생성이 필요 하지 않기 때문에 정적 초기화 블록을 통해 초기화를 진행합니다. 

 

 

class Book{
    String color ;
    static int count;
    
    
    //정적 초기화 블록
    static{
        for(int i = 0; i<10; i++){
            count++;
        }
    }

    public Book(String color) {
        this.color = color;
    }
}



public class Main {
    public static void main(String[] args) {
        Book oneBook = new Book("red");
        oneBook.count++;
        System.out.println(oneBook.count);   // [결과] : 11
        Book twoBook = new Book("blue");
        oneBook.count++;
        System.out.println(oneBook.count);   // [결과] : 12
        Book threeBook = new Book("green");
        oneBook.count++;
        System.out.println(oneBook.count);   // [결과] : 13
    }
}

 

 

이처럼 결과는 아래와 같이 변경된 것을 확인 할 수 있습니다.

 

[before]

1, 2, 3

 

[after]

11,12,13

 

 

정적 초기화 블록은 static {  } 으로 자신이 초기화 하고자 하는 환경에 맞게 setting 하시면 됩니다.  static사용하고자 할때 아래사항을 생각하면서 사용하시면 좋습니다. 

 

1.  static이라는 키워드가 붙으면 항상 실행과 동시에 메모리에 올린다. 

2.  static 메소드에서서 인스터스 메소드 , 인스턴스 변수를 사용할 수 없다. 

3. 각 객체들이 값을 공유하고자 할 때 사용할 수 있다는 장점이 존재한다.

4.  정적 초기화 블록을 통해 정척 필드의 복잡한 초기화 작업을 수행 할 수 있다.

 

 

static은 상황에 맞게 사용하면 강력한 효과를 낼 수 있으니 잘 활용해서 사용하시기 바랍니다. ㅎㅎ

 

 

'Java' 카테고리의 다른 글

Java Enum 이란?  (0) 2020.06.28
Java 날짜 연산 LocalDateTime  (0) 2020.06.28
Java 출력스트림  (0) 2020.06.21
Java 동적으로 객체 생성하기  (0) 2020.06.21
profile

pooney

@pooney

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!