파이썬 문법 중 클래스에 대해 강의가 진행되었다. 정확히 알고 있는 내용은 생략하고, 조금이라도 헷갈리거나 새로 알게된 부분만 기록하려고 한다.
학습 내용
1. 클래스 - 메서드
2. 클래스 - 생성자
3. 클래스 - 네임 스페이스와 스코프
4. 클래스 - global과 nonlocal
5. 클래스 - Private Variable
6. 클래스 - 클래스 속성과 인스턴스 속성
7. 클래스 - 상속
1. 클래스 - 메서드
- 클래스 내부에 정의된 함수로, 인스턴스의 데이터를 조작하거나 동작을 정의한다.
- self
- 메서드 내에서 쓰이는 self는 필드 및 메소드에 접근하기 위한 객체를 의미한다.
- 메소드 호출 시 객체의 주소값이 첫 번째 인자로 넘어오기 때문에, 객체를 통한 접근 시 호출되는 메소드의 첫 번째 인자는 항상 self 여야 한다.
class Person:
national = 'korea'
language = 'korean'
def greeting(self):
return '안녕하세요'
def information(self):
return "I'm from " + self.national + " and I use " + self.language
def favorite(self, color):
return "I love " + color
2. 클래스 - 생성자
- init 메서드는 객체가 생성될 때 자동으로 호출되는 메서드로, 생성자라고 부른다. 이때 매개변수를 전달받아 인스턴스 속성을 초기화 할 수 있다.
- 인스턴스 속성이란 각 인스턴스마다 개별적으로 가지는 변수이며, 생성자에서 정의된다.
class Person:
national = 'korea'
language = 'korean'
def __init__(self, name, age):
self.name = name
self.age = age
def greeting(self):
return '안녕하세요'
def information(self):
return "I'm from " + self.national + " and I use " + self.language + ". My name is " + self.name + ". I'm " + str(self.age)
def favorite(self, color):
return "I love " + color
3. 클래스 - 네임 스페이스와 스코프
- 네임스페이스는 크게 다섯 가지로 나누어 볼 수 있다.
- 지역(local) 네임스페이스: 현재 함수나 메서드 내의 네임스페이스
- 인스턴스 네임스페이스: 인스턴스 객체의 네임스페이스
- 클래스 네임스페이스: 클래스 객체의 네임스페이스
- 전역(global) 네임스페이스: 모듈 내의 전역 네임스페이스
- 내장(built-in) 네임스페이스: 파이썬 내장 함수와 예외를 포함하는 네임스페이스
- 네임스페이스 검색 순서는 가장 가까운 (가장 작은) 스코프 순서로 보통 로컬 > 전역 > 빌트인 순이다.
# 전역 네임스페이스
variable = "global variable"
print('전역: ', variable) # 전역: global variable
def outer_function():
# 외부 함수 네임스페이스
variable = "outer variable"
print('지역(외부 함수): ', variable)
def inner_function():
# 지역 네임스페이스
variable = "inner variable"
print('지역(내부 함수): ', variable)
inner_function()
outer_function() # 지역(외부 함수): outer variable
# 지역(내부 함수): inner variable
class TestClass:
# 클래스 네임스페이스
variable = "class variable"
def __init__(self, value):
self.variable = value # 인스턴스 네임스페이스
def class_function(self):
variable = "local variable"
print('클래스 지역: ', variable)
# 인스턴스 생성 및 메서드 호출
obj = TestClass("instance variable")
print('인스턴스: ', obj.variable) # 인스턴스: instance variable
obj.class_function() # 클래스 지역: local variable
4. 클래스 - global과 nonlocal
- global
- 함수 내부에서 전역 변수를 참조하거나 수정할 때 사용하여, 함수 내부에서 전역 변수에 접근할 수 있다.
- 설정 값을 전역적으로 유지하고 여러 함수에서 이 값을 변경하거나 참조할 때 유용하다.
g_variable = "global variable"
def modify_global():
global g_variable
g_variable = "global modified in function"
print(g_variable) # global variable
modify_global()
print(g_variable) # global modified in function
- nonlocal
- 중첩 함수에서 바깥 함수의 변수(로컬 변수를 포함)를 참조하거나 수정할 때 사용하며, 중첩 함수에서 한 단계 바깥의 함수 변수에 접근할 수 있다.
- 클로저(closure)나 함수형 프로그래밍 패턴에서 바깥 함수의 상태를 유지하고 수정하는 경우에 유용하다.
def outer_function():
variable = "outer variable"
def inner_function():
nonlocal variable
variable = "outer modified in inner function"
print(variable)
inner_function()
print(variable)
outer_function() # outer variable
# outer modified in inner function
5. 클래스 - Private Variable
- 객체 내부에서만 접근할 수 있는 private은 파이썬에 존재하지 않는다.
- 단, 대부분의 파이썬 코드에서 따르는 밑줄로 시작하는 네임스페이스를 가진 속성은 private하게 취급된다는 규약을 통해 private 속성을 설정할 수 있다.
class Character:
def __init__(self, nickname, type):
self.nickname = nickname # Public attribute
self.__type = type # Private attribute
def get_type(self):
return self.__type
def set_type(self, type):
character_types = ['전사', '법사', '치유사']
for given_type in character_types:
if(type == given_type):
self.__type = type
return
raise ValueError("잘못된 캐릭터 타입을 선택하였습니다.")
my_character = Character("산골짜기다람쥐", "전사")
print(my_character.nickname) # 산골짜기다람쥐
# Private attribute에 직접 접근 시도 (실패)
try:
print(my_character.__type) # 'Character' object has no attribute '__type'
except AttributeError as e:
print(e)
# Private attribute에 접근하는 public method 사용
print(my_character.get_type()) # 전사
# Public method를 통해 private attribute 수정
my_character.set_type("법사")
print(my_character.get_type()) # 법사
# 잘못된 값으로 수정 시도
try:
my_character.set_type("흑마법사") # 잘못된 캐릭터 타입을 선택하였습니다.
except ValueError as e:
print(e)
6. 클래스 - 클래스 속성과 인스턴스 속성
- 인스턴스 변수는 인스턴스별 데이터를 위한 것이고, 클래스 변수는 그 클래스의 모든 인스턴스에서 공유되는 어트리뷰트와 메서드를 위해 사용한다.
- 클래스 속성은 공유되는 속성으로 변경이 발생하면, 전체 객체에서 변경될 수 있다.
class Character:
skills = []
def __init__(self, nickname, type):
self.nickname = nickname
self.type = type
def add_skill(self, skill):
self.skills.append(skill)
def show_skill(self):
return self.type + ' ' + self.nickname + '님의 보유 스킬 ' + str(self.skills)
my_character = Character('산골짜기다람쥐', '전사')
your_character = Character('흑염룡의고릴라', '법사')
my_character.add_skill('곤봉 휘두르기')
your_character.add_skill('마법진 그려서 날려버리기')
print(my_character.show_skill()) # 전사 산골짜기다람쥐님의 보유 스킬 ['곤봉 휘두르기', '마법진 그려서 날려버리기']
따라서 객체마다 다른 데이터를 관리해야 하는 경우에는 인스턴스 속성으로 설정해야 한다.
class Character:
def __init__(self, nickname, type):
self.nickname = nickname
self.type = type
self.skills = []
def add_skill(self, skill):
self.skills.append(skill)
def show_skill(self):
return self.type + ' ' + self.nickname + '님의 보유 스킬 ' + str(self.skills)
my_character = Character('산골짜기다람쥐', '전사')
your_character = Character('흑염룡의고릴라', '법사')
my_character.add_skill('곤봉 휘두르기')
your_character.add_skill('마법진 그려서 날려버리기')
print(my_character.show_skill()) # 전사 산골짜기다람쥐님의 보유 스킬 ['곤봉 휘두르기']
인스턴스 속성과 클래스 속성으로 같은 이름을 사용하면, 인스턴스 속성을 우선한다.
class Character:
nickname = '땅파먹는개미핥기'
def __init__(self, nickname, type):
self.nickname = nickname
self.type = type
my_character = Character('산골짜기다람쥐', '전사')
print(my_character.nickname) # 산골짜기다람쥐
7. 클래스 - 상속
상속 기본 문법
class Person:
national = 'korea'
def greeting(self):
return 'Hello. This is Python'
class Student(Person):
pass
student = Student()
print(student.greeting()) # Hello. This is Python
상속의 특징
- 다중 상속 지원
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
다중 상속 시 시 검색 순서는 왼쪽에서 오른쪽으로 탐색한다.
class Person:
national = 'korea'
def greeting(self):
return 'Hello. This is Python'
class Learner:
def greeting(self):
return 'Hello. I am Learner'
def learn(self):
return 'I am learning Python'
class Student(Person, Learner):
pass
student = Student()
print(student.greeting()) # Hello. This is Python
print(student.learn()) # I am learning Python
2. 다른 모듈의 클래스 상속 가능
다른 모듈에 포함된 클래스도 상속받을 수 있다.
class DerivedClassName(module_name.BaseClassName):
<statement-1>
.
.
.
<statement-N>
3. 부모 클래스의 속성 오버라이딩 가능
부모 클래스의 속성을 오버라이딩하여 사용할 수 있다.
class Person:
national = 'korea'
def greeting(self):
return 'Hello. This is Python'
class Learner(Person):
def __init__(self, subject):
self.subject = subject
def learn(self):
return 'I am learning ' + self.subject
class Student(Learner):
def __init__(self, name, subject):
Learner.__init__(self, subject)
self.name = name;
def greeting(self):
return 'Hello. My name is ' + self.name
student = Student('토끼', 'python')
print(student.greeting()) # Hello. My name is 토끼
print(student.learn()) # I am learning python
**이외에 클래스 메서드에 대해서도 강의시간에 잠시 설명해주셨는데, 강의자료에는 없어서 아래 링크를 첨부
https://dojang.io/mod/page/view.php?id=2380
파이썬 코딩 도장: 35.3 클래스 메서드 사용하기
이번에는 정적 메서드와 비슷하지만 약간의 차이점이 있는 클래스 메서드를 사용해보겠습니다. 클래스 메서드는 다음과 같이 메서드 위에 @classmethod를 붙입니다. 이때 클래스 메서드는 첫 번째
dojang.io
'SK Networks AI > 일일 회고록' 카테고리의 다른 글
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 7일차(25.02.17 월요일) (0) | 2025.02.17 |
|---|---|
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 6일차(25.02.14 금요일) (2) | 2025.02.14 |
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 4일차(25.02.12 수요일) (0) | 2025.02.12 |
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 3일차(25.02.11 화요일) (0) | 2025.02.10 |
| [SK네트웍스 Family AI 캠프 11기] 일일 회고 - 2일차(25.02.10 월요일) (0) | 2025.02.10 |