- 접근제한자를 사용하는 이유 : 고유 멤버 변수값들을 외부에 의한 변경으로부터 보호
- 접근 허용 범위 : public > protecte > default > private
- public : 접근 제한 없음
- protected : 같은 패키지에 있는 객체 또는 상속관계 객체들만 접근 가능
- default : 접근 제한자를 명시하지않으면 모두 default이며 같은 패키지에 있는 객체들만 접근 가능
- private : 현재 객체 내에서만 접근 가능
- 접근제한자 사용 종류
- 클래스 : public, default
- 생성자, 멤버변수, 멤버메소드 : 전체 사용 가능
- 지역변수 : 접근제한자 사용 불가
- 객체지향 특징
- 캡슐화(은닉화)
- 개념 : 변수와 클래스를 하나로 묶는 작업이며, 클래스에 담는 내용 중 중요한 데이터나 기능을 외부의 접근으로부터 막기위해 사용한다.
- 사용방법
- 멤버 변수 접근제한자를 private로 설정한다.
- 멤버 변수 값을 set하고 get할 수 있는 메소드 getter/setter를 만든다.
- 장점
- 데이터 접근을 제어함으로 오류 발생률이 적다.
- 유지보수
- 재사용이 가능하다.
- 정보은닉
- 캡슐화의 중요 장점으로 다른 객체에게 자신의 정보를 숨기고 자신만의 연산을 통해 접근을 허용시키는 것이다.
- 장점
- 데이터가 바뀌어도 다른 객체에 영향을 주지 않아 독립적이다.
- 객체 이식성이 좋다.
- 객체에 포함된 정보 손상 및 오용 방지 가능
- 접근제한자 예제
public class Lotto {
private int[] lots; //서로 다른 45개의 수에서 서로 다른 6개를 선택
public Lotto() {
lots=new int[6];
}
public int makeOne() {
return (int)(45*Math.random())+1; //random은 static method다
//0 <= Math.random() < 1 최대0.9999..를 리턴 double형임 casting해서 44.9999가 44만 남고 +1 이니까 45
//총 1~45까지 임의의 숫자를 만듦
}
public void make( ) {
int count = 0;
while(count!=lots.length) {
int m=makeOne();
//contains를 불러서 값이 없으면 count 하나 증가
if(contains(m)==true) {
lots[count] = m;
count++;
}
}
}
public boolean contains(int m) {
//lots에 있는지 없는지를 확인하는 메소드
boolean swit = true;
for (int i = 0; i < lots.length; i++) {
if(lots[i]==m) {
swit = false;
break;
}
}
return swit;//없는 값이면시켜주고 넣어줌?
} //makeOne에서 contain을 부름.
public void print() {
for (int i = 0; i < lots.length; i++) {
System.out.print(lots[i]+" ");
}
}
public static void main(String[] args) {
Lotto lot = new Lotto();
lot.make();
lot.print();
}
}
먼저 private int[] lots;는 pritvate으로 접근이 제한되어있기 때문에 Lotto라는 객체 내의 method들만 접근이 가능하다.
public static void main(String[] args) {
Lotto lot = new Lotto();
lot.make();
lot.print();
}
main에서 Lotto 타입의 빈 lot객체를 생성 한다.
public Lotto() {
lots=new int[6];
}
lots배열 하나를 생성한다.
여기서 주의할 점!!!!
System.out.println(lot.lots); //error!!
error가 나는 이유는 lots의 접근제하자가 private이기 때문이다. lots는 Lotto클래스 내의 make, makeOne, contains, print에서만 직접적으로 접근이 가능하기 때문에 main에서 lots를 접근할때에도 이 네가지 메소드 중 하나를 통해 접근해야한다.
public void make( ) {
int count = 0;
while(count!=lots.length) {
int m=makeOne();
//contains를 불러서 값이 없으면 count 하나 증가
if(contains(m)==true) {
lots[count] = m;
count++;
}
}
}
make()함수에서 makeOne()함수를 호출해 하나의 랜덤 값을 return받은 후 int m에 저장한 뒤, contains()함수를 호출한다.
public boolean contains(int m) {
//lots에 있는지 없는지를 확인하는 메소드
boolean swit = true;
for (int i = 0; i < lots.length; i++) {
if(lots[i]==m) {
swit = false;
break;
}
}
return swit;
}
contains()함수에선 입력 값 m이 private int[] lots에 이미 저장되어 있는 값인지 확인한다. 이는 중복을 제거하기 위한 과정이다. return값이 true이면 lots에 저장 안 된 값이기에 lots배열에 추가한다.
make()함수는 lots배열에 값을 추가 할 때 마다 증가하는 count값이 lots배열의 길이와 같아지기 전까지 반복되며 lots배열 길이 즉, 길이가 6이 될 때 make()함수가 종료된다.
현재 lots배열엔 6개의 랜덤한 값이 저장되어 있으며 이후 lot.print()구문을 통해 출력된다.