static 변수와 static 메서드

최준호·2021년 7월 6일
0

java

목록 보기
7/25

static이란

메서드나 멤버변수에 static이라는 예약어를 정의하면 해당 멤버변수나 메서드들의 객체가 생성될 때 static 영역이라는 곳에 유일하게 생성되어지면서 모든 객체들이 공유하여 사용하게 된다.

[접근제한] static [반환형] 메서드명(){}
[접근제한] static [자료형] 변수명;

다음과 같이 사용한다.

static 변수

static으로 선언되었다면 객체를 생상하지 않고 사용할 수 잇으며 아무리 많은 객체를 생성한다고 해도 static 변수는 오직 하나만 만들어지며 그것은 모든 객체가 공유한다. 예를들어 은행에서 0.1% 금리를 주고 있었다고 가정해보자 근데 이 금리가 상승하여 0.2%의 금리를 적용해야하는 상황인데 은행을 이용하는 고객들의 모든 통장이 각각 하나의 객체라면 모든 통장을 일일히 0.2%로 수정해야한다. 하지만 static 변수로 선언되어 있다면 고객 하나의 통장을 0.2%로 수정하면 하나의 변수를 모두 공유하고 있기 때문에 한번에 수정이 가능하다.

public class Bank{
    private String bankName;
    static float investing = 0.1f;

    public Bank(String bankName){
        this.bankName = bankName;
    }

    public void printBank(){
        System.out.println("은행 : "+ bankName);
        System.out.println("금리 : "+ investing);
    }
}
public class BankMain{
    public static void main(String[] args){
        Bank bank = new Bank("카카오뱅크");
        Bank.investing = 0.2f;
        bank.printBank();
    }
}

다음과 같은 결과를 얻을 수 있다. 혹시라도 나와 같이 class에 내부에서 작성해서 테스트 해보시는 분들은 파일 이름과 다른 class의 public을 제거해서 사용하고 아니라면 파일 2개를 각각 만들어서 테스트하면 된다.

그리고 이 코드에서 확인할 수 있는 점은 static 변수는 객체를 생성하여 호출되어지지 않고 class에서 직접 호출하여 사용한다는 점이다.

Bank.investing = 0.2f;

static method

static method 또한 static 변수와 마찬가지로 공유 개념으로 사용되며 한가지 주의해야할 점은 static 메서드 안에서 static이 아닌 변수들을 참조해서 사용할 수 없다.

class StaticTest{
    String s1 = "none static";
    static String s2 = "static";

    public static String getString(){
        return s2;
        //return s1은 오류가 발생
    }
}

static 메서드나 static 변수들은 정적인 영역(=static 영역)에 존재하므로 위 예제처럼 객체를 생성하지 않고도 접근할 수 있다는 장점이 있다. 하지만 static 변수가 아닌 instance 변수는 사용할 수 없다는 점에 주의해야한다. 하지만 객체를 생성하여 얻어진 참조변수를 통한 멤버변수는 접근이 가능하다.

class StaticTest2{
    int c;
    static int count;
    public StaticTest2(){
        c++;
        count++;
    }
}
class StaticTest3{
    public static void main(String[] args){
        StaticTest2 s1 = new StaticTest2();
        System.out.println("s1의 c = "+s1.c+", s1의 count = "+s1.count);

        StaticTest2 s2 = new StaticTest2();
        System.out.println("s2의 c = "+s2.c+", s2의 count = "+s2.count);


        StaticTest2 s3 = new StaticTest2();
        System.out.println("s3의 c = "+s3.c+", s3의 count = "+s3.count);
    }
}

다음과 같은 결과를 확인할 수 있고 새로운 객체를 생성하여 새로운 값이 증가된 c는 계속 1로 출력되는 것을 확인할 수 있고 모든 객체가 값을 공유하는 count는 계속해서 증가됨을 확인할 수 있었다.

static 초기화(static initializers)

static 초기화란

static {
    수행문
}

다음과 같은 구조의 static 사용법이다. 잘 사용되어지지 않는다고 하는데 이는 main을 실행하기 전에 static 초기화로 미리 정의하는 방법으로 사용되어진다.

class StaticTest4{

    int a = 100;
    static int b = 200;
    static{
        b=5000;
        c=10000;
    }
    public static void main(String[] args){
        System.out.println("c = "+c);
    }
    static int c;
}

위 코드에서 c가 맨 아래에 선언되어 있어 이질감을 느낄 수 있다. 왜냐면 c를 선언하고 그 아래에서 값을 초기화 해야하는데 c의 값을 먼저 초기화하고 아래에서 사용하기 때문이다. 하지만 static으로 선언된 변수를 static으로 초기화한다면 문제가 없다. 이런 방법이 있다는 것을 알고 간단하게 넘어가자.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글