객체 지향 프로그래밍 Object Oriented Programming 上

Bleu·2023년 8월 24일
0

python

목록 보기
6/22

객체 지향 프로그래밍 (Object Oriented Programming)

:프로그램을 구성하는 변수와 함수들에서 서로 연관성 있는 것 끼리 묶어서 모듈화 하는 개발하는 언어들을 객체 지향 프로그래밍 언어

모든 프로그램: 절차 지향적인 방식
(결국 모든 프로그램은 변수에 따른 함수를 만드는 것이다)

→ 내용이 많아지면 유지&보수가 어려워 짐 
(절차 지향 방식 ⇒ 유지 보수의 의 편의성 )

Instance(객체)

: 연관성 있는 값들과 그 값들을 처리하는 함수(메소드)들을 묶어서 가지고 있는 것(값)

→ 속성(Attribute)

⇒ 객체의 데이터/상태로 객체를 구성하는 값들.

→ 메소드(method) (= operator)

⇒ 객체가 제공하는 기능으로 주로 Attribute들을 처리한다.

python은 모든 값들이 instance type이다



Class 정의

(객체의 type)

: 동일한 형태의 객체들이 가져야 하는 Attribute와 Method들을 정의 한 것

class 로부터 객체(instance)를 생성한 뒤 사용한다.

class 클래스이름:   # 선언부
		# 클래스 구현
		# 메소드들을 정의

클래스 이름의 관례: 파스칼 표기법-각 단어의 첫 글자는 대문자 나머진 소문자로 정의한다.

ex) Person, Student, HighSchoolStudent

→ 카멜 표기법과는 첫 글자가 대문자로 시작하는지 소문자로 시작하는 지의 차이가 있음



Attribute (속성)

: instance의 데이터, instance가 가지는 값, instance의 상태

📍 객체에 속성을 추가, 조회
  • 객체의 속성 추가(값 변경)
    1. Initializer(생성자)를 통한 추가
    2. 객체.속성명 = 값 (추가/변경)
    3. 메소드를 통한 추가/변경
    • 1(Initializer)은 초기화할 때. 2, 3은 속성값을 변경할 때 적용
  • 속성 값 조회
    • 객체.속성명
  • 객체.dict
    - 객체가 가지고 있는 Attribute들을 dictionary로 반환

Tip> x.y 의 의미 ⇒ 내가 쓰려하는 거는 y 인데 이 y는 x안에 있다는 의미


Initialize (생성자)

: instance를 생성 할 떄 호출되는 특수method → attribute를 초기화 하는 코드 구현

  • 구문
def __init__(self [,매개변수들 선언]):           #[ ] 옵션.
# 구현 -> attribute(instance변수) 초기화
self.속성명=

변수 초기화: 처음 변수 만들어서 처음 값 대입.


self parameter

self : 현재 만들어지고 있는 객체

첫 번째 parameter 는 self로 받는다

- 메소드는 반드시 한 개 이상의 parameter를 선언해야 함
→ self는 그 중 첫 번째 parameter

- 메소드 호출 시 그 메소드를 소유한 instance가 self parameter에 할당
- Initializer의 self : 현재 만들어 지고 있는 객체를 받는다.
- 메소드의 self : 메소드를 소유한 객체를 받는다.
- Caller에서 생성자/메소드에 전달된 argument들을 받을 parameter는 두 번째 변수부터 선언한다.


instance method

: 객체가 제공하는 기능

객체의 attribute값을 처리하는 기능을 구현한다.

구문

def 이름(self [, 매개변수들 선언]):
	# 구현
	# attribute 사용(조회/대입)
	self.attribute

self (첫번째 매개변수)

  • method를 소유한 객체를 받는 변수
  • 호출할 때 전달하는 argument를 받는 매개변수는 두번째 부터 선언한다

ex)

p.(set_info(”홍길동”, 20, “서울")
#이 두개가 연결 →
 p ⇒ self
”홍길동” ⇒ name
20 ⇒ age
”서울” ⇒ address
def set_info(self, name, age, address)

+ self 에 관한 관게성 & self가 어떻게 구문 내에서 작용하는지!!


Information Hiding 정보 은닉

Attribute의 값을 caller(객체 외부)가 마음대로 바꾸지 못하게 하기 위해
→ 직접 호출을 막고 setter/getter 메소드를 통해 값을 변경/조회 하도록
(필요성 있음)
→ 그냥 내용을 조회 할 수 없게 가려버림 (데이터 보호가 주 목적)
⇒ mehtod 통해 접근 할 수 있게 한다 (getter로 조회)

setter

  • Attribute의 값을 변경하는 메소드. 관례상 set 으로 시작

getter

  • Attribute의 값을 조회하는 메소드. 관례상 get 으로 시작
📍 Attribute 직접 호출 막기
  • Attribute의 이름을 (double underscore)로 시작한다. (로 끝나면 안된다.)
  • 같은 클래스에서는 선언한 이름으로 사용가능하지만 외부에서는 그 이름으로 호출할 수 없게 된다.

ex) 객체의 값 외부에서 변경

p = Person("홍길동", 20, "서울")
print(p.name, p.age, p.address)
p.print_info()

p.age = 30
p.print_info()  # age가 변경 됨
[person class에 정보 은닉 적용]
1. attribute 변수들을 외부에서 호출 할 수 없도록 만들어 줌
 → self.__변수명 = 초기값  (*이때 뒤에도  _붙이면 다시 풀어짐
2. attribute변수들을 조회(getter), 변경 (setter) 하는 메소드를 정의    

ex)

class Person:
    
    def __init__(self, name, age, address):
        self.name = name
        self.__age = age
        self.address = address
        self.email = None
        
    # age 값을 조회하는 메소드
    def get_age(self):
        return self.__age # 같은 class에서는 __age(원래이름)로 호출 가능.
    
    # age값을 변경하는 메소드
    def set_age(self, age):
        if 0 <= age <=100:
            self.__age = age
        else:
            print(f"{age}는 나이에 넣을 수 없습니다. 0 ~ 100 사이 정수를 넣어주세요.")

property함수를 사용

  • 은닉된 instance 변수의 값을 사용할 때 getter/setter대신 변수를 사용하는 방식으로 호출할 수 있도록 함

    구현

    1. getter/setter 메소드를 만든다.
    2. 변수 = property(getter, setter) 를 등록한다.
    3. 호출
      → 값조회: 변수를 사용 => getter가 호출 된다.
      → 값변경: 변수 = 변경할 값 => setter가 호출 된다

(예시 제시)

데코레이터(decorator)를 이용해 property 지정

  • setter/getter 구현 + property()를 이용해 변수 등록 하는 것을 더 간단하게 구현하는 방식
  • setter/getter 메소드이름을 변수처럼 지정. (보통은 같은 이름으로 지정)
  • getter메소드: @property 데코레이터를 선언
  • setter메소드: @getter메소드이름.setter 데코레이터를 선언.
    - 반드시 getter 메소드를 먼저 정의한다.
    - setter메소드 이름은 getter와 동일해야 한다.
  • getter/setter의 이름을 Attribute 변수처럼 사용한다.
    주의: getter/setter 메소드를 직접 호출 할 수 없고 변수형식으로만 호출가능

(예시 제시)

0개의 댓글