접근권한 수식어(Access Modifier) 접근제한자
1) 종류: private, (default), protected, public
2) 기능
- 멤버 변수, 멤버메소드에 대한 접근 권한을 제한
3) private: '자기자신'이 선언된 클래스에서만 사용 가능
4) (default): '자기자신' + '같은 패키지'에 있는 클래스들에서는사용 가능
5) protected: '자기자신' + '같은 패키지' + '상속받은 클래스' 에서 사용 가능
다른 패키지의 클래스라도 '상속 받으면' 사용 가능하다
6) public: 어디서든 사용이 가능
사용범위: private < (default) < protected < public
※ 클래스에 붙는 접근제한자는 딱 두가지 입니다
(default) , public
package com.lec.java.access01;
public class Test01 {
private int privateNum;
int defaultNum;
protected int protectedNum;
public int publicNum;
}
public class Access01Main {
public static void main(String[] args) {
System.out.println("접근권한 수식어(Access Modifier)");
Test01 t1 = new Test01();
// t1.privateNum = 10; //
t1.defaultNum = 20;
t1.protectedNum = 30;
t1.publicNum = 40;
// 다른 패키지(com.lec.java.access02)에 있는 클래스
// 일단 다른 패키지 라면 import 부터 선행되어야 한다
Test02 t2 = new Test02();
// t2.privateNum = 10;
// t2.defaultNum = 20;
// t2.protectedNum = 40;
t2.publicNum = 50;
// import 없이 full name 으로 사용 가능.
com.lec.java.access02.Test3 t3 = new com.lec.java.access02.Test3();
} // end main()
클래스의 접근 권한 수식어: public, (default)
1. public class: 어디에서나 인스턴스 생성이 가능한 클래스
(주의) public 클래스의 이름은 .java 파일 이름과 반드시 같아야 함
2. (default) class: 같은 패키지에 있는 클래스들에서만 인스턴스 생성이 가능
package com.lec.java.access03;
import com.lec.java.access04.TestPublic2;
//import com.lec.java.access04.MyDefault2; // 애시당초 import 부터 불가!
// 클래스의 접근 권한 수식어: public, (default)
// 1. public class: 어디에서나 인스턴스 생성이 가능한 클래스
// (주의) public 클래스의 이름은 .java 파일 이름과 반드시 같아야 함
// 2. (default) class: 같은 패키지에 있는 클래스들에서만 인스턴스 생성이 가능
public class Access03Main {
public static void main(String[] args) {
System.out.println("public, default 클래스");
TestPublic t1 = new TestPublic();
MyDefault t2 = new MyDefault();
TestPublic2 t3 = new TestPublic2();
// MyDefault2 t4;
} // end main()
} // end class Access05Main
class A {
}
package com.lec.java.access03;
// 디폴트 클래스는 굳이 파일명과 같을 필요 없다.
class MyDefault {
}
* final 멤버변수
(주의) final 멤버 변수는 반드시 선언과 동시에 초기화 (혹은 생성자에서 초기화) 해야 한다
package com.lec.java.final01;
public class Final01Main {
// final 멤버변수
// (주의) final 멤버 변수는 반드시 선언과 동시에 초기화 (혹은 생성자에서 초기화) 해야 한다
final int NUM1 = 1;
// final int NUM2;
final int NUM3; // 생성자에서 초기화 하면 OK
public Final01Main() {
// NUM1 = 1; // 이미 선언단계에서 초기화 했으면 생성자 초기화시 에러
NUM3 = 10;
}
public static void main(String[] args) {
System.out.println("final: 변경할 수 없는 상수");
// 변수:
int num1 = 1;
num1 = 10;
// 상수: 한번 값이 초기화 되면 더이상 변경할수 없다.
final int num2 = 1;
// num2 = 10;
final int num3;
num3 = 1;
// num3 = 12;
} // end main()
} // end class Final01Main
클래스에 선언된 멤버 변수/멤버 메소드는 static 여부에 따라 아래와 같이 불려진다
* 인스턴스 변수: static이 안 붙은 변수
인스턴스를 생성한 다음에(new 생성자(); 호출된 다음에) 사용할 수 있는 변수
* 인스턴스 메소드: static이 안 붙은 메소드
인스턴스를 생성한 다음에(new 생성자(); 호출된 다음에) 사용할 수 있는 메소드
* 클래스 변수(static 변수) : 클래스의 멤버 변수들 중에서, 인스턴스를 생성하지 않아도 사용할 수 있는 변수
* 클래스 메소드(static 메소드) : 인스턴스를 생성하지 않아도 사용할 수 있는 메소드
public class Static01Main {
public static void test() {
System.out.println("Hello, Java!");
}
public void test2() {
System.out.println("안녕하세요~");
}
public static void main(String[] args) {
System.out.println("인스턴스 변수/메소드 vs 클래스 변수/메소드");
test();
// static 안에서는 static 이 아닌 것을 사용할 수 없다.
// test2();
// 인스턴스 변수/메소드 (non-static)
// 인스턴스 생성한 후에 사용하능
Static01Main tc = new Static01Main();
tc.test2();
} // end main()
* 클래스 변수 / 메소드 특징 (static)
1. 메모리의 '메소드 영역'에 클래스가 로드 될때(프로그램 시작될때) '한번만' 생긴다
2. 인스턴스가 생성되지 않아도 사용할 수 있다.
- 클래스이름.static변수, 클래스이름.static메소드() <-- 이렇게 사용한다
3. 모든 인스턴스는 하나의 static 변수/메소드를 '공유'한다.
package com.lec.java.static02;
public class Test {
// 멤버 변수
int num; // 인스턴스 변수
static int sNum; // 클래스 변수(static 변수)
// 메소드
// 인스턴스 메소드
public void show() {
System.out.println("인스턴스 num = " + num);
System.out.println("클래스(static) sNum = " + sNum);
}
// 클래스(static) 메소드
public static void show2() {
// System.out.println("인스턴스 num = " + num);
System.out.println("클래스(static) sNum = " + sNum);
}
}
public class Static02Main {
public static void main(String[] args) {
System.out.println("인스턴스 변수/메소드");
Test.show2(); // static 변수도 기본값으로 초기화 된다.
Test.sNum = 123;
Test.show2();
System.out.println();
// 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()
* Singleton 디자인 패턴
:전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하며, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
package com.lec.java.static03;
public class Test {
private int num;
// 생성자
private Test() {
num = 100;
}
// singleton 디자인
private static Test instance = null;
public static Test getInstance() {
if(instance == null) { // 기존에 인스턴스가 없으면 새로 만들고,
instance = new Test();
}
// 있었으면 있던 인스턴스를 리턴
return instance;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
package com.lec.java.static03;
import java.util.Calendar;
public class Static03Main {
public static void main(String[] args) {
System.out.println("Singleton 디자인 패턴");
// Singleton 객체는 인스턴스가 복수개 생성 불가.
// Test t1 = new Test();
// Test t2 = new Test();
Test t1 = Test.getInstance(); // 최초로 인스턴스 생성
System.out.println("t1: num = " + t1.getNum());
t1.setNum(123);
System.out.println("t1: num = " + t1.getNum());
System.out.println();
Test t2 = Test.getInstance(); // 기존에 먼저 만들어졌던 인스턴스를 리턴받음.
System.out.println("t1:" + t1);
System.out.println("t2:" + t2);
t2.setNum(12345);
System.out.println("t1: num = " + t1.getNum()); // 둘다 12345
System.out.println("t2: num = " + t2.getNum()); // 둘다 12345
// Calendar c = new Calendar(); 생성자 제공 안됨
Calendar c = Calendar.getInstance();
} // end main()
} // end class Static03Main
'JAVA' 카테고리의 다른 글
[JAVA] 다형성, 추상 클래스, 인터페이스 (0) | 2022.02.09 |
---|---|
[JAVA] 상속 (0) | 2022.02.09 |
[JAVA] 클래스 (0) | 2022.02.08 |
[JAVA] 메소드 (0) | 2022.02.08 |
[JAVA] 형변환, 변수 (0) | 2022.02.08 |