정의
👉 게임을 만들 때
게임 캐릭터, 총, 총알 등등 모든것은 객체로 이루어져있다.
객체에는 속성과 행동이 있다.
총알 객체의 속성 = 공격성, 행동 = 총알을 맞은 상대방의 공격력을 깎는다.
👉 객체지향 프로그래밍으로 프로그램을 만들려면?
1. 프로그램에 어떤 객체들이 필요할지 정한다.
2. 객체들의 속성과 행동을 정한다.
3. 객체들이 어떻게 소통할지 정한다.
👉 객체에는 속성과 행동이 있다.
user 객체를 만든다고 할 때, 이 객체의 속성과 행동이 정해질 것이다.
모든 user 객체들은 동일한 속성과 행동을 가지게 될 텐데,
이 틀을 만드는 것을 '클래스' 라고 한다.
클래스는 설계도와 비슷한 개념으로 붕어빵을 만들때 쓰는 틀과 같다.
👉 클래스라는 설계도로 객체를 만드므로 객체는 우리가 클래스로 구현할 어떤것을 의미한다.
인스턴스는 객체를 실체화 시킨 것으로 객체를 만들기 위한 동작들을 정의한 것이다.
정리
마우스를 만들기 위한 설계도 (공장) - 클래스
마우스(공장에서 찍어낼 무언가) - 객체
마우스를 구성하는 왼쪽, 오른쪽 버튼, 휠,
왼쪽을 클릭했을 때, 오른쪽을 클릭했을 때, 스크롤을 내릴때 - 인스턴스
클래스
👉 클래스 만들기 규칙
-클래스 이름의 첫 글자는 대문자
-내용 부분에 속성과 행동을 입력하기(각각의 인스턴스를 만든다)
예) class User
인스턴스 변수
👉 정의하기
인스턴스 이름.속성 이름(인스턴스 변수) = "속성에 넣을 것"
예)
user1 = User()
user2 = User()
user3 = User()
각 유저 인스턴스는 같은 이름의 속성을 가지고 있더라도
서로 다른 값을 가지고 있게 되고, 속성을 공유하는 것이 아니라
개인적으로 가지게 된다. 이렇게 인스턴스가 개인적으로 가지고 있는
속성을 인스턴스 변수라고 한다.
👉 사용하기
인스턴스 이름.인스턴스 변수 이름
예)
user1.name="이땡땡"
user2.name="박땡땡"
메소드
👉 객체는 속성과 행동으로 이루어진다고 했는데
속성은 변수로 나타내었다면, 행동은 함수로 나타낸다.
함수는 메소드를 의미한다.
👉 메소드는 세가지 종류로 나뉜다.
1) 인스턴스 메소드
2) 클래스 메소드
3) 정적 메소드
인스턴스 메소드
👉 정의하기
인스턴스 변수를 사용하거나 인스턴스 변수에 값을 설정하는 메소드
예)
class User
def say_hello(some_User):
print("안녕하세요 저는 {}입니다.".format(some_User.name))
User 클래스에 say_hello라는 메소드를 작성했다.
이 메소드가 하는 일은 인사를 출력하는 행동을 하는 것이다.
say_hello는 인스턴스 변수를 사용한 인스턴스 메소드가 되는것이다.
👉 사용하기
메소드를 출력할 때
클래스.메소드(인스턴스) 예) User.say_hello(User1)
그런데 파라미터를 넘겨주지 않고 호출하는 방법도 있다.
인스턴스(파라미터).메소드 예) User1.say_hello
첫번째 > 클래스에서 메소드를 호출
두번째 > 인스턴스의 메소드를 호출
인스턴스가 자동으로 파라미터로 전달되므로, 파라미터를 또 넣게 되면
파라미터를 두번 받은것이 되어 오류가 출력된다.
👉 첫번째 파라미터를 작성할 때
인스턴스 메소드를 정의할 때는 항상 첫번째 파라미터로 인스턴스를 받기 위한 파라미터를 써주어야 하는데, 파이썬에서는 self를 쓰기를 권장한다.
def check_name(self, name):
return self.name == name
# 파라미터로 받는 name이 유저의 이름과 같은지 불린으로 리턴
user1.name ="이땡땡"
print(user1.check_name("이땡땡")
참고로 위와 같은 경우에, self.name은 은 인스턴스 변수 이름이기 때문에 파라미터 name과 이름이 같아도 문제가 되지 않는다.
메소드 실행 시 True가 출력이 된다.
특수 메소드
👉 init
유저 이름과 이메일, 비밀번호를 출력하는 메소드 작성
class User
def initialize(self, name, email, password):
self.name = name
self.email = email
self.password = password
user1 = User()
user1.initialize("이땡땡","@gmail.com","1234")
새 인스턴스를 만들 때마다 메소드를 활용하기 위해 두줄로 나누어 작성하게 된다.
여기서 특수 메소드는 한 줄로 작성할 수 있도록 간소화 시켜준다.
class User
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
user1 = User()
user1.initialize("이땡땡","@gmail.com","1234")
이름 앞 뒤로 __ 가 있는 매직 메소드, 특수 메소드라고 부른다.
특수 메소드는 특정 상황에서 자동으로 호출되는 메소드로
init 이닛 메소드는 인스턴스가 생성될 때 자동으로 생성된다.
class User
def __init__(self, name, email, password):
self.name = name
self.email = email
self.password = password
user1 = User("이땡땡","@gmail.com","1234")
print(user1)
👉 str
각각의 인스턴스를 원하는 정보에 맞게 출력하는 방법?
위의 프린트 user1 실행 시 결과는 클래스 이름과 그 인스턴스가
저장되어있는 주소가 출력된다. 원하는 정보를 출력하려면?
class User
def __str__(self):
return "사용자 {}, 이메일 {}, 비밀번호 {}.format(
더블 언더스코어 str 은 줄여서 던더라고 부르고
이 메소드를 던더 str이라고 부르기도 한다.
특수 메소드는 특정 상황에 자동으로 호출되는 메소드인데
위 메소드는 프린트 함수를 호출할 때 자동으로 호출된다.
따라서 어떤 메소드를 출력하려고 할 떄 던더 에스티알이 호출된다.
클래스 변수
👉 위에서 인스턴스는 각각 자신만의 속성을 가진다고 했는데
여러 인스턴스들이 공유하는 속성을 가질 필요가 있는 경우가 있다.
같은 클래스 내에 존재하는 인스턴스들이 서로 공유하기 위해 사용하는것이 바로 클래스 변수이다.
사용하기
1)정의
클래스 이름 밑에 바로 정의해주면 된다.
예)
class User
count = 0
2)사용
클래스 이름.변수 명
예) User.count = 1
👉 인스턴스의 클래스 변수 호출은?
인스턴스 이름.변수 명
예) print(user1.count)
참고로 해당 인스턴스에 클래스 변수를 바꾸고 싶어서 user1.count = 5 를 하게 되면, 클래스 변수가 아니라 인스턴스 변수가 설정된다.
이 문법은 인스턴스 변수를 설정하는 문법과 동일하며
두개의 같은 이름의 변수는 클래스 변수보다 인스턴스 변수가 우선이다.
따라서 클래스 변수를 설정하고 싶다면 클래스 이름으로만 설정이 가능하다.
정리
한 클래스에 모든 인스턴스가 공유하는 속성을 클래스 변수라고 한다.
클래스 변수를 읽는 것은 두가지 모두 가능하다.
클래스 이름.클래스 변수 이름
인스턴스 이름.클래스 변수이름
클래스 변수의 값을 설정하는 것은 클래스 이름으로부터만 가능하다.
데코레이터
👉 데코레이터 함수가 하는 일
파라미터로 함수를 받아 데코레이팅 하여 리턴해준다.
이 함수는 다른 함수를 꾸며주는 역할을 하기 때문에 데코레이터라고 부른다.
👉 사용하기
함수 위에 @데코레이터함수 를 작성해준다.
@add_print_to
def print_hello():
print("안녕")
클래스 메소드
👉 인스턴스 메소드와의 비교
인스턴스 메소드는 인스턴스 변수의 값을 읽거나 설정하는 메소드이고
클래스 메소드는 클래스 변수의 값을 읽거나 설정하는 메소드이다.
인스턴스 메소드의 첫번째 파라미터의 이름은 self이고
클래스 메소드는 첫번째 파라미터의 이름을 cls로 써준다.
👉 클래스 메소드에는 @classmethod를 써주어야 하고
이것은 데코레이터 함수이다.
👉 두가지의 차이점
인스턴스 메소드 self에는 인스턴스 자신이 전달되고
클래스 메소드의 cls는 클래스 자신이 자동 전달된다.
인스턴스 메소드와 다르게 클래스 메소드는 파라미터와 관계 없이
모두 클래스가 자동 전달된다.
그리고 클래스 메소드는 인스턴스 변수에는 사용이 불가능하다.
인스턴스 메소드 > 인스턴스 변수, 클래스 변수
클래스 메소드 -> 클래스 변수
인스턴스 변수를 사용하지 않는 경우 -> 클래스 변수
인스턴스 메소드는 인스턴스 변수와 클래스 변수에 사용되는것을 알수있다.
따라서 인스턴스 변수와 클래스 변수가 둘다 존재한다면, 인스턴스 메소드를 사용하면 된다.
정적 메소드
인스턴스 변수나 클래스 변수 중 아무것도 사용하지 않을 메소드라면
정적 메소드를 사용하면 된다.
어떤 속성을 다루지 않고, 단지 기능적인 역할만 하는 함수를 정의
👍👍👍👍👍👍👍👍👍