1. 소개

우리는 오늘의 수업을 캡슐화 에 할애하고자 합니다 . 당신은 이미 그것이 일반적인 용어로 무엇인지 알고 있습니다.

캡슐화

캡슐화의 이점은 무엇입니까? 그것들 중 상당수가 있지만 제 생각에는 주요한 네 가지를 골라 낼 수 있습니다.


2. 유효한 내부 상태

프로그램에서 개체가 여러 다른 클래스와 상호 작용할 때 상황이 자주 발생합니다. 개체와의 이러한 상호 작용은 개체 내부의 데이터를 손상시켜 개체가 예상대로 계속 작동하지 못하게 할 수 있습니다.

결과적으로 개체는 내부 데이터에 대한 변경 사항을 추적하거나 더 나은 방법으로 자체적으로 변경해야 합니다.

일부 변수가 다른 클래스에 의해 변경되는 것을 원하지 않으면 비공개로 선언합니다. 이렇게 하면 자체 클래스의 메서드만 액세스할 수 있습니다. 변수를 읽기 전용으로 만들려면 public getter관련 변수에 대한 를 추가해야 합니다.

예를 들어 모든 사람이 컬렉션의 요소 수를 알 수 있기를 원하지만 허가 없이 컬렉션을 변경할 수 없도록 하고 싶다고 가정합니다. private int count그런 다음 변수와 메서드를 선언합니다 public getCount().

캡슐화 를 올바르게 사용하면 어떤 클래스도 클래스의 내부 데이터에 직접 액세스할 수 없으므로 제어할 수 없는 변경을 방지할 수 있습니다 . 이러한 변경은 변경되는 변수와 동일한 클래스의 메서드를 호출해야만 가능합니다.

다른 프로그래머가 항상 자신에게 가장 안전한 방식이 아니라 자신에게 가장 편리한 방식으로 클래스를 사용할 것이라고 가정하는 것이 가장 좋습니다. 이 동작은 버그의 원인일 뿐만 아니라 이를 방지하려는 시도입니다.


3. 메서드 인수 유효성 검사

때로는 메서드에 전달된 인수의 유효성을 검사해야 합니다. 예를 들어 사람을 나타내는 클래스가 있고 생년월일을 설정할 수 있다고 가정합니다. 프로그램의 논리와 클래스의 논리에 맞는지 확인하기 위해 모든 입력 데이터를 확인해야 합니다. 예를 들어, 13번째 달 또는 2월 30일 등의 생일을 허용하지 않습니다.

생년월일을 2월 30일로 표시하는 이유는 무엇입니까? 첫째, 이것은 데이터를 입력할 때 사용자 오류일 수 있습니다. 둘째, 프로그램이 시계처럼 실행되기 전에 많은 오류가 있을 수 있습니다. 예를 들어 다음과 같은 상황이 가능합니다.

한 프로그래머가 생일이 모레인 사람들을 식별하는 프로그램을 작성합니다. 예를 들어, 오늘이 3월 3일이라고 가정해 보겠습니다. 프로그램은 현재 날짜에 숫자 2를 더하고 3월 5일에 태어난 모든 사람을 찾습니다. 모든 것이 올바른 것 같습니다.

그러나 3월 30일이 되면 달력에 3월 32일이 없기 때문에 프로그램은 아무도 찾지 않습니다. 메서드에 전달된 데이터를 확인하면 프로그램 오류가 훨씬 적습니다.

ArrayList코드를 연구하고 분석했을 때를 기억하십니까 ? 우리는 메소드 가 0보다 크거나 같고 배열의 길이보다 작은지 확인하는 것을 보았습니다. getsetindex 또한 이러한 메서드는 인덱스가 배열 범위를 벗어나면 예외를 발생시킵니다. 이것은 입력 유효성 검사의 전형적인 예입니다.


4. 코드 변경 시 오류 최소화

대규모 프로젝트에 참여했을 때 매우 유용한 클래스를 작성했다고 가정해 보겠습니다. 모두가 그것을 너무 좋아해서 다른 프로그래머들이 그들의 코드에서 수백 곳에서 그것을 사용하기 시작했습니다.

수업이 너무 유용해서 일부 개선하기로 결정했습니다. 그러나 클래스에서 메서드를 제거하면 수십 명의 코드가 컴파일을 중지합니다. 그들은 모든 것을 다시 작성해야 할 것입니다. 더 많이 변경할수록 더 많은 오류가 발생합니다. 당신은 많은 집회를 깨뜨릴 것이고 당신은 미움을 받을 것입니다.

그러나 비공개로 선언된 메서드를 변경할 때 이러한 메서드를 호출할 수 있는 다른 클래스가 어디에도 없다는 것을 알고 있습니다. 다시 작성할 수 있고 매개변수의 수와 유형을 변경할 수 있으며 모든 종속 외부 코드가 계속 작동합니다. 글쎄, 적어도 그것은 컴파일됩니다.


5. 객체가 외부 객체와 상호 작용하는 방식을 결정합니다.

객체로 수행할 수 있는 일부 작업을 제한할 수 있습니다. 예를 들어 객체가 한 번만 인스턴스화되기를 원한다고 가정합니다. 프로젝트의 여러 위치에서 생성될 수 있는 경우에도 마찬가지입니다. 그리고 우리는 캡슐화 덕분에 이것을 할 수 있습니다.

캡슐화 2

캡슐화를 통해 추가 제한 사항을 추가할 수 있으며 이는 추가 이점 으로 전환될 수 있습니다 . 예를 들어, 클래스는 불변String 객체 로 구현됩니다 . 클래스 의 객체는 생성된 순간부터 죽을 때까지 불변입니다. 클래스( , , ...) 의 모든 메서드는 호출된 개체를 변경하지 않고 새 문자열을 반환합니다.StringStringremovesubstring

캡슐화는 매우 흥미로운 일입니다.