접근제어자
접근제어자는 클래스 내에서 멤버의 접근을 제한하는 역할을 수행
접근제어자 종류 및 범위
종류 | 객체 내부 | 같은 패키지 | 서로 다른 패키지 |
public | 접근가능 | 접근가능 | 접근가능 |
protected | 접근가능 | 접근가능 | 하위 클래스만 접근가능 |
(default) | 접근가능 | 접근가능 | 접근 불가 |
private | 접근가능 | 접근 불가 | 접근 불가 |
접근제어자의 사용
구분 | 사용가능한 접근제어자 |
클래스 | public, (default) |
인스턴스 변수 | public, protected, (default), private |
클래스 변수 | public, protected, (default), private |
생성자 | public, protected, (default), private |
인스턴스 메소드 | public, protected, (default), private |
클래스 메소드 | public, protected, (default), private |
매개변수, 지역변수 | 사용불가 |
사용예시
// public 접근제한이 적용된 클래스
public class Sample {
}
// default 접근제한이 적용된 클래스
class Sample {
}
// 필드, 생성자, 메소드 접근제어
public class Sample {
// 필드의 접근제어
private String a;
protected String b;
String c;
public String d;
// 생성자의 접근제어
private Sample() {}
public Sample(String a, String b, String c, String d) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
// 메소드의 접근제어
private void test1() { ... }
protected void test2() { ... }
void test3() { ... }
public void test4() { ... }
}
접근제어자의 일반적인 사용
- 클래스에는 public 접근제어자를 붙인다
- 클래스의 인스턴스 변수는 private 접근제어자를 붙여서 은닉화시킨다
- 클래스의 상수는 public 접근제어자를 붙여서 공개한다
- 클래스의 생성자와 메소드는 public 접근제어자를 붙여서 공개한다
- 클래스의 생성자와 메소드도 private 접근제어자를 붙여서 은닉화할 수도 있다
- 생성자의 은닉화는 new 연산자를 사용해서 임의로 객체생성을 하지 못하게 한다
- 메소드의 은닉화는 클래스 내부에서만 사용되고, 외부에 공개할 필요가 없는 메소드인 경우에 사용한다
접근제어자를 이용한 캡슐화
- 캡슐화는 접근제어자를 이용한 은닉화를 전제로 한다
- 캡슐화는 사용자에게 공개할 필요가 없는 속성과 기능을 은닉화시키고, 사용자가 실제로 사용할 속성과 기능만을 공개하는 것이다
- 캡슐화를 통해서 사용자는 클래스 내부의 복잡한 구현을 모르더라도, 공개된 기능을 사용해서 클래스의 기능을 온전히 사용할 수 있게 된다
캡슐화의 장점
- 객체의 데이터를 보호할 수 있다
- 사용자의 편의성이 좋아진다
- 유지보수성이 좋아진다
내부클래스
- 클래스내부에 정의된 클래스다
- 내부클래스를 정의하는 이유
- 클래스가 특정 클래스와 밀접한 관계를 맺고 있을 때, 클래스의 내부에 선언하는 것이 유리
- 클래스의 구성요소들을 서로 쉽게 사용할 수 있다
- 내부클래스를 포함하고 있는 클래스를 컴파일하면 내부클래스의 갯수만큼 컴파일된 클래스파일이 추가로 생성된다
- 내부클래스의 컴파일된 클래스의 파일명 : 외부클래스명$내부클래스.class
내부클래스의 종류
인스턴스 내부 클래스(Instance Inner Class)
- 외부의 멤버변수와 멤버메소드의 접근할 수 있다
- 주로 외부 클래스의 멤버변수와 밀접하게 결합된 작업을 수행할 때 사용하는 내부 클래스다.
public class Outer {
int x;
int y;
public void test1{} {
수행문;
}
// 인스턴스 내부 클래스
class Inner {
int a;
int b;
public void test2() {
수행문;
}
}
}
정적 내부 클래스(Static Inner Class)
- 외부 클래스와 객체와 독립적으로 동작하는 내부클래스다
- 외부 클래스의 정적변수와 정적메소드만 접근할 수 있다
- 주로 외부 클래스와 느슨하게 결합된 유틸리티 클래스를 작성할 때 사용하는 내부 클래스다
public class Outer {
int x;
int y;
static int z;
public void test1() {
수행문
}
public static void test2() {
수행문
}
// static 내부 클래스
static class Inner {
int a;
int b;
public void test3() {
수행문
}
}
}
로컬 내부 클래스(Local Inner Class)
- 메소드 내부에서 정의되고 사용되는 내부클래스다
- 메소드의 지역변수와 파라미터에 접근할 수 있다
- 주로 메소드 내에서 필요한 작업을 수행하기 위해서 임시로 사용되는 내부클래스다
public class Outer {
int x;
int y;
public void test1() {
수행문;
}
public void test2() {
int x1 = 100;
int y1 = 200;
// 지역내부 클래스
class Inner {
int a;
int b;
public void test2() {
수행문;
}
}
y1 = 20;
}
}
익명 내부 클래스(Annonymous Inner Class)
- 이름이 없는 내부클래스다
- 인터페이스나 추상클래스의 구현객체를 생성할 때 사용되는 내부클래스다
- 클래스를 정의하면서 동시에 객체를 생성한다
- 주로 콜백함수, 이벤트처리에 사용되는 일회용 객체를 생성할 때 사용된다
//인터페이스
public interface Pen {
void draw();
}
//익명객체
Pen p = new Pen() {
public void draw() {
// 구현코드
}
};
//인터페이스
public inteface MouseListener {
void mouseClicked(MouseEvent e);
void mouseMoved(MouseEvent e);
}
//익명객체
MouseListener listener = new MouseListener() {
public void mouseClicked(MouseEvent e) {
// 구현코드
}
public void mouseMoved(MouseEvent e) {
// 구현코드
}
};
인터페이스의 구현객체 생성하기
1. 구현클래스를 정의하고, 객체 생성하기
public class BarChart implements Chart {
public void draw() {
// 막대그래프 그리기
}
}
BarChart c1 = new BarChart();
Chart c2 = new BarChart();
2. 구현클래스를 정의하면서 동시에 객체 생성하기
Chart c1 = new Chart() {
public void draw() {
// 파이차트 그리기
}
};
Chart c2 = new Chart() {
public void draw() {
// 꺽은선 그래프 그리기
}
};
Chart c3 = new Chart() {
public void draw() {
// 지도차트 그리기
}
};
'Java' 카테고리의 다른 글
Java_String 클래스 (0) | 2023.11.14 |
---|---|
Java_Object 클래스, Java API (0) | 2023.11.14 |
Java_인터페이스(oop) (1) | 2023.11.10 |
Java_오버라이딩, 추상화, 다형성(oop) (0) | 2023.11.09 |
Java_상속, Object, 클래스 형변환(oop) (0) | 2023.11.08 |