티스토리 뷰

요즘 들어 제가 사용하는 코드들에 대한 의미를 알고 쓰는 것이 맞는지, 왜 쓰는 것인지 에 대한 의문이 듭니다..

 

그 중 하나가 private 키워드인데요.

프로젝트를 진행하면서 private 키워드를 붙여서 파일 내 변수나 함수를 만들었습니다.

코드리뷰 단계에서 특히 이 부분을 유심하게 체크하기도 하고 새삼 중요하다고 생각을 했었습니다.

그러던 중 왜 써야하나? 라는 의문이 들었고 아 부분에 대해 정리를 해보려고 합니다. 

(private를 포함해서 접근제어자는 다양한 키워드가 있지만 포괄해서 정리를 하겠습니다.)

 

private
  • 비공개 접근수준은 가장 한정적인 범위이다.
  • 비공개 접근수준으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용할 수 있다.
  • 비공개 접근수준으로 지정한 기능은 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용할 수 없다.

요정도로 알고 있을 것입니다.

말이 굉장히 어려운데.. 다들 아시는 개념이겠죠!

그럼 대체 왜 써야하는지? 구체적으로 어떠한 의미를 갖는지? 에 대해 알아보겠습니다.

 

이 부분을 쉽게 이해하려면 객체지향의 캡슐화, 은닉화 부분에 대해 이해를 해야합니다.

캡슐화와 은닉화에 대해 간단하게 살펴보겠습니다.

캡슐화(Encapsulation)

  • 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미한다.
  • 클래스를 만들 때 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록 사용해야 할 변수와 그 변수를 가지고 특정한 액션 즉 메서드를 관련성 있게 클래스에 구성해야 한다.
그럼 왜 묶어야 하고 숨겨야 하는 것일까?

묶음으로 인해 프로그램을 바라보는 단위가 커짐

객체지향 프로그램에서는 프로그램 소스를 클래스 단위로 바라보게 됨으로써 좀 더 복잡하고 커다란 소스코드도 쉽게 이해하게 되었습니다.
왜냐하면 클래스 내부에 여러 함수를 내포할 수 있기 때문에 프로그램 소스 코드를 바라보는 단위가 커졌으며, 그로 인해 프로그램 관리가 좀 더 수월해진 것입니다.

 

내부를 숨김으로써 내부를 좀 더 자유롭게 변경할 수 있다.

이전의 함수 중심적인 구조적 프로그래밍 언어에서는 프로그램 내부에서 데이터가 어디서 어떻게 변경되는지 파악하기 어려웠고, 그로 인해 유지 보수가 힘들었기 때문에 자료를 중심으로 함수가 종속되는 구조가 되기도 하였다.
객체 지향에서는 클래스 내부의 데이터를 외부에서 참조하지 못하도록 차단하여 이러한 문제점을 차단할 수 있습니다.

이렇게 내부의 데이터나 함수를 외부에서 참조하지 못하도록 차단하는 개념을 정보 은닉 (Information Hiding)이라고 하며 이것이 바로 캡슐화라는 개념입니다.

 

** 정보 은닉 (Information Hiding)에 대해 간단한 예시를 들자면

유저 정보를 가지고 있는 User라는 객체에서 유저의 정보들이 public으로 선언되어 있다면, 누구든 접근해서 유저 정보를 변경할 수 있습니다. 그렇기 때문에 private로 해서 데이터를 보호하고 접근을 제한해야합니다.

 

은닉화 (hiding)

  • 은닉이란 내부 데이터, 내부 연산을 외부에서 접근하지 못하도록 은닉(hiding) 혹은 격리(isolation)시키는 것
  • 변수에 접근지정자를 private 로 지정한다.
  • setter, getter 를 사용해 변수의 접근, 제어한다
은닉화는 캡슐화의 한 개념으로 객체 외부에서 객체내의 자료로의 접근을 제한하고 데이터를 수정, 조작하는 동작은 내부에 두고 접근(getter),설정(setter)하는 메소드로 결과만 받는 것입니다.

이렇게 되면 외부에서는 내부적인 움직임을 알수가 없으며 데이터에 어떤값이 있는지 또는 어떤 변화가 일어나는지 알 수 없습니다.

단지 데이터의 접근을 메서드(setter , getter)를 통해 결과만 받을뿐이죠.
이러한 것을 은닉화라고 합니다.

 

1. 은닉화는 중요사항이(변수든 메소드든 간에) 밖으로 드러나지 않도록 꼭꼭 감추는것
2. 캡슐화는 중요사항을 감춘 상태에서 외부에 그것을 사용할수 있는 방법을 설정하고 외부와 직접적으로 의사소통을 의미


고객이 식당에 와서 메뉴판을 보며 고르는 행위를 돕기 위해서 굳이 식당에서 들여오는 계란의 유통 구조와 삶는 방법을 메뉴판에 열거할 필요는 없습니다. (은닉된 정보는 알 필요가 없다는 얘기겠죠!)
객체지향 은닉화의 개념을 무시한다면 너무 많은 인터페이스들이 노출되며 결정적으로 사용자 불편을 초래할 수 있을 것입니다.

이렇듯 은닉화는 정말 중요한 개념이고, UI나 인터페이스 설계에서 핵심적인 부분이라고 합니다.

 

덧붙여 캡슐화와 은닉화는 동일한 개념이 아닙니다.

캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징을 가집니다.

위의 예시처럼 고객이 식당에 와서 밥을 먹을 때 계란의 유통 구조와 삶는 법을 알 필요가 없을 것입니다.

고객 입장에서는 식당 이용 방법, 즉 public으로 정의된 속성만 알면 되는 것입니다.

 

정리

  • private를 사용하는 이유는 다른 사람이 코드 읽었을 때 해당 메서드나 프로퍼티가 private 인지 아닌지를 파악해서 외부에서 호출하는 건지 해당 클래스 내에서 쓰는건지 확실하게 구분을 하기 위해서 쓰는 것 
  • 객체지향 프로그래밍 관점에서 객체 외부에서 객체 내부로 직접 데이터나 연산에 접근하면 안되기 때문에 (캡슐화, 은닉화)

 

참고 자료

https://velog.io/@hkoo9329/OOPObject-Oriented-Programming-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9D%B4%EB%9E%80

 

OOP(Object-Oriented Programming, 객체 지향 프로그래밍) 이란?

OOP란 무엇인가? OOP (Object-Oriented Programming)이란 객체 지향적인 프로그래밍. 즉, C언어같은 절차 지향적인 프로그래밍이 아닌 객체의 관점에서 프로그래밍을 한다는 것이다. OOP는 객체를 기준으로

velog.io

https://beerntv.wordpress.com/2017/01/18/0118-%E1%84%8E%E1%85%AE%E1%84%89%E1%85%A1%E1%86%BC%E1%84%92%E1%85%AA-%E1%84%8F%E1%85%A2%E1%86%B8%E1%84%89%E1%85%B2%E1%86%AF%E1%84%92%E1%85%AA-%E1%84%8B%E1%85%B3%E1%86%AB%E1%84%82%E1%85%B5%E1%86%A8/

 

0118 추상화.캡슐화.은닉화.상속성.다형서

OOP (Object Oriented Programming: 객체지향개발) 1) 추상화(Abstraciton) 공통의 속성이나 기능을 묶어 이름을 붙이는 것 객체 지향적 관점에서 클래스를 정의하는 것을 바로 추상화라고 정의 내릴 수 있겠

beerntv.wordpress.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함