[Java] 캡슐화와 정보은닉, 접근 제한자

승등·2023년 10월 9일
0

Java

목록 보기
2/4

객체 지향 프로그래밍(Object Oriented Programming, OOP)에는 추상화(Abstraction), 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)의 4가지 원칙이 있다.

이 포스트에서는 그 중 캡슐화에 대해 알아보고 그와 관련된 정보은닉과 접근제한자의 개념에 대해서 정리하도록 한다.

캡슐화


  • 객체가 독립적인 역할 수행을 위해 필요한 데이터와 기능들을 하나로 묶고 구현된 일부사항에 대하여 사용자의 접근이 불가능하도록 은닉하는 것을 말한다.

  • 다시 말하자면 클래스의 변수(데이터)와 메소드(기능)를 하나로 묶는 것을 의미한다.

  • 캡슐화와 유사한 개념으로 정보은닉이 있으나 둘을 같은 개념이라고 할 수는 없다. 캡슐화 된 객체의 모든 정보가 반드시 은닉되어 있는 것은 아니며 정보은닉에는 캡슐화 외의 방법도 존재하기 때문이다.

캡슐화의 장점

  • 데이터 보호
    정보은닉(은닉화)를 통해 사용자의 내부 데이터에 대한 불필요한 접근을 제어할 수 있다. 이는 외부에서의 간섭으로 인해 프로그램의 데이터가 변질되는 것을 막아 프로그램의 안정성을 높일 수 있음을 의미한다.

  • 높은 독립성
    캡슐화를 하게 되면 각 기능을 하나의 모듈처럼 활용하기 때문에 객체간의 이식성이 높고 독립성을 유지한다.

  • 사용의 편의성
    객체 내부의 데이터가 바뀌어도 객체의 사용법이 변하지 않는다. 공개되지 않는 정보는 사용자가 알 필요가 없다. 따라서 사용자는 프로그램의 복잡한 작동원리를 숙지할 필요없이 간단한 사용법을 익히는 것 만으로 같은 결과를 기대할 수 있다.

    • 예를 들어 일반적인 운전자는 자동차 엔진의 구동원리는 알지도 못하고 알 필요도 없다. (그것이 내연기관차든, 전기차든) 페달을 밟으면 자동차가 움직인다는 사용법만을 숙지하고 있을 뿐이다.

정보은닉


정보은닉이란 객체 지향 언어적 요소를 활용하여 객체에 대한 구체적인 정보를 노출시키지 않도록 하는 기법을 칭한다.

정보은닉을 하는 목적은 외부(사용자)에게 정보 노출을 최소화 하는 것에서 그치지 않는다. 객체(또는 클래스) 간에 서로를 모르게 하는 것(어떤 객체가 다른 객체를 생성하든, 다른 객체의 메소드를 호출하든, 다른 객체가 가진 정보를 조회하든, 다른 객체의 타입을 참조하든, 어떤 행위라도 상관이 없다.)은 프로그램의 유연성을 확보한다. (이상적으로 봤을 때) 두 객체간에 어떠한 간섭도 없다면 두 객체 중 하나가 수정되거나 삭제되어도 어떠한 영향을 미치지 않는다는 것을 의미한다.

정보은닉의 종류

  • 상위 타입 캐스팅을 통한 객체의 구체적인 타입 은닉

  • 캡슐화를 통한 객체의 필드 및 메소드 은닉

  • 인터페이스 및 추상 클래스를 기반으로하는 구현 은닉

정보은닉의 목적

  • 동일한 타입(상위 타입, 조상)의 다른 구현 객체들을 교체함으로써 동적 기능 변경이 가능함.

  • 코드가 구체적인 것들(타입, 메소드, 구현)에 의존하는 것을 막는 것으로 객체간의 결합도를 낮추는 것으로 유지보수(객체의 교체 혹은 변경)에 용이하게 함.

  • 연동할 구체적인 구현이 없는 상태에서도 (인터페이스 만으로) 정확한 연동 코드의 생성이 가능함.

접근제한자


접근제한자(Access Modifier)는 클래스, 필드, 메소드 등의 선언에 사용되며 위의 요소들에 대한 외부에서의 접근 권한을 지정하는데 사용된다. (접근제어자라고도 부른다.)

접근제한자를 사용하여 정보은닉을 수행할 수 있다.

접근제한자의 종류

  • Java에는 public, protected, default, private의 4가지 접근제한자가 있다.

public: 접근제한이 없다. 클래스 외부 어디에서든 접근 가능.

protected: 같은 패키지 또는 상속 관계의 클래스에서만 접근 가능.

default: 같은 패키지 내의 클래스에서만 접근 가능.
(default로 선언시 별도로 접근제한자를 표기하지 않는다.)

private: 클래스 내부에서만 접근 가능.

  • 접근 권한 범위를 정리하면 다음과 같다.
    public > protected > default > private
 접근자  클래스 내부   패키지    상속받은 클래스 이외의 영역  
privateOXXX
defaultOOXX
protectedOOOX
publicOOOO

🔎 package

패키지란 폴더와 같은 기능을 한다. 다수의 클래스 작성 시 관리를 용이하게 해주고 동일한 이름의 클래스를 작성 시 식별자 역할을 하여 클래스를 유일하게 해주는 기능을 수행한다.

  • 패키지의 구조: 상위패키지.하위패키지.클래스
  • 패키지 선언: package 상위패키지.하위패키지;

관례적인 요소로, 패키지명으로는 회사의 도메인명을 역순으로 사용하는 것이 일반적이다. 예시: com.google.projectName

클래스의 접근제한

클래스에 적용할 수 있는 접근제한자:
public, default

// default 접근제한 클래스, 클래스 생성 시 접근제한자를 생략
class 클래스명 { . . . }

// public 접근제한 클래스
public class 클래스명 { . . . }

생성자의 접근제한

생성자에 적용할 수 있는 접근제한자:
public, protected, default, private

// 클래스에 생성자를 선언하지 않을 시 컴파일러에 의해 자동으로 기본 생성자가 추가된다.
// 기본 생성자의 접근 제한은 클래스와 동일하다.(public, default)
// 생성자의 접근제한자가 public일 경우 클래스의 접근제한도 public인 것이 일반적이다.
// 생성자의 접근 권한이 클래스의 접근 권한보다 큰 경우 클래스의 권한으로 제한되기 때문.

public class 클래스명 {
	// public 접근제한 생성자
    public 클래스명(. . .) { . . . }
    
    // protected 접근제한 생성자
    protected 클래스명(. . .) { . . . }
    
    // default 접근제한 생성자
    클래스명(. . .) { . . . }
    
    // private 접근제한 생성자
    private 클래스명(. . .) { . . . }    
}

필드와 메소드의 접근제한

필드, 메소드에 적용할 수 있는 접근제한자:
public, protected, default, private

// 필드, 메소드의 접근제한자가 public일 경우 클래스의 접근제한도 public인 것이 일반적이다.
// 필드, 메소드의 접근 권한이 클래스의 접근 권한보다 큰 경우 클래스의 권한으로 제한되기 때문.
// [대괄호] 안은 생략 가능

// 필드 선언
[ public | protected | private ] [static] 타입 필드명;

// 메소드 선언
[ public | protected | private ] [static] 리턴타입 메소드명( . . .) { . . .}


Reference

Java 자바 - 접근 제한자 public, protected, default, private
[JAVA] 패키지와 접근 제한자
객체지향의 올바른 이해 : 5. 정보 은닉(information hiding)

0개의 댓글