Access Modifier:
- private: 선언된 클래스 내에서만 사용 가능
- (default): 아무 것도 안 붙을 때. 자기 자신 / 같은 패키지에서 사용 가능
- protected: 자기 자신 / 같은 패키지 / 상속받은 클래스에서 사용 가능
- public: 어디서든 사용 가능
사용범위: private < (default) < protected < public
(주의) public 클래스의 이름은 .java 파일 이름과 반드시 같아야 함
// 다른 패키지의 (default) 클래스는 import 할수 없다!
//import com.lec.java.j14_04_access.TestDefault2;
import com.lec.java.j14_04_access.TestPublic2;
//import com.lec.java.j14_04_access.TestPublic;
public class Access03Main {
public static void main(String[] args) {
System.out.println("public, default 클래스");
TestPublic t1 = new TestPublic();
TestDefault t2 = new TestDefault();
TestPublic2 t3 = new TestPublic2();
// TestDefault2 t3;
// 다른 패키지에 있는 동일 이름의 클래스를 사용하려면?
// 패키지명까지 명시하여 구분.
com.lec.java.j14_04_access.TestPublic t4 = new com.lec.java.j14_04_access.TestPublic();
} // end main()
} // end class
그 외의 Modifier:
final, static, abstract, transient, synchronized, volatile
public class Final01Main {
// final 멤버변수(필드)
// (주의) final 멤버 변수는 반드시 선언과 동시에 초기화 (혹은 생성자에서 초기화) 해야 한다
final int NUM1 = 1;
// final int NUM2; // 초기화 되지 않은 final 필드는 에러!
final int NUM3;
public Final01Main() {
NUM3 = 10;
}
public static void main(String[] args) {
System.out.println("final: 변경할 수 없는 상수");
final int NUM1;
NUM1 = 88;
} // end main()
} // end class Final01Main
- 인스턴스 변수: static 이 안붙은 변수
- 인스턴스를 생성한 다음에(new 생성자(); 호출된 다음에) 사용할 수 있는 변수
- 인스턴스 메소드:static 이 안 붙은 메소드
- 인스턴스를 생성한 다음에(new 생성자(); 호출된 다음에 사용할 수 있는 메소드
- 클래스 변수(static 변수): 클래스의 멤버 변수들 중에서, 인스턴스를 생성하지 않아도 사용할 수 있는 변수
- 클래스 메소드(static 메소드): 인스턴스를 생성하지 않아도 사용할 수 있는 메소드
public class Static01Main {
// 클래스 메소드 (class method, static method)
public static void test1(){
System.out.println("test1(): static");
}
// 인스턴스 메소드 (instance method, non-static method)
public void test2(){
System.out.println("test2(): non-static");
}
public static void main(String[] args) {
System.out.println("인스턴스 변수/메소드 vs 클래스 변수/메소드");
test1();
// static 에서는 non-static 사용못한다! ★★
// test2();
// 인스턴스 생성한 후에 사용 가능.
Static01Main tc = new Static01Main();
tc.test2();
} // end main()
} // end class
클래스 변수 / 메소드 특징 (static)
1. 메모리의 '메소드 영역'에 클래스가 로드 될때(프로그램 시작될때) '한번만' 생긴다
2. 인스턴스가 생성되지 않아도 사용할 수 있다.
- 클래스이름.static변수, 클래스이름.static메소드()
- 따라서, 인스턴스를 나타내는 this 와 super 는 static 메소드에서 사용불가
3. 모든 인스턴스는 하나의 static 변수/메소드를 '공유'한다.
package com.lec.java.j14_07_static;
public class Static02Main {
public static void main(String[] args) {
System.out.println("인스턴스 변수/메소드");
Test.show2();
Test.sNum = 123;
System.out.println(Test.sNum);
// Test.num = 10; // 에러
Test t = new Test();
t.num = 100;
t.show();
Test t2 = new Test();
t2.show();
t2.sNum = 340; // 가능하나, 바람직한 static 사용방법 아님!
t.show();
Test.sNum = 100;
t.sNum = 500;
t2.sNum = 700;
System.out.println(Test.sNum);
System.out.println(t.sNum);
System.out.println(t2.sNum);
} // end main()
} // end class
package com.lec.java.j14_07_static;
public class Test {
int num; // 인스턴스 변수 (non-staic 변수)
static int sNum; // 클래스 변수 (static 변수)
// 인스턴스 메소드
public void show(){
System.out.println("인스턴스 num = " + num);
System.out.println("클래스(static) sNum = " + sNum);
}
public static void show2(){
//System.out.println("인스턴스 num = " + num);
//System.out.println(this.num);
System.out.println("클래스(static) sNum = " + sNum);
}
}