- 접근 제어자를 사용하여 ‘클래스의 멤버’에 대한 접근을 제한함으로써 캡슐화를 구현할 수 있습니다. - 이를 통해 클래스의 내부 구현 세부사항을 숨기고 외부에서 직접 접근하지 못하도록 함으로써 안정성과 유지 보수성을 높일 수 있습니다.
💡 캡슐화 사용예시
- Car라는 클래스에서 멤버 변수로 brand를 선언하였습니다. - 해당 brand 변수는 클래스 내에만 유효한 ‘private’ 접근 제어자로 지정을 하였습니다. - 그렇기에 외부에서 해당 변수를 접근할 수 있는 방법은 없지만 getter/setter를 통해 직접적인 변수 접근 및 변경이 아닌 메서드를 통한 접근이 가능하도록 구성을 하여 캡슐화를 구성하였습니다.
publicclassCar{
privateString brand; // private 접근 제어자를 사용하여 brand 변수에 접근을 제한publicStringgetBrand() { // public 메소드를 통해 brand 변수에 접근return brand;
}
publicvoidsetBrand(String brand) { // public 메소드를 통해 brand 변수를 수정this.brand = brand;
}
}
- 접근 제어자를 사용하여 ‘멤버 변수에 대한 접근을 제한’함으로써 데이터의 무결성과 안정성을 보호할 수 있습니다. - 외부에서 무작위로 데이터를 수정하는 것을 방지하고, 유효한 메서드를 통해만 데이터에 접근할 수 있도록 합니다.
💡 데이터 보호 사용예시
- BankAccount라는 클래스에서 멤버 변수로 balance를 선언하였습니다. - 해당 balance 변수는 클래스 내에만 유효한 ‘private’ 접근 제어자로 지정을 하였습니다. - 그렇기에 외부에서 해당 변수에 대해 직접적인 접근이 불가능하지만 deposit(), withdraw() 메서드를 통해서 변수를 조작하여 반환하여 데이터 값을 반환하도록 구성하였습니다.
publicclassBankAccount {
privatedouble balance; // private 접근 제어자를 사용하여 balance 변수에 접근을 제한publicdoublegetBalance() { // public 메소드를 통해 balance 변수에 접근return balance;
}
publicvoiddeposit(double amount) { // public 메소드를 통해 balance 변수를 수정
balance += amount;
}
publicvoidwithdraw(double amount) { // public 메소드를 통해 balance 변수를 수정if (amount <= balance) {
balance -= amount;
} else {
System.out.println("Insufficient funds");
}
}
}
- 접근 제어자를 사용하여 상속 관계에서 부모 클래스의 메서드와 변수를 하위 클래스에서 재사용할 수 있습니다. - 이를 통해 코드의 중복을 피하고, 효율적인 개발을 할 수 있습니다.
💡 사용 예시
- Animal이라는 클래스와 Dog라는 클래스가 있으며 Dog 클래스는 Animal로부터 상속을 받은 관계입니다. - Animal 클래스에서는 protected 접근 제어자를 두고 멤버 변수를 선언하였기에, Dog 클래스에서는 Animal 클래스의 멤버 변수에 대한 접근이 가능합니다. - 또한 상속관계이기에 Dog 클래스의 인스턴스를 생성 후 eat() 메서드 접근 역시 가능합니다.
publicclassAnimal{
protectedString name; // protected 접근 제어자를 사용하여 name 변수에 접근publicAnimal(String name) {
this.name = name;
}
publicvoideat() {
System.out.println(name + " is eating");
}
}
publicclassDogextendsAnimal{
publicDog(String name) {
super(name);
}
publicvoidbark() {
System.out.println(name + " is barking");
}
}
publicclassMain{
publicstaticvoidmain(String[] args) {
Dog dog = new Dog("Buddy");
dog.eat(); // 상위 클래스인 Animal의 eat 메소드 재사용
dog.bark(); // 하위 클래스인 Dog의 bark 메소드 사용
}
}