본문 바로가기
프로젝트/토이 프로젝트

Toy.didIPass 1) 객체지향적 접근 - 추상화/캡슐화

by Fola 2022. 6. 19.

 

토이 프로젝트 >

Toy poj.pf 1) 자격증 과락, 합격, 불합격 계산 프로그램 (Ver. 1.0)

 

 

 

0.

코드 링크:

https://github.com/dpcalfola/toy_projects/tree/main/did_i_pass

 

 

 

 

1. 객체지향 프로그래밍의 특징

 

객체지향 프로그래밍의 특징에는 캡슐화, 상속, 추상화, 다형성 4가지가 있다.

이번 토이 프로젝트는 상속과 다형성을 적용시킬 만큼 복잡하지 않아서 제외하고,

추상화 캡슐화 관점에서 'Subject' 클래스를 해석해 보았다. 

 

 

 

 

 

2. 추상화

 

1) 추상화

 

'과목'을 하나의 클래스(class Subject:)로 만들고 각 과목을 객체로 생성, 저장한다.

자격증 시험의 '과목'은 현실 세계의 관점으론 수없이 많은 의미가 될 수 있다.

수 없이 많은 의미의 가능성 중에서 내가 필요한 데이터만을 추상화하여 설계하고 필드를 선언하였다.

 

- 과목 넘버, 과목 전체 문항수, 유저가 입력한 데이터, 정답 문항수, 오답 문항수, 100점 환산 점수, 과락 여부, 과락 출력 메시지

 

# Fields
num: int
subject_questions: int
input_score: int
correct: int
incorrect: int
converted_subject_score: float
is_pass: bool
fail_message: str

 

 

2) 타입 어노테이션

 

파이썬 변수 선언 시 되도록 타입을 명시하는 편이다.

 

파이썬은 동적 타입 언어이므로 굳이 변수에 타입을 선언하지 않아도 문제가 되지 않는다.

하지만, 변수의 타입을 동적으로 이용하는 코드가 필요한 경우는 매우 적다고 생각한다.

 

타입을 명시한다면, 코드 가독성을 제고할 뿐 아니라

코드 작성자의 실수로 발생할 타입 에러를 IDE 단에서 발견할 수 있다.

타입 어노테이션을 쓰지 않을 이유가 없다.

 

나의 이런 성향은 백엔드 언어를 자바로 시작한 탓도 있으리라 생각한다.

 

 

 

 

 

3. 캡슐화

 

1) 만족 항목

 

1개의 과목 객체 안에서 필요한 프로세스는 모두 클래스 안에서 처리한다.

생성자를 통해 (과목 번호, 총 문항수, 유저 입력값) 세 개의 파라미터를 받아 객체를 생성하고

객체가 생성됨과 동시에 한 과목 내에서 필요한 모든 정보를 계산하고 각각의 필드에 저장한다.

 

처리 과정을 클래스 코드 안에 숨김으로서

과목 처리 프로세스에 대한 응집도를 높이며, 입출력 모듈과의 결합도를 낮추었다.

 

 

 

2) 개선 필요 항목

 

객체의 필드를 은닉하지 못했다.

객체 생성과 동시에 저장된 필드 값 모두가 더 이상의 계산이나 재할당이 전혀 필요 없음에도

너무 쉽게 접근하고 수정이 가능한 상황이다.

 

자바에서는 필드 값을 private로 선언하고

필요에 따라 getter / setter 메서드를 통해서만 필드 접근이 가능하도록 설계하는 경우가 많다. 

 

파이썬에서도 같은 방식을 사용하고 싶었으나, 아직 방법을 익히지 못했다.

 

최근 검색을 통해 

필드 앞에 __를 붙여서 접근을 제한하고

@property, @필드.setter 어노테이션을 이용하여 getter, setter 함수를 만드는

파이썬 문법을 알게 되었다. 

 

이를 익히고 적용해볼 예정이다. 

 

 

 

 

 

댓글