IT_developers

Python 개념 및 실습 - 클래스(1) 본문

Python

Python 개념 및 실습 - 클래스(1)

developers developing 2022. 9. 11. 08:00

파이썬 클래스

  • 클래스를 꼭 필요로 하진않음.
  • 클래스를 만들어 놓으면 계속 불러서 쓸 수 있음
  • 안할 땐 변수로 가능

 

클래스 사용하지 않고 학생 3명의 정보

변수 사용해서 학생 3명 입력. 변수명이 중복 불가.

# 학생 1
student_name1 = "Kim"
student_number_1 = 1
student_grade_1 = 1
student_detail_1 = [{"gender": "male"}, {"score1": 97}, {"score2": 88}]

# 학생 2
student_name2 = "Park"
student_number_2 = 2
student_grade_2 = 2
student_detail_2 = [{"gender": "female"}, {"score1": 87}, {"score2": 96}]

# 학생 3
student_name3 = "Choi"
student_number_3 = 3
student_grade_3 = 3
student_detail_3 = [{"gender": "male"}, {"score1": 66}, {"score2": 78}]

# 변수 사용은 효율성이 떨어짐

print(
    "이름: %s, 학번 : %d, 학년 : %d, 학생정보 : %s"
    % (student_name1, student_number_1, student_grade_1, student_detail_1)
)
print(
    "이름: %s, 학번 : %d, 학년 : %d, 학생정보 : %s"
    % (student_name2, student_number_2, student_grade_2, student_detail_2)
)
print(
    "이름: %s, 학번 : %d, 학년 : %d, 학생정보 : %s"
    % (student_name3, student_number_3, student_grade_3, student_detail_3)
)

 

list : 서로 다른 내용도 한번에 담아서 처리 가능. 다양한 자료구조

student_name_list = ["Kim", "Park", "Choi"]
student_numbers_list = [1, 2, 3]
student_grade_list = [1, 2, 3]
student_details_list = [
    {"gender": "male", "score1": 97, "score2": 88},
    {"gender": "female", "score1": 87, "score2": 96},
    {"gender": "male", "score1": 66, "score2": 78},
]
print(student_name_list)
print(student_numbers_list)
print(student_grade_list)
print(student_details_list)

 

# Park 학생 정보 삭제

student_name_list = ["Kim", "Park", "Choi"]
student_numbers_list = [1, 2, 3]
student_grade_list = [1, 2, 3]
student_details_list = [
    {"gender": "male", "score1": 97, "score2": 88},
    {"gender": "female", "score1": 87, "score2": 96},
    {"gender": "male", "score1": 66, "score2": 78},
]

# 삭제

del student_name_list[1]
del student_numbers_list[1]
del student_grade_list[1]
del student_details_list[1]

# 출력

print(student_name_list)
print(student_numbers_list)
print(student_grade_list)
print(student_details_list)

 

# 특정 학생만 출력

student_name_list = ["Kim", "Park", "Choi"]
student_numbers_list = [1, 2, 3]
student_grade_list = [1, 2, 3]
student_details_list = [
    {"gender": "male", "score1": 97, "score2": 88},
    {"gender": "female", "score1": 87, "score2": 96},
    {"gender": "male", "score1": 66, "score2": 78},
]
 
print(student_name_list[0])
print(student_numbers_list[0])
print(student_grade_list[0])
print(student_details_list[0])

 

클래스

 

class Student():  # 괄호는 필수 아님
 
    #  __init__: 자동완성. 자바의 생성자와 같은 개념
    # self : 자바의 this와 같은 개념
 
    def __init__(self, name, number, grade, details):
        self.name = name
        self.number = number
        self.grade = grade
        self.details = details

# 객체 생성

student1 = Student("Kim", 1, 1, {"gender": "male", "score1": 97, "score2": 88})
student2 = Student("Park", 2, 2, {"gender": "female", "score1": 87, "score2": 96})
student3 = Student("Choi", 3, 3, {"gender": "male", "score1": 66, "score2": 78})
print(student1)
print(student2)
print(student3)

해당 객체에 포함된 16진수 값 출력. 주소값 출력
 
 

# toString()

class Student:
 
    def __init__(self, name, number, grade, details):
        self.name = name
        self.number = number
        self.grade = grade
        self.details = details

    #__str__ :  자바에서의 toString()개념
    def __str__(self):
        return "name : {}, number : {}, grade : {}, details : {}".format(
            self.name, self.number, self.grade, self.details
        )


# 객체 생성
student1 = Student("Kim", 1, 1, {"gender": "male", "score1": 97, "score2": 88})
student2 = Student("Park", 2, 2, {"gender": "female", "score1": 87, "score2": 96})
student3 = Student("Choi", 3, 3, {"gender": "male", "score1": 66, "score2": 78})
 
print(student1)
print(student2)
print(student3)

 

자바에서 클래스 
class Student{
                   private String name;
                   private int number;

              public Student(String name, int number...){
                  this.name = name;
              }

             public String toString(){
                 return "name : " + name..
             }
}

 멤버 변수 선언을 안해도 됨.
self 키워드를 붙임.

 

"""
설명글 작성 ==> 설명하는 글 불러서 쓸 수 있음
"""

인스턴스 메소드 : self 키워드가 필요, 멤버 변수 선언, 

# UserInfo 클래스

class UserInfo:
    """
    UserInfo class
    Author : 홍길동
    Date : 2022-05-26
    Description : 클래스 작성법
    """

    def user_info(self):
        print("메소드 실행")
