hayu's 개발 일지

[TIL]240702 접근 제어자(2) 본문

기술/java

[TIL]240702 접근 제어자(2)

hayu00 2024. 7. 2. 21:23

공부한 내용

캡슐화

  • 캡슐화(Encapsulation)는 객체 지향 프로그래밍의 중요한 개념 중 하나다.
  • 캡슐화는 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것을 말한다.
  • 캡슐화를 통해 데이터의 직접적인 변경을 방지하거나 제한할 수 있다.
  • 캡슐화는 쉽게 이야기해서 속성과 기능을 하나로 묶고, 외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것이다.

⇒ 캡슐화를 안전하게 완성할 수 있게 해주는 장치가 바로 접근 제어자이다.

캡슐화 - 접근 제어자의 사용 목적

  • 캡슐화는 접근 제어자를 사용하여 ‘클래스의 멤버’에 대한 접근을 제한함으로써 구현할 수 있다.
  • 이를 통해 클래스의 내부 구현 세부사항을 숨기고 있어 외부에서 직접 접근하지 못하도록함으로써 안정성과 유지 보수성을 높일 수 있다.

캡슐화 사용 예시

  • Car라는 클래스에서 멤버 변수로 brand를 선언
  • 해당 brand 변수는 클래스 내에만 유효한 ‘private’ 접근 제어자로 지정
  • 그렇기에 외부에서 해당 변수를 접근할 수 있는 방법은 없지만 getter/setter를 통해 직접적인 변수 접근 및 변경이 아닌 메서드를 통한 접근이 가능하도록 구성을 하여 캡슐화를 구성
public class Car {
    private String brand; // private 접근 제어자를 사용하여 brand 변수에 접근을 제한

    public String getBrand() { // public 메소드를 통해 brand 변수에 접근
        return brand;
    }

    public void setBrand(String brand) { // public 메소드를 통해 brand 변수를 수정
        this.brand = brand;
    }
}

데이터 보호

  • 접근 제어자를 사용하여 ‘멤버 변수에 대한 접근을 제한’함으로써 데이터의 무결성과 안정성을 보호할 수 있다.
  • 외부에서 무작위로 데이터를 수정하는 것을 방지하고, 유효한 메서드를 통해만 데이터에 접근할 수 있도록 한다.

데이터 보호 사용 예시

  • BankAccount라는 클래스에서 멤버 변수로 balance를 선언
  • 해당 balance 변수는 클래스 내에만 유효한 ‘private’ 접근 제어자로 지정
  • 그렇기에 외부에서 해당 변수에 대해 직접적인 접근이 불가능하지만 deposit(), withdraw() 메서드를 통해서 변수를 조작하여 반환하여 데이터 값을 반환하도록 구성
public class BankAccount {
    private double balance; // private 접근 제어자를 사용하여 balance 변수에 접근을 제한

    public double getBalance() { // public 메소드를 통해 balance 변수에 접근
        return balance;
    }

    public void deposit(double amount) { // public 메소드를 통해 balance 변수를 수정
        balance += amount;
    }

    public void withdraw(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() 메서드 접근 역시 가능
public class Animal {
    protected String name; // protected 접근 제어자를 사용하여 name 변수에 접근

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating");
    }
}

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void bark() {
        System.out.println(name + " is barking");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.eat();  // 상위 클래스인 Animal의 eat 메소드 재사용
        dog.bark(); // 하위 클래스인 Dog의 bark 메소드 사용
    }
}

 

 

회고

- 코드를 짤때 무심코 사용하는 접근 제어자에 대해 대충은 알고 있었지만, 제대로 알지 못했다. 

- 접근 제어자의 용도와 종류 등에 대해 공부하여 정리해보는 시간이었다.  

 

참고 자료

- https://88240.tistory.com/448

- https://adjh54.tistory.com/360#google_vignette

'기술 > java' 카테고리의 다른 글

[TIL]240704 자바 메모리 구조  (0) 2024.07.04
[TIL]240701 접근 제어자(1)  (0) 2024.07.01
[TIL]240630 패키지(package)(2)  (0) 2024.06.30
[TIL]240629 패키지(package)(1)  (0) 2024.06.29
99클럽 코테 스터디 24일차 TIL + this  (0) 2024.06.13