728x90
반응형
SMALL
Modifier 란?
- 클래스나 변구, 메소드의 선언부 앞에 붙여주어 부가적인 제어를 할 수 있도록 도와줌
- Access Modifier (접근 제어자) : 멤버 변수, 멤버메소드에 대한 접근 권한을 제한한다.
- private : '자기 자신' 이 선언된 클래스 에서만 사용 가능
- protected : 자기 자신' + '같은 패키지' + '상속받은 클래스'에서 사용 가능 (다른 패키지의 클래스라도 상속 받으면 사용 가능)
- public : 어디서든지 사용 가능
- (default) : '자기 자신' + '같은 패키지' 에 있는 클래스들에서 사용 가능
접근 제어자의 사용 범위 : private < (default) < protected < public
[클래스의 접근 제어자는 딱 두가지 => public, default]
- 예제
public class Access01Main {
public static void main(String[] args) {
System.out.println("접근권한 수식어(Access Modifier)");
Test01 t1 = new Test01(); //같은 패키지에 있는 클래스
// t1.privateNum = 10; //자기자신이 선언된 클래스가 아니므로 사용 X
t1.defaultNum = 20; // 같은 패키지에 있으므로 사용 가능
t1.protectedNum = 30; // 같은 패키지에 있고 더 나아가서 상속 받으면 사용 할 수 있으므로 사용 가능
t1.publicNum = 40; // 어디서나 사용 가능
Test02 t2 = new Test02(); //다른 패키지에 있는 클래스
// t2.privateNum = 10;
// t2.defaultNum = 20;
// t2.protectedNum = 40; // 같은 패키지도 아니고 상속 받지도 않았기 때문에 사용 불가
t2.publicNum = 50;
} // end main()
} // end class Access01Main
- 선언 했을 때 오류가 나는 것들은 주석처리 하였음.
- 그 외
- final : 멤버 변수에 주로 붙히며 반드시 선언과 동시에 초기화해줘야 한다.
- final 은 변경 할 수 없는 상수를 뜻하며, 개발자가 final 로 선언 한 변수는 변경되지 않을 변수라는 것을 알아차려야함.
- 예제
public class Final01Main {
final int NUM1 = 1;
//final int NUM2;
final int NUM3; // 생성자에서 초기화 가능
public Final01Main(){
//NUM1 = 10;
NUM3 = 10;
}
public static void main(String[] args) {
System.out.println("final: 변경할 수 없는 상수");
int num1 = 1;
num1 = 10;
final int num2;
num2 = 1;
//num2 = 10; // 이미 1로 초기화 된 FINAL 변수를 변경하려고 해서 에러 발생, 주석처리
} // end main()
} // end class Final01Main
- static
- 클래스의 멤버변수 중 static 변수를 자기고 있다면 그 변수는 클래스의 인스턴스를 사용하지 않아도 사용 할 수 있는 변수
- 클래스의 멤버 메소드 중 static 변수를 가지고 있다면 인스턴스를 생성하지 않아도 사용 할 수 있는 메소드
- [static 메소드 안에서 static 이 아닌 메소드를 바로 호출 할 수 없다!]
- [static은 non-static을 사용하지 못한다.]
- 특징
- 메모리의 메소드 영역에 (JVM) 클래스가 로드 될때 한번만 생성된다.
- 인스턴스가 생성되지 않아도 사용 할 수 있다.
- 클래스이름.static변수명, 클래스이름.static메소드()
- 모든 인스턴스는 하나의 static변수/메소드를 공유한다. (이를 이용한 singleton 패턴 설계)
- 예시
public class Static02Main {
public static void main(String[] args) {
System.out.println("인스턴스 변수/메소드");
Test.show2(); // static 변수도 기본값으로 초기화 됨
// 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();
Test.sNum = 987;
System.out.println("t:");
t.show();
System.out.println("t2:");
t2.show();
t2.sNum = 340; // 가능하나, 바람직한 static 사용법이 아님! (warning 뜬다)
t.show();
} // end main()
} // end class Static02Main
public class Test {
int num; // 인스턴스 변수
static int sNum; // 클래스 변수
// 인스턴스 메소드
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("클래스(static) sNum = " + sNum);
}
}
- 위의 예시 코드를 돌려보면 sNum이라는 static 변수가 다른 인스턴스를 통해 변경되었음 에도 서로 다른 인스턴스에서 같은 값을 가지고 있는 것을 확인 할 수 있다.
- static을 사용한 singleton 패턴 예제
public class Test {
private int num;
// singleton 디자인패턴
// 생성자는 private 으로
private Test() { this.num = 100; }
private static Test instance = null; // 생성된 instance 를 reference
public static Test getInstance(){
if(instance == null){ // 기존에 생성된 인스턴스가 없었다면
instance = new Test(); // 생성!
}
return instance;
}
// 메소드 (getter / setter)
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
그 밖에 abstract, transient, syncronized, volatile 등의 MODIFIER 가 존재 한다.
728x90
반응형
LIST
'프로그래밍 > 자바' 카테고리의 다른 글
[자바/기본] 인터페이스 Interface + 추상 클래스 Abstract + 다형성 Polymorphism (0) | 2023.10.12 |
---|---|
[자바/기본] 상속 Inheritance (0) | 2023.10.12 |
[자바 / 기본] Class란? (1) | 2023.10.07 |
[자바] 정올 189 ~ 194 && 215, 216, 237 : 문자열2 - 형성평가 1 ~ 9 (1) | 2023.10.04 |
[자바] 정올 602~ 612 : 문자열2 - 자가진단1 ~ 11 (0) | 2023.10.04 |