파이썬 기초

클래스 설명

데이터_박과장 2023. 10. 11. 22:21

클래스는 왜 필요한가?

클래스는 객체 지향 프로그래밍의 핵심 개념으로, 데이터와 관련 기능을 하나로 묶어 관리할 수 있는 구조를 제공합니다. 이는 코드의 재사용성을 높이고 코드를 보다 모듈화하며, 복잡한 시스템을 관리하기 용이하게 합니다.
클래스가 필요한 이유를 설명하는 예시

예를 들어, "자동차"를 다루는 프로그램을 작성하려면 각 자동차마다 모델, 색상, 속도와 같은 속성을 가질 것입니다. 클래스를 사용하면 "자동차"라는 개념을 하나의 클래스로 정의하고, 각 자동차 객체는 이 클래스의 인스턴스로 생성됩니다. 이렇게 하면 자동차 객체를 생성하고 관리하는 작업이 간편해지며, 코드의 가독성과 유지보수성이 향상됩니다.
예시 코드:

class Car:
    def __init__(self, model, color, speed):
        self.model = model
        self.color = color
        self.speed = speed

    def start(self):
        print(f"{self.color} {self.model}이 출발합니다.")

car1 = Car("Sedan", "Blue", 100)
car2 = Car("SUV", "Red", 120)

car1.start()
car2.start()

예시 2

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        print(f"안녕, 나는 {self.name}이고, {self.age}살이야.")

person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

person1.greet()
person2.greet()



클래스와 객체

클래스는 객체의 설계도이며, 객체는 클래스로부터 생성된 실체입니다. 클래스는 객체의 특성(속성)과 동작(메서드)을 정의하며, 객체는 이러한 클래스의 정의를 기반으로 생성됩니다.

 

 

 


사칙 연산 클래스 만들기

사칙 연산을 수행하는 클래스를 만들어 봅니다. 이 클래스는 덧셈, 뺄셈, 곱셈, 나눗셈을 수행할 수 있는 메서드를 가집니다.
클래스를 어떻게 만들지 먼저 구상하기

클래스를 만들기 전에 필요한 속성과 메서드를 구상하는 단계입니다. 클래스는 객체의 특성과 동작을 정의하는 청사진으로, 구상 단계가 중요합니다.
클래스 구조 만들기

클래스를 정의하기 위해 class 키워드를 사용하고, 클래스의 구조를 만들기 위한 속성과 메서드를 정의합니다.
객체에 연산할 숫자 지정하기

클래스로부터 객체를 생성하고, 객체에 연산을 수행할 숫자를 지정하는 단계입니다.
더하기 기능 만들기

클래스에 덧셈을 수행하는 메서드를 추가하여 객체가 숫자를 더할 수 있게 만듭니다.
곱하기, 빼기, 나누기 기능 만들기

클래스에 곱셈, 뺄셈, 나눗셈을 수행하는 메서드를 추가하여 객체가 다양한 산술 연산을 수행할 수 있게 만듭니다.

 

class Calculator:
    def add(self, x, y):
        return x + y

    def subtract(self, x, y):
        return x - y

    def multiply(self, x, y):
        return x * y

    def divide(self, x, y):
        if y == 0:
            return "Division by zero is not allowed."
        return x / y

# Calculator 클래스의 인스턴스 생성
calc = Calculator()

# 덧셈 연산
result_add = calc.add(5, 3)
print("덧셈 결과:", result_add)

# 뺄셈 연산
result_subtract = calc.subtract(10, 4)
print("뺄셈 결과:", result_subtract)

# 곱셈 연산
result_multiply = calc.multiply(6, 2)
print("곱셈 결과:", result_multiply)

# 나눗셈 연산
result_divide = calc.divide(8, 4)
print("나눗셈 결과:", result_divide)

클래스 예시2 

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def study(self, subject):
        print(f"{self.name} is studying {subject}.")

    def take_exam(self, subject):
        print(f"{self.name} is taking an exam in {subject}.")

# Student 클래스의 인스턴스 생성
student1 = Student("Alice", 18)

# 학생의 공부와 시험 과정
student1.study("Math")
student1.take_exam("Math")

 


생성자
생성자는 객체가 생성될 때 초기화 작업을 수행하는 특별한 메서드입니다. 일반적으로 __init__ 메서드로 정의되며, 객체를 생성할 때 자동으로 호출됩니다.

 

아래는 생성자가 없는 클래스의 예시입니다.

 

class Dog:
    def set_name(self, name):
        self.name = name

    def set_age(self, age):
        self.age = age

    def bark(self):
        print(f"{self.name} is barking!")

# Dog 클래스의 인스턴스 생성
dog1 = Dog()
dog2 = Dog()

# 각 개의 이름과 나이 설정
dog1.set_name("Buddy")
dog1.set_age(3)

dog2.set_name("Milo")
dog2.set_age(2)

# 개의 정보 출력
print(f"{dog1.name} is {dog1.age} years old.")
print(f"{dog2.name} is {dog2.age} years old.")

