2021. 7. 2. 16:34ㆍpython/파이썬
# 절차적 프로그래밍, 구조적 프로그래밍, 함수지향적 프로그래밍 - 함수 기반 언어
# 대표적으로 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__(self, name, dept, num, grade): # 함수 인자는 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__(self, name, dept, num, grade):
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__(self, name, dept) :
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(self, name) :
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__(self, name, dept) :
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(self, name) :
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__(self, name, dept) :
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(self, name) :
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 |