본문 바로가기
Programming/Java

[Java] 12. 캡슐화와 접근 제어자

by Rayched 2023. 1. 16.

1. 개요

이번에는 객체 지향 프로그래밍의 특징 중 하나인 캡슐화에 대해서 정리해 보겠다.

https://rclogstorage.tistory.com/m/14

 

[Java] 0 - (1). 객체 지향 프로그래밍이란 무엇인가

앞에서 자바의 정의와 특징들을 설명할 때, 자바의 특징인 '객체지향 언어'라는 부분에 대해 설명하지 않고 넘어갔었다. 이번에는 객체 지향 언어, 객체 지향 프로그래밍에 대해 정리해보겠다.

rclogstorage.tistory.com

사실 캡슐화는 앞에서 객체 지향 언어의 특징을 정리할 때 한 번 다뤄본 적이 있었지만

상세하게 다루지는 않고 그냥 이런 것이 있다 식으로 넘어갔었다.

이번에는 캡슐화의 정의와 캡슐화를 가장 잘 표현할 수 있는 '접근 제어자'도 같이 다뤄보도록 하겠다.


2. 캡슐화와 접근제어자

① 캡슐화 (Encapsulation)

- 데이터나 데이터를 활용하는 함수를 클래스라는 '캡슐' 안에 넣어놓는 것

- 객체, 클래스의 멤버 변수나 메서드를 하나로 패키징 하는 객체 지향 언어의 특징 중 하나이다.

- '접근 제어자'를 통해서 객체 내부의 데이터로 접근하는 방법에 제약을 걸 수 있다.

    이를 통해서 외부로부터 데이터를 보호하는 것이 가능하다.

 

② 접근 제어자 (Access Modifier)

- 클래스나 변수, 메서드, 생성자 등에 부가적인 의미를 부여해 주는 키워드

- 어떤 제어자를 사용하냐에 따라서 클래스나 클래스의 멤버, 생성자에 대한 접근에 제약을 걸 수 있다.

- 접근 제어자를 사용해서 수정, 삭제를 해서는 안 되는 중요한 데이터를

   외부에서 임의로 변경하지 못하게 할 수 있다.

   이는 데이터를 보호하는 측면에서 매우 중요한 것이다.

- 접근 제어자는 한 개만 사용할 수 있다.

//접근 제어자 예시

public class Sample {} //옳은 예시

public protected class Sample {} //옳지 못한 예시
//Sample 클래스에 접근 제어자를 public, protected 두 가지를 사용했으므로
//error가 발생하게 된다.
접근 제어자 명 접근 제한 범위
public 어떤 클래스에서든 접근 가능하다. (접근 제한이 존재하지 않음)
protected 자기 자신. 같은 패키지 내의 자식 클래스에서도 접근 가능
private 자기 자신, 같은 클래스에서만 접근할 수 있다.
(default) 같은 패키지 내에서는 접근 가능, 클래스 선언 시 public을 생략하면 붙은 제어자

 

③ 접근 제어자 예제문제

잘못 입력된 접근 제어자를 용도에 맞게 수정하는 예제를 하나 준비해 봤다.

https://replit.com/@Rayched/Test#Main.java

 

Access Modifier Example

Run Java code live in your browser. Write and run code in 50+ languages online with Replit, a powerful IDE, compiler, & interpreter.

replit.com

해당 예제는 'Main.java'와 'Human.java' 두 가지 코드 파일로 구성됐다.

Main 클래스의 main 메서드에서 Human 객체를 만들고

해당 객체의 talk() 메서드를 실행시키려고 하는데 그냥 두면 에러가 발생한다.

변수 age와 talk() 메서드의 접근 제어자가 private로 설정됐기 때문에 Main 클래스에서

해당 변수와 메서드에 접근할 수가 없다.

 

age와 talk()의 접근 제어자를 public으로 수정하면

프로그램이 정상적으로 동작하는 것을 확인할 수 있을 것이다.

//'Human.java'

//접근 제어자 예제
//변수 age와 talk() 메서드의 접근 제어자가 private이다.
//Human 클래스에서만 접근할 수 있고
//외부 클래스, Main 클래스에서는 접근할 수 없다.
//프로그램이 실행시키기 위해서
//접근 제어자를 private에서 public으로 바꿔주세요.

public class Human {
  public String name;
  public int age;
  //private -> public으로 수정

  public void talk(String name){ //private -> public으로 수정
    this.name = name;
    System.out.printf("%s이 말합니다.\n", name);
  }
}

접근 제어자를 public으로 수정했기 때문에 문장이 정상적으로 출력된다.


3. 마치며

객체 지향 언어의 특징인 다형성에 대해 알아보다가

캡슐화에 대해서 궁금한 것이 생겨서 이를 찾아봤었다.

객체 지향 언어에서 캡슐화의 방식으로 '접근 제어자'를 사용한다는 것을 알게 됐고접근 제어자의 정의와 종류에 대해 찾아보게 되었다.그동안 자바를 다루면서 늘 봐왔지만, 하지만 어떤 의미를 가졌는지 모른 채로 그냥 넘겨버렸던접근 제어자에 대해 알게 되다 보니 내가 모르는 게 많다는 생각이 들었다.

'Programming > Java' 카테고리의 다른 글

[Java] 14. 다형성 (Polymorphism)  (0) 2023.01.20
[Java] 13. 오버로딩 (Overloading)  (0) 2023.01.17
[Java] 11. 생성자 (Constructor)  (0) 2023.01.16
[Java] 10. 상속 (Inheritance)  (0) 2022.12.22
[Java] 9. static  (0) 2022.12.21