static은 정적 혹은 고정된이라는 의미이다.
정적 멤버는 클래스에 고정된 멤버로서 new 연산자를 이용해 별도의 객체 생성 없이 사용 가능한 필드와 메소드이다.
static은 메모리가 1번 생성되고 소멸도 1번 된다.
static은 클래스명으로 직접 접근이 가능하다.
클래스명.변수
클래스명.함수()

빨간색으로 표시된 s는 static, 파란색으로 표시된 f는 final이라는 의미이다.
static에 대해 알아보기 위해 Sawon 클래스를 생성하여 실습해보자
package oop0913;
public class Sawon {
//멤버변수 field
String sabun; //사원번호
String name; //이름
int pay; //급여
//생성자함수 constructor
public Sawon() {}
//생성자 함수 자동 코딩
//메뉴 Source ->Generate Constructor using Fields...
public Sawon(String sabun, String name, int pay) {
this.sabun = sabun;
this.name = name;
this.pay = pay;
}//end
//static 변수
static String COMPANY = "(주)아이티윌";
static int SUDANG = 10;
static double TAX = 0.03;
//static 함수
static void line() {
System.out.println("--------------------");
}//line() end
}//class end
이제 Test02_static 클래스 만들어 Sawon클래스를 사용해보자
package oop0913;
public class Test02_static {
public static void main(String[] args) {
//Sawon 클래스를 생성하고 실습
//static변수와 static함수는 클래스명으로 직접 접근한다
System.out.println(Sawon.COMPANY);
System.out.println(Sawon.SUDANG);
System.out.println(Sawon.TAX);
Sawon.line();
}//main() end
}//class end


물론 new연산자를 통해 객체를 만들어 Sawon 클래스의 static 필드와 static 메소드에 접근할 수 있다.
하지만 이 경우 static을 사용한 의미가 없다.
//1)static의 특징을 적용하지 않은 경우(비추천)
Sawon one = new Sawon("1001", "개나리", 100);
//나의 세금
double myTax = one.pay * one.TAX; //3
//나의 총 지급액 = 금여 - 세금 + 수당
int total = (int)(one.pay-myTax+one.SUDANG); //100-3+10
System.out.println("회사 : " + one.COMPANY);
System.out.println("사번 : " + one.sabun);
System.out.println("이름 : " + one.name);
System.out.println("급여 : " + one.pay);
System.out.println("수당 : " + one.SUDANG);
System.out.println("세금 : " + myTax);
System.out.println("총지급액 : " + total);
one.line();

//2)static의 특징을 적용한 경우(추천)
//-> static 변수와 static 함수는 이미 static 메모리에 값이 올라와 있기 때문에
//-> 별도의 객체 생성을 하지 않고도 바로 접근할 수 있다.
Sawon two = new Sawon("1002", "진달래", 200);
myTax = two.pay * Sawon.TAX; //3
//나의 총 지급액 = 금여 - 세금 + 수당
total = (int)(two.pay-myTax+Sawon.SUDANG); //100-3+10
System.out.println("회사 : " + Sawon.COMPANY);
System.out.println("사번 : " + two.sabun);
System.out.println("이름 : " + two.name);
System.out.println("급여 : " + two.pay);
System.out.println("수당 : " + Sawon.SUDANG);
System.out.println("세금 : " + myTax);
System.out.println("총지급액 : " + total);
Sawon.line();
System.out.println("회사 : " + Sawon.COMPANY);
System.out.println("수당 : " + Sawon.SUDANG);
Sawon.line();
이와 같이 static으로 선언한 static 변수와 static 함수는 별도의 객체 생성 없이 바로 접근할 수 있다.

여기서 사번, 이름, 급여 등은 사람별(객체)로 그 값이 다르다. 하지만 회사와 수당은 객체 별로 다르지 않다. 이렇게 객체별로 같은 값을 갖는 공용 데이터일 경우 static으로 선언하는 것이 좋다.
//3)static변수의 연산
//-> static 메로리의 특징은 생성도 1번, 소멸도 1번
//-> 주소를 공유한다.
Sawon kim = new Sawon("1003", "무궁화", 300);
Sawon lee = new Sawon("1004", "봉선화", 400);
System.out.println(kim.SUDANG); //10
System.out.println(lee.SUDANG); //10
kim.SUDANG = kim.SUDANG+1; //10+1
System.out.println(kim.SUDANG);
lee.SUDANG = lee.SUDANG+1; //11+1
System.out.println(lee.SUDANG);
여기서 lee.SUDANG은 11이 될 것 같지만 12가 된다.
그 이유는 static은 주소를 공유하며 처음에 언급한 'static은 메모리가 1번 생성되고 소멸도 1번 된다'라는 특징 때문이다.
SUDANG은 kim.SUDANG에서 1이 더해저 11이 된 상태이기 때문에
lee.SUDANG+1은 결국 11+1이 되어 12가 된다.
'웹개발 교육 > Java' 카테고리의 다른 글
| [33일] Java (26) - 성적 프로그램 ox 표시하기 (0) | 2022.09.13 |
|---|---|
| [33일] Java (25) - final (0) | 2022.09.13 |
| [33일] Java (23) - this (0) | 2022.09.13 |
| [32일] Java (22) - String 연습 문제 (0) | 2022.09.08 |
| [32일] Java (21) - String 클래스 (0) | 2022.09.08 |
static은 정적 혹은 고정된이라는 의미이다.
정적 멤버는 클래스에 고정된 멤버로서 new 연산자를 이용해 별도의 객체 생성 없이 사용 가능한 필드와 메소드이다.
static은 메모리가 1번 생성되고 소멸도 1번 된다.
static은 클래스명으로 직접 접근이 가능하다.
클래스명.변수
클래스명.함수()

