본문 바로가기
Java/Java

접근 제한자) 멤버 및 생성자의 접근 제한자, 클래스의 접근 제한자

by 박채니 2022. 3. 16.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


접근 제한자란?

- 자바 제어자의 한 종류로, 클래스/멤버/생성자 앞에 위치

- 사용 범위를 정의


☞ 멤버 및 생성자의 접근 제한자

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

public, protected, default(=package), private 4가지 종류의 접근 제한자를 사용할 수 있습니다.

필드나 메서드 또는 생성자 앞에 위치!!

하지만, 아무것도 작성하지 않으면 default 접근 제한자가 자동 설정

 

접근 제한자 사용 범위

(좁음) private → default → protected → public (넓음)

 

 

동일 패키지의 다른 클래스에서의 접근 제한

package kh.java.oop.access.modifier.field.method;

public class Foo {
	public int a = 1;
	protected int b = 2;
	int c = 3;
	private int d = 4;
	
	public void a() {}
	protected void b() {}
	void c() {}
	private void d() {}
}
package kh.java.oop.access.modifier.field.method;

public class SamePackageRun {

	public static void main(String[] args) {
		Foo foo = new Foo();
		System.out.println(foo.a);
		System.out.println(foo.b);
		System.out.println(foo.c);
//		System.out.println(foo.d);	//접근불가 (The field Foo.d is not visible)
		
		foo.a();
		foo.b();
		foo.c();
//		foo.d();	//접근불가 (The method d() from the type Foo is not visible)
	}
}

@콘솔출력값
1
2
3

동일한 패키지 내 다른 클래스를 생성하여 Foo클래스의 a, b, c, d 변수와 Foo클래스의 a, b, c, d() 메소드를 호출해보았습니다.

동일한 클래스에서만 접근이 가능한 private을 제외하고 모두 오류 없이 출력할 수 있었습니다.

private 변수와 메소드를 호출하려고 하니, 확인 불가하다는 오류 메세지가 발생 하였습니다.

 

 

다른 패키지의 클래스에서의 접근 제한

package kh.java.oop.access.modifier.field.method;

public class Foo {
	public int a = 1;
	protected int b = 2;
	int c = 3;
	private int d = 4;
	
	public void a() {}
	protected void b() {}
	void c() {}
	private void d() {}
}
package kh.java.oop.access.modifier.field.method.other;

import kh.java.oop.access.modifier.field.method.Foo;

public class OtherPackageRun {
	
	public static void main(String[] args) {
		Foo foo = new Foo();
		System.out.println(foo.a);
//		System.out.println(foo.b);	//접근불가 (The field Foo#b is not visible)
//		System.out.println(foo.c);	//접근불가 (The field Foo#c is not visible)
//		System.out.println(foo.d);	//접근불가 (The field Foo#d is not visible)
		
		foo.a();
//		foo.b();	//접근불가 (The method d() from the type Foo is not visible)
//		foo.c();	//접근불가 (The method d() from the type Foo is not visible)
//		foo.d();	//접근불가 (The method d() from the type Foo is not visible)
	}	
}

@콘솔출력값
1

public 변수는 import문을 생성해주면 접근 가능하여 a의 값을 출력할 수 있었지만, 

protected, default, private은 마찬가지로 확인 불가하다는 오류 메세지가 발생 하였습니다.


☞ 클래스의 접근 제한자

접근 제한자 사용 가능 범위
public 다른 패키지에서도 사용 가능 (import 가능)
default 같은 패키지에서만 사용 가능 (import 불가)

public, default 4가지 종류의 접근 제한자를 사용할 수 있습니다.

class 키워드 앞에 접근 제한자를 생략하면 defualt 클래스라는 의미입니다.

 

접근 제한자 사용 범위

(좁음) default → public (넓음)

 

☆ .java 파일 안에는 단 하나의 public class만 존재할 수 있습니다.

 

동일 패키지의 다른 클래스에서의 접근 제한

package kh.java.oop.access.modifier._class;

public class A {

}


class B {
	
}
package kh.java.oop.access.modifier._class;

public class SamePackageMain {
	public static void main(String[] args) {
		A a = new A();
		B b = new B();	//default 패키지 : 같은 패키지 내에서 접근 가능
	}
}

public, default 클래스 모두 같은 패키지 내에서는 접근 가능하기 때문에 문제 없이 객체를 생성할 수 있었습니다.

 

 

다른 패키지의 클래스에서의 접근 제한

package kh.java.oop.access.modifier._class;

public class A {

}


class B {
	
}
package kh.java.oop.access.modifier._class.other;

import kh.java.oop.access.modifier._class.A;

public class OtherPackageMain {
	public static void main(String[] args) {
		A a = new A();
//		B b = new B();	//default 클래스 : 다른 패키지에서는 접근이 불가
	}
}

public 클래스는 import문을 사용하여 다른 패키지에서도 객체 생성이 가능하였지만,

default 클래스는 import문 자체가 사용이 불가하고, 다른 패키지에서는 접근이 불가하므로 객체 생성이 불가합니다.

 

 

LIST