학습 정리 - 클래스와 객체 (2025.01.09)

수아·2025년 1월 9일
0

학습 정리

목록 보기
8/51
post-thumbnail

회고 리스트

1. 아래 코드를 참고 하여 금일 배운 AgeInfo 에 대한 메모리 그림을 그려보시오.

class AgeInfo: # 클래스 이름은 camel case
    def up_age(self):
        self.age += 1
    def get_age(self):
        return self.age
fa = AgeInfo() 		# AgeInfo : 클래스명 + ()함수 = AgeInfo() = (객체=인스턴스)생성자함수
fa.age = 39

[Class 영역]
AgeInfo
├── up_age() # 메서드 참조
└── get_age() # 메서드 참조

[Heap 영역 (Instance)]
fa
├── age: 39 # 인스턴스 변수
├── up_age() # 클래스의 메서드 참조
└── get_age() # 클래스의 메서드 참조

[Stack 영역]
fa → 객체 (Heap 영역의 fa를 참조)

2. self 란?

self 는 Python 클래스에서 인스턴스 자신을 가리키는 키워드이다.
메서드 호출 시 Python은 자동으로 self를 넘겨주기 때문에 self를 통해 인스턴스 변수와 메서드를 사용할 수 있다.

class AgeInfo:
    def set_age(self, age):
        self.age = age  # self.age는 인스턴스의 속성

    def get_age(self):
        return self.age  # self로 접근해야 인스턴스 변수 사용 가능

# 인스턴스 생성
person1 = AgeInfo()
person2 = AgeInfo()

# 각 인스턴스에 다른 값을 설정
person1.set_age(25)
person2.set_age(30)

print(person1.get_age())  # 25 출력
print(person2.get_age())  # 30 출력

3. 클래스와 객체에 대하여 설명하시오.

  • 클래스

    : 객체를 만들기 위한 설계도 또는 틀
    : 클래스 안에는 속성(변수)과 메서드(함수)가 정의된다.
  • 객체

    : 클래스를 기반으로 만들어진 실제 사용 가능한 인스턴스
    : 객체는 클래스에 정의된 속성과 메서드를 사용할 수 있다.

4. instance 변수에 대하여 설명하시오.

클래스에 의해 생성된 각 객체(인스턴스)에서 독립적으로 관리되는 변수
self를 사용해 생성되며, 인스턴스마다 서로 다른 값을 가질 수 있다.

5. 생성자 함수란?

생성자 함수는 객체가 생성될 때 자동으로 호출되는 초기화 메서드이다.
생성자 함수는 인스턴스 변수를 초기화하거나 필요한 값을 설정할 때 사용된다.
Python에서는 __init__( ) 메서드가 생성자 함수 역할을 한다.

class Car : 
	pass
    

car = Car() 	# Car옆에 있는 소괄호 -> 생성자 호출

클래스 이름 뒤에 괄호를 붙이는 것이 생성자를 호출하는 문법이다.
이때 Python 내부적으로 __new__( ) 메서드가 호출되어 객체를 생성하고 __init__( ) 메서드가 호출되어 객체를 초기화한다.

6. dir() 함수에 대하여 설명하시오.

객체가 가진 모든 속성과 메서드를 리스트 형태로 반환한다.
클래스나 인스턴스에 어떤 메서드가 있는지 확인할 때 사용된다.

n = 15
print(dir(n))
# 출력 : ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__',
'__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__',
'__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__',
'__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__',
'__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__',
'__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__',
'__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__',
'__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__',
'__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__',
'__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__',
'__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate',
'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']

7. 스페셜 메서드란?

특별한 기능을 수행하는 메서드로, 이름 앞뒤에 __(더블 언더스코어)__가 붙어 있다.
Python에서 특정 상황에서 자동으로 호출되는 메서드이다.
6번에서 출력 결과 중 앞뒤로 __ 가 붙은 메서드는 다 스페셜 메서드이다.

우리가 덧셈을 할 때 num1 + num2 이런 식으로 덧셈 기호(+)를 사용하지만 실제로는 __add__( ) 함수가호출된다.

8 init 함수의 용도는?

객체 생성할 때 인스턴스 변수를 초기화하거나 필요한 매개변수를 받아 초기 설정할 때 사용한다.

9. 국영수 를 입력 받아, 평균과 총점 ,성적을 출력 프로그램을 작성하시오