빨간색으로 표시된 s는 static, 파란색으로 표시된 f는 final이라는 의미이다.
static에 대해 알아보기 위해 Sawon 클래스를 생성하여 실습해보자
package oop0913;
public class Sawon {
//멤버변수 field
String sabun; //사원번호
String name; //이름
int pay; //급여
//생성자함수 constructor
public Sawon() {}
//생성자 함수 자동 코딩
//메뉴 Source ->Generate Constructor using Fields...
public Sawon(String sabun, String name, int pay) {
this.sabun = sabun;
this.name = name;
this.pay = pay;
}//end
//static 변수
static String COMPANY = "(주)아이티윌";
static int SUDANG = 10;
static double TAX = 0.03;
//static 함수
static void line() {
System.out.println("--------------------");
}//line() end
}//class end
이제 Test02_static 클래스 만들어 Sawon클래스를 사용해보자
package oop0913;
public class Test02_static {
public static void main(String[] args) {
//Sawon 클래스를 생성하고 실습
//static변수와 static함수는 클래스명으로 직접 접근한다
System.out.println(Sawon.COMPANY);
System.out.println(Sawon.SUDANG);
System.out.println(Sawon.TAX);
Sawon.line();
}//main() end
}//class end


물론 new연산자를 통해 객체를 만들어 Sawon 클래스의 static 필드와 static 메소드에 접근할 수 있다.
하지만 이 경우 static을 사용한 의미가 없다.
//1)static의 특징을 적용하지 않은 경우(비추천)
Sawon one = new Sawon("1001", "개나리", 100);
//나의 세금
double myTax = one.pay * one.TAX; //3
//나의 총 지급액 = 금여 - 세금 + 수당
int total = (int)(one.pay-myTax+one.SUDANG); //100-3+10
System.out.println("회사 : " + one.COMPANY);
System.out.println("사번 : " + one.sabun);
System.out.println("이름 : " + one.name);
System.out.println("급여 : " + one.pay);
System.out.println("수당 : " + one.SUDANG);
System.out.println("세금 : " + myTax);
System.out.println("총지급액 : " + total);
one.line();

//2)static의 특징을 적용한 경우(추천)
//-> static 변수와 static 함수는 이미 static 메모리에 값이 올라와 있기 때문에
//-> 별도의 객체 생성을 하지 않고도 바로 접근할 수 있다.
Sawon two = new Sawon("1002", "진달래", 200);
myTax = two.pay * Sawon.TAX; //3
//나의 총 지급액 = 금여 - 세금 + 수당
total = (int)(two.pay-myTax+Sawon.SUDANG); //100-3+10
System.out.println("회사 : " + Sawon.COMPANY);
System.out.println("사번 : " + two.sabun);
System.out.println("이름 : " + two.name);
System.out.println("급여 : " + two.pay);
System.out.println("수당 : " + Sawon.SUDANG);
System.out.println("세금 : " + myTax);
System.out.println("총지급액 : " + total);
Sawon.line();
System.out.println("회사 : " + Sawon.COMPANY);
System.out.println("수당 : " + Sawon.SUDANG);
Sawon.line();
이와 같이 static으로 선언한 static 변수와 static 함수는 별도의 객체 생성 없이 바로 접근할 수 있다.

여기서 사번, 이름, 급여 등은 사람별(객체)로 그 값이 다르다. 하지만 회사와 수당은 객체 별로 다르지 않다. 이렇게 객체별로 같은 값을 갖는 공용 데이터일 경우 static으로 선언하는 것이 좋다.
//3)static변수의 연산
//-> static 메로리의 특징은 생성도 1번, 소멸도 1번
//-> 주소를 공유한다.
Sawon kim = new Sawon("1003", "무궁화", 300);
Sawon lee = new Sawon("1004", "봉선화", 400);
System.out.println(kim.SUDANG); //10
System.out.println(lee.SUDANG); //10
kim.SUDANG = kim.SUDANG+1; //10+1
System.out.println(kim.SUDANG);
lee.SUDANG = lee.SUDANG+1; //11+1
System.out.println(lee.SUDANG);
여기서 lee.SUDANG은 11이 될 것 같지만 12가 된다.
그 이유는 static은 주소를 공유하며 처음에 언급한 'static은 메모리가 1번 생성되고 소멸도 1번 된다'라는 특징 때문이다.
SUDANG은 kim.SUDANG에서 1이 더해저 11이 된 상태이기 때문에
lee.SUDANG+1은 결국 11+1이 되어 12가 된다.
'웹개발 교육 > Java' 카테고리의 다른 글
| [33일] Java (26) - 성적 프로그램 ox 표시하기 (0) | 2022.09.13 |
|---|---|
| [33일] Java (25) - final (0) | 2022.09.13 |
| [33일] Java (23) - this (0) | 2022.09.13 |
| [32일] Java (22) - String 연습 문제 (0) | 2022.09.08 |
| [32일] Java (21) - String 클래스 (0) | 2022.09.08 |