[python]_클래스(1)

Hi K·2022년 10월 17일
0

파이썬기초

목록 보기
11/12

object oriented programming

객체 지향 프로그래밍

구조체(structure)

클래스 이전에 구조체를 먼저 공부하는 이유는 클래스가 C언어 구조체에서 확장된 개념이기 때문입니다.
구조체란 배열과는 달리 인덱스가 아닌 "변수명"으로 특정 대상을 프로그래밍적으로 묘사하기 위해 사용합니다.

- 파이썬은 구조체가 없지만 이해를 위해서 참고

추상화

추상화는 대상을 간단하게 표현하는 것을 의미합니다.
이를테면 사람을 만약 컴퓨터적으로 표현한다면 원래대로라면 표현해야하는 요소가 너무 많습니다.
그렇지만 프로그램적으로 표현 요소를 줄이고 줄여서 필수적인 요소만 표현하는 것이 개발에 유리하기에 추상화를 하게 됩니다.

추상화 예시

고양이의 요소 : 털색, 수염모수, 몸무게, 품종, 이름, 나이, 좋아하는 간식, 주인, 집, 성별, 건강상태, 점프력, 울음소리, 발톱길이...

동물병원에 등록하는데 주인, 이름, 나이, 품종만 등록하기로 합니다.
개발시에는 개발자가 고려할 수 있는(혹은 기능이 요구하는 최소한의) 사항만을 정의합니다.

(참고)
<변수로 나누는 분류>
동적 변수 언어 - 변수자료형을 정하지 않아서 넣고 싶은 자료형을 마음껏 넣을 수 있음
정적 변수 언어 - 변수자료형을 정해서 선언하면 그때부터는 선언한 자료형으로만 저장할수 있음
(동적변수)
name = "가나다하"
name = 5
(정적변수)
String name = "쥬라기";
int a = 5;
int name = 5;----->(error :이미 String으로 정의했기 때문)

# 클래스(구조체) 구현 문법
# 클래스는 일종의 설계도이다 실제로 변수를 생성하기 전까지는 작동하지 않는다
# (파이썬과 자바는 클래스 선언시 파스칼케이스(맨 앞글자만 대문자)로 해준다)
class Cat:
    name = ""
    age = 0
    cat_type = ""
    owner = ""
    
# 실제로는 생성을 해 줘야 기능합니다.
# cat1은 클래스의 객체, 클래스의 instance라고 함
cat1 = Cat()
cat2 = Cat()
print(cat1)
print(cat2)
cat1.name = "룰루"
cat1.age = 2
cat1.cat_type = "스코티시 폴드"
cat1.owner = "유재석"

cat2.name = "랄라"
cat2.age = 4
cat2.cat_type = "코숏"
cat2.owner = "박명수"

print(cat1.name)
print(cat2.name)
class Player:
    name = ""
    skill = ""
    age = 0
    weight = 0
    height =0

player1 = Player()
player2 = Player()

player1.name = "아이유"
player1.skill = "low kick"
player1.weight = 55
player1.height = 164

player2.name = "수지"
player2.skill = "hook"
player2.weight = 56
player2.height = 165

구조체와 전용 함수

위에서 cat에 대한 정보를 기입했을때 하나하나 print() 구문으로 이름과 나이, 품종을 조사해야해서 불편합니다.
이럴때 함수를 선언해두면 편하게 조회할 수 있습니다.

# cat을 한마리 더 만들어주세요.
# 이름, 나이, 주인, 품종까지 모두 기입해주세요

cat3 = Cat()
cat3.name = "마루"
cat3.age = 2
cat3.cat_type = "샴"
cat3.owner = "집사"

print("이름 : %s, 나이 : %s, 품종 : %s, 주인 : %s" %
        (cat3.name, cat3.age, cat3.cat_type, cat3.owner))

