Menu
Coddy logo textTech

정보 은닉

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;
    }
}

이제 유효하지 않은 온도는 자동으로 거부됩니다. 내부 표현은 숨겨져 있으므로, 클래스를 사용하는 코드에 영향을 주지 않고 나중에 온도가 내부적으로 저장되는 방식(예: 켈빈)을 변경할 수 있습니다.

이 접근 방식은 세 가지 주요 이점을 제공합니다: 검증은 데이터 무결성을 보장하고, 유연성은 외부 코드를 손상시키지 않고 내부 변경을 가능하게 하며, 제어는 데이터에 허용되는 작업을 정확하게 결정할 수 있게 해줍니다.

challenge icon

챌린지

쉬움

민감한 데이터를 보호하고 제어된 액세스를 통해 보안 규칙을 시행함으로써 정보 은닉을 보여주는 Password 관리 클래스를 만들어 보겠습니다.

코드를 구성하기 위해 두 개의 파일을 생성합니다:

  • Password.java: 내부 데이터를 숨기고 비밀번호 설정 및 액세스 방식을 제어하는 Password 클래스를 생성합니다:
    • 실제 비밀번호를 저장하는 private password 필드 (String)
    • 최소 허용 비밀번호 길이를 정의하는 private minLength 필드 (int)
    • 최소 길이 요구 사항을 매개변수로 받는 생성자
    • 최소 길이 요구 사항을 충족하는 비밀번호만 수락하는 setter setPassword(String password). 유효한 경우 이를 저장하고 true를 반환하며, 너무 짧으면 비밀번호를 변경하지 않고 false를 반환합니다.
    • 모든 문자가 별표(*)로 대체된 비밀번호를 반환하는 getter getMaskedPassword() - 실제 비밀번호를 절대 노출하지 마세요!
    • 입력된 시도가 저장된 비밀번호와 일치하면 true를, 그렇지 않으면 false를 반환하는 메서드 checkPassword(String attempt)
    • 현재 비밀번호의 길이를 반환하는 getter getLength() (비밀번호가 설정되지 않은 경우 0 반환)
  • 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")를 출력합니다
        
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