# 개의 짖는 소리 출력
dog1.bark()
dog2.bark()


클래스의 상속

클래스 상속은 기존 클래스를 기반으로 새로운 클래스를 정의하는 개념입니다. 부모 클래스의 속성과 메서드를 자식 클래스가 상속받아 재사용할 수 있습니다.

 

클래스 상속의 예시

# 부모 클래스 (슈퍼 클래스)
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f"My name is {self.name} and I am {self.age} years old.")

# 자식 클래스 (서브 클래스)
class Student(Person):
    def __init__(self, name, age, student_id):
        # 부모 클래스의 생성자 호출 (super() 함수 사용)
        super().__init__(name, age)
        self.student_id = student_id

    def study(self, subject):
        print(f"{self.name} is studying {subject}.")

# Person 클래스의 인스턴스 생성
person = Person("Alice", 25)
person.introduce()

# Student 클래스의 인스턴스 생성
student = Student("Bob", 20, "12345")
student.introduce()
student.study("Math")

이 코드에서 "Person" 클래스는 이름과 나이를 가지는 기본적인 사람을 나타내며, "introduce" 메서드로 자기 소개를 출력합니다. "Student" 클래스는 "Person" 클래스를 상속받고, 학생 ID와 "study" 메서드를 추가로 가지고 있습니다. 이를 통해 "Student" 클래스는 "Person" 클래스의 모든 속성과 메서드를 상속받아 사용하며, 필요한 추가 기능을 더할 수 있습니다.

 


메서드 오버라이딩

자식 클래스에서 부모 클래스의 메서드를 다시 정의하는 것을 메서드 오버라이딩이라고 합니다. 이를 통해 자식 클래스는 부모 클래스의 동일한 이름의 메서드를 자체적으로 구현할 수 있습니다.

 

메서드 오버라이드의 예시

# 부모 클래스
class Animal:
    def speak(self):
        print("Animal makes a sound.")

# 자식 클래스
class Dog(Animal):
    def speak(self):
        print("Dog barks.")

# 다른 자식 클래스
class Cat(Animal):
    def speak(self):
        print("Cat meows.")

# Animal 클래스의 인스턴스
animal = Animal()
animal.speak()  # "Animal makes a sound."

# Dog 클래스의 인스턴스
dog = Dog()
dog.speak()  # "Dog barks."

# Cat 클래스의 인스턴스
cat = Cat()
cat.speak()  # "Cat meows."

이 코드에서 "Animal" 클래스는 "speak" 메서드를 가지고 있습니다. "Dog" 클래스와 "Cat" 클래스는 "Animal" 클래스를 상속받고, "speak" 메서드를 오버라이딩하여 각각 "Dog barks."와 "Cat meows."로 재정의합니다. 결과적으로 각 클래스의 객체가 해당 클래스의 메서드를 호출하면, 오버라이딩된 메서드가 실행됩니다.

 


클래스 변수

클래스 변수는 클래스 내부에서 공유되는 변수로, 모든 객체가 클래스 변수에 접근할 수 있습니다. 클래스 변수는 클래스 레벨에서 선언되며, 모든 객체에 동일한 값이 공유됩니다.

 

class Employee:
    # 클래스 변수
    company = "XYZ Corporation"

    def __init__(self, name, employee_id):
        self.name = name
        self.employee_id = employee_id

    def get_info(self):
        return f"Employee: {self.name}, ID: {self.employee_id}, Company: {Employee.company}"

# Employee 클래스의 인스턴스 생성
employee1 = Employee("Alice", 1001)
employee2 = Employee("Bob", 1002)

# 클래스 변수에 접근
print(f"Company (Class Variable): {Employee.company}")

# 각 인스턴스의 정보 출력
print(employee1.get_info())  # "Employee: Alice, ID: 1001, Company: XYZ Corporation"
print(employee2.get_info())  # "Employee: Bob, ID: 1002, Company: XYZ Corporation"

# 클래스 변수를 변경 (모든 인스턴스에 영향을 미침)
Employee.company = "ABC Inc."

# 변경된 클래스 변수 출력
print(f"Company (Class Variable): {Employee.company}")

# 클래스 변수 변경 후 인스턴스 정보 출력
print(employee1.get_info())  # "Employee: Alice, ID: 1001, Company: ABC Inc."
print(employee2.get_info())  # "Employee: Bob, ID: 1002, Company: ABC Inc."

 

이 코드에서 "Employee" 클래스는 클래스 변수인 "company"를 가지고 있으며, 모든 "Employee" 클래스의 인스턴스에서 이 변수를 공유합니다. 클래스 변수는 클래스명으로 접근하거나 변경할 수 있으며, 모든 인스턴스에 영향을 미칩니다.

 

'파이썬 기초' 카테고리의 다른 글

예외처리  (0) 2023.10.11
모듈  (0) 2023.10.11
파일 읽고쓰기  (0) 2023.10.11
사용자 입력&출력  (0) 2023.10.11
파이썬 - 함수의 이해  (0) 2023.10.11