본문 바로가기

Java/문법

9-1장 접근 지정자

- 자바 제어자 (modifer)

 - 클래스, 필드, 메서드, 생성자 등에게 어떠한 특징을 부여하는 문법 요소 

 

- 접근 지정자

 - 클래스, 멤버, 생성자 앞에 위치할 수 있으며, 사용 범위를 정의하는 역할 

 

1. 멤버 및 생성자의 접근 지정자 

 

 - public > protected > default(package) > private

 - 아무것도 작성하지 않으면 default 접근 지정자가 자동으로 설정

 - 멤버 및 생성자에서 사용하는 4가지 접근 지정자

Class Test {
	public int a;
    protected int b;
    int c; //default 접근 지정자 자동 설정
    private int d;
    public void abc();
    protected void bcd();
    void cde(); //default 접근 지정자 자동 설정
    private void def();
}

- 멤버 및 생성자에서 사요하는 4가지 접근 지정자의 사용 가능 범위

접근 지정자 사용 가능 범위
public 동일 패키지의 모든 클래스 + 다른 패키지의 모든 클래스에서 사용가능
protected 동일 패키지의 모든 클래스 + 다른 패키지의 자식 클래스에서 사용가능
default 동일 패키지의 모든 클래스에서 사용 가능
private 동일 클래스에서 사용가능

 

 - 패키지 abc

pacakge abc;
public class A {
	public int a;
    protected int b;
    int c;
    private int d;
    void abc() {
    	//a,b,c,d 사용 간으
    }
}

package abc;
class B {
	//a,b,c 사용가능
}

 패키지 bcd

package bcd;
class C {
	//a 사용 가능
}

package bcd;
class D extends A {
	//a,b 사용 가능
}

- Class B

 - private 필드는 자신의 클래스에서만 사용할 수 있으므로 클래스 B에서 사용 불가 

 - default는 같은 패키지에서 얼마든지 사용할 수 있으므로 default 이상의 접근 지정자를 포함하고 있는 a,b,c 사용가능

 

- Class C

 -  a만 사용 가능

 - default는 같은 패키지가 아니기 때문에 사용 불가

 - protected도 다른 패키지일 때 자식 클래스 네에서만 사용 가능 

 

- Class D 

 - 클래스 A를 상속한 A의 자식 클래스 (class extends A)

 - a,b 사용 가능 

 

package pack1;

public class A {
	//public부터 private까지 4가지의 서로 다른 접근 지정자를 포함하고 있는 필드 선언
	public int a = 1; 
	protected int b =2;
	int c = 3;
	private int d = 4;
	
	public void print() {
		//같은 클래스 내의 멤버인 print() 메서드 내부에서는 모든 접근 지정자에 접근 가능
		System.out.print(a +" ");
		System.out.print(b +" ");
		System.out.print(c +" ");
		System.out.print(d);
		System.out.println();
		
	}
}
package pack1;

public class B {
	public void print() {
		//객체 생성
		A a = new A(); //다른 클래스의 인스턴스 멤버를 사용하기 위해 객체 생성
		
		//멤버 활용
		//클래스 A는 같은 패키지에 있으므로 public,protected, default 접근 지어자로 지정된 필드는 사용 가능
		System.out.print(a.a + " "); 
		System.out.print(a.b + " ");
		System.out.print(a.c + " ");
		//System.out.print(a.d + " "); private 접근 지정자로 지정된 필드는 접근 불가능
	}
}
package pack2;

import pack1.A; //pack1의 클래스 A 임포트 

public class C {
	public void print() {
		//객체 생성
		A a = new A();
		
		//멤버 활용
		//다른 패키지 내의 클래스에서는 자식 클래스가 아닐 때는 public 접근 지정자만 사용 가능
		System.out.print(a.a + " ");
		//System.out.print(a.b + " ");
		//System.out.print(a.c + " ");
		//System.out.print(a.d + " ");
		System.out.println();
		
	}
}
package pack2;

import pack1.A;

public class D extends A {
	public void print() {
		//멤버 활용
		//자식 클래슨느 다른 패키지에 있어도 객체의 생성 없이 protected 접근 지정자 필드까지 접근 가능
		System.out.print(a + " ");
		System.out.print(b + " ");
		//System.out.print(c + " ");
		//System.out.print(d);
		System.out.println();
	}
}
package pack0;

//서로 다른 패키지에 있는 A,B,C,D 클래스 임포트 
import pack1.A;
import pack1.B;
import pack2.C;
import pack2.D;

public class AccessModifierOfMember {
	public static void main(String[] args) {
		//클래스의 객체 생성 및 print() 메서드 호출
		A a = new A();
		B b = new B();
		C c = new C();
		D d = new D();
		
		a.print();
		b.print();
		c.print();
		d.print();
		
	}
}

 

