접근제어자 캡슐화, 정보 은닉

    접근 제어자

     

    접근 제어자는 클래스, 변수, 메서드의 접근 범위를 제한하여 클래스 내부의 데이터를 보호하고 외부에서의 무분별한 접근을 제한한다. 

    • 접근제어자가 사용될 수 있는 곳 : 클래스, 멤버변수, 메서드, 생성자 
    • 접근 제어자는 생략 가능하며, 생략한 경우 자동으로 default를 뜻한다.
    대상 사용 가능한 접근 제어자
    클래스 public, default
    메서드, 멤버변수 public, default, protected, private
    지역변수 X (지역 변수는 접근 제어자 없음)

     

    private : 같은 클래스 내에서만 접근 가능
    protected : 같은 패키지 내에서도 접근 가능 + 패키지에 관계없이 상속관계에 있는 자손클래스에서 접근 가능
    default : 같은 패키지 내의 클래스에서만 접근 (아무 것도 명시하지 않은 경우)
    public : 접근 제한이 없음, 외부 클래스에서 자유롭게 접근 가능

     

    Private 

    해당 클래스 내에서만 접근 가능 (외부 클래스에서 접근 불가)

     

    private 접근 제어자는 클래스의 내부 구현을 숨기고, 외부에서는 클래스가 제공하는 공개 인터페이스만을 통해 상호작용하도록 한다. 이를 통해 클래스의 캡슐화를 강화하고, 데이터의 무단 변경을 방지한다.

     

    public class Time {
        public int hour;
        ...
    }

    Time이라는 클래스에 hour라는 public 변수가 있다고 해보자. Time 클래스에서 변수 name은 public으로 선언되어있기 때문에, 클래스 외부에서 직접 접근이 가능하다.

     

    Time time = new Time();
    time.hour = 1000;

    name 변수가 public으로 선언되어 있기 때문에 해당 멤버 변수에 직접 접근하여 값을 변경할 수 있고, 잘못된 값이 지정되어도 이것을 막을 방법이 없다.

     

    public class Time {
        private int hour;
    
        public void setHour(int hour) {
            if (hour < 0 || hour > 24) return;
            this.hour = hour;
        }
    }

     

     대신에 hour 변수를 private으로 선언하고, setHout(int hour) 메서드를 통해 간접적으로 접근할 수 있게 만들어야 한다. 즉 멤버 변수를 private으로 지정하고, 이 값을 변경할 수 있는 public 메서드를 제공하여 간접적으로 멤버 변수의 값을 다루어야 한다.

     

    private 접근 제어자를 통해 클래스 내부의 구현을 숨기고, 외부에서는 클래스가 제공하는 공개된 메서드를 통해 상호작용하도록 강제할 수 있다. 이를 통해 클래스의 캡슐화를 강화하고 데이터의 무단 변경을 방지한다.

     

    캡슐화와 정보 은닉

     

    캡슐화는 객체지향 프로그래밍에서 객체의 속성(Field)와 행위(method)를 하나로 묶어, 외부로 부터 내부를 감싸 숨겨 정보를 은닉하는 개념이다. 즉, 클래스 내에서 관련된 데이터를 묶어서 관리하고 데이터를 외부에서 직접 접근하는 것이 아닌 메서드를 통해 접근할 수 있도록 제한하는 것이다.  정보은닉을 하는 방법은 여러가지가 있는데, 그 중 하나가 캡슐화이다. 어떤 것을 은닉하느냐에 따라 업캐스팅, 캡슐화, 인터페이스 또는 추상클래스로 나뉘게 된다. 

     

    객체의 구체적인 타입을 은닉 : 업 캐스팅 

     

    객체의 타입을 더 상위 타입으로 변환하는 과정을 업캐스팅이라고 하는데, 업캐스팅을 통해 구체적인 타입을 숨기고, 상위 클래스 또는 인터페이스나 추상 클래스로 다루는 것이다.

    Animal animal = new Dog(); // 업캐스팅
    animal.makeSound(); // Animal 메서드만 호출 가능

    Dog 클래스는 Animal 클래스를 상속한다고 할 때, Dog 객체를 Animal 타입으로 참조하면, 객체의 구체적인 타입(Dog)을 숨기고 Animal 타입으로만 다룰 수 있다. 이렇게 업캐스팅을 사용하면 구체적인 타입인 Dog를 숨기고 상위 타입만 다룰 수 있게 된다.

     

    구현을 은닉 : 인터페이스 또는 추상 클래스

     

    인터페이스추상 클래스는 객체가 제공해야 할 행동만을 명시하고, 실제 동작(구현)은 구현 클래스가 제공한다.

    interface Shape {
        void draw();  // 추상적인 행동만 정의
    }
    
    class Circle implements Shape {
        public void draw() {
            System.out.println("Draw a circle");
        }
    }
    
    class Rectangle implements Shape {
        public void draw() {
            System.out.println("Draw a rectangle");
        }
    }

    예를 들어, Shape라는 인터페이스를 정의하고 이를 구현하는 Circle, Rectangle 클래스를 사용하면, 클라이언트는 Shape 인터페이스만을 알고 작업할 수 있고, 구체적인 구현(ex.원의 넓이 계산, 직사각형의 넓이 계산 등)은 숨길 수 있다.

     

     

     

     

    'Java' 카테고리의 다른 글

    클래스와 객체의 이해  (0) 2024.11.20
    JDK와 JRE의 차이  (0) 2024.11.20
    String, Stringbuffer, Stringbuilder 차이  (0) 2024.11.20
    String 문자열 String Pool, ==과 equals() 차이점  (0) 2024.11.15
    기본 타입과 참조 타입  (0) 2024.11.15

    댓글