정보 은닉
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 12번째.
정보 은닉은 객체의 내부 데이터에 대한 직접적인 접근을 제한하는 원칙입니다. private 필드를 게터(getters) 및 세터(setters)와 결합함으로써, 객체의 상태 주위에 보호 장벽을 생성할 수 있습니다.
정보 은닉(information hiding)이 없을 때 어떤 일이 일어나는지 생각해 봅시다:
public class Temperature {
public double celsius; // 직접 노출됨
}
// 누구나 유효하지 않은 값을 설정할 수 있음
Temperature t = new Temperature();
t.celsius = -500; // 절대 영도 미만 - 불가능함!정보 은닉을 통해 데이터가 액세스되고 수정되는 방식을 제어할 수 있습니다:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}이제 유효하지 않은 온도는 자동으로 거부됩니다. 내부 표현은 숨겨져 있으므로, 클래스를 사용하는 코드에 영향을 주지 않고 나중에 온도가 내부적으로 저장되는 방식(예: 켈빈)을 변경할 수 있습니다.
이 접근 방식은 세 가지 주요 이점을 제공합니다: 검증은 데이터 무결성을 보장하고, 유연성은 외부 코드를 손상시키지 않고 내부 변경을 가능하게 하며, 제어는 데이터에 허용되는 작업을 정확하게 결정할 수 있게 해줍니다.
챌린지
쉬움민감한 데이터를 보호하고 제어된 액세스를 통해 보안 규칙을 시행함으로써 정보 은닉을 보여주는 Password 관리 클래스를 만들어 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
Password.java: 내부 데이터를 숨기고 비밀번호 설정 및 액세스 방식을 제어하는 Password 클래스를 생성합니다:- 실제 비밀번호를 저장하는 private
password필드 (String) - 최소 허용 비밀번호 길이를 정의하는 private
minLength필드 (int) - 최소 길이 요구 사항을 매개변수로 받는 생성자
- 최소 길이 요구 사항을 충족하는 비밀번호만 수락하는 setter
setPassword(String password). 유효한 경우 이를 저장하고true를 반환하며, 너무 짧으면 비밀번호를 변경하지 않고false를 반환합니다. - 모든 문자가 별표(
*)로 대체된 비밀번호를 반환하는 gettergetMaskedPassword()- 실제 비밀번호를 절대 노출하지 마세요! - 입력된 시도가 저장된 비밀번호와 일치하면
true를, 그렇지 않으면false를 반환하는 메서드checkPassword(String attempt) - 현재 비밀번호의 길이를 반환하는 getter
getLength()(비밀번호가 설정되지 않은 경우 0 반환)
- 실제 비밀번호를 저장하는 private
Main.java: 최소 길이가 6인 Password 객체를 생성한 다음, 설정할 비밀번호와 확인할 시도라는 두 개의 입력을 읽습니다. 다음 세 줄을 출력합니다:Set: true또는Set: false(비밀번호 설정 결과)Masked: ******(마스킹된 버전의 비밀번호)Match: true또는Match: false(시도 확인 결과)
설정할 비밀번호와 확인할 비밀번호 시도라는 두 개의 입력을 받게 됩니다.
실제 비밀번호가 클래스 외부에서 직접 접근할 수 없는 방식에 주목하세요. 이것이 바로 정보 은닉이 작동하는 방식입니다. 클래스는 어떤 정보가 공개되고 비밀번호가 어떻게 수정될 수 있는지를 정확하게 제어합니다.
치트 시트
정보 은닉은 private 필드와 게터(getters) 및 세터(setters)를 결합하여 사용하여 객체의 내부 데이터에 대한 직접적인 접근을 제한합니다.
정보 은닉이 없으면 필드가 노출되어 유효하지 않은 값으로 설정될 수 있습니다:
public class Temperature {
public double celsius; // Exposed directly
}
Temperature t = new Temperature();
t.celsius = -500; // Invalid value allowed정보 은닉을 사용하면 접근을 제어하고 데이터를 검증할 수 있습니다:
public class Temperature {
private double celsius;
public void setCelsius(double celsius) {
if (celsius >= -273.15) {
this.celsius = celsius;
}
}
public double getCelsius() {
return celsius;
}
}정보 은닉의 주요 이점:
- 검증: 유효하지 않은 값을 거부하여 데이터 무결성을 보장합니다
- 유연성: 외부 코드에 영향을 주지 않고 내부 변경을 허용합니다
- 제어: 데이터에 대해 허용되는 작업을 결정할 수 있게 합니다
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 설정할 비밀번호를 읽습니다
String passwordToSet = scanner.nextLine();
// 확인할 비밀번호 시도를 읽습니다
String passwordAttempt = scanner.nextLine();
// TODO: 최소 길이가 6인 Password 객체를 생성합니다
// TODO: 비밀번호를 설정하고 결과("Set: true" 또는 "Set: false")를 출력합니다
// TODO: 마스킹된 비밀번호("Masked: ******")를 출력합니다
// TODO: 비밀번호 시도를 확인하고 결과("Match: true" 또는 "Match: false")를 출력합니다
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조