캡슐화란
객체의 필드,메서드를 하나로 묶고, 실제구현내용을 감추는 것을 말한다. 외부 객체는 객체내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메서드만 이용할 수 있다.
은닉된 정보 + 정보의 접근 통로를 메서드로 만듬 = 캡슐화이다.
접근제어자를 통한 데이터 보안이다.
캡슐화를 위해서는 테이터와 기능을 하나라 묶기때문에 데이터(정보)를 은닉할 수 있어야한다. 정보를 은닉하기 위한 방법은 public, private 등의 접근제어자를 사용한다.
접근제어자
private
외부에 노출되면 안되는 정보들을 정보은닉시키고 그것을 도와주는 접근제어자이다.
자신의 클래스에서 접근가능(다른클래스 접근불가)
public
클래스가 public 접근제한을 가지게 되면 같은 패키지뿐만 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다.
default - (아무것도 선언되있지 않은 상태를 의미) - 동일 패키지에서 접근가능
클래스를 선언할 때 public 을 생략했다면 클래스는 default 접근제한을 가진다. 클래스가 default접근 제한을 가지게 되면 같은 패키지에서는 아무런 제한없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한한다.
protected - 자식클래스가 아닌 다른 패키지에 소속된 클래스
생성자의 접근제한
객체를 생성하지 위해서는 new 연산자로 생성자를 호출해야한다. 하지만 생성자를 어디에서나 호출할 수 있는 것이 아니다. 생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다.
생성자는 위와 같이 4가지의 접근제한자를 가질 수 있다.
클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동적으로 기본생성자가 추가된다.
자동으로 생성되는 기본 생성자의 접근 제한은 클래스의 접근제한과 동일하다.
클래스 default 접근제한 - 기본 생성자도 default 접근제한
클래스 public 접근제한 - 기본 생성자도 public 접근제한
접근제한자 | 생성자 | 설명 | |
public | 클래스() | public 접근제한은 모든 패키지에서 아무런 제한없이 생성자를 호출할 수 있도록 한다. 생성자가 public 접근제한을 가지면 클래스도 public 접근제한을 가지는 것이 정상적이다. 클래스가 default 접근제한을 가진다면 클래스 사용이 같은 패키지로 한정되므로, 비록 생성자가 public 접근 제한을 가지더라도 같은 패키지에서만 생성자를 호출할 수 있다. |
|
protected | 클래스() | protected 접근제한은 default접근제한과 마찬가지로 같은 패키지에 속하는 클래스에서 생성자를 호출할 수 있도록한다. 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식클래스라면 생성자를 호출할 수 있다. | |
default | 클래스() | 생성자를 선언할 때 public 또는 private를 생략했다면 생성자는 default접근제한을 가진다. default 접근제한을 같은 패키지에서는 아무런 제한없이 생성자를 호출할 수 있으나,다른 패키지에서는 생성자를 호출할 수없도록 한다. | |
private | 클래스() | private 접근제한은 동일 패키지이건 다른패키지이건 상관없이 생성자를 호출하지 못하도록 제한다. 따라서 클래스 외부에서 new 연산자로 객체를 만들 수 없다. 오로지 클래스 내부에서만 생성자를 호출할 수 있고, 객체를 만들 수 있다. |
필드와 메서드의 접근제한
필드와 메서드도 public , protected, default, private 접근제한을 가질 수 있다.
접근제한자 | 생성자 | 설명 | |
public | 필드 메서드() |
public 접근제한은 모든 패키지에서 아무런 제한없이 필드와 메서드를 사용할 수 있도록 해준다. 필드와 메서드가 public 접근제한을 가질 경우 클래스도 public 접근제한을 가져야 한다. 클래스가 default 접근제한을 가지게 되면 같은 패키지안에서만 클래스가 사용되기 때문이다. |
|
protected | 클래스() | protected 접근제한은 default접근제한과 마찬가지로 같은 패키지에 속하는 클래스에서 필드와 메서드를 사용할 수 있도록 한다. 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식클래스라면 필드와 메서드를 사용할 수 있다. | |
default | 클래스() | 필드와 메서드를 선언할 때 public 또는 private를 생략했다면 default 접근제한을 가진다. default 접근제한은 같은 패키지에서는 아무런 제한이 없으며 필드와 메서드를 사용할 수 있으나, 다른패키지에서는 필드와 메서드를 사용할 수 없도록 한다. |
|
private | 클래스() | private 접근제한은 동일 패키지이건 다른패키지이건 상관없이 필드와 메서드를 사용하지 못하도록 제한한다. 오로지 클래스 내부에서만 사용할 수 있다. |
package world.asia;
public class Korea {
public String capital; //수도 public - 어떠한 값도 대입가능
String language; //언어 dafault 상태 - 외부에서 값을 저장 못함
private int population; //인구 private - 자신의 클래스에서만 접근가능.외부에서 값 대입 못함
public void setPopulation(int population) {
if (population < 1) {
System.out.println("인구는 0이상이여야 한다.");
} else {
this.population = population;
}
}
public int getPopulation () {
return population;
}
}
package world;
import world.asia.Japen;
import world.asia.Korea;
import world.europe.France;
public class CountryManager {
public static void main(String[] args) {
Korea k = new Korea();
Japen j = new Japen();
France f = new France();
// k.capital = "평양";
// k.language = "중국어";
// k.population = "-1";
k.setPopulation(-1);
k.setPopulation(5000);
}
}
위 코드에서보면 capital 에는 한국의 수도가 들어가야한다. 그렇지만 평양을 넣었을 때의 값은 평양이 된다.
이처럼 맞지 않은 값을 사용자가 입력했을 때 public 이라면 값은 입력이 된다. 그렇기 때문에 private 접근제어자를 사용하는 방법이 알맞다.
싱글톤
'java' 카테고리의 다른 글
java_7_ 상속(Inheritance) & 다형성 (0) | 2021.10.18 |
---|---|
java_7_싱글톤 (0) | 2021.10.18 |
java_6_ static (0) | 2021.10.14 |
java_6_ 클래스 구성 (생성자) (0) | 2021.10.14 |
java_5_ 클래스 구성 (필드 , 메소드, 오버로딩) (0) | 2021.10.13 |