JAVA

[JAVA] 접근제한자, final, static

shb 2022. 2. 9. 15:39

접근권한 수식어(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