Python 챌린지 5일차 TIL

‍박태우·2023년 3월 9일
0
post-custom-banner

Part 15.

클래스와 객체지향 프로그래밍

1)인스턴스의 이해

  • 인스턴스 : 값을 가지는 ,만들어져서 사용 가능한 것 (각각을 의미)
  • 클래스 : 인스턴스의 타입을 의미

코드 설명)

  • numbers1과 numbers2는 각각을 인스턴스라고 부를 수 있으며 이 둘은 같은 인스턴스는 아니다.
  • 하지만 둘 모두 list클래스의 인스턴스 라고 할수 있음
  • isinstance(a,type) : a가 type클래스의 인스턴스 이면 True, 아니면 False 리턴
  • numbers1==list 가 False인 이유 : numbers1은 리스트 클래스의 인스턴스일뿐 그 자체를 리스트와 같다고 보기는 어렵기 때문이다.

2)인스턴스의 이해 실습(1)

list1 = [1, 2, 3]
list2 = [1, 2, 3]

if list1 is list1: #자기 자신은 자기 자신과 같으므로 True
    print("당연히 list1과 list1은 같은 인스턴스입니다.")

if list1 == list2: #각 인덱스 데이터 비교 후 같으면 True
    print("list1과 list2의 값은 같습니다.")
    if list1 is list2: #데이터는 같아도 다른 인스턴스 이므로 False
        print("그리고 list1과 list2는 같은 인스턴스입니다.")
    else:
        print("하지만 list1과 list2는 다른 인스턴스입니다.")

당연히 list1과 list1은 같은 인스턴스입니다.
list1과 list2의 값은 같습니다.
하지만 list1과 list2는 다른 인스턴스입니다.

3)인스턴스의 이해 실습(2)

list1 = list(range(10))
list2 = [1, 2, 3]

if isinstance(list1, list) and isinstance(list2, list):
    print("list1과 list2는 둘 다 list클래스 입니다.")
    #둘다 list 클래스의 인스턴스들로 볼 수 있으므로 True

list1과 list2는 둘 다 list클래스 입니다.

4)클래스 만들기

  • 형태:
    class Human():
  • 예시:
class Human():
    '''사람'''
    
    
#a=list() 리스트 인스턴스 저장 , list클래스 사용
person1=Human() 
#클래스 호출하기, 리스트 인스턴스 저장과 비슷, 
#person1을 Human 클래스의 인스턴스로 만듬

person2=Human() #인간 클래스의 인스턴스가 person2에 생긴다.

person1.language='한국어' #클래스에 language 인스턴스 추가
person2.language='English'

print(person1.language)
print(person2.language)

person1.name='서울시민' #클래스에 name 인스턴스 추가
person2.name='인도인'

#클래스와 인스턴스를 이용하면 데이터와 코드를 이용자가 이해하기 쉽도록 포장가능

def speak(person):
    print('{}이 {}로 말을 합니다.'.format(person.name,person.language))
    
    
Human.speak=speak #Human.speak를 클래스의 함수로 만드는데 기존의 함수 speak를 사용 
person1.speak()
person2.speak()
#speak(person1)
#speak(person2)
#Human.speak=speak 코드가 없고 외부 함수를 통해 클래스의 정보를 출력하는 경우

한국어
English
서울시민이 한국어로 말을 합니다.
인도인이 English로 말을 합니다.

5)클래스 만들기 실습

class Car():
    '''자동차'''

taxi = Car()
taxi.name="택시" #name 인스턴스를 생성하고 "택시"대입

6)모델링

*모델링 : 클래스로 현실의 개념을 표현하는것
ex)

class Human():
    '''Person''' #써주지 않으면 def로 함수시 IndentationError 발생(구문 오류)   

# person=Human()
# person.name='철수'
# person.weight=60.5 
#매번 이렇게 적어주기 어려움

def create_human(name,weight):
    person=Human()
    person.name=name
    person.weight=weight
    return person
    
Human.create=create_human #human 관련 함수를 human클래스에 넣는 행위 매개변수의 형태도 그대로

person=Human.create('철수',60.5)
# person=create_human('철수',60.5) 내부함수화 안하면 이렇게

def eat(person):
    person.weight+=0.1
    print('{}가 먹어서 {}kg이 되었습니다'.format(person.name,person.weight))
def walk(person):
    person.weight-=0.1
    print('{}가 걸어서 {}kg이 되었습니다'.format(person.name,person.weight))
    
Human.eat=eat
Human.walk=walk
person.walk() #이경우 person에게 일을 시키므로 따로 매개변수는 넣지 않아도 됨
person.eat()
person.walk()

철수가 걸어서 60.4kg이 되었습니다
철수가 먹어서 60.5kg이 되었습니다
철수가 걸어서 60.4kg이 되었습니다

7)메소드 이해하기

  • 메소드(method)를 호출 : 인스턴스로 함수를 호출하는 것
  • 장점 :
    1)클래스가 가진 메소드가 어떤것인지 잘 드러남
    2)함수를 만들어 별도로 저장해야하는 작업도 필요 없음

예시)

class Human():
    '''Person'''
    def create(name,weight):
        person=Human()
        person.name=name
        person.weight=weight
        return person
        
    def eat(self):
        self.weight+=0.1
        print('{}가 먹어서 {}kg이 되었습니다'.format(self.name,self.weight))
    def walk(person):
        self.weight-=0.1
        print('{}가 걸어서 {}kg이 되었습니다'.format(self.name,self.weight))
        
    def speak(self,message):
        print(message)
    
#python에서는 보통 메소드의 첫번째 인자는 self로 씀

def eat(self):
    self.weight+=0.1
    print('{}가 먹어서 {}kg이 되었습니다'.format(self.name,self.weight))

person=Human.create('철수',60.5)
eat(person) 
#클래스 외부 eat함수 사용시에는 person을 인자로 넣어야 함 메소드 eat의 self로 전달됨

person.eat() 
#person이라는 인스턴스의 eat호출 위줄과 같은 결과 출력
#이 경우는 실행 됨, person이라는 인스턴스가 메소드 eat의 self로 전달되기 때문

person.speak("안녕하세요.")
#self에 자동으로 person인자가 전달되고 그이후에 "안녕하세요"가 전달되기 때문에 실행가능

철수가 먹어서 60.6kg이 되었습니다
철수가 먹어서 60.7kg이 되었습니다
안녕하세요.

  • 클래스 내부에서 메소드를 이용하는것과 클래스 외부의 함수를 이용하는 방식은 다르다.

8)메소드 이해하기 실습

class Car():
    '''자동차'''
    def run(self):#self 키워드를 이용해 자동으로 인스턴스 정보 전달
        print("{}가 달립니다.".format(self.name))

taxi = Car()
taxi.name = "택시"
taxi.run() #self 로 인해 외부에서는 매개변수 없이 사용가능

택시가 달립니다.

profile
잘 부탁드립니다.
post-custom-banner

0개의 댓글