# Cat 자료형의 전용 함수
def show_cat_info(cat):
    print("이름 : %s, 나이 : %s, 품종 : %s, 주인 : %s" %
         (cat.name, cat.age, cat.cat_type, cat.owner))
    
def show_cat_info(a):
    print("이름 : %s, 나이 : %s, 품종 : %s, 주인 : %s" %
         (a.name, a.age, a.cat_type, a.owner))
# 변수명을 cat으로 해도되고 a로 해도된다. 위아래만 맞춰주면 된다. 정보를 나타내도록 cat으로 써주는 편이 좋다

show_cat_info(cat3)

# cat 전용인지 비교할 수 있도록 dog를 선언하겠습니다.
class Dog:
    name = ""
    age = 0
    dog_type = ""
    address = ""
    
dog1 = Dog()
dog1.name = "몽구"
dog1.age = 6
dog1.dog_type = "믹스"
dog1.address = "시흥 오이도"

show_cat_info(dog1)
# 이름이 같으면 dog를 집어넣어도 걸러내지 못함
# name, age는 자료 꺼내오고 cat_type에서 에러나는 이유

여러분들이 아까 임의로 만든 클래스 관련

해당 클래스를 이용해 생성한 변수(객체)의 정보를 콘솔에 찍을 수 있는
전용 함수를 생성하고 실제로 사용까지 해주세요
제출은 함수 코드와 클래스 및 객체 생성코드를 캡쳐하거나 복붙해주시면 됩니다.

class Player:
    name = ""
    skill = ""
    weight = 0
    height =0

player1 = Player()
player2 = Player()

player1.name = "아이유"
player1.skill = "low kick"
player1.weight = 55
player1.height = 164

player2.name = "수지"
player2.skill = "hook"
player2.weight = 56
player2.height = 165

def show_player_info(player):
    print("이름 : %s, 기술 : %s, 체중 : %s, 신장 : %s" %
         (player.name, player.skill, player.weight, player.height))
    
show_player_info(player1)




show_player_info(player)함수에서 player1의 주소값인 200번지로 찾아가 힙에서 값을 가져와 출력하고 출력을 마치면 스택에 할당된 공간은 사라진다.


메서드

특정 구조체 전용 함수를 외부에 선언할 필요가 있는가?

특정 구조체에서만 사용할 함수를, 굳이 외부에 빼서 혼란을 야기할 필요가 없다는 결론을 내렸습니다.
그래서 클래스에서는 변수와 함께 함수를 같은 소속을 선언합니다.
이렇게 클래스 내부에 선언된 함수를 가리켜 메서드라고 부릅니다.

class Computer:
    cpu = ""
    ram = 0
    ssd = 0
    
    # 메서드는 기본적으로 대부분의 경우 self를 파라미터로 선언해주셔야합니다.
    def get_info(self):
        print("cpu : %s, ram : %sGb, sse : %sGb" % (self.cpu, self.ram, self.ssd))
        
# 컴퓨터 객체를 생성하고, cpu, ram, ssd에 임의의 값을 지정해주신다음 
# 메서드 호출로 콘솔에 정보를 찍어주세요.
co1 = Computer()

co1.cpu = "AMD라이젠7세대"
co1.ram = 32
co1.ssd = 500

co1.get_info()

<과제>
여러분들이 직접 "클래스"를 만들어주시고

조회메서드를 하나 생성해주세요.
그리고 메모리 구조를 그려서 슬랙에 캡쳐 제출해주시면 됩니다.

class Developer:
    name = ""
    ranguage = ""
    age = 0
    
    def get_info(self):
        print("이름 : %s, 사용언어 : %s, 나이 : %s" % (self.name, self.ranguage, self.age))
        
dev1 = Developer()
dev2 = Developer()

dev1.name = "유재석"
dev1.ranguage = "python"
dev1.age = 24

dev2.name = "정준하"
dev2.ranguage = "java"
dev2.age = 24

dev2.get_info()

profile
파이썬초짜의 기록

0개의 댓글