SK Networks AI/일일 회고록

[SK네트웍스 Family AI 캠프 11기] 일일 회고 - 5일차(25.02.13 목요일)

js-kkk 2025. 2. 13. 17:39

파이썬 문법 중 클래스에 대해 강의가 진행되었다. 정확히 알고 있는 내용은 생략하고, 조금이라도 헷갈리거나 새로 알게된 부분만 기록하려고 한다.

 

 

 

학습 내용

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. 클래스 - 네임 스페이스와 스코프

  • 네임스페이스는 크게 다섯 가지로 나누어 볼 수 있다.
    1. 지역(local) 네임스페이스: 현재 함수나 메서드 내의 네임스페이스
    2. 인스턴스 네임스페이스: 인스턴스 객체의 네임스페이스
    3. 클래스 네임스페이스: 클래스 객체의 네임스페이스
    4. 전역(global) 네임스페이스: 모듈 내의 전역 네임스페이스
    5. 내장(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

 

상속의 특징

  1. 다중 상속 지원
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