앞선 내용을 정리하자면, object는 어떤 것을 의미하고, class는 개체의 종류를 의미합니다. 객체에는 상태와 작업, 즉 데이터 멤버와 메서드가 있을 수 있습니다.
지금까지 데이터 멤버와 메서드는 내부 사용자와 외부 사용자 모두에게 공개되었습니다. 객체 내에서 이를 사용하여 객체의 데이터 멤버와 메서드를 호출합니다. 객체 외부에서, 예를 들어 다른 클래스의 객체를 호출할 때 object.data 멤버와 object.method()를 사용하여 객체의 데이터 멤버와 메서드를 호출할 수 있습니다.
우리는 객체의 멤버(멤버에는 데이터 멤버와 메소드가 포함됨)를 캡슐화하여 외부에서 일부 멤버만 호출할 수 있도록 할 것입니다. 캡슐화를 사용하면 객체의 사용 편의성과 보안을 향상시킬 수 있습니다.
캡슐화 및 인터페이스
캡슐화는 제한된 외부 인터페이스를 유지하고 특정 구현 세부 정보를 숨기는 것을 의미하는 컴퓨터의 일반적인 용어입니다. 예를 들어 Linux 아키텍처에서는 Linux 운영 체제가 시스템 호출 인터페이스만 유지하면서 기본 하드웨어의 특정 세부 정보를 캡슐화한다는 것을 알 수 있습니다. 사용자는 패키지 외부에 있으며 인터페이스를 통해서만 필요한 작업을 수행할 수 있습니다.
캡슐화는 생활에서 매우 일반적입니다. 예를 들어, 다음은 충전식 손전등입니다.
설명서를 읽지 않고도 사용자는 이 손전등의 작동, 즉 전환 및 충전을 추측할 수 있습니다. 이 손전등은 플라스틱 껍질을 사용하여 사용자가 만질 필요가 없는 내부 세부 사항을 숨기고 스위치와 전기 플러그라는 두 개의 인터페이스만 남깁니다. 이 두 가지 인터페이스를 사용하면 사용자는 제품이 달성하도록 설계된 기능을 충분히 사용할 수 있습니다. 모든 세부 사항이 동시에 사용자에게 노출되면 사용자는 제품에 압도당하는 느낌을 받게 됩니다(예: 아래의 unshelled 리모컨). 따라서 캡슐화하면 제품의 사용 편의성이 향상됩니다.
제품이 포장되지 않은 경우 배터리, 회로, 밀봉 고무 등 손전등이나 리모컨의 많은 세부 사항이 사용자에게 노출됩니다. 이를 통해 사용자는 배터리를 직접 방전하거나 LED 조명을 꺼내는 등 제품을 보다 자유롭게 조작할 수 있습니다. 그러나 사용자가 제품을 손상시킬 위험이 더 큰 경우가 많습니다. 따라서 캡슐화는 제품의 안전성을 향상시킵니다.
Java 소프트웨어 제품은 일상적인 제품과 동일합니다. 개체 내부에는 많은 멤버(데이터 멤버 및 메서드)가 있을 수 있습니다. 일부 데이터 멤버와 메서드는 내부적으로만 사용됩니다. 이때 우리는 객체를 캡슐화하기 위해 객체를 "패킹"하는 메커니즘을 갖기를 희망합니다. 이를 통해 사용자는 내부 구성원과 접촉하지 않고도 외부 인터페이스를 보다 쉽게 학습하고 사용할 수 있습니다.
객체 멤버의 캡슐화
Java는 객체 멤버의 외부 가시성을 제어하기 위해 public, private, protected라는 세 가지 키워드를 사용합니다.
1.public: 멤버가 외부에 표시됩니다. 즉, 멤버는 인터페이스의 일부입니다.
2.private : 외부에 보이지 않고 내부에서만 사용이 가능한 회원이며, 외부에서는 접근이 불가능합니다.
(보호에는 상속 개념이 포함되며, 이에 대해서는 나중에 논의하겠습니다)
먼저 이전에 정의된 Human 클래스를 캡슐화해 보겠습니다.
다음과 같이 코드 코드를 복사합니다.
공개 수업 테스트
{
공개 정적 무효 메인(문자열[] 인수)
{
인간 aPerson = 새로운 인간(160);
System.out.println(aPerson.getHeight());
aPerson.growHeight(170);
System.out.println(aPerson.getHeight());
aPerson.repeatBreath(100);
}
}
수업인간
{
/**
* 생성자
*/
공개 인간(int h)
{
this.높이 = h;
System.out.println("나는 태어났어요");
}
/**
*접속자
*/
공개 int getHeight()
{
this.height를 반환합니다.
}
/**
* 돌연변이
*/
공공 무효 성장 높이(int h)
{
this.height = this.height + h;
}
/**
* 캡슐화, 내부용
*/
개인 공허 호흡()
{
System.out.println("후...후...");
}
/**
* 호흡() 호출
*/
공개 무효 반복 호흡(int 대표)
{
내가;
for(i = 0; i < 대표자; i++) {
this.breath();
}
}
private int height; // 내부용으로 캡슐화되었습니다.
}
내부 메소드는 캡슐화의 영향을 받지 않습니다. 인간의 내부 메소드는 private으로 설정된 height 및 Breath()를 포함한 모든 멤버를 호출할 수 있습니다.
외부 메서드는 공용 멤버만 호출할 수 있습니다. Test와 같이 Human 외부에 있는 경우 Human에서 public으로 지정된 멤버만 호출할 수 있고 private으로 지정된 멤버는 호출할 수 없습니다.
캡슐화를 통해 Human 클래스는 다음 메서드만 인터페이스로 유지합니다.
1.getHeight()
2.성장높이()
3.rep숨()
Human 클래스와 해당 인터페이스를 다음과 같이 나타낼 수 있습니다.
"케이스 포함 리모콘"
기본에서 호출 높이를 강제로 적용하는 경우:
다음과 같이 코드 코드를 복사합니다.
System.out.println(aPerson.height);
다음과 같은 오류 메시지가 표시됩니다.
다음과 같이 코드 코드를 복사합니다.
Test.java:6: 높이가 Human에서 비공개 액세스 권한을 갖습니다.
System.out.println(aPerson.height);
^
오류 1개
삐, 감전됐어요! 비공개로 선언된 멤버는 외부에서 호출할 수 없습니다.
Java의 일반적인 사양에서는 상태(예: 높이)를 표현하는 데이터 멤버가 비공개로 설정됩니다. 데이터 멤버에 대한 수정은 인터페이스에서 제공하는 메서드(예: getHeight() 및 GrowthHeight())를 통해 수행되어야 합니다. 이 사양은 데이터를 보호하는 역할을 합니다. 사용자는 데이터를 직접 수정할 수 없으며 해당 방법을 사용하여 데이터를 읽고 써야 합니다. 클래스 디자이너는 인터페이스 메서드에 데이터 사용 사양을 추가할 수 있습니다.
클래스 캡슐화
.java 파일에는 위의 Test 클래스와 같이 public 키워드가 있는 클래스가 하나만 있고 하나만 있을 수 있습니다. 따라서 다른 클래스에서 이 클래스를 직접 호출할 수 있습니다. 인간 클래스에는 키워드가 없습니다. 이전에는 개체의 구성원에 키워드가 없었습니다. 이러한 키워드 부족은 일종의 가시성을 나타내기도 하며, 패키지를 설명할 때 이에 대해 자세히 설명하겠습니다.
손전등을 표현하기 위해 Torch 클래스를 캡슐화하는 연습을 해보세요. 인터페이스에는 스위칭 및 충전이 있습니다. 내부 구성원에게는 힘이 있습니다.
요약
캡슐화, 인터페이스
비공개, 공개