객체지향적 프로그래밍, class

2021. 7. 2. 16:34python/파이썬

728x90

# 절차적 프로그래밍, 구조적 프로그래밍, 함수지향적 프로그래밍 - 함수 기반 언어

# 대표적으로 c 언어

# 해결해야 하는 문제를 기능단위로 세분화

# 하나의 기능을 다시 세부기능으로 나눠요.

# 그러다보면 더 이상 나눌 수 없는 단위 기능이 도출되는데 이를 우리가 배운

# 함수(function)형태로 구현

# Top down 방식, divide and conquer

# 프로그램의 분석과 설계가 쉽다. -> 코드로 작성하고 프로그램을 완성

# 프로그램의 구현시간이 짧다. -> 비용 절감

# 프로그램을 수정하기가 쉽지 않다. 재활용성이 떨어진다. => 유지 보수성이 좋지 않다.

# 1990년 들어오면서 인터넷이 보급 -> 사람들의 요구사항이 많아지기 시작.

# 프로그램의 수정 요청이 많아짐 -> 개발 비용보다 유지 보수 비용이 급격히 증가.

 

# 새로운 방식의 프로그래밍 방법을 필요로 함.

# "객체 지향 방식" 프로그램을 분석, 설계, 구현

# 유지보수성을 높일 수 있다.

# 프로그램을 설계하고 구현하는게 어렵다.(상대적) / (설계에 따라 사람마다 코드 짜는 방식의 차이가 큼 = 코드에 정답이 없다)

# 대표적인 언어 : Java, C++, C#

# 프로그램을 만드는(설계 및 구현하는) 기본적인 생각

# 내가 해결해야 하는 현실의 문제를 그대로 프로그램으로 표현

# -> 현실에서 발생하는 여러가지 수정 요소 또한 그대로 프로그램에 쉽게 수정이 가능..할 것이다!

# 프로그램을 구성하는 주체를 파악하고, 이 주체들 간의 DATA의 흐름에 초점을 맞춘다.

# 구성 요소에 초점을 맞추므로, 새로운 요구 사항이 발생하면 구성 요소를 추가하면 되는 방식

 

# 은행 프로그램

# 고객, 계좌, 은행 건물(지점), 은행원, 단말기, 테이블, 의자 etc...

# -> 꼭 필요한 구성요소(개인마다 다를 수 있다) : 고객, 계좌, 은행 건물(지점), 은행원, 단말기

 

# 우리가 해결해야 하는 문제를 구성하고 있는 구성요소를 프로그램적으로 표현

# 현실 세계에서 문제를 구성하고 있는 구성요소 => 개체(object)

# 프로그램적으로 문제를 구성하고 있는 구성요소 => 객체(object)

 

# 프로그램적으로 표현하기 위한 방법 => class

# class => 1. (현실 세계의) 객체(를 프로그래밍으로) 모델링의 수단

# 학생(대학생)이라는 개념을 프로그램적으로 모델링

# 학생이 가진 고유한 상태(학년, 학번, 재학/휴학, 학과, 학교, 키, 몸무게, 주소, 이름, ..."값")와 행위

# 개인 기준에 따라 필요한 구성요소만 정함.

# 상태(학년, 학번, 재학/휴학, 학과, 학교, 이름, ...) => 변수(instance variable)

# 행위(수업을 듣다, 수강신청하다, 공부하다, 시험을 보다...) => 함수(method)

 

class Student(object) : # class명은 관용적으로 첫 글자 대문자로 함.

                        # class 내부에 함수를 선언하기 위해, class 자체 함수 __init__ 부터 시작

                           instance(object)객체는 heap의 저장된 공간을 지칭.

    def __init__(selfnamedeptnumgrade): # 함수 인자는 self부터 시작한다.

        # name, dept, num, grade는 local variable이고 stack에 임시저장.

        # instance variable은 heap에 저장된다. (객체를 저장하기 위한 메모리)

        self.name = name # instance variable(class의 변수를 만들기 위한 방법)

        self.dept = dept # instance variable에 함수 인자(init 옆에 있는 지역변수)를 대입한다.

        self.num = num

        self.grade = grade

 