# 객체지향적으로(클래스 활용하여) 프로그램밍 하시오.
국어 점수 입력 : 80
영어 점수 입력 : 70
수학 점수 입력 : 60
총점 :  210
평균 :  70.0
학점 :  미
그만하시겠습니까? no
국어 점수 입력 : 80
영어 점수 입력 : 70
수학 점수 입력 : 60
총점 :  210
평균 :  70.0
학점 :  미
그만하시겠습니까? no
class Grade : 
    def __init__(self, kor, eng, math) :
        self.kor = kor
        self.eng = eng
        self.math = math

    def get_total(self) :
        return self.kor + self.eng + self.math
    
    def get_avg(self) : 
        return self.get_total() / 3
    
    def get_grade(self) : 
        avg = self.get_avg()
        grade = "가"

        if avg >= 90 : 
            grade = "수"
        elif avg >= 80 : 
            grade = "우"
        elif avg >= 70 : 
            grade = "미"
        elif avg >= 60 : 
            grade = "양"
        else : 
            grade = "가"
        
        return grade
    
def main() :
    while True : 
        kor = int(input("국어 점수 입력 : "))
        eng = int(input("영어 점수 입력 : "))
        math = int(input("수학 점수 입력 : "))

        grade = Grade(kor, eng, math)

        print("총점 :", grade.get_total())
        print("평균 : ", grade.get_avg())
        print("학점 :", grade.get_grade())

        continue_ys = input("그만하시겠습니까?")

        if continue_ys.upper() == "Y" or continue_ys.upper() == "YES" :
            break
        
main()

10.클래스 정의

비어있는 사람 (Human) 클래스를 "정의" 해보세요.

class Human:
    pass  # 클래스 내부에 아무 내용도 없을 때 사용

(pass : Python 문법상 클래스나 함수가 비어 있으면 오류가 발생하기 때문에 빈 블록을 표현할 때 사용)

11. 인스턴스 생성

사람 (Human) 클래스의 인스턴스를 "생성" 하고 이를 areum 변수로 바인딩해보세요.

class Human:
    pass  			# 비어 있는 클래스

areum = Human() 	# Human 클래스의 인스턴스 생성

print(type(areum))  # 출력: <class '__main__.Human'>

12 클래스 생성자-1

# 사람 (Human) 클래스에 "응애응애"를 출력하는 생성자를 추가하세요.
areum = Human()
응애응애
class Human:
    def __init__(self) : 
        print("응애응애")

# Human 클래스의 인스턴스 생성
areum = Human()

13. 인스턴스 속성에 접근

# 12번에서 생성한 인스턴스의 이름, 나이, 성별을 출력하세요.
# 인스턴스 변수에 접근하여 값을 출력하면 됩니다.
# 인스턴스 변수에 접근하여 값을 가져오는 예
이름: 조아름, 나이: 25, 성별: 여자
class Human:
    def __init__(self) :
        pass

areum = Human()

areum.name = "조아름"
areum.age = 25
areum.gender = "여자"

print(f"이름: {areum.name}, 나이: {areum.age}, 성별: {areum.gender}")

14 클래스 메소드 - 1

# 사람 (Human) 클래스에서 이름, 나이, 성별을 출력하는 who() 메소드를 추가하세요.
areum.who()
이름: 조아름, 나이: 25, 성별: 여자
areum.age
25
class Human:
    def who(self) : 
        print(f"이름: {self.name}, 나이: {self.age}, 성별: {self.gender}")
areum = Human()

areum.name = "조아름"
areum.age = 25
areum.gender = "여자"

areum.who()
print(areum.age)

15. 생성자

# Stock 클래스의 객체가 생성될 때 종목명과 종목코드를 입력 받을 수 있도록 생성자를 정의해보세요.
삼성 = Stock("삼성전자", "005930")
class Stock : 
    def __init__(self, name, code) : 
        self.name = name
        self.code = code

samsung = Stock("삼성전자", "005930")

print(f"종목명: {samsung.name}, 종목코드: {samsung.code}")
# 출력 : 종목명: 삼성전자, 종목코드: 005930

16 메서드

# 객체에 종목명을 입력할 수 있는 set_name 메서드를 추가해보세요.
a = Stock(None, None)
a.set_name("삼성전자")
class Stock : 
    def __init__(self, name, code) : 
        self.name = name
        self.code = code
    
    def set_name(self, name) : 
        self.name = name

a = Stock(None, None)
a.set_name("삼성전자")

print(f"종목명: {a.name}") 		# 출력: 종목명: 삼성전자

17 메서드

