글
반갑습니다. 발전소장 에르입니다 :) 이번 시간에 다뤄볼 주제는 '접근 제한자' 요놈인데요.
쉽게 말하면 기숙사의 방마다에 위치한 '도어락'같은 아이입니다.
자바에서는 '접근 제한자'와 '비-접근 제한자'로 두가지 타입이 존재합니다.
데이터 멤버, 메소드, 생성자, 클래스들의 스코프를 지정해주는 접근제한자로는 4가지가 있는데
1. private
2. default
3.protected
4.public
위와 같이 되어있으며, 특히 4번쨰 public은 매우 익숙하리라 단언합니다.
그리고 비-접근 제어자로는 static, abstract, synchronized, native, volatile, transient 등이 있습니다만,
우리가 오늘 메인으로 다룰 주제는 위에서도 언급했다싶이 ' 접근 제한자' 입니다.
1) private access modifier
클래스 내부에서만 공유할 수 있는 제한자입니다.
package com.access.modifier;
class A {
// private 필드와 메소드를 가진 A라는 클래스가 있고,
private int data = 40;
private void msg() {
System.out.println("Hello java");
}
}
public class Simple {
//메인메소드를 가지고있는 Simple클래스
public static void main(String args[]) {
A obj = new A();
//A 인스턴스를 만들어 A가 가지고있는 필드와 메소드에 접근하고자합니다만.!!
System.out.println(obj.data);// Compile Time Error
obj.msg();// Compile Time Error
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The field A.data is not visible
The method msg() from the type A is not visible
at com.access.modifier.Simple.main(Simple.java:18)
라는 에러를 뱉어주는데요, 다른 방 학생이 옆 방에서 물건을 가지고 갈려는데 비밀번호가 걸려있어서 못들어가는거라고
보시면 되실거같네요.
다음엔 private 생성자의 역할을 알아봅시다.
만약 private 생성자를 가진 클래스가 있다고 가정할때, 다른 클래스에서는 해당 클래스를 생성할 수가 없게됩니다.
class A {
private A() {
}// private 생성자
void msg() {
System.out.println("Hello java");
}
}
public class Simple {
public static void main(String args[]) {
A obj = new A();// Compile Time Error
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The constructor A() is not visible
at com.access.modifier.Simple.main(Simple.java:12)
라고 뜨네요, 왜냐면 인스턴스를 만들때 필요한건 생성자인데 이 생성자에 접근을 할 수 없으니 만들 수가 없는거죠.
물과 냉장고는 있는데 각얼음을 만들기위한 틀이 없다고나할까나..
2) default access modifier
package com.access.modifier;
class A {
void msg() {
System.out.println("Hello");
}
}
=====================================================
package com.access1.modifier;
//save by B.java
import com.access.*;
class B {
public static void main(String args[]) {
A obj = new A();// Compile Time Error
obj.msg();// Compile Time Error
}
}
class A의 제한자가 default이기때문에 같은 패키지에서만 호출이 가능한데
class B에서 다른 패키지에 있는 A를 호출할려고했기떄문에 자바가 '안되, 돌아가'하며 컴파일 에러를 뱉은 상황입니다.
3) protected access modifier
package com.access.modifier;
public class A{
protected void msg(){System.out.println("Hello");}
}
======================================================
package com.access1.modifier;
import com.access.modifier.*;
class B extends A {
public static void main(String args[]) {
B obj = new B();
obj.msg();
}
}
Hello
비록 A,B의 패키지는 서로 다르지만, B가 A를 상속했기 때문에 A의 method를 호출할 수 있었습니다.
4) public access modifier
package com.access.modifier;
public class A {
public void msg() {
System.out.println("Hello");
}
}
===================================================
package com.access1.modifier;
import com.access.modifier.*;
class B {
public static void main(String args[]) {
A obj = new A();
obj.msg();
}
}
Hello
..뭐 설명할게 없는 관계로 패스..!
밑에 정리표를 마지막으로 마무리하겠습니다:)
'프로그래밍발전소 ♫ > JAVA 발전소♫' 카테고리의 다른 글
Call Of Value, Preference in Java 값호출, 참조호출 자바 (0) | 2017.09.20 |
---|---|
자바 Encapsulation Java 캡슐화! (0) | 2017.09.15 |
Java) Static Binding + Dynamic Binding (0) | 2017.08.11 |
자바 다형성의 종류. (0) | 2017.08.09 |
자바 Final Keyword 2편! (0) | 2017.08.08 |
RECENT COMMENT