쌓고 쌓다
[JAVA] static / 전역 함수, 전역 변수 본문
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 |