728x90
SMALL

12-1 객체지향의 특징과 클래스

- 객체란?

객체 : 우리 주변의 모든 것들, 자시만의 고유한 특성과 교유의 행동을 가지고 있음
속성(attribute) : 객체가 가지는 자신만의 고유한 특성, 필드 또는 멤버변수로도 불림
메서드(method) : 객체가 가지는 행동

 

- 객체지향 언어

실제 세상에 가깝게 모델링 하여 객체로 표현
>> 객체들 간의 관계, 상호 작용 설계
>> 각 객체를 클래스로 만듦 (이때 클래스란 객체를 만들기 위한 설계도 또는 틀)

 

- 객체지향의 특징

캡슐화 
캡슐로 객체를 감싸서 내부를 보호하고 볼 수 없게 하는 것 
객체의 가장 본질적인 특징
캡슐처럼 중요한 정보들은 비공개로 둠
비공개 속성에 접근하기 위해서는 클래스 안의 메서드에서만 접근 가능하도록 설계

상속
부모 클래스의 속성과 메서드를 자식 클래스에 물려줄 수 있음
여러 클래스의 공통된 속성을 부모 클래스에 정의하고, 각 하위 클래스에서는 그에 맞는 특화된 속성과 메서드를 정의할 수 있음

다형성
같은 이름의 행동이(메서드가) 클래스 혹은 객체에 따라 다르게 구현하는 것
부모로부터 받은 동일한 행동에 대해서 각각 서로 다른 동작을 수행하는 것

- 클래스

클래스 : 객체를 만들기 위한 설계도 또는 틀
인스턴스 : 클래스를 통해서 만들어진 객체, 보통 객체와 분리하기 위해서 인스턴스라는 용어를 사용

class 문의 구조

class 클래스명 :
     속성 정의
     행동 정의

예시) 클래스 인간과 인스턴스 나의 정의

인간의 속성 : 이름, 나이, 직업, 키
인간의 행동 : 공부를 함, 음악을 들음, 밥을 먹음

class human:
     속성 정의 - 이름, 나이, 직업, 키
     행동 정의 - 공부하기, 음악듣기, 밥먹기

나(인스턴스) = 인간
나.이름 = 이하늘
나.나이=21
나.키=180
나.공부한다()

인스턴스(나) = 클래스(인간)를 통해 만들어진 객체

 

- 클래스의 선언

휴대폰의 속성 : 모델명, 제조사, 색
휴대폰의 행동 : 전화걸기, 전화받기, 문자메세지 보내기

예시) 속성 선언

class cellphone:
  model="m1"
  factory="samsung"
  color="black"
dir(cellphone) # dir() - 생성된 이름 공간 확인

 

 

- 클래스 메서드 선언 (객체의 속성과 행동 중 행동)

메서드는 함수 형식으로 선언
메서드의 첫번째 매개변수는 관례적으로 self를 지정

self : 객체 자신을 인자값으로 넘김으로써 함수 내에서 클래스의 속성 및 메서드에 접근 가능하도록 함

 

class cellphone:
  model="m1"
  factory="samsung"
  color="black"

  def callphone(self):
    print("전화 걸기")
  def receivephone(self):
    print("전화 받기")
  def sendsms(self):
    print("문자 받기")
  def info(self):
    print("모델은",self.model,"입니다.")
    print(cellphone.factory,"에서 만들었습니다.")
    print("색깔은",self.color,"입니다.")

 

 

- 인스턴스 생성

인스턴스(s1) : 클래스를 통해 만들어진 객체
속성과 메서드는 속성접근자 .(점)을 이용하여 실행한다.
s1.model
s1.info()

 

class cellphone:
  model="m1"
  factory="samsung"
  color="black"

  def callphone(self):
    print("전화 걸기")
  def receivephone(self):
    print("전화 받기")
  def sendsms(self):
    print("문자 받기")
  def info(self):
    print("모델은",self.model,"입니다.")
    print(cellphone.factory,"에서 만들었습니다.")
    print("색깔은",self.color,"입니다.")
s1 = cellphone() # s1 인스턴스에 class의 메서드(행동)를 넣어주기
s1.callphone()
s1.info()
print(isinstance(s1, cellphone)) # 객체 s1이 cellphone의 클래스에 존재하는지 반환

 

 

- 이름 공간

클래스 정의 :
클래스 객체 생성
독립적인 이름공간 생성
속성과 매서드 존재

익스턴스 객체 생성 :
클래스의 이름을 사용해 함수를 호출하는 형태
클래스와 동일하게 독립적인 이름공간 생성

처음에는 클래스와 인스턴스는 동일한 속성과 메서드를 가짐
인스턴스 객체의 속성이 변경되면 인스턴스 이름공간에 변경된 데이터를 저장

 

s1.model= "iphone" # 인스턴스 객체의 속성을 변경시킴
s1.info() # 변경되지 않은 속성과 메서드는 클래스 객체와 동일한 속성과 요소를 가짐
s1.factory="apple"
s1.info()
s1.color="white"
s1.info()

 

<실행 결과>

 

모델은 iphone 입니다.
samsung 에서 만들었습니다.
색깔은 black 입니다.
모델은 iphone 입니다.
samsung 에서 만들었습니다.
색깔은 black 입니다.
모델은 iphone 입니다.
samsung 에서 만들었습니다.
색깔은 white 입니다.

 

 

