[Django] 장고 기초

MINJEE·2023년 12월 13일

SMHRD_7_Django

목록 보기
1/8
post-thumbnail

◉ 통신을 위해 A 와 B 사이에서 필요한 정보

IP (Internet Protocol Address)

: 컴퓨터 네트워크에서 장치들이 서로 통신하기 위해 사용하는 고유한 주소
  • 4byte 정수로 표현 (보통 1byte.1byte.1byte.1byte 형태로 작성)
  • 각 1byte : 8bit 양의 정수
    • 2진수로 00000000 ~ 11111111
    • 16진수로 0~FF
    • 10진수로 0~255
  • 각 바이트는 0~255.0~255.0~255.0~255로 표현되며 다섯개의 그룹으로 구성
  • 자신의 컴퓨터를 가리키는 loop back 주소 (localhost) : 127.0.0.1
  • cmd(커맨드 프롬프트)에서 ipconfig명령어로 공유기가 부여한 가상 IP주소 확인 가능
  • 실제 외부 IP주소 는 구글에 "내아이피" 검색 시 가장 위의 사이트에서 확인 가능


MAC Address

: 물리적인 주소, LAN 카드에 할당되는 주소
  • 전세계에서 고유한 주소
  • 16진수 6개로 표현
  • cmd에서 ipconfig/all 명령어로 확인
    (맥의 경우, 설정-네트워크-고급 에서 wifi-MAC주소 로 확인 가능)

PORT

: 컴퓨터 네트워크에서 프로세스를 식별하기 위해 사용되는 숫자
  • IP주소는 컴퓨터를 식별하고, port는 프로그램을 식별 (내가 만나야할 프로그램이 무엇인지)
  • 1~65535 사이 숫자로 지정
  • 특정 포트 번호틑 특정 프로토콜이나 서비스에 할당되어 있음
  • 일반적으로, 0~1023까지의 포트 번호는 잘 알려진 포트(Well-Known Ports)로, 특정 프로토콜이나 서비스에 예약되어 있음
    • 예를 들어, 웹사이트의 경우 http나 https 프로토콜을 사용하며, 포트번호 80 사용
  • 1024~49151까지의 포트 번호는 등록된 포트(Registered Ports)로, 특정 애플리케이션이나 서비스에 할당될 수 있음
    • 예를 들어, 포트 번호 3306은 MySQL데이터베이스 서비스에 할당되어 있고, 8000포트는 장고 프레임워크에서 사용하는 개발 서버에 할당되어 있음
  • 49152~65535까지의 포트 번호는 동적 또는 프라이빗 포트(Dynamic or Private Ports)로, 일반적으로 애플리케이션이나 서비스가 필요에 따라 임시로 사용할 수 있는 범위
  • 포트 번호는 IP 주소와 함께 사용되어 특정 프로세스나 애플리케이션을 식별하고, 데이터 통신을 가능하게 함



◉ 알아두면 좋은 파이썬 코드

함수

함수의 매개변수에 기본값을 할당하면 함수를 여러가지 방법으로 다양하게 호출 가능

def myfunc(a=1, b=2, c=3):
	return a+b+c

print(myfunc()) # 1 + 2 + 3
print(myfunc(10)) # 10 + 2 + 3
print(myfunc(10,20)) # 10 + 20 + 3
print(myfunc(10,20,30)) # 10+ 20 + 30
print(myfunc(b=100)) # 1 + 100 + 3
print(myfunc(c=100, b=200)) # 1 + 200 + 100
  • 매개변수에 변수를 지정해주면 순서 상관x, 지정해주지 않으면 앞에서부터 하나씩 할당

람다

람다(lamda)는 1줄짜리 쓰고 버리는 함수

  • 메모리 항상 차지x
  • 1줄만 가능
  • lambda 매개변수들 : 처리코드
add = lambda x,y: x+y
print(add(4,5))   # 함수(def)를 사용할 때보다 간결

필터

함수(첫번째 매개변수)를 리스트(두번째 매개변수)에 요소마다 한번씩 호출

  • 함수는 매개변수가 하나이고, 반환값이 True/False
  • True인 것만 반환해줌
  • filter(함수, 리스트)
nums = [4,23,2,11,15,41,7,9,12]

def even(x):
	if x%2 == 0 :
		return True
	else:
		return False
evenList = list(filter(even, nums))
# filter의 함수부분을 lambda로 사용가능
evenList = list(filter(lambda x: x%2==0, nums))

