티스토리 뷰

Java/문법

6. 접근 제어자 : Access Modifier

알 수 없는 사용자 2018. 10. 9. 02:03


이번 포스팅에서는

접근 제어자에 대해 다루어 보겠습니다.

접근 제어자는 자바에서 필수적으로

 알아야 할 부분으로 

개념을 확실히 잡고 갑시다.


==============================================


접근 제어자 : Access Modifier 





1. 접근 제어자가 무엇일까?


 접근 제어자의 의미는 상당히 간단합니다. 말 그대로 접근을 제한하는 것인데요.

클래스의 변수나 메소드 혹은 클래스의 접근을 제한을 지정하는 역할입니다.

 그렇다면 여기서 의문이 드는 것은 왜 사용할까? 입니다. 그냥 편하게 모든 변수나 메소드, 클래스를 언제 어느 곳에서든 호출하도록 해놓으면 편하지 않겠냐라는 생각이 들 수도 있습니다. 

 매우 규모 있는 프로그램이나 로직을 구현한다 하면 엄청난 양의 코드로 복잡하게 설계될 것입니다. 이때 접근 제어자라는 것이 없이 언제 어디서든 누구에게나 접근이 변수나 메소드에 접근 가능하다면 어떻게 될까요?

 프로그램이 규모가 커진다는 것은 프로그램의 안정성, 위험성 또한 커진다는 것입니다. 그렇기 때문에 만약 객체를 사용하는 입장에서 객체 내부적으로 사용하는 변수나 메소드에 접근함으로써 개발자가 의도하지 못한 오동작을 일으킨다면 단순한 버그 수정이 아니라 프로그램을 갈아엎어야 하는 상황이 나올지도 모릅니다.

 이런 문제로부터 객체를 보호하기 위해서 개발자의 의도에 따라 접근을 제어할 수 있는 기능을 제공하는 것이 접근 제어자입니다.

솔직히 작은 예제나 단순한 프로그램을 구현하는 학생 입장에서는 와닿지 않지만, 접근 제어자를 계속 사용하는 습관을 지니는 것이 좋다고 생각합니다.






2. 접근 제어자의 종류는?





사실 접근 제어자의 종류와 구별은 위 그림과 표로 설명이 끝날정도 입니다. 중요한 것에 비해 이해하기 어렵지 않은 내용이죠.

그림처럼 private가 가장 작은 단위고 public이 가장 큰 단위라고 일단 외우는 것이 접근 제어자를 이해하기에 좋다고 생각합니다.

default의 경우 우리가 아무것도 지정하지 않으면 default로 지정됩니다.


그리고 다음과 같이 대상에 따라 사용할 수 있는 접근 제어자가 다릅니다.


 - 클래스 : public, (default)

 - 메소드, 맴버변수 : public, protected, (default), private

 - 지역변수 : 해당 없음.


제가 이 부분을 처음 공부할 때는 protected와 default의 구별이 애매했습니다. 표에 나타난 것과 같이 protected와 default의 차이는 다른 패키지에서의 상속 관계 차이입니다. 하지만 상속에 대한 정확한 개념이 파악되지 않고 몸에 익지 않았다면 당연히 갸우뚱하게 되겠죠.

그렇기 때문에 접근 제어자는 암기가 어려울 만큼 복잡한 내용도 아니기때문에 숙지만 해두고 상속의 개념을 파악하고 다시 한번 접근 제어자에 대한 내용을 참고한다면 도움이 될 거로 생각합니다.





3. 접근 제어자의 사용법은?


접근 제어자의 사용법도 매우 간단합니다.


 - 클래스 : [접근 제어자] class [클래스명] {...}

 - 메소드 : [접근 제어자] [제어자] [반환형] [함수명] [파라미터] {....}

 - 맴버변수 : [접근 제어자] [제어자] [타입] [변수명] 

 

public class Ball {
private int speed;
private int course;

Ball(int sp, int co) {
...
}

public String current() {
...
}
}


우리가 계속 설계했던 방식에서 각 변수나 메소드, 클래스 맨 앞에 접근 제어자만 명시해주면 됩니다.


만약 위와 같이 Ball 이란 클래스를 설계해둔 상태에서 Ball 클래스와 다른 패키지에 있는 메인클래스에서 Ball 객체를 생성하려고 시도한다면 public이 필요하게 됩니다. (물론 import도 해주어야합니다.)

Ball 객체를 생성했다고 객체 안에 모든 기능, 데이터에 대한 접근 권한을 가지는 것은 아닙니다. 클래스, 변수, 메소드 각각 별도의 권한을 가지고 있습니다.

만약 반대로 클래스는 default로 생성했는데 current() 메소드를 public이라 돼있다고 current() 메소드를 사용할 수 있는 것이 아닙니다.


변수의 경우 private로 설정해두는 경우가 많습니다. (보통 데이터는 직접접근 하지못하게 private을 권장하는 것으로 알고 있습니다.)

변수의 경우 객체에서 저장하는 값으로 모든 기능에 영향을 줄 수 있는 중요한 값이므로 private로 설정해 객체 내에서만 설정가능하도록 합니다.

객체를 생성했을 때 default로 돼 있다면 ball.speed 이런 식으로 변수 값을 바로 참조할 수 있지만 private으로 설정된다면 이마저도 불가능합니다.


생성자의 경우 public으로 설정하는 경우가 많습니다.

객체를 생성한다는 것은 생성자를 호출한다는 것인데 만약 클래스만 public이고 생성자는 public 이하의 속성이라면 참 이상하겠죠


protected의 경우 타 패키지에서 상속될 경우에만 접근을 허용하는 것인데 상속에 대해 다루어보고 그때 다루어보면 감이 잡힐 것입니다,


=========================================================================================================


참고로, 접근 제어자와 일반 제어자는 다릅니다.

일반 제어자는 static, final, abstract, native, synchronized 등이 있습니다.

일반 제어자의 경우 접근 제어자와 같이 쓸 수 있는 경우도 있고 없는 경우도 있습니다.

 - 메소드에 static과 abstract를 함께 사용할 수 없습니다.

 - 클래스에 abstract와 final를 동시에 사용할 수 없습니다.

 - abstract 메소드의 접근 제어자가 private일 수 없습니다.

 - 메소드에 private와 final을 같이 사용할 수 없습니다.  

대부분 abstract와 관련된 것이기 때문에 이 부분도 차후에 abstract에 대해 공부하시면 이해가 가실 겁니다..

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

9. 추상화 : abstraction  (31) 2018.10.11
7. 상속 : extends  (31) 2018.10.11
5. 정적 변수와 메소드 : static  (0) 2018.10.06
4. 가비지 컬렉터 : Garbage Collector & 메모리  (0) 2018.10.05
3 . 생성자 : Constructor  (0) 2018.10.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함