stu1 = Student('홍길동''CS''990101'4.0# class를 기반으로 instance(object)를 생성

                                           # __init__ 의 self를 제외한 함수 인자로 전달되는 값들.

stu2 = Student('박길동''철학''990102'3.5)

###################### 4일차 그림판 - 1 #########################

 

 


.은 dot operater(연산)라고 지칭하며 따라가라는 의미이다

reference는 주소값을 가지고는 위치 가르킨다

 

 

# 학생의 정보를 저장해보기

 

# 학생이 1명 있으면

stu_name = '홍길동'

stu-dept = 'CS'

stu_num = '990101'

stu_grade = 4.0

 

# 학생이 3명 있으면 복붙 or 

 

# list 이용

stu_name = ['홍길동''김길동''박길동']

stu_dept = ['CS''철학''수학']

# ...

# 여러 개의 정보를 처리하는데는 좋으나 index 제어가 필요

 

# class 이용이 적합하다 !!

 

class Student(object) :

    

    def __init__(selfnamedeptnumgrade):

        

        self.name = name

        self.dept = dept

        self.num = num

        self.grade = grade

 

stu1 = Student('홍길동''CS''990101'4.0)

stu2 = Student('박길동''철학''990102'3.5)

stu3 = Student('김길동''수학''990103'1.5)

 

## 자료 구조 관점에서의 class. instance 하나에 여러 개의 data type을 저장하는 새로운 data type

## Abstract Data Type(ADT)  --- C에서의 구조체

 

students = [] # 데이터를 정리할 list를 생성한다. list에는 data type 상관없이 들어갈 수 있다!

students.append(Student('홍길동''CS''990101'4.0)) # class 넣는 것 가능

 

## class 정리. ####

## 1. 객체모델링의 수단

## 2. instance를 만들어내는 수단

class의 2번째 의미는 객체묘사내용을 이용해서 instance를 만들어 낼수 있는 열할

## 3. ADT (새로운 data type을 만들어내는 수단)

 

a = 100

print(type(a)) # <class 'int'>

# class int(object) # 이 구조에 따라, a = 100은 int라는 클래스에 100이라는 object가 있는 것이다.

 

a = 3.14

result = int(a) # 이 구조도 마찬가지 a라는 object가 int라는 클래스의 init 함수를 통해 값이 변하는 것.

print(id(a)) # 이로 나오는 주소는 Heap 영역에 만들어진 instance의 시작 주소를 의미하는 것.

###################

 

# python은 하위 호환성이 없다.

# 객체 지향성 : 2.7 버전 (없음) 3.x 버전 (있음). 이 때문에 호환성이 없다.

# 3.x 버전부터는 객체 지향을 근간으로 프로그램 언어를 다시 디자인 한 것.

 

 

 

 

# python은 객체 지향 언어이다.(완전 객체 지향 x. 함수적 프로그래밍도 가능하다. -> a = 100이 가능한 이유)

 

# python에서 나오는 모든 것들은 "객체(intance, object)"

# Numeric, list, tupel, range, map, set, bool

 

# 객체는 class로부터 파생

# class 안에는 변수, 함수 (상태-변수, 행위-함수)가 있다.

# 객체도 변수(property), 함수(method)

 

class Student(object) :

 

    # method(정해져있는 특별한 일을 하는 method)

    def __init__(selfnamedept) :

        self.name = name # self.name : property

        self.dept = dept

        

    # method (property 제어하는 method) : 내가 사용하는 데이터와 method를 하나로 캡슐화 : incapsulation

    def get_student_info(self) : # self : 현재 instance(객체)의 reference(주소값)를 가짐

        메써드 처음에는 (self를 넣는다)

        print(self.name, self.dept) # -> 주소 값 내의 변수(property)를 제어할 수 있게 됨

 

    def set_stu_name(selfname) :

        self.name = name

        

stu1 = Student('홍길동''CS')

print(stu1.name) # property 제어

stu1.get_student_info() # method 호출 : 인자로 stu1이 가진 refrence가 self로 알아서 넘어가는 형태

# stu1.name = '최길동' # property를 변경(바로 변경가능 할 수 있는 것은 객체 지향 측면에서 바람직하지 않다.)

                      # 직접적인 제어로 오류가 발생할 여지가 많기 때문에

# stu1.set_stu_name('최길동') # 으로 바꾼다.

 

 

 

 

 

 

 

 

 

# 이쯤에서 내장함수를 하나 더 알아보자

# dir() : 객체가 가지고 있는 property와 method를 알려준다.

 

print(dir(stu1))

 

 

 

 

# python은 객체 지향면에서 맞지 않는 부분을 허용하는 부분도 있다.

 

class Student(object) :

 

    # method(정해져있는 특별한 일을 하는 method)

    def __init__(selfnamedept) :

        self.name = name # self.name : property

        self.dept = dept

        

    # method (property 제어하는 method) : 내가 사용하는 데이터와 method를 하나로 캡슐화 : incapsulation

    def get_student_info(self) : # self : 현재 instance(객체)의 reference(주소값)를 가짐

        print(self.name, self.dept) # -> 주소 값 내의 변수(property)를 제어할 수 있게 됨

 

    def set_stu_name(selfname) :

        self.name = name

        

stu1 = Student('홍길동''CS')

 

# 위 class에서 보이는 직접 만든 method = 2개, property = 2개

# 당연히 class 안에 존재하는 property와 method만 이용할 수 있는데

stu1.address = '서울' # 객체 지향 관점에서 오류인 코드이지만 python에서는 허용된다.

print(stu1.address) # 프로그래밍의 유연성을 제공 : 동적 property, method를 허용한다.

                    # 그런데 이 때문에 property 직접 제어가 막히지 않는다.

 

 

 

class Student(object) :

 

    schoalship_rate = 3.5 # property, class variable - class 전체에 쓰이는 변수

    

    def __init__(selfnamedept) :

        self.name = name # self.name : property, instance variable - class 내부 함수에 쓰이는 변수

        self.dept = dept

        

    def get_student_info(self) : # method, instance method - self를 가지는 method

        print(self.name, self.dept)

 

    def set_stu_name(selfname) :

        self.name = name

        

stu1 = Student('홍길동''CS')

 

# __init__ : 객체가 생성될 때 자동으로 호출되고 instance를 self라는 인자로 받아서

#            일반적으로 property를 초기화 할 때 사용된다.

#            => initializer (자바, c++의 constructor(생성자) 역할)

 

# class 내부에 property와 method가 존재하게 되는데

#property는 크게 instance variable(=self)과 class variable(=def 위 변수)로 나뉘어져요

 

 

 

 

 

 

# 프로그래밍 문제 3개 
# 1번문제 정답 : 233168
# 2번문제 정답 : 4613732
# 3번문제 정답 : "This is a sample Program mississippi river" => i
#               "abcdabcdababccddcd" => c

## 문제 4.
## 어떤 수를 소수의 곱으로만 나타내는 것을 소인수분해라 하고, 
## 이 소수들을 그 수의 소인수라고 합니다.
## 예를 들면 13195의 소인수는 5, 7, 13, 29 입니다.

## 600851475143의 소인수 중에서 가장 큰 수를 구하세요.




## 문제 5.
## 앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 
## 같은 수를 대칭수(palindrome)라고 부릅니다.

## 두 자리 수를 곱해 만들 수 있는 대칭수 중 
## 가장 큰 수는 9009 (= 91 × 99) 입니다.

## 세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수를 구하세요


## 문제 6.
## 1 ~ 10 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 2520입니다.
   
## 그러면 1 ~ 20 사이의 어떤 수로도 나누어 떨어지는 가장 작은 수는 얼마입니까?

 

 

 

 

## 문제 2.
## 피보나치 수열의 각 항은 바로 앞의 항 두 개를 더한 것이 됩니다. 
## 1과 2로 시작하는 경우 이 수열은 아래와 같습니다.

## 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
## 짝수이면서 4백만 이하인 모든 항을 더하면 얼마가 됩니까?

fibo = [1, 2]
for i in range(2,32):  # 여기서 4백만 제한하는 것....
    fibo.append(fibo[i-1]+fibo[i-2])
# print(fibo)

result = 0
for n in fibo:
    if n % 2 == 0:
        result += n
print(result)

문제.5
## 문제 5.
num_dic = {}
for i in range(100,1000):
    for j in range(100,1000):
        num_dic[i*j] = int(''.join(reversed(str(i*j))))
# print(num_dic)

num_list = []
for key, value in num_dic.items():
    if value == key:
        num_list.append(key)
num_list.sort()
# print(num_list)
print(f'최댓값 : {max(num_list)}')

 

 

'python > 파이썬' 카테고리의 다른 글

pip, 예외처리, 파일열기  (0) 2021.07.13
class 02, 일급함수, modul 뜻  (0) 2021.07.07
반복문, 함수,람다  (0) 2021.07.01
파이썬 함수 모음  (0) 2021.07.01
시퀀스, set, bool, mapping  (0) 2021.06.30