클래스와 객체
절차지향과 객체지향
절차지향 : 기능들을 어떤 순서로 처리할 것인가에 초점을 맞춘다
객체지향 : 객체가 중심되서, 객체를 정의하고, 객체간의 상호작용에 초점을 맞춘다.
클래스와 객체
클래스 ---> 객체를 만들기 위한 설계도
객체------>설계도로 부터 만들어진 제품
클래스에는 속성과 메서드가 있다.
객체생성방법
인스턴스 = 클래스이름()
==> 클래스이름() 하게 되면 객체가 만들어지고 이를 인스턴스에 담는다.
속성 추가하기
생성자 = 객첼를 생성할 때 호출되는 메서드
속성을 매개변수로 받아와서 생성자에서 초기화한다.
self는 객체자기자신을 의미한다.
def __init__(self, 속성, 속성):
self.속성 = 속성
self.속성 = 속성
메서드추가하기
def __str__(self):
객체 자체를 출력할떄 출력되는 메서드
def __str__(self):
fruit = Fruit()
print(fruit)
fruit라는 객체자체를 출력할때 위의 __str__()이 호출된다.
클래스안에서의 메서드는 매개변수로 항상 self를 받는다.
여러가지 속성
클래스의 여러가지 속성
인스턴스속성
class Person :
def __init__(self, name, age, gender):
self.name = name
self.age= age
self.gender = gender
인스턴스속성이란 객체마다 다르게 가지는 속성을 의미한다.
사람이라는 객체를 만드면 사람마다 이름, 나이, 성별은 모두 다르다.
그러므로 name, age, gender은 인스턴스 속성이 된다.
클래스 안에서 인스턴스속성을 접근할 경우 self.속성명
클래스 밖에서 인스턴스 속성을 접근할 경우 객체명.속성명
클래스 속성
모든 객체가 공유하는 속성
class Person :
number = 0
def __init__(self, name, age, gender):
self.name = name
self.age= age
self.gender = gender
Person.number += 1
만약 회사라고 가정하고 사람이 들어올때마다 사원수는 하나씩 증가하게된다
그러므로 모든 객체가 공유하는 속성이므로 클래스속성을 이용한다.
클래스 안/밖 상관없이 다음과 같이 접근한다. 클래스명.클래스속성
비공개 속성
클래스 안에서만 접근 가능한 속성
class Person :
number = 0
def __init__(self, name, age, gender, id):
self.name = name
self.age= age
self.gender = gender
self.__id = id
Person.number += 1
회사에서 사용하는 id가 외부에 노출되면 안된다고 가정하자!!
그렇다면 id는 외부에서 사용하지 못하게 비공개 속성으로 만들어둔다.
id앞에 ____id두개를 추가하면 비공개속성이된다.
또한 다른 인스턴스 변수들은 public상태이므로 외부에서 접근해서 값을 변경하는 것이 가능하다.
그런 문제를 미연에 방지하고자 외부에서 접근하지 못하게 private로 __를 사용해서 비공개 속성으로 만든다.
여러가지메서드
인스턴스메서드
인스턴스메서드는 인스턴스 속성에 접근할 수있는 메서드이다.
항상 첫번째 파라미터로 self를 갖는다.
class Person :
number = 0
def __init__(self, name, age, gender, id, grade):
self.name = name
self.age= age
self.gender = gender
self.__id = id
self.grade = grade
Person.number += 1
def upgrade(self, 기간):
if self.grade == "사원" and 기간 >=3:
self.grade == "대리"
if self.grade == "대리" and 기간 >=5:
self.grade == "up"
클래스메서드
클래스 속성에 접근하기 위해서 사용한다.
클래스를 의미하는 cls를 파라미터로 받는다.
class Person :
number = 0
def __init__(self, name, age, gender, id, grade):
self.name = name
self.age= age
self.gender = gender
self.__id = id
self.grade = grade
Person.number += 1
def upgrade(self, 기간):
if self.grade == "사원" and 기간 >=3:
self.grade == "대리"
if self.grade == "대리" and 기간 >=5:
self.grade == "up"
@classmethod <= 데코레이터
def peron_count(cls):
print(cls.number)
클래스메서드는 클래스명으로 호출할 수 있다.
Person.person_count()
정적메서드
- 인스턴스를 만들 필요가 없는 메서드이다.
- self를 받지 않는다.
- 메서드가 인스턴스 유무와 관계없이 독립적으로 사용할수 있다.
- @staticmethod 데코레이터 사용
class Math:
@staticmethod
def add(x,y)
return x+y
Math클래스의 add메서드를 만들었다.
이는 Math클래스의 객체를 생성하지 않아도 메서드를 사용할수있다.
호출시
클래스명.메서드명 Math.add()로 호출가능하다.