"캡슐화"의 두 판 사이의 차이
잔글 (→접근제어자) |
|||
2번째 줄: | 2번째 줄: | ||
==목적== | ==목적== | ||
− | 캡슐화는 외부로부터 데이터를 보호하기 위해 외부에는 불필요하거나 내부적으로만 사용되는 부분을 감추기 위해<ref>예스30, | + | 캡슐화는 외부로부터 데이터를 보호하기 위해 외부에는 불필요하거나 내부적으로만 사용되는 부분을 감추기 위해<ref>예스30, 〈[https://soozl91.tistory.com/48 제어자 public, protected, private]〉, 《개인블로그》, 2020-02-07</ref> 특정 속성이나 메소드를 사용자가 사용할 수 없도록 은닉화한 것이다. 캡슐화는 객체의 필드(속성), 메소드를 하나로 묶어 실제 구현 내용을 외부에 감추는 것을 말한다. 외부 객체는 객체 내부의 구조를 얻지 못하며 객체가 제공하는 필드와 메소드만 이용할 수 있다. 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인한 객체의 손상을 방지하기 위함이다. [[자바]]에서는 캡슐화된 멤버를 [[접근제어자]]를 사용하여 노출시킬지 숨길지 결정할 수 있다.<ref>재희, 〈[https://webclub.tistory.com/156 객체지향 프로그래밍의 캡슐화, 상송, 다형성]〉, 《개인블로그》, 2016</ref> |
== 특징 == | == 특징 == | ||
* [[객체]] 제공자와 이용자를 정확하게 나누며, 데이터의 직접 접근을 제한하므로 정보 은폐, 보안 등의 장점을 가진다. | * [[객체]] 제공자와 이용자를 정확하게 나누며, 데이터의 직접 접근을 제한하므로 정보 은폐, 보안 등의 장점을 가진다. | ||
* [[메소드]]의 구현 방법이 바뀌거나 [[객체]] 내의 데이터가 바뀌어도 다른 객체에는 영향을 주지 않아 독립성이 보장된다. | * [[메소드]]의 구현 방법이 바뀌거나 [[객체]] 내의 데이터가 바뀌어도 다른 객체에는 영향을 주지 않아 독립성이 보장된다. | ||
+ | * * [[클래스]]의 [[결합도]]가 낮아져 재사용이 용이하다.<ref>조현권이, 〈[https://m.blog.naver.com/PostView.nhn?blogId=j880825&logNo=220553014888&proxyReferer=https:%2F%2Fwww.google.com%2F 캡슐화:Encapsulation]〉, 《개인블로그》, 2015-11-28</ref> | ||
== 접근제어자 == | == 접근제어자 == | ||
15번째 줄: | 16번째 줄: | ||
* '''[[디폴트]]'''(default) : 같은 [[패키지]]내에서만 접근이 가능하다. | * '''[[디폴트]]'''(default) : 같은 [[패키지]]내에서만 접근이 가능하다. | ||
* '''[[프라이빗]]'''(private) : 같은 [[클래스]] 내부에서만 접근할 수 있다. | * '''[[프라이빗]]'''(private) : 같은 [[클래스]] 내부에서만 접근할 수 있다. | ||
+ | |||
+ | ==private의 Getter와 Setter 메소드== | ||
+ | 객체 지향 프로그래밍에서 객체의 데이터는 객체의 외부에서 직접적으로 접근하는 것을 막는다. 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 [[무결성]](결점이 없는 성질)이 깨어질 수 있기 때문이다. <ref name='thisisjava'>신용권, 〈[https://www.hanbit.co.kr/store/books/look.php?p_code=B1460673937 이것이 자바다]〉, 《한빛출판네트워크》, 2015-01-06</ref> | ||
+ | private을 통해 외부로부터의 데이터 접근을 차단한 변수를 set Method와 get Method를 통해 데이터를 저장, 수정, 출력할 수 있다. 변수에 새로운 값을 할당할 때, Validation 검사를 한다. read/write의 권한을 설정할 수 있다. DI 또는 테스트를 위한 가변 필드를 설정할 수 있다. 런 타임 시 속성 변경에 대한 디버깅 포인트가 있다. 확장 클래스에서의 재정의를 할 수 있다. 대체 속성을 노출할 수 있다.<ref>ohjongsung, 〈[https://ohjongsung.io/2017/08/19/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%BA%A1%EC%8A%90%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-getter-setter 데이터 캡슐화를 위한 Getter, Setter]〉, 《개인블로그》, 2017-08-19</ref> | ||
+ | |||
+ | ===Getter=== | ||
+ | 외부에서 객체의 데이터를 읽을 때 메소드를 사용한다. 객체 외부에서 객체의 필드 값을 사용할 때 부적절한 경우도 있는데 이런 경우 Getter 메소드로 필드값을 가공한 후 외부로 전달한다.<ref name='thisisjava'></ref> | ||
+ | //Getter 메소드 예시 | ||
+ | private int price; | ||
+ | |||
+ | int getPrice() { | ||
+ | return price; | ||
+ | } | ||
+ | |||
+ | ===Setter=== | ||
+ | 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 사용한다. Setter는 메소드의 매개값을 검증하여 유효한 값만 데이터로 저장할 수 있기 때문에 데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근할 수 있도록 유도한다.<ref name='thisisjava'></ref> | ||
+ | //Setter 메소드 예시 | ||
+ | private int price; | ||
+ | |||
+ | void setPrice(int num) { | ||
+ | this.price = price; | ||
+ | } | ||
+ | |||
+ | ===예시=== | ||
+ | public class Order { | ||
+ | public static void main(String[] args) { | ||
+ | Pizza pizza = new Pizza(); | ||
+ | pizza.setPrice(12000); | ||
+ | int orderPizza = pizza.getPrice(); | ||
+ | |||
+ | System.out.println("피자의 가격은 "+orderPizza+"원 입니다."); | ||
+ | } | ||
+ | } | ||
+ | >>피자의 가격은 12000원 입니다. | ||
+ | |||
+ | public class Pizza{ | ||
+ | private int price; | ||
+ | |||
+ | public int getPrice(){ | ||
+ | return price; | ||
+ | } | ||
+ | |||
+ | public void setPrice(int num){ | ||
+ | this.price = num; | ||
+ | } | ||
+ | } | ||
{{각주}} | {{각주}} | ||
21번째 줄: | 68번째 줄: | ||
*예스30, 〈https://soozl91.tistory.com/48 제어자 public, protected, private]〉, 《개인블로그》, 2020-02-07 | *예스30, 〈https://soozl91.tistory.com/48 제어자 public, protected, private]〉, 《개인블로그》, 2020-02-07 | ||
*재희, 〈[https://webclub.tistory.com/156 객체지향 프로그래밍의 캡슐화, 상송, 다형성]〉, 《개인블로그》, 2016 | *재희, 〈[https://webclub.tistory.com/156 객체지향 프로그래밍의 캡슐화, 상송, 다형성]〉, 《개인블로그》, 2016 | ||
+ | *조현권이, 〈[https://m.blog.naver.com/PostView.nhn?blogId=j880825&logNo=220553014888&proxyReferer=https:%2F%2Fwww.google.com%2F 캡슐화:Encapsulation]〉, 《개인블로그》, 2015-11-28 | ||
+ | *shaking shaking, 〈[https://88240.tistory.com/448 JAVA 접근제어자(Access Modifier)]〉, 《개인블로그》, 2016 | ||
+ | *신용권, 〈[https://www.hanbit.co.kr/store/books/look.php?p_code=B1460673937 이것이 자바다]〉, 《한빛출판네트워크》, 2015-01-06 | ||
+ | *ohjongsung, 〈[https://ohjongsung.io/2017/08/19/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%BA%A1%EC%8A%90%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-getter-setter 데이터 캡슐화를 위한 Getter, Setter]〉, 《개인블로그》, 2017-08-19 | ||
== 같이 보기 == | == 같이 보기 == |
2020년 8월 13일 (목) 10:40 판
캡슐화(capsule化) 또는 인캡슐레이션(encapsulation)이란 객체 지향 프로그래밍(OOP)에서 객체의 데이터와 기능을 하나로 묶고 외부에 노출되지 않도록 숨김 처리하는 것을 말한다. 변수, 메소드, 클래스에 대해 접근 제어자를 사용함으로써 캡슐화를 할 수 있다.
목적
캡슐화는 외부로부터 데이터를 보호하기 위해 외부에는 불필요하거나 내부적으로만 사용되는 부분을 감추기 위해[1] 특정 속성이나 메소드를 사용자가 사용할 수 없도록 은닉화한 것이다. 캡슐화는 객체의 필드(속성), 메소드를 하나로 묶어 실제 구현 내용을 외부에 감추는 것을 말한다. 외부 객체는 객체 내부의 구조를 얻지 못하며 객체가 제공하는 필드와 메소드만 이용할 수 있다. 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인한 객체의 손상을 방지하기 위함이다. 자바에서는 캡슐화된 멤버를 접근제어자를 사용하여 노출시킬지 숨길지 결정할 수 있다.[2]
특징
- 객체 제공자와 이용자를 정확하게 나누며, 데이터의 직접 접근을 제한하므로 정보 은폐, 보안 등의 장점을 가진다.
- 메소드의 구현 방법이 바뀌거나 객체 내의 데이터가 바뀌어도 다른 객체에는 영향을 주지 않아 독립성이 보장된다.
- * 클래스의 결합도가 낮아져 재사용이 용이하다.[3]
접근제어자
접근 제어자는 멤버 또는 클래스에 사용되어 외부에서 접근하지 못하도록 제한하는 역할을 한다. 접근제어자는 생략할 수 있으며 생략 시 자동으로 디폴트(default)로 지정된다. 접근제어자가 사용될 수 있는 곳은 클래스, 멤버변수, 메소드, 생성자이다.[4]
- 퍼블릭(public) : 접근 제한이 없다. 다른 패키지, 다른 클래스에서 접근할 수 있다.
- 프로텍티드(protected) : 같은 패키지 내에서 접근할 수 있다. 다른 클래스에서는 접근할 수 없지만, 상속 받은 자식 클래스에서는 접근이 가능하다.
- 디폴트(default) : 같은 패키지내에서만 접근이 가능하다.
- 프라이빗(private) : 같은 클래스 내부에서만 접근할 수 있다.
private의 Getter와 Setter 메소드
객체 지향 프로그래밍에서 객체의 데이터는 객체의 외부에서 직접적으로 접근하는 것을 막는다. 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨어질 수 있기 때문이다. [5] private을 통해 외부로부터의 데이터 접근을 차단한 변수를 set Method와 get Method를 통해 데이터를 저장, 수정, 출력할 수 있다. 변수에 새로운 값을 할당할 때, Validation 검사를 한다. read/write의 권한을 설정할 수 있다. DI 또는 테스트를 위한 가변 필드를 설정할 수 있다. 런 타임 시 속성 변경에 대한 디버깅 포인트가 있다. 확장 클래스에서의 재정의를 할 수 있다. 대체 속성을 노출할 수 있다.[6]
Getter
외부에서 객체의 데이터를 읽을 때 메소드를 사용한다. 객체 외부에서 객체의 필드 값을 사용할 때 부적절한 경우도 있는데 이런 경우 Getter 메소드로 필드값을 가공한 후 외부로 전달한다.[5]
//Getter 메소드 예시 private int price; int getPrice() { return price; }
Setter
객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 사용한다. Setter는 메소드의 매개값을 검증하여 유효한 값만 데이터로 저장할 수 있기 때문에 데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근할 수 있도록 유도한다.[5]
//Setter 메소드 예시 private int price; void setPrice(int num) { this.price = price; }
예시
public class Order { public static void main(String[] args) { Pizza pizza = new Pizza(); pizza.setPrice(12000); int orderPizza = pizza.getPrice(); System.out.println("피자의 가격은 "+orderPizza+"원 입니다."); } } >>피자의 가격은 12000원 입니다.
public class Pizza{ private int price; public int getPrice(){ return price; } public void setPrice(int num){ this.price = num; } }
각주
- ↑ 예스30, 〈제어자 public, protected, private〉, 《개인블로그》, 2020-02-07
- ↑ 재희, 〈객체지향 프로그래밍의 캡슐화, 상송, 다형성〉, 《개인블로그》, 2016
- ↑ 조현권이, 〈캡슐화:Encapsulation〉, 《개인블로그》, 2015-11-28
- ↑ shaking shaking, 〈JAVA 접근제어자(Access Modifier)〉, 《개인블로그》, 2016
- ↑ 5.0 5.1 5.2 신용권, 〈이것이 자바다〉, 《한빛출판네트워크》, 2015-01-06
- ↑ ohjongsung, 〈데이터 캡슐화를 위한 Getter, Setter〉, 《개인블로그》, 2017-08-19
참고자료
- 예스30, 〈https://soozl91.tistory.com/48 제어자 public, protected, private]〉, 《개인블로그》, 2020-02-07
- 재희, 〈객체지향 프로그래밍의 캡슐화, 상송, 다형성〉, 《개인블로그》, 2016
- 조현권이, 〈캡슐화:Encapsulation〉, 《개인블로그》, 2015-11-28
- shaking shaking, 〈JAVA 접근제어자(Access Modifier)〉, 《개인블로그》, 2016
- 신용권, 〈이것이 자바다〉, 《한빛출판네트워크》, 2015-01-06
- ohjongsung, 〈데이터 캡슐화를 위한 Getter, Setter〉, 《개인블로그》, 2017-08-19
같이 보기