쌓고 쌓다

[JAVA] static / 전역 함수, 전역 변수 본문

프로그래밍/java

[JAVA] static / 전역 함수, 전역 변수

승민아 2021. 12. 23. 22:03

static과 non-static의 이해

우리 사람들은 태어나면 눈을 가지게 됩니다 이것은 사람마다 개별적인 소유입니다.

눈은 사람이 없이 존재할 수 없습니다. 사람이 죽으면 눈도 없어지죠.

사람의 탄생과 함께 존재하고 소멸과 함께 없어집니다.

하지만, 눈은 사람마다 있지만 다 다르고 공유하질 않습니다.

 

공기는 우리가 태어나기 전이나 죽어도 존재합니다.

모든 사람들이 공유하며 사용하죠 이것이 눈과의 차이점입니다.

눈은 non-static, 공기는 static 멤버라고 생각할 수 있습니다.

 

static 멤버 선언

class Sample{
    
    int A; // non-static 변수
    void g() // non-static 함수
    {
        A=10;
    }
    
    static int B;  // static 변수
    static void h() // static 함수
    {
        B=50;
    }
    
}

 위와 같이 static을 붙여주면 됩니다.

 

static 과 non-static 차이점

공간적 특성

- non-static 멤버 : 객체마다 멤버가 별도로 존재

- static 멤버 :  클래스 하나에 멤버가 하나 존재

(객체 내부에 존재하는 것이 아닌, 별도의 공간에 저장 , 클래스 멤버라고 부름)

 

시간적 특성

- non-static 멤버 : 객체 생성 시 멤버 생성 ( 객체의 소멸 시 멤버 소멸, 객체 생성 후 사용 가능 )

- static 멤버 : 클래스 로딩시에 생성 ( 객체 생성전에 멤버가 이미 생성됨, 객체의 소멸에도 멤버가 안 사라짐 )

 

공유의 특성

- non-static 멤버 : 공유하지 않고, 객체마다 다 자기것을 가짐

- static 멤버 : 동일한 클래스라면 모두가 한가지를 공유함

 

static 멤버의 생성

Sample sample;

static 멤버는 Sample 클래스가 사용되기 시작하는 시점(클래스가 로딩되는 시점)에 생성된다.

위으 코드가 실행이 될 시점에는 이미 변수 B, 함수 h가 이미 생성되어 있어 사용이 가능하다.

sample = new Sample();

위의 코드로 객체가 생성된다면 이제 변수 A, 함수 g가 객체 sample에 생성된다.

 

static 멤버의 접근 ( 객체.static 멤버 )

        Sample Asample = new Sample();
        Sample Bsample = new Sample();

        Asample.B=100;
        System.out.println(Bsample.B);

A, B샘플의 객체를 생성하고 static 멤버를 확인해보겠습니다.

A샘플의 static 변수 B를 100으로 초기화하고

B샘플의 static 변수 B를 출력해보겠습니다.

A샘플의 변수 B를 100으로 바꿨지만, B샘플의 B 또한 변경이 일어난 걸 확인할 수 있다.

이는 A샘플, B샘플의 Sample 클래스가 static 변수 B를 공유하기 때문이다.

 

Sample Asample = new Sample();
Sample Bsample = new Sample();

Asample.B=100;
Bsample.h();
System.out.println(Asample.B);

A샘플의 static 변수 B를 100으로 초기화하였지만

B샘플의 static 함수 h(B를 50으로 바꾸는 함수)를 실행하고

A샘플의 변수 B를 출력해보아도 100이 아닌 50으로 출력이 된다.

static 멤버의 접근 ( 클래스.static 멤버 )

클래스.static 멤버

클래스를 이용해 위와 같은 코드로 static 멤버에 접근이 가능하다.

 

Sample.B=100;
System.out.println(Sample.B);

위의 코드는 Sample 클래스의 객체를 생성하지도 않았지만, 이미 클래스의 로딩을 통해

Sample 클래스의 static의 멤버들은 생성되어 있기

때문에 Sample 클래스를 이용해서 static 변수 B를 100으로 초기화하여

Sample 클래스의 B를 출력할 수 있다.

물론 변수가 아닌 함수에도 사용이 가능하다.

하지만, non-static 메소드는 클래스의 이름으로 접근이 불가능하다.

Sample.h(); // 호출 가능
Sample.g(); // 컴파일 에러

 

 

static을 이용한 전역 함수, 전역 변수 만들기

C++과 달리 자바에서는 클래스 외부에 변수, 함수를 만들 수가 없었다...

자바에서는 static을 이용해야 한다.

package com.company;

class Sample{

    public static int sum(int a,int b)
    {
        return a+b;
    }

    public static int abs(int a)
    {
        if(a>=0)
            return a;
        else
            return (-1)*a;
    }

    public static int max(int a, int b)
    {
        return a>b?a:b;
    }

}

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

        System.out.println(Sample.abs(-5));
        System.out.println(Sample.max(1,-1));
        System.out.println(Sample.sum(50,50));

    }
}

실행 결과

 

static 함수의 제약

- static 함수는 static 멤버에만 접근이 가능하다.

 but ) non-static 함수에서는 static 멤버 접근 가능

class Sample{
    
    int a;
    static int b;
    void g()
    {
        a=5;
    }  
    
    void g2()
    {
        b=5; // non-static 함수에서는 static 멤버에 접근 가능
    }
    
    
    static void h()
    {
        a=4; // 컴파일 에러 - static 함수는 static 멤버에게만 접근이 가능
        g(); // 컴파일 에러 -함수도 마찬가지
    }
    
}

 

- static 함수는 this를 사용할 수 없다.

class Sample{

    int a;
    static int b;
    void g()
    {
        b=5; // non-static 함수에서는 static 멤버에 접근 가능
    }
    
    
    static void h()
    {
        this.a=3; // 컴파일 에러 - static 함수에서는 this 사용 불가
    }

    static void h2()
    {
        this.b=3; // 컴파일 에러 - static 함수에서는 this 사용 불가
    }

}

'프로그래밍 > java' 카테고리의 다른 글

[JAVA] super() 과 상속에서의 생성자 순서  (0) 2021.12.25
[JAVA] final 키워드  (0) 2021.12.24
[JAVA] 접근 지정  (0) 2021.12.22
[JAVA] 함수(메소드) 오버로딩  (0) 2021.12.22
[JAVA] 함수(메소드)의 매개변수  (0) 2021.12.21
Comments