축약

  • 기존의 리스트를 이용하여 새로운 리스트를 생성하는 방법
  • 일반적으로 for반복문과 조건문을 사용하여 축약된 리스트 생성
  • [변수명 for 변수명 in 반복자]
  • [변수명 for 변수명 in 반복자 if 조건식] : 조건을 만족하는 경우만을 포함하는 리스트 생성
evenList = [x for x in nums if x%2==0] # nums에서 짝수인 것만 리스트에 저장

복사(copy)

  • 변수 공간(stack), 데이터 공간(heap)은 따로따로 → 변수는 데이터 공간의 첫번째 요소만 가리키고, 데이터 공간 내 각 요소는 다음 요소를 가리킴

  • 얕은 복사(soft copy) : 참조(원본 객체의 주소)만 복사

    • 같은 데이터 공간을 가짐
    • 새로운 변수와 원본 객체는 같은 주소를 참조하므로, 하나의 객체를 가리킴
    • 원본 객체나 복사된 객체 중 하나를 수정하면 다른 객체에도 영향을 끼침
    nums = [1,3,2,4,5,8,10,11,13,19,22,27]
    
    nums2 = nums # 객체 복사 (얕은 복사, 참조만 복사)
    nums2[0] = 100
    
    print(nums) ##[100, 3, 2, 4, 5, 8, 10, 11, 13, 19, 22, 27]
    print(nums2) ##[100, 3, 2, 4, 5, 8, 10, 11, 13, 19, 22, 27]
    # nums와 nums2는 결과 동일
  • 깊은 복사 : 원본 객체의 주소뿐만 아니라, 내부 요소들까지 모두 복사

    • 새로운 독립적인 객체를 생성하는 방식
    • 새로운 변수를 생성하고 요소를 하나하나 옮겨야함 → 축약을 이용하면 편리
    • 한 쪽을 수정해도 다른 쪽에는 영향을 주지 않음
    • 축약을 이용하거나 copy.deepcopy()를 이용하여 깊은 복사
    nums = [1,3,2,4,5,8,10,11,13,19,22,27]
    
    nums3 = [num for num in nums] # 축약을 이용한 깊은 복사
    nums3[0] = 5
    
    # 또는
    # import copy
    # nums3 = copy.deepcopy(nums) # copy라이브러리를 이용한 깊은 복사
    
    print(nums) ##[100, 3, 2, 4, 5, 8, 10, 11, 13, 19, 22, 27]
    print(nums3)## [5, 3, 2, 4, 5, 8, 10, 11, 13, 19, 22, 27]
    # nums와 nums3는 다른 결과 

클래스

  • 관련있는 데이터(속성)와 함수(메서드)의 집합
  • 클래스는 메모리를 갖지 않음 ⇒ 객체를 생성해야만 메모리 확보
  • self : 인스턴스 자체를 가리키는 매개변수
    • 객체 자신에 대한 참조
    • 클래스 내부 함수의 첫번째 매개변수
  • __init__ : 초기화 메서드
    • 이름이 __init__으로 정해져 있음
    • 사용자가 만들고 시스템이 호출
    • 객체가 생성될 때 필요한 초기 작업을 수행
  • 클래스 내부에 동일한 이름의 함수 생성 불가
  • __name__ : 모듈의 이름을 나타내는 내장 변수
    • 각 모듈에 내장되어 있음
    • 모듈이 직접 실행되었을 때와 다른 모듈에서 임포트되었을 때의 동작을 구분하기 위해 사용
    • 직접 실행될 때는 __name__변수는 문자열 "__main__ "으로 설정
    • 다른 모듈에서 임포트될 때는 __name__변수는 해당 모듈의 이름으로 설정
  • 클래스객체명 = 클래스명(파라미터들) : 객체 생성
  • 클래스객체명.함수명() : 클래스 내의 함수 실행 (클래스 객체 생성 후 가능)
  • 클래스객체명.속성명 : 클래스 내의 속성 접근 (클래스 객체 생성 후 가능)

예시 : 주급 계산 클래스

# SalaryData.py

class Salary:
	# 초기화 메서드
	def __init__(self, name='홍길동', hourlySalary = 20000, workingHours=30):
		self.name = name
        self.hourlySalary = hourlySalary
        self.workingHours = workingHours
        self.process() # 객체 생성 시 자동 주급계산

	# 주급 계산 메서드
	def process(self): 
		self.weeklyWage = self.hourlySalary * self.workingHours
	
    # 문자열로 출력하는 메서드
	def toString(self):
		return f"{self.name} - 시간당급여액:{self.hourlySalary}원, 근무시간:{self.workingHours}시간 => 주급:{self.weeklyWage}원"

print(__name__) # 이 파일을 직접실행할 때는 __main__ 출력
				# 다른 파일에서 이 파일을 import하고 실행하면 SalaryData (해당 모듈 이름) 출력

