OOP (Object Oriented Programming)

객체 지향 프로그래밍

독립적인 객체들 간 메세지를 통해 프로그램을 구성

# 클래스 사용
# 클래스 Elephant()로부터 만들어진 Elephant 인스턴스(instance)
덤보 = Elephant()
코코리 = Elephant()

# . 멤버 접근 연산자
print(덤보.nose, 덤보.color)
print(코코리.nose, 코코리.color)
코코리.color = "하늘색" # 만들어진 인스턴스는 독립적이다!!
print(코코리.nose, 코코리.color)
print(덤보.nose, 덤보.color) 

# 함수 호출
덤보.cry()
코코리.cry()
덤보.eat()
코코리.eat()

길다 회색 길다 회색 길다 하늘색 길다 회색 뿌우웅 뿌우웅 500kg 먹는다 500kg 먹는다

# kernal에 Elephant클래스가 올라가 있다
# 새로 정의 -> 반영 X
덤보 = Elephant()
덤보.show_info()

코코리 = Elephant()
코코리.show_info()
코코리.color = "하늘색"
코코리.show_info()

코 : 길다, 색깔 : 회색 코 : 길다, 색깔 : 회색 코 : 길다, 색깔 : 하늘색

# 클래스 정의
class Elephant:
    # 멤버(member)
    # 멤버 변수 : 특징, 속성, 특성
    # 멤버 함수 : 함수, 기능, 동작, 작동, 행위, 메소드
    # 특징, 속성, 특성
    nose = "길다" # 코가 길다
    color = "회색" # 회색이다

    # self 키워드
    # 들여쓰기를 통해 class안의 멤버를 구분!!
    # self : 클래스 안에 있는 함수다!! -> self -> 위로 타고 가서 클래스를 찾아!!
    # 그 클래스 안에 있구나!! -> 클래스 자체를 호출!!
    # 클래스 안에 함수를 정의할 때 -> 첫 번째 parameter로 self를 쓰자
    # self는 클래스 안의 멤버에 접근할 때도 사용!!

    # 외부에서 show_info() 함수를 호출하면
    # 코 : 길다, 색깔 : 회색
    def show_info(self):
        print(f"코 : {self.nose}, 색깔 : {self.color}")
    
    # 기능, 동작, 작동
    def cry(self):
        print("뿌우웅") # 뿌우웅 울다
    def eat(self):
        print("500kg 먹는다") # 500kg 먹는다
# 은행 클래스!!
class Bank:
    # 접근 제한자 (Access Modifier)
    # 1. public : 누구나, 어디서든 접근 가능
    # 2. _protected : 상속, 같은 패키지 접근 가능
    # 3. __private : 같은 클래스 내에서만 접근 가능
    
    __money = 0
    def deposit(self, money):
        self.__money += money
    def withdraw(self, money):
        self.__money -= money
    def show_money(self):
        print(f"잔액 : {self.__money}원")
월급통장 = Bank()
월급통장.show_money()
월급통장.deposit(1000)
월급통장.show_money()
월급통장.__money = 10000
월급통장.show_money()

잔액 : 0원 잔액 : 1000원 잔액 : 1000원

나만의통장 = Bank()
나만의통장.deposit(1000)
나만의통장.withdraw(500)
나만의통장.show_money()

나만의통장.money = 2000000000 # 그동안 감사했습니다
나만의통장.show_money()

# 객체지향 프로그래밍 특징
# 추상화 (Abstraction)
# 개념, 객체 하나 얘기해주세요 -> 코끼리
# 코끼리 class -> 코끼리 대표적인 특징 추출

# 캡슐화 (Encapsulation)
# 외부에서 사용자가 접근하지 않아도 되는 것 -> 접근 제한적 허용

# 상속 (Inheritance)
# 다형성 (Polymorphism)
# VO(Value Object)
class Contact:
    # 생성자 (Constructor)
    # 멤버 변수 -> field
    # 개발자가 클래스로부터 생성한 인스턴스에
    # 해당 값들을 부여하지 않았을 때!
    # 에러 등을 방지하고자!!

    # __init__ 함수는 정의하지 않으면
    # 자동으로 기본 생성자가 호출!!
    def __init__(self, name, age, mbti):
        self.__name = name
        self.__age = age
        self.__mbti = mbti

    # getter 함수 (field를 return 함수!!)
    def get_age(self):
        return self.__age

    # setter 함수!! (field를 수정하는 함수!!)
    def set_age(self, age):
        self.__age = age

    # str 내장함수 : 해당 인스턴스명을 호출하면 return 반환!!
    def __str__(self):
        return f"이름 : {self.__name}, 나이 : {self.__age}세, MBTI : {self.__mbti}"
c4 = Contact("송강", 30, "ENFP")
c4.set_age(28)
c5 = Contact("유재석", 50, "ENFJ")
list_contact = [c4, c5]
result = 0
for c in list_contact:
    result += c.get_age()
print(result)

78

c4 = Contact("송강", 30, "ENFP")
print(c4)
c4.__name = "나예호" # name이 public
print(c4)
c4.set_age(28)
print(c4)

c4 = Contact("송강", 30, "ENFP") print(c4) c4.__name = "나예호" # name이 public print(c4) c4.set_age(28) print(c4)

list2 = [1, 2, 3, 4, 5]
print(list2)

print(c3)

[1, 2, 3, 4, 5] <main.Contact object at 0x0000027506D2EAF0>