티스토리 뷰

제어자



클래스, 메소드, 변수의 앞에 public, final 이런식으로 선언부를 제외하고 앞에 붙어있는 것들을 보았을 것이다.


public static void main(String[] args) {
		// TODO Auto-generated method stub
		
	}


이클립스에서 자동으로 main을 생성하면 위와같은 형식의 main메소드가 생성된다. void main(String[] args)까지는 이해할 수 있겠다. 근데 앞에 붙어있는 public과 static은 어떤 역할을 하는 것일까?


이들은 제어자라고 불린다. 선언부에 함께 사용되어 부가적인 의미를 부여하는 역할을 한다. 대표적으로 접근 제어자가 있고, 그 이외에 다른 기능을하는 제어자들이 존재한다. 이 개시물에서는 접근 제어자만 다뤄보도록 하겠다.




접근 제어자



제어자들 중에 접근의 범위를 지정해주는 제어자들을 접근 제어자라고 한다. 제어자는 따로 명시하지 않아도 항상 default제어자가 붙어있다.



 접근 제어자

 클래스

 패키지

 상속

 전체

 public

 

 

 

 

 protected

 

 

 

 

 (default)

 

 

 

 

 private

    



각 제어자들의 접근 가능 범위를 나타낸 표이다. 하나하나 뜯어보면서 알아보도록 하겠다.


접근 제어자의 종류


public

public을 붙이면 접근 제한이 전혀 없는 것이다. 다른 클래스에서도 접근할 수 있고, 다른 패키지에서도 접근할 수 있다. 한 프로젝트 어느 곳에서든 접근이 가능하다.

protected

protected는 패키지에 관계없이 상속관계에 있는 자식 클래스에서 접근할 수 있도록 해준다. 상속관계에 있다면 어디서든 접근이 가능하다.

default

아무런 접근 제어자를 붙이지 않았다면 자동으로 default로 적용된다. 이 접근 제어자로는 한 패키지 내에서 모두 접근이 가능하다. 따라서 상속관계에서 패키지를 넘나들 수 있는 protected보다 더 좁은 범위라고 할 수 있다.

private

가장 강도가 높은 제한이다. private은 한 클래스 안에서만 접근이 가능하다. 클래스 외부에서 직접 접근할 수 없어서 데이터를 보호하는 것에 용이하다.


접근 제어자 사용 가능 범위


이 접근 제어자들은 아무곳에나 붙일 수 있을까? 클래스를 private으로 선언하면 아무도 접근하지 못하는 클래스가 만들어질 탠데 의미가 있을까? 여기서 접근 제어자들이 클래스, 메소드, 변수에 어떻게 적용되는지 알아볼 필요가 있다.

클래스 - public, (default)

클래스에는 public, default만 붙일 수 있다. 내부 클래스, 중첩 클래스에서는 모든 접근 제어자가 허용되지만, 특수한 경우이기에 일반적인 경우만을 설명하겠다.

클래스에 이 두가지만 있는 이유는 프로젝트 폴더 내에서 클래스가 분류되는 방법은 패키지 단위이기 때문이다. 따라서 같은 패키지에서 접근 가능한지 아닌지만 명시해주면 되므로 이 두 접근 제한자만 존재하는 것으로 보인다.

한 가지 주의할 점은 하나의 java파일에는 반드시 하나의 public 클래스만 존재해야 한다는 것에 주의하자. 이것의 이유는 하나의 파일에 너무 많은 public 클래스를 생성해버리면 규모가 커지면 커질수록 내가 사용하는 클래스가 어디 있는지 찾을 수가 없어진다. 따라서 애초에 자바를 설계할 때 부터 이를 제한하여 유지보수에 용이성을 높인 것이라고 한다.

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

모든 접근 제한자를 사용할 수 있다. 이들은 클래스 안에 존재하기 때문에 상속관계가 존재할 수 있고 클래스 내부에서만 사용하도록 제한하는 것도 필요하게 된다. 그래서 모든 접근 제한자를 사용할 수 있다.

지역변수 - 사용할 수 없음

지역변수라는 개념 자체가 한 메소드 또는 반복문, 특정 모듈 안에서 사용되고 사라지는 개념이기 때문에 접근 제한자를 굳이 만들 필요가 없다.



캡슐화(Encapsulation)


여기서 캡슐화라는 개념이 나온다. 캡슐화는 하나의 클래스는 그 내부에서 어떤 작업을 하는지에 관점을 두는 것이 아니라, 어떤 역할을 하는지에 초점을 두는 개념이다. 즉, 실제로 구현된 부분은 외부에 노출시키지 않고 특정 기능만을 알려주는 것이다.

따라서 캡슐화를 실현하기 위해서 내부에 선언된 데이터를 공개할 것인지, 아니면 숨겨서 안보이게 할 것인지 정확하게 정의해줄 필요가 있다. 이것이 정보은닉(Data Hiding)이라고 하는 개념이다. 정보은닉은 캡슐화를 실현하기 위한 구체적인 방법의 일종이라고 할 수 있다.

예를들어 내가 랜덤으로 숫자를 생성하여 사용자가 그 숫자를 맞추게 하는 간단한 게임 프로그램을 만들었다고 하면, 랜덤으로 생성된 이 숫자는 private으로 선언하여 클래스 외부로 보여주지 않고, 단지 클래스 내부의 다른 함수들을 통해 비교하고 정답 여부를 도출하는 것에만 사용해야 한다는 것이다.



참고



Java의 정석 - 남궁성

https://beerntv.wordpress.com/2017/01/18/0118-%E1%84%8E%E1%85%AE%E1%84%89%E1%85%A1%E1%86%BC%E1%84%92%E1%85%AA-%E1%84%8F%E1%85%A2%E1%86%B8%E1%84%89%E1%85%B2%E1%86%AF%E1%84%92%E1%85%AA-%E1%84%8B%E1%85%B3%E1%86%AB%E1%84%82%E1%85%B5%E1%86%A8/

https://kldp.org/node/69225

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함