-
1. OOP(Object Oriented Programming) 캡슐화프로그래밍언어/Java(초급) 2020. 4. 1. 23:42
안녕하세요 현우입니다. 이번 포스팅은 [ 자바의 기본 OOP의 캡슐화에 대한 이해 및 용도 ] 입니다. :)
1. 정보은닉
- 정보은닉이란 인스턴스 변수에 private를 선언하는 것이다.
정보은닉이 되지 않은 예제코드
/** 클래스가 생성되있다고 가정하에**/ // 본래 사과의 가격은 1000 public static void main(String[] args){ FruitSeller seller = new FruitSeller(0, 30, ,1500); FruitBuyer buyer = new FruitBuyer(10000); seller.myMoney +=500; //돈 500원 만내고 buyer.myMoney -=500; seller.numOfApple -=20; //사과 스무개를 가져간다!! buyer.numOfApple +=20; }
돈을 지불하고 사과를 건네 받는 행동이 FruitBuyer 클래스의 buyApple이 라는 메소드로 정의되어 있다. 하지만 위의 main함수에서는 이러한 정상적인 과일 구매의 과정이 무시되고 변수에 직접 접근하여 500원만내고 사과 스무개를 가져가는 상황이 연출 되었다.
외부의 인스턴스 접근을 막아보자!
class FruitSeller{ private int numOfApple; private int myMoney; private final int APPLE_PRICE; } class FruitBuyer{ private int myMoney; private int numOfApple; public void buyApple(FruitSeller seller int money){ numOfApple+=seller.saleApple(money); myMoney-=money; } }
인스턴스 변수에 private으로 선언되면, 해당 변수가 선언된 클래스 외부에서는 접근이 불가능 하다. 즉 buyApple 메소드가 과일 구매의 유일한 수단이 된다.
2. 접근제어 지시자
제어자는 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여한다. 이미 여러코드에서 본 public, static 같은 키워드들이 여기 해당된다. 이러한 제어자에는 클래스의 접근 범위와 관련된 접근제어자와 일반제어자가 있다.
접근 제어자는 멤버 또는 클래스에 사용하며 외부에서의 접근을 제어하기 위해사용된다. 지정되 있지 않을 경우 default가 된다.
- public : 접근 제한이 없음.
- protected : 같은 패키지 내에서 혹은 다른 패키지의 자손클래스에서 접근이 가능
- default : 같은 패키지 내에서만 접근이 가능
- private : 같은 클래스 내에서만 접근이 가능
public > protected > default > private
유형별로는 다음과 같은 접근제어자 사용이 가능하다.
- 클래스 : public, default
- 메서드, 멤버변수 : public, protected, default, private
- 지역변수 : 지역변수 자체가 해당 블럭에서만 사용이 가능하므로 접근제어자의 의미가 없음
3. 캡슐화
캡슐화는 객체지향 프로그램의 대표적인 특징중 하나이다. 접근 제어자를 사용하면 클래스 외부로 부터의
접근을 제어할 수 있으므로 객체를 캡슐화 할 수 있다. 예를 들어 private의 경우 동일 클래스 내에서만 접근이 가능 하므로 멤버 필드에 private를 선언하면 해당 변수를 클래스 외부에서 접근 할 수 없게 된다.
이경우 클래스의 외부에서 해당멤버의 접근을 제공하기위해 getter, setter메서드를 제공하는데 getter은 멤버값을 제공하기위해 setter은 멤버값의 변경을 위해 사용한다.
private int count; public int getCount() { return count; } public void setCount(int count) { this.count = count; }
캡슐화가 쉬울까? 캡슐화는 일관되게 적용할 수 있는 단순한 개념이 아니고, 구현하는 프로그램의 성격과 특성에 따라서 적용하는 범위가 달라지는, 흔히 하는 말로 정답이라는 것이 없는 개념이다.
reference
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=4408110
https://dinfree.com/lecture/language/112_java_4.html#m1
'프로그래밍언어 > Java(초급)' 카테고리의 다른 글
3. OOP(Object Oriented Programming) 오버라이딩 (0) 2020.04.07 2. OOP(Object Oriented Programming) 상속 (0) 2020.04.02 5. Collection 프레임워크 (ArrayList vs LinkedList) (0) 2020.03.29 4. StringBuilder & StringBuffer 클래스 다루기 (0) 2020.03.27 3. Java 문자열(String) 다루기 (0) 2020.03.27