2025/09/01 Python -8

김기훈·2025년 9월 1일

TIL

목록 보기
10/191
post-thumbnail

객체와 클래스

  • 객체 지향 프로그래밍 : 클래스 기반객체우선으로 생각하는 프로그래밍
    • 객체지향 프로그래밍 언어 : Java , Python , PHP 등
  • 객체 : 구현하고자 하는 대상의 속성기능을 가지는 프로그래밍 단위
    • 여러가지 속성(이름,수강과목 등등)을 가지고 있는 대상을 객체
    • 프로그래밍 언어에서 좀덛 넓은 의미로 속성을 가질 수 있는 모든 것을 객체
  • 추상화 : 객체를 구성하고 있는 속성이 많ㅇ느 경우 필요한 속성만을 이용해 객체를 표현하는 개념

oz_students = [
    {"name": "백현우", "python": 4, "database": 3, "Django": 3, "AWS": 2},
    {"name": "홍혜인", "python": 4, "database": 5, "Django": 2, "AWS": 4},
    {"name": "윤은성", "python": 3, "database": 4, "Django": 4, "AWS": 1},
    {"name": "홍수철", "python": 2, "database": 3, "Django": 1, "AWS": 5},
]
-------------------------------------------------------------------------
# 속성과 관련된 코드 개선
def create_oz_student(name, python, database, django, AWS):
    return{
        "name": name,
        "python": python,
        "database": database,
        "django": django,
        "AWS": AWS
    }


oz_students = [
    create_oz_student("백현우",4 ,3 ,3 ,2),
    create_oz_student("홍혜인",4 ,5 ,2 ,4),
    create_oz_student("윤은성",3 ,4 ,4 ,1),
    create_oz_student("홍수철",2 ,3 ,1 ,5)
]
-------------------------------------------------------------------------
print("이름", "총점", "평균", sep="\t")

for student in oz_students:
    ability_sum = student["python"] + student["database"] + student["django"] +\
                student["AWS"]
    ability_average = ability_sum / 4

    print(student["name"], ability_sum, ability_average, sep="\t")
  • 같은 내용을 함수를 이용하여 더 간단하게 바꿀 수 있다.
    • 매번 name, python, database, django, aws를 입력할 필요도 없다.
    • 어떤 값들이 들어가게 되는지 한눈에 파악하기도 좋아졌다.

#객체화
def create_oz_student(name, python, database, django, AWS):
    return{
        "name": name,
        "python": python,
        "database": database,
        "django": django,
        "AWS": AWS
    }

# 객체를 사용한 기능 처리
def get_sum(student): # 밑에서 for문이 student를 정의할것 이기 때문에 미래를 준비한것
    return student["python"] + student["database"] + student["django"] + student["AWS"]

def get_average(student):
    return get_sum(student) / 4

def to_string(student):
    return f'{student["name"]}\t{get_sum(student)}\t{get_average(student)}'

#데이터 입력
oz_students = [
    create_oz_student("백현우",4 ,3 ,3 ,2),
    create_oz_student("홍혜인",4 ,5 ,2 ,4),
    create_oz_student("윤은성",3 ,4 ,4 ,1),
    create_oz_student("홍수철",2 ,3 ,1 ,5)
]

#총점은 프로그래밍 활용 능력의 총합, 평균은 프로그램 활용 능력의 총합의 평균
print("이름", "총점", "평균", sep="\t")

for student in oz_students:
    print(to_string(student))

클래스

  • 작성한 코드를 더 효율적으로 만들기 위한 기능
# 클래스를 선언(만들다)합니다.
class CreateOzStudent:
    pass

student = CreateOzStudent()

oz_students = [
    CreateOzStudent("백현우",4 ,3 ,3 ,2),
    CreateOzStudent("홍혜인",4 ,5 ,2 ,4),
    CreateOzStudent("윤은성",3 ,4 ,4 ,1),
    CreateOzStudent("홍수철",2 ,3 ,1 ,5)
]
  • 객체 : 코드로 만들어진 무언가(데이터와 기능을 가진 덩어리)

    • 클래스 : 객체를 찍어내는 설계도 , 클래스를 이용해 ~를 만들면 ~객체 생성
  • 생성자 : 객체를 만들 때 자동으로 실행되는 특별한 함수 (init)

    • 생성자는 객체가 처음 만들어질 때 필요한 정보들을 채워 넣는 역할을 합니다.
  • 인스턴스 : 클래스로부터 실제로 만들어진 객체

  • 클래스 이름과 같은 함수 : 생성자

    • 생성자로 생성된 객체를 인스턴스 라고 함
      • CreateOzStudent() : 생성자 함수 / student : 인스턴스

