객체의 유효한 상태를 메서드와 property로 보호합니다.
property는 메서드를 속성처럼 읽고 쓰게 하면서 검증이나 계산을 넣습니다. 밑줄 하나로 시작하는 이름은 클래스 내부용이라는 관례이며 완전한 보안 장벽은 아닙니다.
생성자는 completed가 0 이상 total 이하인지 먼저 검사하고, 통과한 값만 _completed와 _total에 저장합니다. rate는 @property라 괄호 없이 progress.rate로 읽히며 18/24를 계산해 진도율: 75.0%가 출력됩니다. setter를 만들지 않았으므로 progress.rate에 값을 대입하면 AttributeError가 납니다.
setter가 필요하지 않은 계산 속성은 읽기 전용으로 두고 상태 변경은 의미 있는 메서드를 통해 수행하면 불가능한 상태를 막기 쉽습니다.
객체가 항상 지켜야 하는 불변 조건은 생성자와 모든 변경 경로에서 확인하고 실패하면 즉시 예외를 발생시킵니다.
모든 속성에 기계적으로 getter와 setter를 만들면 Python의 단순한 속성 접근 장점을 잃습니다.
직접 바꿔보세요complete가 전체 강의 수를 넘지 않도록 메서드를 추가하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.