티스토리 뷰

728x90
반응형

자바에는 public, protected, private, 그리고 작성을 생략하는 default의 4가지 접근지정자가 있다.

각각의 특성을 살펴보자.

 

[ 접근 지정자 ]


 * public : 어디에서든 접근 가능
 * protected : 같은 package 안에서 접근 가능하고, package가 달라도 상속 관계이면 접근 가능
 * default(접근 지정자를 생략한 경우) : 같은 package 안에서만 접근 가능
 * private : 같은 클래스 혹은 같은 객체 안에서만 접근 가능
 

- 접근 지정자를 붙이는 곳

  1. 클래스 (해당 클래스를 import 할 수 있는지 여부를 결정한다.) 
  2. 생성자 (해당 생성자를 호출해서 객체를 생성할 수 있는지 여부를 결정한다.)
  3. 필드    (해당 필드를 참조할 수 있는지 여부를 결정한다.) 
  4. 메소드 (해당 메소드를 호출할 수 있는지 여부를 결정한다.)
   

- 클래스의 접근 지정자는 public or default 2가지만 가능하다.

 

예제를 통해 자세히 살펴보자.


test.a 패키지를 생성하고 다음의 클래스들을 추가해보자.

 

Eraser.java - 접근지정자가 default인 eraser 클래스 

package test.a;

//접근지정자 Default => 같은 패키지에서만 import 가능
class Eraser {

}

 

Pen.java - 접근지정자가 public인 Pen 클래스 

package test.a;
//public 클래스 접근 지정자는 어디에서든 import(사용) 가능하다.
public class Pen {
	//공개 생성자
	public Pen() {
		
	}
	//비공개 생성자
	private Pen(String color) {
		
	}
	
	//공개 필드
	public String brand;
	//비공개 필드
	private String price;
	
	//공개 메소드
	public void test() {
		//Eraser클래스는 동일 패키지에 존재하기 때문에 import 없이 사용 가능
		Eraser a = null;
		
		new Pen();
		//private 생성자이지만 같은 객체 안이므로 호출 가능
		new Pen("파랑");
		//private 필드이지만 같은 객체 안이므로 호출 가능
		System.out.println(this.price);
		//private 메소드이지만 같은 객체 안이므로 호출 가능
		this.test2();
	}
	
	//비공개 메소드
	private void test2() {
		
	}

}

동일 패키지에 있을 때

 

Pen 클래스는 public 기본생성자, color을 전달받는 private 생성자, public 필드 brand, 비공개 필드 price, public 메소드 test를 포함한다.

 

접근지정자가 public인 필드, 메소드, 클래스들은 어디에서 사용가능하므로 설명에서 제외하고 나머지 접근지정자들에 대해 살펴보도록 하자.

 

test메소드를 먼저 살펴보자.

 

Eraser a = null;

Eraser 클래스는 접근 지정자가 default이므로, eraser와 pen이 동일 패키지 내에 존재하기 때문에 import 없이 사용할 수 있는 모습이다. 

 

new Pen("파랑");

color을 전달받는 Pen의 생성자private이지만 같은 객체 안이므로 호출이 가능한 모습이다.

 

System.out.println(this.price);

priceprivate 필드이지만, 같은 객체 안이므로 호출 가능하다.

 

this.test2();

test2()private 메소드이지만, 같은 객체 안이므로 호출 가능하다.


다른 패키지에 있을 때

 

eraser, pen과 다른 패키지에 있는 메인 클래스에서 살펴보자.

 

MainClass12.java

package test.main;

import test.a.Pen;

