Class (1)

Grace Goh·2022년 9월 23일
0

Python

목록 보기
22/24

객체지향 프로그래밍 OOP


객체지향 이론의 개념

실제 세계는 사물(객체, object)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다. 이 개념을 이용하여 코드 간에 서로 관계를 맺어줌으로써 보다 유기적으로 프로그램을 구성할 수 있다.

Class를 사용하는 이유

  1. 대상(object)을 객체화할 수 있다.
  2. 코드 재사용성이 높다... 상속, 중복 방지, 성능 향상.
  3. 프로그램 개발과 유지보수에 드는 시간, 비용을 최소화할 수 있다.

# 절차지향
dog1 = {'vaccine' : 'covid19'
		'name' : 'Happy'
        'age' : 10
        }
         
dog2 = {'vaccine' : 'covid19'
		'name' : 'Rafael'
        'age' : 37
        }

dog3 = {'vaccine' : 'covid19'
		'name' : 'Sunflower'
        'age' : 35
        }
        
dog4 = ...

코드를 바꿔야 할 경우, n개를 정직하게 일일이 바꿔줘야 한다.

# 객체지향
class Dog:
	vaccine = 'covid19'
    
	def __init__(self, dogname, dogage):
    	self.name = dogname
        self.age = dogage 

dog1 = Dog("Happy", 10)
dog2 = Dog("Rafael", 37)
dog3 = Dog("Sunflower", 35)

설계도/틀을 바꿔줌으로써 전체를 동시에 바꿀 수도 있다.
ex 클래스 변수 vaccine에 '광견병'을 추가한다.



클래스 선언

다음 3가지 방법 모두 가능하다.

class Dog:
class Dog():
class Dog(object): # 모든 클래스는 object를 상속 받는다.

class Dog:
    pass

클래스, 객체, 인스턴스 ⭐

class Dog:
    vaccine = 'covid19'

    def __init__(self, dogname, dogage): # 초기화
        self.name = dogname 
        self.age = dogage

print(Dog)
# <class '__main__.Dog'>
  • 클래스 : '개 설계도'

  • 객체(object) : 우리가 구현할 대상인 '개'

  • 인스턴스 : 설계도로 찍어낸 각각의 개들. ex 해피, 대랑이, 순돌이.. 등
    인스턴스가 객체에 포함된다.



클래스 속성, 인스턴스 속성

# 예제1
class Dog:

	# 클래스 속성
    vaccine = 'covid19'
    
    def __init__(self, dogname, dogage):
    	# 인스턴스 속성
    	self.name = dogname 
        self.age = dogage   

# '인스턴스'화
dog1 = Dog("Happy", 10)
dog2 = Dog("Rafael", 37)
dog3 = Dog("Sunflower", 35)
dog4 = Dog("Happy", 10) 

클래스 속성

  • (클래스 내) 모두가 공유하는 속성
  • 클래스 변수 : 직접 접근 가능

인스턴스 속성

  • 각각의 강아지들은 name과 age가 모두 다르다. (각각 다른 속성)
  • (클래스 속성이 '공용 거실'이라면) 인스턴스는 '내 방', '네 방' 등 각자 방
  • 인스턴스 변수 : 앞에 self가 붙은 변수. 객체마다 별도로 존재. 직접 접근 불가.

인스턴스화

  • dog1과 같이 변수를 할당 받아 메모리에 올라갈 때 (id값을 갖게 될 때)
    설계도를 바탕으로 구현된 것을 '인스턴스화' 되었다고 한다.

  • 인스턴스화 해서 변수가 생성된 객체들은 각각 다른 객체로 간주한다.

    • dog1 ~ dog4는 모두 다른 객체다.

    • dog1dog4는 둘 다 이름이 '해피'이고 나이가 10살로 같기 때문에 같은 강아지라 생각할 수 있지만, 우리집 말티즈 해피(10)와 공원에서 만난 푸들 해피(10)는 (아무리 이름과 나이가 같더라도) 다른 강아지다.

print(dog1 == dog4)
# False


print(id(dog1), id(dog2), id(dog3), id(dog4))
# 2881701779344 2881701972864 2881701638448 2881702011280, id 값이 모두 다르다.

# 인스턴스 속성 확인
print('{} is {} and {} is {}.'.format(dog1.name, dog1.age, dog2.name, dog2.age))


if dog1.vaccine == 'covid19':
    print('{0} is {1}.'.format(dog1.name, dog1.age))

dog1 ~ dog4로 인스턴스화 했기 때문에 접근이 가능한 것이다.

# 직접 접근이 가능할까?
print(Dog.vaccine) # class로 바로 접근 가능

print(dog1.vaccine) # 인스턴스로도 접근 가능
print(dog3.vaccine)
# covid19
# covid19
# covid19

print(Dog('Rafael', 37))
# <__main__.Dog object at 0x0000025F54582340>

.__dict__ 네임스페이스

객체를 인스턴스화 하고 나면 ('해피' 생성)
'각자 방'이 지닌 속성attribute들을 {딕셔너리} 형태로 확인할 수 있다.

print('개1', dog1.__dict__)
print('개2', dog2.__dict__)
# 개1 {'name': 'Happy', 'age': 10}
# 개2 {'name': 'Rafael', 'age': 37}
profile
Español, Inglés, Coreano y Python

0개의 댓글