# 종목명과 종목코드를 리턴하는 get_name, get_code 메서드를 추가하세요.
# 해당 메서드를 사용하여 종목명과 종목코드를 얻고 이를 출력해보세요.
samsung = Stock("삼성전자", "005930")
class Stock : 
    def __init__(self, name, code) : 
        self.name = name
        self.code = code
    
    def set_name(self, name) : 
        self.name = name
    
    def get_name(self) : 
        return self.name
    
    def get_code(self) : 
        return self.code

samsung = Stock("삼성전자", "005930")
print("종목명 : " + samsung.get_name(), "종목 코드 : " + samsung.get_code())
# 출력 : 종목명 : 삼성전자 종목 코드 : 005930

18. 객체 생성

위에서 정의한 생성자를 통해 다음 정보를 갖는 객체를 생성해보세요.
항목 정보
종목명 삼성전자
종목코드 005930
PER 15.79
PBR 1.33
배당수익률 2.83

class Stock : 
    def __init__(self, name, code, PER, PBR, rate) : 
        self.name = name	# 종목명
        self.code = code	# 종목코드
        self.PER = PER		
        self.PBR = PBR		
        self.rate = rate	# 배당수익률
    
samsung = Stock("삼성전자", "005930", 15.79, 1.33, 2.83)

print(f"종목명: {samsung.name}")
print(f"종목코드: {samsung.code}")
print(f"PER: {samsung.PER}")
print(f"PBR: {samsung.PBR}")
print(f"배당수익률: {samsung.rate}")

19. 여러 종목의 객체 생성

# 아래의 표를 참조하여 3종목에 대해 객체를 생성하고 이를 파이썬 리스트에 저장하세요.
# 파이썬 리스트에 저장된 각 종목에 대해 for 루프를 통해 종목코드와 PER을 출력해보세요.
종목명	종목코드	PER		PBR		배당수익률
삼성전자	005930	15.79	1.33	2.83
현대차	005380	8.70	0.35	4.27
LG전자	066570	317.34	0.69	1.37
class Stock : 
    def __init__(self, name, code, PER, PBR, rate) : 
        self.name = name
        self.code = code
        self.PER = PER
        self.PBR = PBR
        self.rate = rate

    def get_name(self) : 
        return self.name
    
    def get_code(self) : 
        return self.code
    
    def get_PER(self) : 
        return self.PER
    
    def get_PBR(self) : 
        return self.PBR
    
    def get_rate(self) : 
        return self.rate
    
samsung = Stock("삼성전자", "005930", 15.79, 1.33, 2.83)
hyundai = Stock("현대차", "005380", 8.70, 0.35, 4.27)
lg = Stock("LG전자", "066570", 317.34, 0.69, 1.37)

business = [samsung, hyundai, lg]

for i in range(0, len(business)) : 
    print(f"종목명 : {business[i].get_name()}  종목코드 : {business[i].get_code()} PER : {str(business[i].get_PER())}")

20. 전역변수와 로컬변수에 대하여 설명하시오.

  • 전역변수 (Global Variable)
    : 함수나 클래스 바깥에서 선언된 변수
    : 프로그램 전체에서 접근 가능하다.
    : 모든 함수나 메서드에서 공통으로 사용되기 때문에 값을 공유할 수 있다.
    : 함수 내부에서 전역변수를 수정하려면 global 키워드를 사용해야 한다.
    : 프로그램 종료 시 메모리에서 해제된다.
    : 프로그램 전체에 영향을 주기 때문에 너무 많은 전역변수를 사용하면 코드가 복잡해지고 버그 발생 가능성이 높아진다.

  • 로컬변수 (Local Variable)
    : 함수나 메서드 내부에서 선언된 변수
    : 해당 함수 또는 메서드 안에서만 사용 가능하다.
    : 함수 호출이 끝나면 로컬변수는 메모리에서 사라진다.

우리가 많이 사용하는 for i in range(0, 10)에서 i도 로컬 변수이다.
for 루프 내부에서만 사용되는 변수이기 때문이다.
i는 반복문이 실행될 때만 메모리에 존재하고 반복문이 끝나면 더이상 사용되지 않는다.
Python에서는 함수 내부뿐만 아니라 for, while등의 반복문과 if 등의 블록 안에서 생성된 변수도 로컬 변수로 취급된다고 한다.

가능하면 함수 내부에서 로컬변수를 사용하고 필요할 경우 함수에 매개변수를 전달하여 값을 관리하는 것이 좋다.

세줄요약)
객체란 클래스를 메모리로 올린것이다.
self란 호출한 객체다.
객체지향 언어의 4대 특징은 상속, 다형성, 정보은닉,캡슐화 이다.

https://wikidocs.net/7030

0개의 댓글