# 객체 생성
user1 = UserInfo()

# 메소드 호출
user1.user_info()

 

#  생성자  : __init__ 사용

class UserInfo:
    """
    UserInfo class
    Author : 홍길동
    Date : 2022-05-26
    Description : 클래스 작성법
    """

    # 자바에서의 default 생성자와 동일
    def __init__(self) -> None:
        self.name = "홍길동"
        self.age = 25

    def user_info(self):
# def __init__(self) -> None: 하지 않으면 AttributeError: 'UserInfo' object has no attribute 'name'
        return "name : {}, age : {}".format(self.name, self.age)

user1 = UserInfo()
print(user1.user_info())

# Car 클래스 

class Car:
 
    # 멤버 변수
    color = ""
    speed = 0

    def upSpeed(self, value):
        self.speed += value

    def downSpeed(self, value):
        self.speed -= value


# 객체 생성
car1 = Car()
car1.speed = 0
car1.color = "Red"

car2 = Car()
car2.speed = 0
car2.color = "Blue"

car3 = Car()
car3.speed = 0
car3.color = "Yellow"

car1.upSpeed(30)
print("car1 색상 : {}, 속도 {}km".format(car1.color, car1.speed))

car2.upSpeed(100)
car2.downSpeed(20)
print("car2 색상 : {}, 속도 {}km".format(car2.color, car2.speed))

car3.upSpeed(40)
print("car3 색상 : {}, 속도 {}km".format(car3.color, car3.speed))

 

#  생성자  : __init__ 사용

class Car:
    """
    UserInfo class
    Author : 홍길동
    Date : 2022-05-26
    Description : 클래스 작성법
    """

    def __init__(self) -> None:
        self.color = "Red"
        self.speed = 0

    def upSpeed(self, value):
        self.speed += value

    def downSpeed(self, value):
        self.speed -= value


car1 = Car()

car2 = Car()
car2.speed = 0
car2.color = "Blue"

car1.upSpeed(30)
print("car1 색상 : {}, 속도 {}km".format(car1.color, car1.speed))

car2.upSpeed(100)
car2.downSpeed(20)
print("car2 색상 : {}, 속도 {}km".format(car2.color, car2.speed))

print(Car.__doc__)  # __doc__ : 주석 값 읽어옴. 값이 없다면 None 출력

 

클래스 변수 :  반드시 선언 필요,

호출시 : 클래스 이름. 클래스 변수 사용

class UserInfo:
    """
    UserInfo class
    Author : 홍길동
    Date : 2022-05-26
    Description : 클래스 작성법
    """
 
    user_cnt = 0
 
 
    def __init__(self, name, age) -> None:
        # self를 붙이면 객체가 개별로 가지고 있는 멤버 변수
        self.name = name
        self.age = age
        self.user_cnt += 1
    
    def user_info(self):
        return "name : {}, age : {}, user_cnt : {}".format(
            self.name, self.age, self.user_cnt
        )

 

# self ==> 클래스로 변경

class UserInfo:
    """
    UserInfo class
    Author : 홍길동
    Date : 2022-05-26
    Description : 클래스 작성법
    """

    user_cnt = 0

    def __init__(self, name, age) -> None:
        # self를 붙이면 객체가 개별로 가지고 있는 멤버 변수
        self.name = name
        self.age = age
        # self.user_cnt += 1
        # 클래스 변수 : class이름을 붙이면 static 과 같은 개념
        UserInfo.user_cnt += 1

    def user_info(self):
        return "name : {}, age : {}, user_cnt : {}".format(
            self.name, self.age, self.user_cnt
        )

 user_cnt = 0 ==> 막으면 에러 발생.

클래스 변수는 꼭 선언해야함.

 
 
class UserInfo:
    """
    UserInfo class
    Author : 홍길동
    Date : 2022-05-26
    Description : 클래스 작성법
    """

    user_cnt = 0

    def __init__(self, name, age) -> None:
     
        self.name = name
        self.age = age
        UserInfo.user_cnt += 1

    def user_info(self):
        return "name : {}, age : {}".format(self.name, self.age)

    def __del__(self):
        UserInfo.user_cnt -= 1


user1 = UserInfo("홍길동", 25)
user2 = UserInfo("성춘향", 26)

print(user1.user_info())
print(user2.user_info())

print("현재 생성된 User {}명".format(UserInfo.user_cnt))
 
 
 
class UserInfo:
    """
    UserInfo class
    Author : 홍길동
    Date : 2022-05-26
    Description : 클래스 작성법
    """

    user_cnt = 0

    def __init__(self, name, age) -> None:
        # self를 붙이면 객체가 개별로 가지고 있는 멤버 변수
        self.name = name
        self.age = age
        self.user_cnt
        # 클래스 변수 : class이름을 붙이면 static 과 같은 개념
        UserInfo.user_cnt += 1

    def user_info(self):
        return "name : {}, age : {}".format(self.name, self.age)

    def __del__(self):
        UserInfo.user_cnt -= 1


user1 = UserInfo("홍길동", 25)
user2 = UserInfo("성춘향", 26)

print(user1.user_info())
print(user2.user_info())

print("현재 생성된 User {}명".format(UserInfo.user_cnt))

# 객체 삭제

del user1  # __del__호출됨
print("현재 생성된 User {}명".format(UserInfo.user_cnt))

Comments