접근제한자 ( Access Modifier )
- 접근 제한자는 클래스와 멤버변수, 메서드, 생성자의 접근을 제어할 수 있는 제한자이다.
- 라이브러리 클래스를 설계할 때 외부클래스에서 접근할 수 있는 멤버와 접근 할 수 없는 멤보로 구분한다.
- 변수, 생성자, 메서드를 설계하는 것이 바람직
- 외부에서 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나, 객체의 특정 데이터를 보호하기 위해
- 해당 멤버변수에 접근하지 못하도록 막는 것이 접근 제한자의 역할이다.
- 클래스에는 접근제한자를 public 과 default만 붙일 수 있다.
접근제한자의 종류
- public : 같은 클래스, 같은 패키지, 다른 패키지를 막론하고 모두 접근이 가능
- protected : 같은 클래스, 같은 패키지는 접근이 가능하지만 다른 패키지에 속해있는 클래스인 경우 상속관계가 없으면 접근이 불가능하다.
- default : 같은 클래스, 같은 패키지에서만 접근이 가능하며 패키지가 다를 경우 접근이 불가능하다.
- private : 같은 클래스 내부가 아니면 접근이 불가능하다.
정보은닉 - 캡슐화 ( Encapsulation )
- 은닉은 사용자에게 상세한 내부 구현을 숨기고 필요한 부분만 보이게 하는 것이다.
- 은닉을 사용하기 위해서는 클래스의 멤버변수의 접근제한자를 private으로 설정한다.
- 은닉된 멤버변수에 접근하기 위해서는 공개된(public) 메서드를 통해서 접근할 수 있다.
- 변수 의 값을 변경시키는데 사용되는 메서드는 setter메서드
- 변수의 값을 얻어오는데 사용 하는 메서드를 getter메서드
- 공개 메서드를 이용하여 데이터를 변경시킬 경우 메서드 내에 데이터 유효성을 검증할 수 있는 루틴을 넣을 수 있다.
- 접근 권한을 체크할 수 있는 로직을 포함시키면 인가되지 않은 사용자 에게 중요한 데이터나 로직을 숨길 수 있다.
- 멤버변수만 private 제한자를 가지는 것은 아닙니다. 외부에 공개하고 싶지 않은 메서드들도 private으로 선언 가능
user 클래스 ( 은닉 (getter,setter) )
public class User {
private String name;
private int rrn;
private int age;
public User() {
}
public User(String n, int r, int a) {
this.name = n;
this.rrn = r;
this.age = a;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRrn() {
return rrn;
}
public void setRrn(int rrn) {
this.rrn = rrn;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
< Main Class >
import java.util.Arrays;
import java.util.Scanner;
public class MainClass {
public static void main(String[] args) {
User u = new User("홍길동", 123123, 20);
String name = u.getName();
int rrn = u.getRrn();
int age = u.getAge();
System.out.println(name + " " + rrn + " " + age);
User[] user = new User[2];
User u2 = new User("김길동", 456456, 30);
user[0] = u;
user[1] = u2;
for (User i : user){
System.out.println(i.getName() + " " + i.getAge() + " " + i.getRrn());
}
Scanner sc = new Scanner(System.in);
User[] users = new User[2];
int i = 0;
while(i<users.length) {
String n = sc.next();
int r = sc.nextInt();
int a = sc.nextInt();
User us = new User(n, r, a);
users[i] = us;
i++;
}
for(User j : users) {
System.out.println(j.getName() + " " + j.getAge() + " " + j.getRrn());
}
}
}
예제
< Keyboard.class >
public class KeyBoard {
public void info() {
System.out.println("----키보드 정보----");
System.out.println("from 삼성");
}
}
< Monitor.Class >
public class Monitor {
public void info() {
System.out.println("----모니터 정보----");
System.out.println("from LG");
}
}
< Mouse.Class >
public class Mouse {
public void info() {
System.out.println("----마우스 정보----");
System.out.println("from 미키마우스");
}
}
< Compiter.Class >
public class Computer {
//1. 키보드, 마우스, 모니터 클래스를 저장하는 변수를 선언
public KeyBoard keyboard;
public Monitor monitor;
public Mouse mouse;
//2.기본생성자를 생성하고, 변수를 클래스로 초기화
public Computer() {
this.keyboard = new KeyBoard();
this.monitor = new Monitor();
this.mouse = new Mouse();
}
//3.KeyBoard, Mouse, Monitor를 전달받는 생성자를 생성.
public Computer(KeyBoard k, Monitor m, Mouse m1) {
this.keyboard = k;
this.monitor = m;
this.mouse = m1;
}
//4.키보드, 모니터, 마우스 정보를 출력하는 computerInfo() 메서드를 생성
public void computerInfo() {
keyboard.info();
monitor.info();
mouse.info();
}
//5.키보드, 모니터, 마우스에 대한 getter/setter 생성
public KeyBoard getKeyboard() {
keyboard.info();
return keyboard;
}
public void setKeyboard(KeyBoard k) {
this.keyboard = k;
}
public Monitor getMonitor() {
monitor.info();
return monitor;
}
public void setMonitor(Monitor m) {
this.monitor = m;
}
public Mouse getMouse() {
mouse.info();
return mouse;
}
public void setMouse(Mouse m1) {
this.mouse = m1;
}
}
< Main.Class >
public class MainClass {
public static void main(String[] args) {
Computer cm = new Computer();
cm.computerInfo();
System.out.println();
cm.getMonitor();
}
}
728x90
'Programming > Java' 카테고리의 다른 글
[JAVA] 정적 제한자 Static (0) | 2023.11.30 |
---|---|
[JAVA] 다형성 (1) | 2023.11.14 |
[JAVA] 패키지와 상속 (0) | 2023.11.10 |
[JAVA] 객체와 클래스 (0) | 2023.11.08 |
[JAVA] 스택(Stack)과 큐(Queue) (0) | 2023.11.07 |