[파이썬 기초 문법] class 란,,,

마운틴 스타·2025년 6월 30일

파이썬 기초 문법

목록 보기
1/2

사람은 우매한 존재입니다 .
얼마나 멍청하냐면, 1학년때 배우고, 2학년때 배우고, 심지어 3학년때는 코딩존 조교를 하며 가르치던 파이썬 기초 문법을 그새 까먹었다.

특히 Class는 평소 잘 쓰지않는 문법이었어서, 더 모르겠더라


Class 개요

객체 지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 데이터와 해당 데이터를 다루는 메서드를 함께 묶어놓은 틀(template)이다.

  • 객체들끼리는 상호통신하면서 프로그램 전체가 돌아가도록 코드를 구성할 수 있다.
  • Object(객체) : 자신 고유의 속성을 가지는 대상
  • Class : 객체들을 소프트웨어 내에서 구현하기 위해 만든 설계도

Class 구성요소

1. 속성

클래스 내부에 정의된 변수

2. 메서드(method)

클래스 내부에 정의된 함수

3. 객체(Object , 인스턴스)

클래스로부터 실제로 만들어진 실체


출처 | https://thingsdaq.org/2022/02/23/classes-vs-functions-in-python/


class의 흐름

  1. 클래스를 정의
  2. 속성과 메서드 정의
  3. 객체 생성
  4. 각 객체는 클래스가 가진 속성과 메서드를 사용가능

가장 기본적인 구조는 아래와 같다

class Student:
    # 1. 클래스 속성
    dream = '취업'


    # 2. 생성자 (-> 인스턴스 속성)
    def __init__(self, name, phone):
        self.name = name 
        self.phone = phone
        # __init__() == 클래스명() 호출했을 때 호출되면서 인스턴스를 생성하는 메서드
        
    
    # 3. 메서드
    # 메서드는 반드시 self (객체의 주소값)을 첫 번째 파라미터로 받음
    def study(self):
        print('공부하자!')
        
        
# 인스턴스 생성
student_1 = Student('산별', '010-1234-5678')
        

위 코드를 실행하면,
Student라는 class 틀이 적용되고,
student_1 이라는 객체를 생성하여 적용한것이다.
class 내에 있는함수는 student_1에서도 적용이 가능하다.

다만 출력을 할때 헷갈리지않게 주의해야한다.

print(student_1)         # 인스턴스를 대입한 변수 출력 => 주소값
print(student_1.dream)   # 인스턴스를 대입한 변수의 속성명/함수 호출
print(student_1.name)    # '산별'
student_1.study()        # 공부하자!

init 생성자

내가 가장 헷갈렸던 부분이다.

  • init은 클래스에서 객체가 만들어질때 자동으로 실행되는 함수이다. -> 초기화라 할 수있다.
  • 즉, 객체가 생성될 때(생성자) 그 객체의 속성을 처음으로 '초기화'해주는 함수이다.
student_2 = Student('철수', '010-5678-1234')
# 여기서 student_2를 만들 때 __init__이 자동으로 실행됨

상속(inheritance)

한 클래스가 다른 클래스의 기능(속성/메서드)을 그대로 물려받아 사용할 수 있다.
즉, 기존 클래스를 확장해서 새로운 클래스를 만드는 것이다.

class Animal:
    def speak(self):
        print('동물이 소리를 낸다')

class Dog(Animal):    # Animal을 상속받은 Dog 클래스
    def bark(self):
        print('멍멍!')

dog = Dog()
dog.speak()  # 동물이 소리를 낸다  (부모 클래스 메서드 사용 가능)
dog.bark()   # 멍멍!
  • Dog 클래스는 Animal의 속성과 메서드를 그대로 쓸 수 있음
  • 필요하면, 자식 클래스에서 메서드를 '덮어쓰기(오버라이딩)'할 수도 있음

오버라이딩

상속은 부모클래스(기존)의 기능(속성,메서드)을 그대로 물려받아서 자식클래(새로운 클래스)에 쓸 수 있게 해주는 기능이라면,
오버라이딩은 부모 클래스의 메서드 중 자식 클래스에서 다르게 동작학 ㅔ해준다.
즉, 부모 클래서의 메서드와 '이름이 똑같은' 메서드를 자식 클래스에서 다시 정의하면된다.

  • 자식 클래스에 똑같은 이름의 메서드가 있다면, 자식이 취우선으로 실행된다.
class Animal:
    def sound(self):
        print("동물이 소리를 낸다")

class Dog(Animal):
    def sound(self):   # 부모랑 똑같은 이름의 메서드! (오버라이딩)
        print("멍멍!")

class Cat(Animal):
    def sound(self):   # 이것도 오버라이딩
        print("야옹!")

dog = Dog()
cat = Cat()

dog.sound()  # 멍멍!
cat.sound()  # 야옹!

private(비공개 속성/메서드)

클래스 안에 있는 변수(속성)나 함수(메서드)를 외부에서 막고 싶을 때 이름 앞에 밑줄 두 개를 붙임.

  • 클래스 안에서는 자유롭게 사용할 수 있는데 클래스 밖(외부)에서는 직접 접근이 막힌다.
  • 사실 완전히 숨기는 건 아니고, “이건 건드리지 마세요”라는 신호 + 실제로 직접 접근하면 에러가 난다.
    => 객체 지향 설계의 "캡슐화"를 위한 약속이다.
class Person:
    def __init__(self, name):
        self.__name = name   # private 속성

    def get_name(self):
        return self.__name

p = Person('산별')
# print(p.__name)  # 에러! (직접 접근 불가)
print(p.get_name())  # '산별' (getter 메서드로 접근)

사실 class고 뭐고 그냥 매일 술이나 푸데푸데 마시면서 살고싶습니다.
사실 그렇게 살고있음

다들 알콜길을 걸어라

0개의 댓글