생성자와 메소드

class 클래스 이름:
    def __init__(self, 추가적인 매개변수):
  • self의 값은 누가 넣는가? : 파이썬에서 클래스 내부 함수의 매개변수 첫번째 값은 자동으로 채워짐
    • 이로인해 클래스.메소드()만으로 쉽게 기능을 이용 가능한 것
class CreateOzStudent:
    def __init__(self, name, python, database, django, AWS):#name, python 등은 식별자
        self.name = name
        self.python = python
        self.database = database
        self.django = django
        self.AWS = AWS

    def get_sum(self):
        return self.python + self.database + self.django + self.AWS
    
    def get_average(self):
        return self.get_sum() / 4
    
    def to_string(self):
        return f'{self.name}\t{self.get_sum()}\t{self.get_average()}'

#데이터 입력
oz_students = [
    CreateOzStudent("백현우",4 ,3 ,3 ,2),
    CreateOzStudent("홍혜인",4 ,5 ,2 ,4),
    CreateOzStudent("윤은성",3 ,4 ,4 ,1),
    CreateOzStudent("홍수철",2 ,3 ,1 ,5)
]

print("이름", "총점", "평균", sep="\t")

for student in oz_students:
    print(student.to_string())
  • self가 가지고 있는 속성과 기능에 접근하는 방법 self.식별자
    • def get_sum(self):
      • self = Class안에 있는 입력값 CreateOzStudent("백현우",4 ,3 ,3 ,2)
      • return self.python + self.database + self.django + self.AWS 넣고 계산
  • CreateOzStudent("백현우",4 ,3 ,3 ,2)라는 생성자를 이용해 객체 생성

인스턴스와 특수 메서드

  • 클래스로 부터 생성된 객체를 인스턴스
    • 다양한 클래스가 존재하면 어떤 클래스에서 생성된 인스턴스인지 확인하기 어려움
    • isinstance(인스턴스 객체, 클래스)
      • 두번째 매개변수로 입력한 클래스 기반으로 인스턴스가 생성되었는지 True,False 반환

class Student:
    def __init__(self):
        pass

student = Student() # student : 인스턴스 , Student() : 생성자 함수 

print("isinstance(student, Student):", isinstance(student, Student))
# isinstance(student, Student): True
class Python:
    def study(self):
        print("파이썬을 수강중입니다.")

class Java:
    def teach(self):
        print("자바를 수강중입니다.")

programming_subjects = [Python(), Python(), Python(), Java(), Python()]

for subject in programming_subjects:
    if isinstance(subject, Python):
        subject.study() # 파이썬을 수강중입니다.
    elif isinstance(subject, Java):
        subject.teach() # 자바를 수강중입니다.
  • Python()을 실행하면 생성자(init)가 호출되어 새로운 객체가 생성
  • 즉, programming_subjects 리스트에는 Python()이나 Java() "함수 호출"의 결과가 들어감
    • 리스트 안에는 생성자 함수 그 자체가 아니라 생성자에 의해 만들어진 인스턴스가 담김

특수 메서드

  • str : str()만 입력해도 기존 방식과 다르게 자동으로 호출됨
class CreateOzStudent:
    def __init__(self, name, python, database, django, AWS):#name, python 등은 식별자
        self.name = name#self가 가지고 있는 속성과 기능에 접근하는 방법 self.식별자
        self.python = python
        self.database = database
        self.django = django
        self.AWS = AWS

    def get_sum(self):
        return self.python + self.database + self.django + self.AWS
    
    def get_average(self):
        return self.get_sum() / 4
-------------------------------------------------------------------------- 
    def to_string(self):
        return f'{self.name}\t{self.get_sum()}\t{self.get_average()}'
