4. 제어자 (Modifier)
4.1 접근 제어자
"제어자"라는 단어는 JAVA에서는 "클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여하는 것" 이지만, 제 나름대로 해석을 해 보면, 학창실절의 선생님과 비슷하다는 생각이 들었습니다.
"너는 1학년 3반의 1번 학생이야. 다른 반에 가서 수업을 들으면 안된단다. 그리고 우리 반은 1번이 첫 번째 번호이니깐, 맨 앞에 앉아서 선생님 말을 처음으로 들어주었으면 좋겠다~"라고 이야기를 하는 선생님와 매우 비슷하다는 생각이 들었습니다.
여기서 "너는 1학년 3반의 학생이야."라고 하는 부분은 활동 범위를 지정해 주는 것이었습니다.
1학년 3반이 아닌 다른 곳에서는 수업을 듣을 수 없다는 것을 알려주기도 하고, 내가 수업을 들어야 할 곳은 1학년 3반이라는 것을 알려주는 말이었죠.
JAVA에서는 이러한 것을 '접근 제어자'라고 부릅니다.
접근 제어자의 종류로는 public, protected, default, private 4가지가 있습니다.
사전에 검색을 해 보면 다음과 같은 의미를 가지고 있는 것을 알 수 있습니다.
public - 공공의
protected - 보호된, 지켜진
default - (by default) (달리 손을 쓰지 않아서) 자연스럽게[자동적으로]
private - 사유의, 개인사유의
이 접근 제어자들은 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 활동할 수 있는 영역을 알려줍니다.
제어자 |
같은 클래스 |
같은 패키지 |
자손클래스 |
전체 |
public |
|
|
|
|
protected |
|
|
|
|
(default) |
|
|
|
|
private |
|
|
|
|
<표 1>
public 은 접근 제한이 전혀 없는 공공의 것,
protected는 다른 클래스, 다른 패키지여도, 상속 받기만 한다면, 어디서든 사용할 수 있는 부모의 보호가 필요한 접근제어자.
그리고, default는 같은 패키지 내의 클래스에서만 접근이 가능하도록 하는 것
그리고 private는 같은 클래스 내에서만 접근이 가능한 접근제어자를 나타냅니다.
이제 직접 사용을 해 보겠습니다.
<myjava.ModifierExam 클래스 -1->
<myjava.ModifierExam 클래스>에서 public과 protected, default 그리고 private를 선언을 해 보았습니다.
그리고,
myjava2 라는 패키지에서 OtherPackageExam라는 class를 만들어서 위의 변수들을 호출 해 보았습니다.
< myjava2.OtherPakacgeExam -1->
ㄷㄷㄷ... 접근 제한이 전혀 없는 public으로 선언하였던 a 만 호출을 할 수 있었습니다.
그 다음으로 느슨한(?) protected를 호출 해 보겠습니다.
< myjava2.OtherPakacgeExam -2->
< myjava2.OtherPakacgeExam -3->
짜잔~!<myjava.ModifierExam 클래스 -2->
public 접근제어자를 사용하는 Method를 사용하여 c와 d를 가지고 올 수 있습니다.
이렇게 접근 제어자는 활동영역을 설정 해 줄 수 있습니다. 그리고 그 영역을 넘어서 호출하는 것 또한 가능하기는 합니다. 그렇다면 왜 모든 것을 public으로 하지, protected, default 그리고 private로 나누어 놓았는지 궁금해 집니다.
우선 접근 제어자를 나누어 놓은 것은 두 가지 정도의 이유가 있습니다.
첫 째, 외부로부터 데이터를 보호하기 위해서
둘 째, 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
즉, 보안의 이유가 있습니다.
그리고 하나 더 찾아보자면, Method의 접근제어자가 public일 때는 Method에 변화가 생겼을 때, 많은 부분에서 오류를 점검해야 하지만, private나 default로 하면, 적은 부분만을 점검해도 되는 이점도 생길 수 있습니다.
그리고 위에서 default와 private로 선언 되었던 변수를 호출하였던 방법을 사용하면 좋은 점은 호출 보다는 변경하거나 새로운 값을 할당할 때 발휘됩니다.
< Time class >
11번째 줄부터 보시면, hour가 0과 23이내의 값이 아니라면, 아무런 설정도 하지 않고 return 해 버리는 것을 볼 수 있습니다. 즉, 값을 설정하려고 할 때, 유효한 값만을 갖을 수 있도록 할 수 있습니다.
지금까지 접근 제어자에 대한 설명이었습니다.
그리고 JAVA에서는 static과 final 그리고 abstract라는 제어자를 제공하기도 합니다.
지금부터는 접근 제어자가 아닌 제어자 static, final, abstract에 대해서 이야기 하겠습니다.
4.2 제어자, static
위에서 말했던, 제어자는 선생님 같다는 말에서 "1번이 첫 번째 번호이니깐, 맨 앞에 앉아서 선생님 말을 처음으로 들어주었으면 좋겠다~"라고 이야기하는 선생님의 말은 반에서 수업이나 활동 등이 진행되어질 때의 순서를 정해 주는 것이었습니다.
JAVA에서도 비슷한 것이 있습니다. 그 중에 하나가 static이라는 것입니다.
변수나 Method명 앞에 static을 붙여주면, 그 변수나 Method를 JAVA는 가장 처음으로 읽게 됩니다. 즉, 인스턴스화가 진행되어지는 class나 main Method 보다도 먼저 읽게 되어 main에서 인스턴스화를 하지 않아도, 사용할 수 있게 됩니다. 이것의 예로 다음과 같은 코드를 보여드리겠습니다.
< myjava.StaticTest2 클래스 -1->
< myjava.StaticTest2 클래스 -1- >를 보시면, 11번째 줄에서는 static이 아닌 변수 num2를 인스턴스화하지 않고 사용하였기 때문에, 에러가 발생하였습니다. 하지만, num1과 str1은 따로 인스턴스화하지 않고도 에러가 발생하지 않았습니다.
이것이 static 이라는 제어자의 기능입니다.
즉, 무엇 보다도 먼저 존재를 알 수 있고, main보다도 먼저 읽고 사용할 수 있게 되어진다는 기능이 있습니다.
그리고 따로 인스턴스를 만들지 않기 때문에 다음과 같은 결과를 볼 수 있습니다.
< myjava.StaticTest2 클래스 -2->
< myjava.StaticTest2 클래스 컴파일 -2->
< myjava.StaticTest2 클래스 -2-> 분명 13번째 줄에서 새롭게 인스턴스화 하였음에도 불과하고, 1234와 안녕못합니당이 출력되는 것을 볼 수 있습니다. 즉, static을 하게 되면 인스턴스를 만들지 않는다는 것을 알 수 있습니다.
4.3 제어자, final
final은 '마지막의' 라는 뜻을 가지고 있습니다. 저는 이 final을 PPT에서 '맨 앞으로 보내기'를 생각하며 이해를 했었습니다. 항상 맨 앞으로 와있는 변수, Method 클래스를 만들겠다. 즉, 변수는 상수처럼 다시는 변경할 수 없는 것이 되고, Method는 Overridng을 할 수 없는 것이 되어버립니다. 또 클래스는 상속할 수 없는 클래스가 되어 버립니다.
< final 변수를 변경하려고할 때의 에러 >
< final 클래스를 상속 받을 때의 에러 >
< final Method를 overriding할 때의 에러 >
이렇듯 Final은 보통 수학에서는 Pi 같은 것들을 설정할 때 사용하기도 하고, 변하면 안되는 값을 설정할 때 많이 사용합니다. 그리고 초기화도 항상 같이 해 주어야하는 점도 중요합니다.
물론 접근 제어자에서 썻던 방법과 비슷한 방법을 쓰면 나중에 그 값을 설정해 주는 방법도 존재합니다.
< Final 변수를 나중에 값을 넣어주는 방법 >
이렇게 생성자를 호출할 때 값을 넣어주면, 나중에 값을 넣어주는 것 또한 가능 해 집니다.
물론 그 다음에 NUMBER를 변경하는 것은 에러입니다.
이상으로 final 설명을 마치겠습니다.
4.4 제어자, abstract
abstract는 '미완성의', '추상적인' 의 의미를 가지고있습니다. class나 Method에 붙여 사용하였을 때, 아직 완성되어지지 않은 추상적인 class이고, 추상적인 Method가 되는 것입니다. 쉽게 생각하면, 아주 많은 class와 Method를 만들려고 하는데 중복되어지는 것도 많고, 차이가 있다면 아주 조금일 때, 미리 선언을 다 해놓고 차이가 있는 부분만 Overriding을 하면 됩니다. 이 때 사용하는 것이 abstract라고 생각합니다.
코드로 보자면,
< myjava.AbstractExam.SumClass>
< myjava.AbstractExam.SumClass를 상속 받은 UsingAbstract>
< myjava.AbstractExam.SumClass> 에서는 선언만 해주었고, < myjava.AbstractExam.SumClass를 상속 받은 UsingAbstract>에서는 Overriding만 하고 main에서 사용까지 하였습니다. 이러한 방법은 스타 유닛에서 질럿과 커세어를 만들 때, 움직이는 것은 같지만, 공중 공격과 지상몹 공격하는 방법이 다르기 때문에, 유닛이라는 abstract 클래스에서 move만 선언을 미리 하고, 질럿과 커세어는 유닛 Abstract 클래스를 상속 받아 공중attack과 지상 attack Method를 각 각 만들어 사용하는 것에 쓰일 수 있습니다.
이 Abstract는 추 후에 다형성과 추상클래스에서 또 다루도록 하겠습니다.
※ 참고 문헌
1. 자바의 정석 3판 /남궁성/ 도우출판/344p~353p
'WEB > java' 카테고리의 다른 글
apache tomcat과 eclipse로 server 시작하기 (0) | 2019.02.24 |
---|