- 클래스 객체에서 멤버변수(속성) 추가

파이썬에서는 클래스 및 인스턴스 객체에 동적으로 멤버변수(속성) 추가 가능

예시) 클래스 객체에 새로운 멤버 변수 price 추가

s2=cellphone()
s2.info()
cellphone.price=0 # 인스턴스 객체 s1,s2에서 에러가 발생하지 않음
print(s1.price)
print(s2.price)
s1.price=100
s2.price=200
print(s1.price)
print(s2.price)

 

<실행 결과>

 

0

0

100

200

 

인스턴트 객체를 통해 변수나 함수 이름을 찾을 때, 즉 print(s1.price)를 할 때

인스턴스 객체의 이름 공간 > 클래스 영역 > 전역영역으로 이름을 찾음

이 경우 클래스 영역에서 price가 추가되었으므로 에러가 발생하지 않음.

 

만약 인스턴트 객체에 동적으로 멤버 변수를 추가하는 경우

추가한 인스턴스 객체를 통해서만 접근 가능

다른 인스턴스 객체(s2)에서는 오류 발생

 

예시) 

s2=cellphone()
s2.info()
s1.size=20
print(s1.size)
print(s2.size) # 에러 발생!!

 

- 클래스 객체에서 주의 사항

클래스 메서드 내에서 self를 통해서 멤버변수에 접근해야함
전역변수와 클래스 변수 이름이 동일할 경우 에러를 발생시키지 않으면서, 잘못된 data를 전달할 수 있음

 

예시) 

model = "m1" # 전역변수 model에 m1 할당
class cellphone:
  model="" # 클래스의 속성 model을 정의
  def setmodel(self,m):
    self.model = m
  def info(self):
    print("모델은",model,"입니다.") # self.model이 아닌 그냥 model을 사용할 경우 전역변수의 model이 출력됨
s1 = cellphone()
s1.setmodel("s1") # s1의 setmodel을 s1으로 정의해 주었지만
s1.info() # 결과값은 전역변수 m1이 나옴
 

- 생성자 / 소멸자 메서드

인스턴트 객체를 생성할 때 초기화 작업을 위해 생성자 메서드 지원
메모리 해제 등의 종료작업을 위해서 소멸자 메서드 지원

생성자 메서드 : 인스턴트 객체가 생성될 때 자동으로 호출 됨
소멸자 메서드 : 인스턴트 객체의 레퍼런스 카운트가 0이 될 때 호출됨

__init__ 
클래스 객체의 초기화, 주로 멤버변수의 값들을 초기화하는 작업

예시)

 

class cellphone :
  def __init__(self,m,f,c): # 생성자, 생성될 때 호출
    print("객체 생성")
    self.model=m
    self.factory=f
    self.color=c
  def __del__(self): # 소멸자, 소멸될 때 호출
    print("객체 소멸")
  def info(self):
    print("모델은",self.model,"입니다.")
    print(self.factory,"에서 만들었습니다.")
    print("색깔은",self.color,"입니다.")
s1=cellphone("m1","samsung","black")
s1.info()
del s1

 

 

- 매직메서드

매직메서드 : 함수명이나 변수명 앞뒤로 '__"가 있는 경우에는 특별한 용도로 미리 정의 한 것

__init__ : 클래스 객체의 초기화
__del__ : 종료작업을 위한 소멸자
__new__ : 인스턴트 객체가 생성되면 처음 실행하는 동작을 지정
__getattribute__ : 객체의 속성을 참조할 때 무조건 호출
__getattr__ : 참조 시, 속성이 존재하지 않을 때 호출
__setattr__ : 객체의 속성을 변경할 때 호출

 

 

 

12-2 캡슐화와 상속

- 캡슐화

캡슐로 객체를 감싸서 내부를 보호하고 볼 수 없게 하는 것
객체의 가장 본질적인 특징
중요한 정보들은 비공개로 둠
클래스 안의 메서드에서만 접근 가능

__를 속성 앞에 붙여서 비공개로 사용
클래스 바깥쪽에서 접근할 수 없음
클래스 안에서만 접근 가능 

예시) 

class cellphone:
  def __init__(self,model,factory,price):
    self.model = model
    self.factory= factory
    self.__price=price
  def info(self):
    print("모델은",self.model,"입니다.")
    print(self.factory,"에서 만들었음")
    print("가격은",self.__price,"입니다.")
s1=cellphone("m1","samsung",1111) # s1 인스턴스를 만듦
s1.__price=32323 # s1의 price를 변경, 하지만 __price로 설정했기에 바뀌지 않음
s1.price=777 # s1의 price를 변경, 하지만 __price로 설정했기에 바뀌지 않음
s1.info()

 

 

- 상속

부모클래스의 모든 속성(데이터, 메서드)을 물려줄 수 있음
각 클래스마다 특화된 메서드와 멤버변수를 정의하여 중복코드 작성을 방지하고 유지보수가 용이함

추상화 : 여러 클래스들의 공통된 특징 등을 추출해 기본 클래스로 작성하는 것, 추상화의 결과물이 부모 클래스임
issubclass : 상속 관계에 있는 두 클래스의 관계를 알 수 있는 함수

728x90
LIST
Dylan07