--------------------------------------------------------------------------
    def __str__(self): # __str__적용
        return f'{self.name}\t{self.get_sum()}\t{self.get_average()}'
--------------------------------------------------------------------------
#데이터 입력
oz_students = [
    CreateOzStudent("백현우",4 ,3 ,3 ,2),#CreateOzStudent() 생성자를 이용해 리스트 안에 데이터 생성
    CreateOzStudent("홍혜인",4 ,5 ,2 ,4),
    CreateOzStudent("윤은성",3 ,4 ,4 ,1),
    CreateOzStudent("홍수철",2 ,3 ,1 ,5)
]

print("이름", "총점", "평균", sep="\t")
--------------------------------------------------------------------------
for student in oz_students:
    print(student.to_string())
--------------------------------------------------------------------------
for student in oz_students:  # __str__적용
    print(str(student))
--------------------------------------------------------------------------
  • str : 메서드처럼 .함수 가 아닌 str()로 객체를 문자열로 표현시 자동으로 실행된다.

  • eq : 함수이름으로 사용시 print(student == student2)처럼 ==으로 사용가능


클래스 변수와 메서드

  • 클래스 안에서, self.가 없고, 그냥 이름만 붙여진 변수.
    • 모든 인스턴스가 공유합니다.
  • 그 클래스에 속한 모든 함수(메서드)에서 사용 가능할 뿐만 아니라,
    • Account.interest_rate처럼 직접 접근 가능 (외부 코드에서도 클래스명.변수로 접근 가능)
class Account:
    interest_rate = 0.05

a = Account("철수", 1000)
b = Account("영희", 2000)

print(Account.interest_rate)  # 클래스 이름으로 접근 → 0.05
print(a.interest_rate)        # 인스턴스로 접근 → 0.05
print(b.interest_rate)        # 인스턴스로 접근 → 0.05
class 클래스 이름:
    클래스 변수 = 값
    
[클래스 변수에 접근하기]
클래스 이름.변수 이름
class CreateOzStudent:
    count = 0 # 클래스 변수 만들기

    def __init__(self, name, python, database, django, AWS):#name, python 등은 식별자
        self.name = name#self가 가지고 있는 속성과 기능에 접근하는 방법 self.식별자
        self.python = python
        self.database = database
        self.django = django
        self.AWS = AWS

        CreateOzStudent.count += 1 # 클래스 변수에 접근하기
        print(f'{CreateOzStudent.count}번째 수강생의 정보가 추가되었습니다.')

#데이터 입력
oz_students = [
    CreateOzStudent("백현우",4 ,3 ,3 ,2),
    CreateOzStudent("홍혜인",4 ,5 ,2 ,4),
    CreateOzStudent("윤은성",3 ,4 ,4 ,1),
    CreateOzStudent("홍수철",2 ,3 ,1 ,5)
]

print()
print(f'현재 데이터가 입력된 총 수강생은 {CreateOzStudent.count}입니다.')
  • 클래스 변수 만들기 : class CreateOzStudent: count = 0
    • 클래스 변수에 접근하기 : CreateOzStudent.count += 1 (클래스.변수이름)

클래스 안에 함수를 만드는 방법

  • @classmethod : 데코레이터를 이용
    • 반복되는 패턴을 자동으로 처리하거나, 클래스 정의를 깔끔하게 유지하기 위해서 사용
[ 클래스 데코레이터를 이용하여 클래스 함수를 만드는 구문 ]
class 클래스 이름:
    @classmethod
    def 클래스 함수(cls, 매개변수):
        pass
        
[ 클래스 함수를 호출하는 방법 ]
클래스 이름.함수 이름(매개변수)
class CreateOzStudent:
    students = []

    @classmethod
    def print(cls):
        print("수강생 데이터베이스 정보")
        print("이름\t총점\t평균")
        for student in cls.students:
            print(str(student)) # 형변환이 아닌 def __str__(self): 이거

    def __init__(self, name, python, database, django, AWS):#name, python 등은 식별자
        self.name = name#self가 가지고 있는 속성과 기능에 접근하는 방법 self.식별자
        self.python = python
        self.database = database
        self.django = django
        self.AWS = AWS
        CreateOzStudent.students.append(self)

    def get_sum(self):
        return self.python + self.database + self.django + self.AWS
    
    def get_average(self):
        return self.get_sum() / 4
    
    def __str__(self):
        return f'{self.name}\t{self.get_sum()}\t{self.get_average()}'

