본문 바로가기
생활코딩/JAVA

생활코딩 - JAVA (접근 제어자)

by Love of fate 2020. 12. 19.
728x90
반응형

접근 제어자는 객체에 속한 멤버(메소드나 변수)를 사용하는 입장에서 누가 이것을 사용할 수 있는가에 대한 권한을 부여하는 역할을 한다.
변화를 수용하는 과정에서 자유로움만으로는 각종 문제가 생길 수 있다. 그러한 문제를 완화하기 위해서는 다양한 규제가 필요하다.

규제라는 측면에 맞춰진 기능
- 데이터 타입
데이터 타입은 어던 변수가 잇을 대 그 변수의 형식을 지정함으로써 해당 변수에는 반드시 문자열이 들어가거나 반드시 정수가 들어간다는 사실을 그 변수를 사용하는 사용자에게
보장해준다.

추상클래스, final, 접근 제어자, 인터페이스 등은 규제에 해당하는 것이다.

[문법]
package org.opentutorials.javatutorials.acesmodifier;

class A {
public String y(){
return “public void y()”;
}

private String z(){
return “public void z()”;
}

public String x(){
return z();
)
}

Public class AccessDeomo1{
public static void main(String [] args){
A a = new A();
system.out.println(a.y());

// 아래 코드는 오류가 발생한다.
// System.out.println(a.z());

System.out.println(a.x());
}
}

System.out.println(a.z());의 주석을 해제한 후 프로그램을 실행하면 다음과 같은 오류가 발생한다.
[출력 결과]
Exception in thread “main” java.lang.Error; Unresolved compilation probled:
The method z() from the type A is not visible at org.opentutorials.javatutorials.accessmodifier.accessDemo1.main(AccessDemo1.java:15)

Y() 메소드와 z() 메소드의 차이점은 메소드 서명에서 y()는 public으로, z()는 private으로 지정돼 있다는 것이다. 그래서 위와 같은 문제가 발생하는 것이다.
어떤 클래스가 가진 메소드가 public 이면 누구드지 그 클래스의 메소드를 호출해서 사용할 수 있다.
메소드 뿐만 아니라 변수도 마찬가지 이다.
하지만 어던 클래스에 속한 메소드가 private이면 해당 클래스 내부에서는 사용 할 수 있지만 클래스 바깥쪽에 있는 외부 클래스에서는 사용할 수 없고, 사용하려고 하면 오류가 발생 한다.
같은 클래스에서는 private으로 지정된 메소드를 사용할 수 있다.

Public, private를 가리켜 접근 제어자(access modifier)라고 한다.

[접근 제어자를 사용하는 이유]
Package org.opentutorials.javatutorials.accessmodifier;

Class A{
public String y(){
return “public void y()”;
}

private String z(){
return “public void z()”;
}

public String x(){
return z();
}
}

Public class accessDemo1{
public static void main(String[] args){
A a = new A();
System.out.println(a.y());
//아래 코드는 오류가 발생한다.
System.out.println(a.z());
System.out.println(a.x());
}
}

Accessdemo1 클래스 안에서는 main 메소드가 A 클래스의 y(), z(), x()라는 메소드에 접근(Access)하고 있다.
사용자가 사용하도록 의도된 인터페이스만 사용자가 사용할 수 있게 한다는 것도 private, public을 통해 얻을 수 잇는 중요한 정점이다.


[세밀한 제어]
public은 언제나 접근할 수 있고, private은 같은 클래스에서만 접근할 수 있다
public. Protected. Default. Private
같은 패키지, 같은 클래스 : 접근가능. 접근가능. 접근가능. 접근가능
같은 패키지, 상속관계. : 접근가능. 접근가능. 접근가능. 접근불가
같은 패키지, 상속관계 아님. : 접근가능. 접근가능. 접근가능. 접근불가
다른 패키지, 상속관계. : 접근가능. 접근가능. 접근불가. 접근불가
다른 패키지, 상속관계 아님 : 접근가능. 접근불가. 접근 불가. 접근불가

this는 일차적으로 클래스 자기 자신을 의미하지만 만약 해당클래스가 뭔가를 상속받았고 그 클래스가 자체적으로 가진 메소드나 필드가 없다면 자바는 그 클래스의 부모 클래스에서 메소드를 찾는다
같은 패키지에 속한 클래스는 인스턴스를 만들어서 접근하는 경우에도 private을 제외한 모든 접근 제어자를 통해 접근 가능하고 상속 관계를 통해 접근할때도 private을 제외하고 모두 접근 가능하다는 결론을 얻을 수 있다. 그래서 private을 빼고 같은 패키지인 경우에는 new로 인스턴스를 생성하건 상속을 받건 똑같이 접근 가능하다는 사실을 알 수 있다.

Public 멤버에는 모든 클래스에서 접근할 수가 없다. Priavate 멤버인 경우에는 같은 클래스에서만 접근할 수 있다.
같은클래스라면 그것이 private이건 default이건 protected이건 public이건 모두 접근이 가능하다.
protected는 같은 패키지 내에서 접근 가능하다.
default도 같은 패키지 내에서 접근 가능하다.
즉, 패키지가 같으면 protected이건 default이건 같다는 말이다.
그런데 다른 패키지인 경우라도 상속 관계라면 protected는 접근이 가능하고 default는 접근이 불가능 하다.

[클래스 접근 제어자]
클래스도 클래스 선언 앞에 접근 제어자를 붙일 수 있다.
클래스의 접근 제어자는 멤버와 달리 default와 public이라는 접근 제어자만을 지원한다.
별도로 접근 제어자를 붙이지 앟은 경우 default가 된다.
클래스 접근 제어자는 패키지와 관련된 개념이라고 생각하면 된다.
접근 제어자가 public인 클래스는 패키지가 다른 클래스에서도 접근할 수 있고, default인 경우에는 같은 패키지에서만 해당 클래스에 접근할 수 있다.

default는 같은 패키지에 있는 클래스만 사용가능하다는 규제가 있기 때문에 default 저근 제어자가 지정된 클래스를 다른 패키지에 속한 클래스에서 사용하려고 하면 사용할 수 없다는 에러가 발생한다.
그래서 default접근 제어자는 패키지에ㅓ 내부적으로 사용하는 클래스에 한해 붙이면 되는 것이고, 클래스가 다른 패키지에서 사용될 수 잇고 다른 패키지에 대해 일종의 은행 창구와 같은 역할을 한다면 public으로 선언해야 한다.

Public으로 선언할 때는 제약사항이 있다. public으로 지정된 크래승와 소스코드의 이름이 다르면 자바는 컴파일 에러를 발생시킨다. 즉, public으로 지정된 클래스가 잇다면 파일명이 클래스이름과 일치해야 한다.

*반드시 기억해야할 것으로는 접근제어자란 무엇인가를 비롯해 public은 모든경우에 접근을 허용하고, private은 같은 클래스에서만 접근을 허용한다는 사실이다.

728x90
반응형