TIL

Java - 클래스, 캡슐화

Paragon53 2025. 2. 26. 18:51

클래스의 중요한 기능은 캡슐화, 상속, 추상화, 다양화가 있다.

 

 

캡슐화!

 외부에서 수정하기위해 절대로 접근하면 안되는 것을 보호하는 개념이다.

 

 이 클래스 혹은 객체의 캡슐화는 접근 제어자를 통해서 구현이 가능하다.

 

접근 제어자

  클래스, 변수,매서드, 생성자의 접근 범위를 제한하는 키워드다.

 캡슐화 구현을 위해 사용된다.

 

접근제어자들의 이용 범위

 

★ USB예제에서 접근하면 안되는 것이 무엇이 있을까?

 

  • 용량
  • 사용중인 용량
  • 남은 용량    
  • 제조사
  • 보안키

위의 5개는 외부에서 직접 수정할 수 있는 권한을 주면 안된다.

  String type = "Local Disk";
    String systemName = "NTFS";
    private String brand;   // 브랜드 (예: 삼성, 샌디스크)
    String version; // USB 버전 (예: 2.0, 3.0)

    private int capacity;   // 용량 (예: 16GB, 32GB)
    private int usedCapacity;    //사용중인 용량
    private int freeCapacity;    // 남은 용량

    private int securityKey;

 

하지만 외부 장치에서 인식하기 위해 주어야 한다. Private에 감싸진 데이터는 인스턴스화 되어도 읽을 수 없다.

=> 그 중요 사항을 읽을수 있게 해주는 매서드가 바로 getter와 setter를 쓰자!

 


★ 정보를 읽을 수있게 getter

    public int getCapacity() {
        return capacity;
    }
    public  int getUsedCapacity() {
        return usedCapacity;
    }
    public  int getFreeCapacity() {
        return freeCapacity;
    }
    public String getBrand() {
        return brand;
    }

 

package chapter2.usbexample;

public class Main {
    public static void main(String[] args) {
        Usb usb = new Usb();

        //접근은 불가능하지만 읽을수 있다.
        usb.getBrand(); 
        usb.capacity();
        usb.getUsedCapacity();
        usb.getFreeCapacity();
    }
}

이러면 직접데이터를 수정할 권리를 주지 않고도 외부에 정보를 줄수 있다.

 

 


★ 정보를 수정(?) 할 수있는 setter

    public void setUnlock(String key){
        if(key.equals(securityKey)){
            System.out.println("인증 되었습니다.");
        }
        else
        {
            System.out.println("틀렸다. 다시!");
        }
    }

 setter는 데이터를 수정한느 매서드이지만,  보안과 관련된 중요한 것은 입력 받는 것 처럼 사용한다.

 

입력된 문자열과 저장한 key값이 맞으면 USB 보안해제를 하도록하면 된다.

 

package chapter2.usbexample;

public class Main {
    public static void main(String[] args) {
        Usb usb1 = new Usb("삼성", 16, "USB 3.0");
        Usb usb2 = new Usb("샌디스크", 16, "USB 2.0");


        System.out.println("제조사 " + usb1.getBrand());
        System.out.println("전체 공간 " + usb1.getCapacity() +" GB");
        System.out.println("사용 중 공간 " + usb1.getUsedCapacity());
        System.out.println("빈 공간 " + usb1.getFreeCapacity());
        
    }
}

 

다음글에서는 보안기능을 별도 클래스에서 상속 받아서 진행하겠다.