#데이터 입력
CreateOzStudent("백현우",4 ,3 ,3 ,2)
CreateOzStudent("홍혜인",4 ,5 ,2 ,4)
CreateOzStudent("윤은성",3 ,4 ,4 ,1)
CreateOzStudent("홍수철",2 ,3 ,1 ,5)

CreateOzStudent.print()
  • CreateOzStudent("백현우",4 ,3 ,3 ,2) ->이 내용이 student 리스트에 들어감

    • CreateOzStudent.students.append(self) 이걸로 리스트에 입력
  • @classmethod : 클래스 데코레이터 이용

  • for student in cls.students

    • class에 작성된 stuednt의 리스트를 이용한다.
  • print(str(student)) : 형변환이 아닌 str(self): 이거 때문에 변환하는 것

  • 클래스 함수는 CreateOzStudent.함수명()으로 실행


프라이빗 변수

  • 외부에서 내부의 값을 변환하지 못하도록 한 것
    • __를 앞에 붙이면 내부에 있는 함수에 접근 불가
import math

class OzCircle:
    def __init__(self, __radius):
        self.__radius = radius
    def get_circumference(self):
        return 2 * math.pi * self.__radius
    def get_area(self):
        return math.pi * (self.__radius ** 2)

circle = OzCircle(10)
circle.radius = -2
print("원의 둘레:", circle.get_circumference())
print("원의 넓이:", circle.get_area())
  • def init(self, __radius):
    • radious에 __를 붙여서 circle.radius = -2 값을 추가했지만 값의 변화가 발생하지 않음

상속

  • 만들었던 클래스 안에 일부 내용을 추가하거나 변경하는 것
#자식클래스를 만들때 사용할 부모 클래스
class Parent:
    def __init__(self):
        self.value = "테스트"
        print("Parent 클래스의 __init()__ 메소드가 호출되었습니다.")
    def test(self):
        print("Parent 클래스의 test() 메소드입니다.")

#Parent 클래스를 매개변수로 넣어 자식 클래스를 만듭니다. -> 상속
class Child(Parent):
    def __init__(self):
        super().__init__() 
        print("Child 클래스의 __init()__ 메소드가 호출되었습니다.")

#자식 클래스의 인스턴스를 생성합니다.
child = Child()
#부모 클래스에 있는 메소드를 호출합니다.
child.test() 
#부모 클래스에 있는 속성을 출력합니다.
print(child.value)  # 테스트

# child.test()  출력 결과
# Parent 클래스의 __init()__ 메소드가 호출되었습니다.
# Child 클래스의 __init()__ 메소드가 호출되었습니다.
# Parent 클래스의 test() 메소드입니다.
  • super().init() : 부모 클래스가 가지고 있는 init()함수를 호출
  • child.test() : 자식 인스턴스에서 부모클래스가 가지고 있는 함수와 변수에 접근
class Vehicle:
    def __init__(self,make,model):
        self.make=make
        self.model=model
    
    def display_info(self):
        return f'이 차량은 {self.make}에서 제조한 {self.model}입니다.'

class Truck(Vehicle):
    def __init__(self, make, model, payload):
        super().__init__(make, model)
        self.payload = payload

    def payload_info(self):
        return f"적재량: {self.payload}kg"

class Car(Vehicle):
    def __init__(self, make, model, seats):
        super().__init__(make, model)
        self.seats = seats

    def seats_info(self):
        return f"좌석 수: {self.seats}"

truck = Truck("테슬라", "사이버트럭", 800)
print(truck.display_info())
print(truck.payload_info())

car = Car("포르쉐", "카이옌", 4)
print(car.display_info())
print(car.seats_info())

  • def init(self,make,model):
    • class Truck(Vehicle): -> def init(self, make, model, payload):
      • 상속받는 클래스(Truck)의 매개변수에 상속받은 클래스(Vehicle)의 매개변수를 넣어야 함
profile
안녕하세요.

0개의 댓글