■ 클래스에서 __(private), _(protected) 접근 제한자를 사용해 private/protected 멤버를 만드는 방법을 보여준다. ▶ main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
class TestClass: def __init__(self): self.__privateValue = "private" self._protectedValue = "protected" self.publicValue = "public" def __printPrivateValue(self): print(self.__privateValue) def _printProtectedValue(self): print(self._protectedValue) def printPublicValue(self): print(self.publicValue) testClass = TestClass() print(testClass.publicValue) # public testClass.printPublicValue() # public print(testClass._protectedValue) # protected testClass._printProtectedValue() # protected print(testClass._TestClass__privateValue) # private testClass._TestClass__printPrivateValue() # private print(testClass.__privateValue) # Error testClass.__printPrivateValue() # Error """ public public protected protected private private Traceback (most recent call last): File "/home/king/testproject/main.py", line 27, in <module> print(testClass.__privateValue) AttributeError: 'TestClass' object has no attribute '__privateValue' """ |
■ 클래스에서 __str__ 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
class Car: def __init__(self, company, details): self.Company = company self.Details = details def __str__(self): return "{} - {}".format(self.Company, self.Details) car1 = Car("페라리", {"색상" : "흰색" , "마력" : 400, "가격" : 8000}) car2 = Car("BMW" , {"색상" : "검정색", "마력" : 270, "가격" : 5000}) car3 = Car("아우디", {"색상" : "은색" , "마력" : 300, "가격" : 6000}) print(car1) print(car2) print(car3) """ 페라리 - {'색상': '흰색', '마력': 400, '가격': 8000} BMW - {'색상': '검정색', '마력': 270, '가격': 5000} 아우디 - {'색상': '은색', '마력': 300, '가격': 6000} """ |
※ __repr__ 메소드 함께 사용시 __str__ 메소드가 우선한다.
■ 클래스에서 __repr__ 메소드를 사용하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
class Car: def __init__(self, company, details): self.Company = company self.Details = details def __repr__(self): return "{} - {}".format(self.Company, self.Details) car1 = Car("페라리", {"색상" : "흰색" , "마력" : 400, "가격" : 8000}) car2 = Car("BMW" , {"색상" : "검정색", "마력" : 270, "가격" : 5000}) car3 = Car("아우디", {"색상" : "은색" , "마력" : 300, "가격" : 6000}) print(car1) print(car2) print(car3) """ 페라리 - {'색상': '흰색', '마력': 400, '가격': 8000} BMW - {'색상': '검정색', '마력': 270, '가격': 5000} 아우디 - {'색상': '은색', '마력': 300, '가격': 6000} """ |
※ __str__ 메소드 함께 사용시 __str__ 메소드가 우선한다.
■ 클래스의 super 함수를 사용해 상위 클래스 메소드를 호출하는 방법을 보여준다. ▶ 예제 코드 1 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
class Animal: def __init__(self): print("Animal __init__()") class Tiger(Animal): def __init__(self): super().__init__() print("Tiger __init__()") class Lion(Animal): def __init__(self): super().__init__() print("Lion __init__()") class Liger(Tiger, Lion): def __init__(self): super().__init__() print("Liger __init__()") liger = Liger() """ Animal __init__() Lion __init__() Tiger __init__() Liger __init__() """ |
▶ 예제 코드 2 (PY)
더 읽기
■ 클래스에서 __mro__ 속성을 사용해 상속 클래스를 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
class Tiger: def Jump(self): print("점프하기") class Lion: def Bite(self): print("물기") class Liger(Tiger, Lion): def Play(self): print("놀기") print(Liger.__mro__) """ (<class '__main__.Liger'>, <class '__main__.Tiger'>, <class '__main__.Lion'>, <class 'object'>) """ |
■ 클래스에서 다중 상속을 하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
class Tiger: def Jump(self): print("점프하기") class Lion: def Bite(self): print("물기") class Liger(Tiger, Lion): def Play(self): print("놀기") liger = Liger() liger.Jump() liger.Bite() liger.Play() """ 점프하기 물기 놀기 """ |
■ 클래스에서 __dict__ 속성을 사용해 클래스 멤버 데이터를 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
class SuperClass: x = 10 def PrintX(self): print(self.x) class SubClass(SuperClass): y = 20 def PrintY(self): print(self.y) subClass = SubClass() subClass.a = 30 print("SuperClass 클래스 멤버 사전") print("--------------------------------------------------") print(SuperClass.__dict__) print("--------------------------------------------------") print() print("SubClass 클래스 멤버 사전") print("--------------------------------------------------") print(SubClass.__dict__) print("--------------------------------------------------") print() print("SubClass 객체 멤버 사전") print("--------------------------------------------------") print(subClass.__dict__) print("--------------------------------------------------") """ SuperClass 클래스 멤버 사전 -------------------------------------------------- {'__module__': '__main__', 'x': 10, 'PrintX': <function SuperClass.PrintX at 0x0000018059B6A3B0>, '__dict__': <attribute '__dict__' of 'SuperClass' objects>, '__weakref__': <attribute '__weakref__' of 'SuperClass' objects>, '__doc__': None} -------------------------------------------------- SubClass 클래스 멤버 사전 -------------------------------------------------- {'__module__': '__main__', 'y': 20, 'PrintY': <function SubClass.PrintY at 0x0000018059B6A440>, '__doc__': None} -------------------------------------------------- SubClass 객체 멤버 사전 -------------------------------------------------- {'a': 30} -------------------------------------------------- """ |
■ 클래스에서 메소드를 확장하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Person: "부모 클래스" def __init__(self, name, phoneNumber): self.Name = name self.PhoneNumber = phoneNumber def PrintData(self): print("Person(Name : {0}, Phone Number : {1})".format(self.Name, self.PhoneNumber)) class Student(Person): "자식 클래스" def __init__(self, name, phoneNumber, subject, studentID): Person.__init__(self, name, phoneNumber) self.Subject = subject self.StudentID = studentID def PrintData(self): Person.PrintData(self) print("Student(Subject : {0}, Student ID : {1})".format(self.Subject, self.StudentID)) student = Student("Marry", "010-654-1234", "Computer Science", "990999") student.PrintData() """ Person(Name : Marry, Phone Number : 010-654-1234) Student(Subject : Computer Science, Student ID : 990999) """ |
■ 클래스에서 메소드를 재정의하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
class Person: "부모 클래스" def __init__(self, name, phoneNumber): self.Name = name self.PhoneNumber = phoneNumber def PrintData(self): print("Person(Name : {0}, Phone Number : {1})".format(self.Name, self.PhoneNumber)) class Student(Person): "자식 클래스" def __init__(self, name, phoneNumber, subject, studentID): Person.__init__(self, name, phoneNumber) self.Subject = subject self.StudentID = studentID def PrintData(self): print("Student(Subject : {0}, Student ID : {1})".format(self.Subject, self.StudentID)) student = Student("Marry", "010-654-1234", "Computer Science", "990999") student.PrintData() """ Student(Subject : Computer Science, Student ID : 990999) """ |
■ 클래스에서 자식 클래스의 메소드를 추가하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Person: "부모 클래스" def __init__(self, name, phoneNumber): self.Name = name self.PhoneNumber = phoneNumber def PrintData(self): print("Person(Name : {0}, Phone Number : {1})".format(self.Name, self.PhoneNumber)) class Student(Person): "자식 클래스" def __init__(self, name, phoneNumber, subject, studentID): Person.__init__(self, name, phoneNumber) self.Subject = subject self.StudentID = studentID def PrintStudentData(self): print("Student(Subject : {0}, Student ID : {1})".format(self.Subject, self.StudentID)) student = Student("Marry", "010-654-1234", "Computer Science", "990999") student.PrintData() student.PrintStudentData() """ Person(Name : Marry, Phone Number : 010-654-1234) Student(Subject : Computer Science, Student ID : 990999) """ |
■ 클래스에서 부모 클래스의 생성자를 호출하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Person: "부모 클래스" def __init__(self, name, phoneNumber): self.Name = name self.PhoneNumber = phoneNumber def PrintData(self): print("Person(Name : {0}, Phone Number : {1})".format(self.Name, self.PhoneNumber)) class Student(Person): "자식 클래스" def __init__(self, name, phoneNumber, subject, studentID): Person.__init__(self, name, phoneNumber) self.Subject = subject self.StudentID = studentID person = Person("Derick", "010-123-4567") person.PrintData() student = Student("Marry", "010-654-1234", "Computer Science", "990999") student.PrintData() """ Person(Name : Derick, Phone Number : 010-123-4567) Person(Name : Marry, Phone Number : 010-654-1234) """ |
■ 클래스의 __bases__ 속성을 사용해 부모 클래스를 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
class Person: "부모 클래스" def __init__(self, name, phoneNumber): self.Name = name self.PhoneNumber = phoneNumber def PrintData(self): print("Person(Name:{0}, Phone Number: {1})".format(self.Name, self.PhoneNumber)) class Student(Person): "자식 클래스" def __init__(self, name, phoneNumber, subject, studentID): self.Name = name self.PhoneNumber = phoneNumber self.Subject = subject self.StudentID = studentID print(Person.__bases__ ) print(Student.__bases__) """ (<class 'object'>,) (<class '__main__.Person'>,) """ |
■ 클래스를 상속하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
class Person: "부모 클래스" def __init__(self, name, phoneNumber): self.Name = name self.PhoneNumber = phoneNumber def PrintData(self): print("Person(Name : {0}, Phone Number : {1})".format(self.Name, self.PhoneNumber)) class Student(Person): "자식 클래스" def __init__(self, name, phoneNumber, subject, studentID): self.Name = name self.PhoneNumber = phoneNumber self.Subject = subject self.StudentID = studentID person = Person("Derick", "010-123-4567") person.PrintData() student = Student("Marry", "010-654-1234", "Computer Science", "990999") student.PrintData() """ Person(Name : Derick, Phone Number : 010-123-4567) Person(Name : Marry, Phone Number : 010-654-1234) """ |
■ 클래스의 __dict__ 속성을 사용해 클래스 멤버 데이터를 구하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
class Person: "부모 클래스" def __init__(self, name, phoneNumber): self.Name = name self.PhoneNumber = phoneNumber def PrintData(self): print("Person(Name:{0}, Phone Number: {1})".format(self.Name, self.PhoneNumber)) class Student(Person): "자식 클래스" def __init__(self, name, phoneNumber, subject, studentID): self.Name = name self.PhoneNumber = phoneNumber self.Subject = subject self.StudentID = studentID person = Person("Derick", "010-123-4567") student = Student("Marry", "010-654-1234", "Computer Science", "990999") print(person.__dict__) print(student.__dict__) """ {'Name': 'Derick', 'PhoneNumber': '010-123-4567'} {'Name': 'Marry', 'PhoneNumber': '010-654-1234', 'Subject': 'Computer Science', 'StudentID': '990999'} """ |
■ 클래스에서 classmethod 함수를 사용해 클래스 메소드를 정의하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
class Counter: instanceCount = 0 def __init__(self): Counter.instanceCount += 1 def printInstanceCount(): print("인스턴스 수 : ", Counter.instanceCount) PrintInstanceCount = staticmethod(printInstanceCount) def printInstanceCount(cls): print("인스턴스 수 : ", cls.instanceCount) PrintInstanceCount = classmethod(printInstanceCount) a, b, c = Counter(), Counter(), Counter() b.PrintInstanceCount() |
■ 클래스에서 __init__/__del__ 메소드를 사용해 생성자와 소멸자를 정의하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
class TestClass: def __init__(self, value): # 생성자 메소드 self.Value = value print("클래스가 생성되었습니다 : {0}".format(value)) def __del__(self): # 소멸자 메소드 print("클래스가 삭제되었습니다.") def TestFunction(): TestClass1 = TestClass(10) TestFunction() """ 클래스가 생성되었습니다 : 10 클래스가 삭제되었습니다. """ |
■ 클래스에서 __class__ 속성을 사용해 클래스 객체 속성을 설정하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
class Test: Data = "디폴트 값" test1 = Test() test2 = Test() test3 = Test() test1.Data = "테스트 1" print(test1.Data) print(test2.Data) print(test3.Data) print() test2.__class__.Data = "테스트 2" print(test1.Data) print(test2.Data) print(test3.Data) """ 테스트 1 디폴트 값 디폴트 값 테스트 1 테스트 2 테스트 2 """ |
■ 클래스에서 언바운드 메소드를 호출하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class Person: Name = "홍길동" def Print(self): print("나의 이름은 {0} 입니다.".format(self.Name)) person1 = Person() person1.Name = "홍길동" Person.Print(person1) """ 나의 이름은 홍길동 입니다. """ |
■ 클래스에서 바운드 메소드를 호출하는 방법을 보여준다. ▶ 예제 코드 (PY)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
class Person: Name = "홍길동" def Print(self): print("나의 이름은 {0} 입니다.".format(self.Name)) person1 = Person() person1.Name = "홍길동" person1.Print() """ 나의 이름은 홍길동 입니다. """ |
■ class 키워드를 사용해 클래스를 만드는 방법을 보여준다. ▶ 예제 코드 (DART)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
class Car { int maximumSpeed; double price; String name; Car(this.maximumSpeed, this.price, this.name); double saleCar() { price = price * 0.9; print('$name : $price'); return price; } } void main() { Car bmw = Car(320, 100000, 'BMW'); Car benz = Car(250, 70000, 'BENZ'); Car ford = Car(200, 80000, 'FORD'); bmw.saleCar(); bmw.saleCar(); benz.saleCar(); ford.saleCar(); } |
■ factory 키워드를 사용해 싱글톤(singleton) 팩터리 생성자를 사용하는 방법을 보여준다. ▶ 예제 코드 (DART)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
class Logger { static Logger? _logger; factory Logger() { if (_logger == null) { _logger = new Logger._create(); } return _logger as Logger; } Logger._create(); log(String msg) { print(msg); } } main() { Logger logger1 = new Logger(); logger1.log("로거가 초기화되었습니다."); Logger logger2 = new Logger(); logger2.log("로거 객체가 재사용되었습니다."); } |
■ factory 키워드를 사용해 단순 팩토리 생성자를 만드는 방법을 보여준다. ▶ 예제 코드 (DART)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
class Name { final String first; final String last; factory Name(String name) { List<String> partList = name.split(' '); return new Name._(partList[0], partList[1]); } Name._(this.first, this.last); } void main() { Name name = new Name("Fred Flinstone"); print("${name.first} ${name.last}"); } |
■ 지정 생성자(named constructor)를 사용하는 방법을 보여준다. ▶ 예제 코드 (DART)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
class Player { String name = ''; int color = 0; Player(this.name, this.color); Player.fromPlayer(Player another) { this.name = another.name; this.color = another.color; } } void main() { Player player1 = Player('홍길동', 20); Player player2 = Player.fromPlayer(player1); print(player1.name); print(player2.name); } |
■ with 키워드를 사용해 클래스에 다른 클래스 기능을 확장하기 ▶ 예제 코드 (DART)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
class Hero { String name = '영웅'; void run() { print('달리다.'); } } abstract class Monster { void attack(); } class Goblin implements Monster { @override void attack() { print('고블린 공격'); } } class DarkGoblin extends Goblin with Hero {} void main() { DarkGoblin goblin = DarkGoblin(); goblin.attack(); print(goblin.name); } |
■ implements 키워드를 사용해 멀티 추상 클래스를 구현하는 방법을 보여준다. ▶ 예제 코드 (DART)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
abstract class Monster { void attack(); } abstract class Flyable { void fly(); } class Bat implements Monster, Flyable { @override void attack() { print('박쥐 공격'); } @override void fly() { print('날개짓을 하다.'); } } |