1. 접근제한자를 사용하는 이유 : 고유 멤버 변수값들을 외부에 의한 변경으로부터 보호
  2. 접근 허용 범위 : public > protecte > default > private
    • public : 접근 제한 없음
    • protected : 같은 패키지에 있는 객체 또는 상속관계 객체들만 접근 가능
    • default : 접근 제한자를 명시하지않으면 모두 default이며 같은 패키지에 있는 객체들만 접근 가능
    • private : 현재 객체 내에서만 접근 가능
  3. 접근제한자 사용 종류
    • 클래스 : public, default
    • 생성자, 멤버변수, 멤버메소드 : 전체 사용 가능
    • 지역변수 : 접근제한자 사용 불가
  4. 객체지향 특징
    1. 캡슐화(은닉화)
    • 개념 : 변수와 클래스를 하나로 묶는 작업이며, 클래스에 담는 내용 중 중요한 데이터나 기능을 외부의 접근으로부터 막기위해 사용한다.
    • 사용방법
      • 멤버 변수 접근제한자를 private로 설정한다.
      • 멤버 변수 값을 set하고 get할 수 있는 메소드 getter/setter를 만든다.
    • 장점
      • 데이터 접근을 제어함으로 오류 발생률이 적다.
      • 유지보수
      • 재사용이 가능하다.
    1. 정보은닉
    • 캡슐화의 중요 장점으로 다른 객체에게 자신의 정보를 숨기고 자신만의 연산을 통해 접근을 허용시키는 것이다.
    • 장점
      • 데이터가 바뀌어도 다른 객체에 영향을 주지 않아 독립적이다.
      • 객체 이식성이 좋다.
      • 객체에 포함된 정보 손상 및 오용 방지 가능
  5. 접근제한자 예제
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이기 때문이다. lotsLotto클래스 내의 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()함수에선 입력 값 mprivate int[] lots에 이미 저장되어 있는 값인지 확인한다. 이는 중복을 제거하기 위한 과정이다. return값이 true이면 lots에 저장 안 된 값이기에 lots배열에 추가한다.

make()함수는 lots배열에 값을 추가 할 때 마다 증가하는 count값이 lots배열의 길이와 같아지기 전까지 반복되며 lots배열 길이 즉, 길이가 6이 될 때 make()함수가 종료된다.

현재 lots배열엔 6개의 랜덤한 값이 저장되어 있으며 이후 lot.print()구문을 통해 출력된다.