s1 = Salary('김민지',11000,15) # 객체 생성
print( s1.toString() ) # 출력 : 김민지 - 시간당급여액:11000원, 근무시간:15시간 => 주급:165000원

예시 : 데이터 추가/검색/수정/삭제 클래스

# SalaryManager.py

from SalaryData import Salary # SalaryData.py에서 만든 Salary 클래스를 import

class SalaryManager:
	dataList = list() # 빈 리스트
    
    # 초기화 메서드 (기본값으로 4개의 데이터를 빈 리스트에 추가)
    def __init__(self): 
    	self.dataList.append(Salary('김민지',11000,15))
    	self.dataList.append(Salary('이호준',18000, 20))
        self.dataList.append(Salary('김윤정',20000,30))
        self.dataList.append(Salary('김동현', 15000, 15))
    
    # 데이터 목록 출력 메서드
    def output(self):
    	for data in self.dataList:
        	print(data.toString())
    
    # 데이터 추가 메서드
    def append(self):
    	data = Salary() # 추가할 객체 생성
        # input()으로 생성한 객체의 데이터 입력받기
        data.name = input('이름 : ') 
        data.hourlySalary = int(input('시간당 급여 : '))
        data.workingHours = int(input('근무시간 : '))
        data.process() # 주급계산
        # 목록에 추가
        self.dataList.append(data)
    
    # 데이터 검색 메서드
    def search(self):
    	# 검색할 이름 입력받기
    	name = input('검색할 이름 : ') 
        # 데이터 목록에서 이름일치하는 데이터들의 리스트 생성
        resultList = list(filter(lambda x: x.name==name, self.dataList))
        # 일치하는 데이터가 없는 경우, 검색 종료
        if len(resultList) == 0:
        	print(name + '을 찾을 수 없습니다.')
        	return # 여기서 데이터 검색 메서드 종료 (꿀팁 : 에러일 때 return 사용하기)
        # 일치하는 데이터가 있는 경우, 출력
        for data in resultList:
        	print(data.toString())
    
    # 데이터 수정 메서드
    def modify(self):
    	name = input('수정할 이름 : ')
        resultList = list(filter (lambda x:x.name==name, self.dataList))
        # 일치하는 데이터가 없는 경우, 수정 메서드 종료
        if len(resultList) == 0:
        	print(name + '을 찾을 수 없습니다.')
            return
        # 일치하는 데이터가 있는 경우, 수정할 데이터 입력받기
        data = resultList[0] # 첫번째 데이터만 수정 가능..!
        data.name = input('새로운 이름 : ')
        data.hourlySalary = int(input('시간당 급여 : '))
        data.workingHours = int(input('근무시간 : '))
        data.process() # 주급계산
        
    # 데이터 삭제 메서드
    def delete(self):
    	name = input('삭제할 이름 : ')
        resultList = list(filter (lambda x:x.name==name, self.dataList))
        # 일치하는 데이터가 없는 경우, 삭제 메서드 종료
        if len(resultList) == 0:
        	print(name + '을 찾을 수 없습니다.')
            return
        # 일치하는 데이터가 있는 경우, 첫번째 데이터 삭제
        self.dataList.remove(resultList[0])
    
    # 데이터를 주급 기준으로 내림차순 정렬 메서드
    def sort(self):
    	sortList = sorted(self.dataList, key=lambda x:x.weeklyWage, reverse=True)
        for data in sortList:
        	print(data.toString())
    
    # 메뉴 보여주는 메서드
    def menuDisplay(self):
    	print('1 : 목록 출력')
        print('2 : 추가')
        print('3 : 검색')
        print('4 : 수정')
        print('5 : 삭제')
        print('6 : 정렬')
        print('0 : 종료')
    
    # 시작(메뉴 선택) 메서드
    def start(self):
    	while True:
        	# 메뉴 보여주기
        	self.menuDisplay()
            # 메뉴 선택 입력받기
            sel = input('선택 : ')
            
            if sel == '1':
            	self.output() # 데이터 출력 메서드 실행
            elif sel=='2':
                self.append() # 데이터 추가 메서드 실행
            elif sel=='3':
                self.search() # 데이터 검색 메서드 실행
            elif sel =='4':
                self.modify() # 데이터 수정 메서드 실행
            elif sel == '5':
                self.delete() # 데이터 삭제 메서드 실행
            elif sel == '6':
                self.sort() # 데이터 정렬 메서드 실행
            elif sel =='0':
                return # 함수 종료
profile
개발, 분석 배운 내용 정리하기!

0개의 댓글