/*
 * [ 접근 지정자 ] 
 * public : 어디에서든 접근 가능
 * protected : 같은 package 안에서 접근 가능하고, package가 달라도 상속 관계이면 접근 가능
 * default(접근 지정자를 생략한 경우) : 같은 package 안에서만 접근 가능
 * private : 같은 클래스 혹은 같은 객체 안에서만 접근 가능
 * 
 * - 접근 지정자를 붙이는 곳
 * 1.클래스 (해당 클래스를 import 할 수 있는지 여부를 결정한다.) 
 * 2.생성자 (해당 생성자를 호출해서 객체를 생성할 수 있는지 여부를 결정한다.)
 * 3.필드    (해당 필드를 참조할 수 있는지 여부를 결정한다.) 
 * 4.메소드 (해당 메소드를 호출할 수 있는지 여부를 결정한다.)
 * 
 * - 클래스의 접근 지정자는 public or default 2가지만 가능하다.
 */
public class MainClass12 {
	public static void main(String[] args) {
		//접근지정자 public이므로 패키지가 달라도 import 가능
		Pen pen1 = null;
		//여기는 test.main 패키지, Eraser는 test.a 패키지에 있기 때문에 import 불가
		//Eraser e1 = null;
		
		//default 생성자는 public으로 공개되어 있어 객체 생성이 가능하다.
		Pen pen2 = new Pen();
		
		//String type을 전달받는 생성자는 private으로 되어 있어 호출 불가
		//Pen pen3 = new Pen("노랑");
		
		//Pen type 객체의 brand라는 필드는 public으로 공개 되어 있어 참조 가능
		System.out.println(pen2.brand);
		//Pen type 객체의 price라는 필드는 private으로 공개되어 있어 참조 불가
		//System.out.println(pen2.price);
	}

}

 


Pen pen1 = null;

접근지정자 public이므로 패키지가 달라도 import이 가능하다.

 

Eraser e1 = null;

Eraser 클래스의 접근지정자는 default이고 MainClass12와 Eraser가 있는  패키지가 달라 import가 불가능하다.

 

Pen pen2 = new Pen();

default 생성자는 public으로 공개되어 있어 객체 생성이 가능하다.

 

Pen pen3 = new Pen("노랑");

String type을 전달받는 생성자private으로 되어 있어 호출이 불가능하다.

 

System.out.println(pen2.brand);

Pen type 객체의 brand라는 필드는 public으로 공개 되어 있어 참조 가능하다.

 

System.out.println(pen2.price);

Pen type 객체의 price라는 필드는 private으로 공개되지 않아 참조가 불가능하다.


protected

이번에는 test.a 패키지에 Util 클래스를 추가해보자.

 

Util.java

package test.a;

public class Util {
	//상속 관계의 자식에게만 공개
	protected String version;
	
	protected void init() {
		System.out.println("유틸맅티를 초기화 합니다.");
	}

}

 

test.b에는 MyUtil 클래스를 추가해보자.

 

MyUtil.java

package test.b;

import test.a.Util;

public class MyUtil extends Util{
	public void showVersion() {
		//다른 패키지여도 protected이기 때문에 부모 클래스의 필드 사용 가능
		System.out.println("버젼:"+this.version);
		this.init();
	}
	public static void main(String[] args) {
		MyUtil m = new MyUtil();
		m.showVersion();
	}
}

 

Util과 MyUtil은 다른 패키지에 있지만, Util의 메소드와 필드의 접근지정자가 protected이기 때문에, MyUtil에서 import하여 this를 이용하여 사용할 수 있다.


자바의 접근지정자는 "캡슐화"라는 객체 지향의 특성과 관계가 있다.

캡슐화는 객체의 필드와 메소드를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉하는 것인데, 

private 등의 접근 지정자를 통해 외부에 은닉할 수 있다.

 

 

우리가 priate, protected 등의 접근지정자를 사용하는 이유는 리모콘을 생각하면 쉽게 알 수 있다.

 

리모콘에는 여러 개의 버튼이 있는데, 이 버튼들을 "메소드"라 볼 수 있다.

버튼들을 동작시키는 각종 부품들은 리모콘 내부에 감춰져있다.

부품들을 "필드"로 볼 수 있다.

따라서, 대부분의 메소드 public으로 공개가 되어있고, 대부분의 필드들은 private으로 감춰져 있다.

 

 

캡슐화에 관한 내용은 다음에 더 자세히 다뤄보도록 하겠다. 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함