Upload
-
View
98
Download
0
Embed Size (px)
Citation preview
Outline
1. Understanding Class
2. Initialization Function : __init__()
3. Class Variable & Instance Variable
4. Data Hiding & Name Mangling
5. Getter, Setter and @property
6. Inheritance & Mixin & Polymorphism
Understanding Class
함수 : 특정행위에대해기술한소스코드
클래스 : 특정행위와상태를담을수있는객체를생성하기위한명세서
모듈 : 함수, 클래스등을포함하여독립적인파일(.py)로저장하여언제든지호출하여재사할수있는공통소스코드들의집합
Don’t Repeat Yourself!
>>> “같은소스를반복해서작성하지말라”
소스 재사용
Understanding Class
함수 : 특정행위에대해기술한소스코드
클래스 : 특정행위와상태를담을수있는객체를생성하기위한명세서
모듈 : 함수, 클래스등을포함하여독립적인파일(.py)로저장하여언제든지호출하여재사할수있는공통소스코드들의집합
Don’t Repeat Yourself!
>>> “같은소스를반복해서작성하지말라”
소스 재사용
Understanding Class
특정상태 : Attribute
특정행위와상태를담을수있는객체를생성하기위한명세서
1. 클래스의 정의
특정행위 : Method
명세서 : Class Name
클래스의 3요소 : 클래스명, 속성, 메소드
Understanding Class
Bom은 23살이다Bom은인하대학교를다닌다Bom은간수치가 40이다Bom은술을마시면간수치가 50증가한다Bom은휴식을취하면간수치가 50떨어진다
1. 클래스의 정의
속성과행위로나눈다
속성 : Bom, 23살, 인하대재학, 간수치40
행위 : 술마시면간수치 +50, 휴식하면간수치-50
Understanding Class
1. 클래스의 정의
class Bom:
name = ‘Bom’
age = 23
univ = “Inha”
liver_state = 40
def drink_alcohol(self):
liver += 50
print( name, “이가술을마십니다”)
def rest(self):
liver -= 50
print( name, “이가휴식을취합니다”)
Bom은 23살이다Bom은인하대학교를다닌다Bom은간수치가 40이다Bom은술을마시면간수치가 50증가한다Bom은휴식을취하면간수치가 50떨어진다
클래스 내부함수의첫 인자는 self
Understanding Class
2. 클래스의 사용
bom = Bom()
print(bom.name + ‘은 ’ + bom.univ + ‘대학교에다닙니다’ )
bom.drink_alcohol()
print(bom.liver)
bom.rest()
print(bom.liver)
변수 = 클래스이름()
변수.속성이름변수.함수이름()
Bom은 Inha대학교에다닙니다Bom이가술을마십니다90
Bom이가휴식을취합니다40
초기화 함수 내부에 선언된 변수에는 self 키
워드가 붙는다
초기화함수 : __init__()
1. __init___()
class Bom:
def __init__(self, name, age, univ)
print(‘초기화함수시작’)
self.name = name
self.age = age
self.univ = univ
self.liver_state = 40
def drink_alcohol(self):
liver += 50
print( name, “이가술을마십니다”)
def rest(self):
liver -= 50
print( name, “이가휴식을취합니다”)
C++ 과 Java의 생성자함수와같은역할클래스가생성된직후에바로실행된다 클래스 내부함수의
첫 인자는 self
초기화함수 : __init__()
2. __init___() 사용
yang= Bom(‘양욱’, 20, ’인하’)
print(yang.name + ‘은 ’ + bom.univ + ‘대학교에다닙니다’ )
yang.liver = 50
print(yang.liver)
yang.rest()
print(yang.liver)
초기화함수시작양욱은인하대학교에다닙니다90
Bom이가휴식을취합니다140
초기화함수 : __init__()
3. 주의사항
class Bom:
self.univ = ‘연세’
def __init__(self, name, age)
print(‘초기화함수시작’)
self.name = name
self.age = age
self.liver_state=40
__init__함수밖에 self.변수이름선언안됨
class Bom:
def __init__(self, name)
self.name = name
self.age
b = Bom(“bom”)
print(b.age)
초기화되지않은변수를참조하면에러
클래스변수&인스턴스변수
1. self
class Bom:
self.univ = ‘연세’
def __init__(self, name, age, univ)
print(‘초기화함수시작’)
self.name = name
self.age = age
self.liver_state=40
C++과 Java의 this 키워드와같은역할지금현재속해있는클래스를참조한다클래스내부함수의첫인자는모두 self
class Bom:
def __init__(self, name, age, univ)
print(‘초기화함수시작’)
self.name = name
self.age = age
여기서 self는 모두Bom클래스의 주소를
참조한다
초기화함수밖에사용하면안되는이유!?
함수의 인자 self를사용한것!
클래스변수&인스턴스변수
2. 클래스 객체와 인스턴스 객체의 namespace
class Bom:
name = ‘Bomin’
def __init__(self)
self.age = 23
>>> b1 = Bom()
>>> b1.name = ‘JumBomin
name=‘JumBomin’
b1(인스턴스)name=‘Bomin’
Bom(클래스)
클래스변수&인스턴스변수
2. 클래스 객체와 인스턴스 객체의 namespace
>>> b1 = Bom()
>>> b1.name = ‘JumBomin’
>>> b2 = Bom()
>>> b1.name
JumBomin
>>> b2.name
Bomin
>>> Bom
Bomin
name=‘JumBomin’
b1(인스턴스)
name=‘Bomin’
Bom(클래스)
b2(인스턴스)
데이터은닉&이름장식
1. 데이터 은닉 (Data Hiding)클래스의내부변수를외부에서접근하지못하게숨기는것변수의신뢰도를높혀준다캡슐화 (Encapsulation)라고부르기도함
어떻게접근을못하게할까?
class Bom:
name = ‘Bomin’
>>> b1 = Bom()
>>> b1.name
Bomin
데이터은닉&이름장식
2. 이름 장식 (Name Mangling)
변수앞에 __(언더스코어두개)를붙혀클래스외부에서접근하지못하게한다
어떻게접근을못하게할까?
class Bom:
__name = ‘Bomin’
>>> b1 = Bom()
>>> b1.name
AttributeError: type object ‘Bom’ has no atrribute ‘name’
>>> b1.__name
AttributeError: type object ‘Bom’ has no atrribute ‘__name’
데이터은닉&이름장식
dir(classname) 함수 : classname내부의 namepace출력
‘_클래스명__변수명 ‘ 으로 namespace가 바뀜>>> name, __name 접근불가능!
데이터은닉&이름장식
2. 이름 장식 (Name Mangling)
_클래스명__변수명으로 접근가능
class Bom:
__name = ‘Bomin’
>>> b1 = Bom()
>>> b1._Bom__name
Bomin
데이터은닉&이름장식
2. 이름 장식 (Name Mangling)
_클래스명__변수명으로 접근가능
class Bom:
__name = ‘Bomin’
>>> b1 = Bom()
>>> b1._Bom__name
Bomin
그럼 데이터 은닉이안되는거 아니에요?
데이터은닉&이름장식
2. 이름 장식 (Name Mangling)
_클래스명__변수명으로 접근가능
class Bom:
__name = ‘Bomin’
>>> b1 = Bom()
>>> b1._Bom__name
Bomin
파이썬은 Java나 C++과다르게데이터은닉이약한언어입니다.
>>> dir()로 namespace를 확인할수도있고>>> _클래스명_변수명 으로접근도가능
@Property
어차피 은닉 안되는데왜 쓰는거에요?
파이썬은 Java나 C++과다르게데이터은닉이약한언어입니다.
>>> dir()로 namespace를 확인할수도있고>>> _클래스명_변수명 으로접근도가능
상속
1. 상속이란?
Base Class
Derived Class
Base Class : 부모클래스, 물려줄속성과메소드정의Derived Class : 자식클래스, 부모로부터속성과메소드물려받음
클래스마다동일한코드작성되는것방지부모에공통된속성을두어코드유지보수용이하게함
상속
2. 속성확인, 부모클래스 확인
__dict__ : 인스턴스의속성을사전객체로관리__base__ : 클래스의부모클래스출력issubclass( 자식클래스, 부모클래스 ) : 두클래스의상속관계확인
상속
3. 부모 클래스의 생성자 호출
부모클래스이름.__init__(self, var…)
super(자식클래스이름, self).__init__(var…)
Developer
PythonDeveloper JavaDeveloper
CPPDeveloper
상속
4. 메소드 재정의 ( Method Overriding )
부모클래스의함수를자식클래스에서재정의해서사용하는것부모클래스의함수와자식클래스의함수의이름만같으면됩니다!
메소드의재정의로다형성구현
Developercoding()
PythonDevelopercoding()
JavaDevelopercoding()
CPPDevelopercoding()
상속
5. 다중 상속 & Mixin 클래스
2개이상의클래스를상속파이썬에서는다중상속이가능! ( Java는 다중상속허용x )
Mixin 클래스 : 속성없이메소드만정의되어있는클래스
Human
WebDeveloper
DeveloperMixin