반응형

반갑습니다. 발전소장 에르입니다 :) 이번 시간에 다뤄볼 주제는 '접근 제한자' 요놈인데요.

쉽게 말하면 기숙사의 방마다에 위치한 '도어락'같은 아이입니다.

자바에서는 '접근 제한자'와 '비-접근 제한자'로 두가지 타입이 존재합니다.

데이터 멤버, 메소드, 생성자, 클래스들의 스코프를 지정해주는 접근제한자로는 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

아무 접근 제한자를 명시하지않으면 자바는 알아서 '뭐야? 아무것도 안붙힘? 그럼 내가 붙여줌' 하면서
default제한자를 붙여줄겁니다. default제한자는 같은 패키지끼리만 접근이 가능하단걸 의미합니다.
같은 동에 사는 학생들만 그 동에 출입할 수 있는거죠.

//save by A.java  

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

가장 모호한 놈입니다..
dafault에 상속개념을 더하여, 같은 패키지와 다른 패키지에서도 접근이 가능하게하지만
다른 패키지에서 접근하고자한다면 상속관계에 있어야합니다.
(protected 제한자는 데이터멤버, 메소드, 생서자에 사용될 수 있지만 클래스에는 사용할 수 없습니다.

//save by A.java  

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

public 얘는 너무 열려있는 아이입니다. 그래서 너무 남발하다간 보안에 취약점이...
//save by A.java  

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

..뭐 설명할게 없는 관계로 패스..! 

밑에 정리표를 마지막으로 마무리하겠습니다:)






반응형
by 발전소장 에르 :) 2017. 9. 13. 00:29