2. 클래스의 접근 지정자

 

- 클래스에서는 public, default 접근지정자만 사용 가능

- default 클래스는 같은 패키지 내에서만 사용 가능

- public 클래스는 다른 패키지에서도 사용 가능 

 

- 클래스에서 사용하는 접근 지정자 (default)

package abc.bcd;
class A {
 //default 클래스 
}

class B {
	void bcd() {
    	A a = new A(); //(o)
    }
}
package bcd.cde;

import abc.bcd.A; // (X)
class C {
	void cde() {
    	//A 클래스 사용(선언) 불가능
    }
}

 - 클래스를 default로 정의하면 다른 패키지에서 임포트 불가능

 

- 클래스에서 사용하는 접근 지정자(public)

package abc.bcd;
public class A {
 //..
}

class B {
	void bcd() {
    	A a = new A(); //(o)
    }
}
package bcd.cde;

import abc.bcd.A; //(o)
class C {
	void cde() {
     //A 클래스 사용(선언) 가능
    }
}

 - 다른 패키지에서 클래스르 사용하기 위해서는 해당 클래스를 임포트할 수 있어야 하므로 public으로 선언해야함 

 

3. 클래스 접근 지정자와 생성자 접근지정자의 연관성

 

- 자동으로 추가되는 생성자의 접근 지정자는 클래스의 접근 지정자에 따라 결정

- 클래스가 public이다 = 다른 패키지에서 임포트 가능

- 생성자가 public이다 = 다른 패키지에서 생성자를 호출해 객체 생성 가능 

- 클래스가 public이면 자동으로 추가되는 생성자도 public

- 클래스가 default이면 자동으로 추가되는 생성자도 default

 

- public 클래스 

package abc.bcd;

public class A {
  //컴파일러가 public A() {} 자동으로 ㅊ우가 
}

class B {
  //A 클래스 사용(생성/선언) 가능
}
package bcd.cde;

import abc.bcd.A; //(o) 클래스의 접근지정자가 public이므로 임포트 가능

class C {
	public static void main(String[] ar) {
    	A a = new A(); //(o) 접근 지정자가 public이므로 호출 가능
    }
 }

 - 클래스와 생성자에 모두 public 접근 지정자가 있기 때문에 다른 패키지에서 클래스를 임포트하거나 생성자 호출 가능

 

- default 클래스 

package abc.bcd;
class A {
  //default 클래스 
  //컴파일러가 A(){} 자동으로 추가 
}

class B {
  //A 클래스 사용(선언/생성) 가능
}
package bcd.cde;

import abc.cde.A; //(X) 클래스의 접근 지정자가 default이므로 임포트 불가능

class C {
	public static void main(String[] ar) {
    	A a = new A(); //(x)
        //임포트되지 않았을 때 생성자의 접근 지정자와 상관없이 호출 불가능
     }
}

 

- 직접 접근자 지정

 - public 클래스, default 생성자 

package abc.bcd; 

public class A {
 //public 클래스 
 A() {
  //default 생성자 
 }
}

class B {
  //A 클래스 사용(선언/생성) 가능
}
package bcd.cde;

import abc.cde.A ; //(o) 클래스의 접근 지정자가 public이므로 임포트 가능

class C {
	public static void main(String[] ar) {
    	A a = new A(); //(X) 생성자의 접근 지정자가 default이므로 호출 불가능
    }
}

 - 다른 패키지에서는 클래스를 임포트할 수 있지만, 생성자를 호출할 수 없으므로 객체 자체를 생성할 수 없음

 

 -  default 클래스 , public 생성자 

package abc.cde;

class A { //default 클래스
	public A() {
    //public 생성자
    }
}

class B {
	//A 클래스 사용(선언/생성) 가능
}
package bcd.cde;

import abc.cde.A; //(x) 클래스의 접근 지정자가 default이므로 임포트 불간으 

class c {
	public static void main(Stirng[] ar) {
    	A a = new A(); //(x) 임포트되지 않았을 때 생성자의 접근 지정자와 상관없이 호출 불가능
    }
}

 -임포트 불가능하므로 생성자가 public이라도 다른 패키지에서는 클래스 자체가 인식되지 않아 객체 생성 불가 

'Java > 문법' 카테고리의 다른 글

10-1장 클래스 상속의 개념과 문법적 특징  (0) 2023.05.04
9-2장 static 제어자  (0) 2023.04.30
8-2 장 외부 클래스  (0) 2023.04.24
8-1장 패키지와 임포트  (0) 2023.04.24
7-4장 this 키워드와 this() 메서드  (0) 2023.04.24