Everything has an expiration date
100 - Java : static 변수(클래스 변수, 정적 변수)와 static 메소드 (클래스 메소드, 정적 메소드) 실습 프로그램 본문
[Java]/Program source (java)
100 - Java : static 변수(클래스 변수, 정적 변수)와 static 메소드 (클래스 메소드, 정적 메소드) 실습 프로그램
Jelly-fish 2023. 9. 8. 17:13
/*===============================================================
■■■ 클래스와 인스턴스 ■■■
- static 변수(클래스 변수)와 static 메소드(클래스 메소드)
=================================================================*/
// ※ 탄생 시점~!!!
// ※ 공유~!!!
// 실습 편의상 접근제어지시자 생략
public class Test100
{
// ※ 클래스 변수 또는 클래스 메소드는
// 클래스 정보가 로딩되는 순간 메모리 할당이 이루어지며
// 클래스 이름 또는 객체(인스턴스)를 통해 접근할 수 있다.
// 즉, 『new』 연산자를 통해 메모리를 할당받지 않아도
// 사용이 가능하다는 것이다.
static int a = 10; //-- static 변수(클래스 변수, class 변수, 정적 변수)
int b = 20; //-- non-static 변수(인스턴스 변수, instance 변수)
// ※ 인스턴스 변수 또는 인스턴스 메소드는
// 동일한 클래스의 메소드에서는 바로 접근하는 것이 가능하지만
// 클래스 메소드에서는 접근할 수 없다.
void write() //-- non-static 메소드(인스턴스 메소드, instance 메소드)
{
System.out.println("인스턴스 메소드 → 클래스 변수 a : " + a);
System.out.println("인스턴스 메소드 → 인스턴스 변수 b : " + b);
}
static void print() //-- static 메소드(클래스 메소드, class 메소드, 정적 메소드)
{
System.out.println("클래스 메소드 → 클래스 변수 a : " + a);
//System.out.println("클래스 메소드 → 인스턴스 변수 b : " + b);
//--==>> 에러 발생(컴파일 에러)
}
public static void main(String[] args)
{
System.out.println("main() 메소드 → 클래스 변수 a : " + Test100.a);
//-- 클래스 변수에 접근하기 위해서는
// 『클래스명.변수명』의 형태로 클래스의 이름을 통해
// 접근하는 것이 가능하다.
//--==>> main() 메소드 → 클래스 변수 a : 10
System.out.println("main() 메소드 → 클래스 변수 a : " + a);
//-- 같은 클래스 내부에 존재하기 때문에
// 클래스의 이름을 생략하는 것이 가능하다. (둘 다 static, 같은 클래스 내부)
//--==>> main() 메소드 → 클래스 변수 a : 10
Test100.print();
//--==>> 클래스 메소드 → 클래스 변수 a : 10
// 같은 static 타입, 같은 클래스 내부이므로 클래스명 직접 언급하지 않아도 괜찮다!!!
print();
//--==>> 클래스 메소드 → 클래스 변수 a : 10
//-- 클래스 메소드에서 클래스 메소드의 호출은 가능하며,
// 『클래스명.메소드명()』의 형태로 접근하여 호출하는 것이 가능하다.
// 또한, 지금은 같은 클래스 내부에 존재하기 때문에
// 클래스의 이름을 생략한 경우에 해당한다.
//System.out.println("main() 메소드 → 인스턴스 변수 b : " + b);
//--==>> 에러 발생(컴파일 에러)
//System.out.println("main() 메소드 → 인스턴스 변수 b : " + Test100.b);
//--==>> 에러 발생(컴파일 에러)
//Test100.write();
//--==>> 에러 발생(컴파일 에러)
//write();
//--==>> 에러 발생(컴파일 에러)
// Test100 클래스 기반 인스턴스 생성
Test100 ob = new Test100();
// 인스턴스 변수 반드시 인스턴스 통해서 접근한다!!!!!!!!!!!!!!!!!!!!!!!!!
//System.out.println("main() 메소드 → 인스턴스 변수 b : " + b);
//--==>> 에러 발생(컴파일 에러)
// 인스턴스 변수 클래스 통해서 접근하지 않는다!!!!!!!!!!!!!!!!!!
//System.out.println("main() 메소드 → 인스턴스 변수 b : " + Test100.b);
//--==>> 에러 발생(컴파일 에러)
// 생성된 인스턴스를 통해 인스턴스 변수에 접근
System.out.println("main() 메소드 → 인스턴스 변수 b : " + ob.b);
//--==>> main() 메소드 → 인스턴스 변수 b : 20
//write();
//--==>> 에러 발생(컴파일 에러)
// 생성된 인스턴스를 통해 인스턴스 메소드에 접근(호출)
ob.write();
//--==>> 인스턴스 메소드 → 클래스 변수 a : 10
// 인스턴스 메소드 → 인스턴스 변수 b : 20
// 생성된 인스턴스를 통해 클래스 변수에 접근
System.out.println("main() 메소드 → 클래스 변수 a : " + ob.a);
//--==>> main() 메소드 → 클래스 변수 a : 10
// 생성된 인스턴스를 통해 클래스 메소드에 접근
ob.print();
//--==>> 클래스 메소드 → 클래스 변수 a : 10
// ※ 클래스 변수나 클래스 메소드는
// 『생성된인스턴스명.변수명』
// 『생성된인스턴스명.메소드명()』
// 의 형태로도 접근(호출)이 가능하다.
// 하지만,
// 『클래스명.변수명』
// 『크래스명.메소드명()』
// 의 형태로 접근(호출)하는 것이 일반적이다.
System.out.println("main() 메소드 → 클래스 변수 a : " + a); // 같은 클래스 내부의 static 변수(클래스변수)이므로 클래스명 생략
System.out.println("main() 메소드 → 클래스 변수 a : " + Test100.a); // 클래스명.클래스변수명 접근
System.out.println("main() 메소드 → 클래스 변수 a : " + ob.a); // 인스턴스명.클래스변수명 접근
//--==>> main() 메소드 → 클래스 변수 a : 10
// main() 메소드 → 클래스 변수 a : 10
// main() 메소드 → 클래스 변수 a : 10
System.out.println(); // 개행
// Test100 클래스 기반 인스턴스 생성
Test100 ob2 = new Test100();
ob2.a = 10000; //-- 클래스 변수
ob2.b = 10000; //-- 인스턴스 변수
System.out.println("ob2 확인 -------------------------");
ob2.write();
//--==>> ob2 확인 -------------------------
// 인스턴스 메소드 → 클래스 변수 a : 10000
// 인스턴스 메소드 → 인스턴스 변수 b : 10000
System.out.println("ob 확인 -------------------------");
ob.write();
//--==>> ob 확인 -------------------------
// 인스턴스 메소드 → 클래스 변수 a : 10000 // static 변수 ( = 스테이플러, 『공유』하는 개념)
// 인스턴스 메소드 → 인스턴스 변수 b : 20 // instance 변수 ( = 딱풀, 각각의 객체)
}
}