09. 정보은닉과 캡슐화

DEV_HOYA·2023년 11월 27일

Java

목록 보기
9/12
post-thumbnail

📌 Chapter 09

⭐ 정보은닉

  • 데이터를 가리고 메소드로만 접근가능하게 하는 것
class Circle {
    private double rad = 0; // 클래스 내부 접근만 허용
    final double PI = 3.14;
    
    public Circle(double r) {
        setRad(r);
    }

    public void setRad(double r) {
        if(r < 0) {
            rad = 0;
            return; 
        }
        rad = r;
    }

    public double getRad() {
        return rad;
    }
}

class InfoHideCircle{
    public static void main(String args[]) {
        Circle c = new Circle(1.5);
		
        c.rad = -2; // error(직접접근불가)
        c.setRad(3.4);
        System.out.println(c.getRad());
    }
}
  • private 선언을 통해 정보은닉
  • 인스턴스 변수를 숨기는 개념(인스턴스 변수 직접 접근 제한)

✅ Getter

  • 인스턴스 변수의 값을 참조하는 용도로 정의된 메소드
  • 변수의 이름이 name이면 메소드의 이름은 getName()으로 짓는게 관례

✅ Setter

  • 인스턴스 변수의 값을 설정하는 용도로 정의된 메소드
  • 변수의 이름이 name이면 메소드의 이름은 setName()으로 짓는게 관례

⭐ 접근 수준 지시자

  • 클래스 정의 대상 : public, default
  • 인스턴스 변수, 메소드 대상 : public, protected, default, private
// AAA.java
public class AAA{

}

// ~~.java
class ZZZ{

}

✅ 클래스 정의 대상(public / default)

  • public : 어디서든 인스턴스 생성이 가능
  • default : 동일 패키지로 묶인 클래스 내에서만 인스턴스 생성을 허용
  • 하나의 소스파일에는 하나의 클래스만 public으로 선언한다
  • 소스파일의 이름과 public으로 선언된 클래스의 이름을 일치시킨다
package zoo;

// Duck은 default로 선언되었으므로 동일 패키지 내에서만 인스턴스 생성 가능
class Duck {

}

// Cat은 public으로 선언되었으므로 어디서든 인스턴스 생성 가능 
public class Cat { 
    public void makeCat() {
        // Duck과 같은 패키지로 묶여 있으니 Duck 인스턴스 생성 가능
        Duck quack = new Duck(); 
    }
}
package animal;

public class Dog {
    public void makeCat() {
        // Cat은 public으로 선언되었으므로 어디서든 인스턴스 생성 가능
        zoo.Cat yaong = new zoo.Cat();
    }
    
    public void makeDuck() {
        // Duck은 default로 선언되었으므로 이 위치에서 인스턴스 생성 불가
        zoo.Duck quack = new zoo.Duck();    // 컴파일 오류 발생 문장
    }
}

✅ 인스턴스 멤버 대상(public / default)

  • public : 어디서든 접근 가능
  • default : 동일패키지로 묶인 클래스 내에서만 접근 가능
package zoo;

public class Cat { 
    // public으로 선언된 메소드, 따라서 어디서든 호출 가능
    public void makeSound() { System.out.println("야옹"); }
    
    // default로 선언된 메소드, 따라서 동일 패키지로 묶인 클래스 내에서 호출 가능
    void makeHappy() { System.out.println("스마일"); }
}
package animal;

public class Dog {
    public void welcome(zoo.Cat c) {
        c.makeSound();     // 호출 가능! 컴파일 성공!
        c.makeHappy();     // 호출 불가! 컴파일 오류! 
    }
}

✅ 인스턴스 멤버 대상(protected)

  • 상속관계에 있는 다른클래스에서 접근 가능
package alpha;

public class AAA{
	protected int num; // protected 선언이 없으면 다른패키지에서 접근 불가
}
// 패키지 선언이 없으므로, 디폴트 패키지

public class BBB extends alpha.AAA{
	public void init(int n){
    	num = n; // 상속관계에서의 접근
    }
}

⭐ 캡슐화

  • 클래스 안에 무엇을 넣을까?
  • 하나의 목적을 이루기 위해 관련있는 모든것을 하나의 클래스에 담아두는 것

0개의 댓글