no image
NoSQL
1. 데이터베이스 분류 1) RDBMS 테이블 기반, SQL 이용해서 작업 트리구조라서 깊이에 따라 조회 속도가 다름 2)NoSQL Not only SQL RDBMS 시스템의 주요 특성을 보장하는 ACID(Atomicity, Consistency, Isolation, Durability - Transaction의 주요 성질) 특성을 제공하지 않는 확장성이나 성능의 특성을 갖는 비관계형 데이터베이스 최근에는 NoSQL에 관계형 데이터베이스의 트랜잭션의 개념을 도입시키고 관계형 데이터베이스에도 NoSQL의 개념을 도입하는 형태로 발전하는 중 2. No SQL 종류 1) Key Value DB Key와 Value의 형태로 저장하는 데이터베이스 Redis가 대표적인 Key Value 데이터베이스 2) Docum..
2024.01.23
SQL
no image
D3. 데이터 자료형
A. 데이터 형식 정수형 데이터 형식 바이트 수 숫자 범위 TINYINT 1 -128 ~ 127 SMALLINT 2 -32,768 ~ 32,767 INT 4 약 -21억 ~ +21억 BIGINT 8 약 ~900경 ~ +900경 그룹 인원을 지정할 때는 TINYINT도 충분 평균 키를 지정할 때도 TINYINT를 사용할 수 있지만, 128cm 이상인 사람들을 위해 값의 범위가 0부터 시작되는 UNSIGNED 예약어 사용! 255cm까지 커버 가능. 문자형 데이터 형식 바이트 수 CHAR(개수) 1~255 VARCHAR(개수) 1~16383 TEXT 1~65535 LONGTEXT 1~4294967295 BLOB 1~65535 LONGBLOB 1~ 4294967295 CHAR은 고정길이 문자형, CHAR(10..
2024.01.22
SQL
no image
Transaction
Transaction 한 번에 이루어져야 하는 작업의 논리적인 단위 All or Nothing. 다 되던지 하나도 되면 안 된다. Table이 있으면 원본 Table에 작업을 하는게 아님. 우리 컴퓨터에 Table이 복사가 되고 그 테이블에 작업이 이루어짐 그리고 내 컴퓨터에서 COMMIT 하면 원본 데이터에 반영함. 로그아웃을 할 때 커밋을 해줌. 그런데 복사하는 동안 다른 작업을 못하니까, 하루 몇백만건을 처리하는 은행은 중간에 튕기면 모든 거래가 다 날라가버리는 방법 대신, Save Point를 사용한다. 시간 단위로, 혹은 거래건수마다 S1, S2를 만들어서 Save Point로 Roll Back 한다. TCM COMMIT: 끝났따. ROLL BACK: 트랜잭션의 시작점으로 돌아가라. SAVE P..
2024.01.22
SQL
no image
D2. SQL 문법
A. 기본 문법 SELECT 열_이름 FROM 테이블_이름 WHERE 조건식 GROUP BY 열_이름 HAVING 조건식 ORDER BY 열_이름 LIMIT 숫자 순서: FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER 회원 테이블 만들기 USE market_db; CREATE TABLE member -- 회원 테이블 ( mem_id CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK) mem_name VARCHAR(10) NOT NULL, -- 이름 mem_number INT NOT NULL, -- 인원수 addr CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력) phone1 CHAR(3), -- 연락처의 ..
2024.01.22
SQL
no image
Github
1. Git 소스 코드 버전 관리를 위한 tool git hub, git lab - git를 활용할 수 있는 웹사이트 2. 용어 repository: 하나의 큰 저장소, 기본 단위 branch: repository에 만드는 작은 저장소 - 실제 저장 단위 origin: 최초의 코드 remote: git hub이나 git lab 같은 원격 저장소 commit: 변경 내용을 적용 push: 로컬의 내용을 remote에 업로드 pull, fetch: remote의 변경 내용을 로컬에 반영 clone: branch의 내용을 로컬로 가져오는 것 merge: 변경한 내용을 하나로 합치는 것 3. git hub를 사용하기 위한 준비 1) git hub에 회원 가입 2) git 설치 3) 설치 확인 git --vers..
2024.01.19
no image
Day8. 가상환경 만들기
파이썬 애플리케이션 작성 가상 환경을 만들어서 작성 가상 환경: 별도의 파이썬 환경을 생성 외부 라이브러리를 설치해서 만든 애플리케이션은 다른곳에서 실행하려면 개발한 환경과 동일한 환경을 만들어야 하고, 컴퓨터에 있는 외부 라이브러리도 전부 설치를 해줘야 한다. 그런데 가상환경을 만들면 필요한 라이브러리만 별도로 다운로드 받아서 가져갈 수 있다. 파이썬 A 라이브러리 B 라이브러리 C 라이브러리 추가 D 라이브러리 추가 1번 프로그램을 만들 때 C를 추가: A, B, C 2번 프로그램을 만들 때 D를 추가: A, B, D 3번 프로그램을 만들 때 나만의 환경을 생성: A, B, X X 라이브러리 사용 가상환경 만들기 #가상환경 생성 python -m venv #디렉토리가 만들어짐 #디렉토리 가상환경으로 ..
2024.01.19
no image
Day7. 웹프로그래밍 개요
개요 Application - Program - Service All Same. 복잡하거나 반복되는 일을 컴퓨터가 할 수 있도록 만든 것 1) 컴퓨터 하드웨어: 실제 장비 하드웨어는 기계어만 인식 소프트웨어: 실제 장비를 코드로 사용할 수 있도록 추상화한 것 운영체제: 하드웨어와 소프트웨어 사이의 인터페이스(통역) 대부분 어셈블러(어셈블리어를 기계어로 번역)와 C언어로 만든다. 그러나 C언어는 플랫폼에서 독립적이지 못하다. 맥용 윈도우용 두개씩 만들어야 함. 플랫폼에서 독립적인 고급언어가 나와서 Python, Java. Python은 C로 다시 바꿔줘야 해서 느리다. (우리가 쓰는 건 C-Python) 컴퓨터와 운영체제를 같이 쓰는게 아니라, 내가 운영체제를 선택하고 싶어져서 Unix 대신 만든게 Lin..
2024.01.18
no image
Day6. 객체지향 프로그래밍
함수형 프로그래밍 기능 단위로 작성 유사한 동작을 하는 함수들은 파일로 묶어서 구분 일반적으로 속도가 빠르고 불필요한 내용을 포함하지 않는 것이 장점 빅데이터 처리 분야에서 많이 사용 객체 지향 프로그래밍 유사한 동작을 하는 함수나 데이터를 하나로 묶어서 프로그래밍 하는 방식 유사한 동작을 하는 함수와 데이터를 클래스라는 템플릿으로 묶고 템플릿을 이용해서 인스턴스를 생성해서 사용하는 방식으로 클래스도 하나의 인스턴스로 취급 클래스와 인스턴스 인스턴스 만들기: 메모리에 인스턴스를 생성하고 인스턴스의 참조(id)를 리턴 한번만 쓸거면 클래스이름(매개변수 나열...) 여러번 쓸거면 obj = 클래스이름(매개변수 나열...) 인스턴스를 생성하고 참조하는 데이터가 없다면 언제인지는 알 수 없지만 자동으로 메모리가..
2024.01.16

NoSQL

0ㅑ채
|2024. 1. 23. 17:45

 

 

1. 데이터베이스 분류

1) RDBMS

  • 테이블 기반, SQL 이용해서 작업
  • 트리구조라서 깊이에 따라 조회 속도가 다름

2)NoSQL

  • Not only SQL
  • RDBMS 시스템의 주요 특성을 보장하는 ACID(Atomicity, Consistency, Isolation, Durability - Transaction의 주요 성질) 특성을 제공하지 않는 확장성이나 성능의 특성을 갖는 비관계형 데이터베이스
  • 최근에는 NoSQL에 관계형 데이터베이스의 트랜잭션의 개념을 도입시키고 관계형 데이터베이스에도 NoSQL의 개념을 도입하는 형태로 발전하는 중

 

2. No SQL 종류

1) Key Value DB

  • Key와 Value의 형태로 저장하는 데이터베이스
  • Redis가 대표적인 Key Value 데이터베이스

 

2) Document DB

  • 하나의 데이터를 하나의 문서로 취급
  • Mongo DB가 대표적인 Document DB

 

3) Wide Column Store

  • 열의 집합체를 만들 수 있는 데이터베이스
  • HBase나 Cassandra가 대표적인 Wide Column Store

 

4) Graph DB

  • 데이터에 그래프 자료구조를 도입한 데이터베이스
  • SNS에 주로 이용

 

 

3. Mongo DB

1) 개요

  • 데이터를 하나의 문서로 취급하는데 데이터를 표현할 때 JSON 표기법 사용
    *JSON 표기법: 자바스크립트 객체표현법, 파이썬도 동일

배열: [데이터 나열]

객체(dict): {키:값, 키:값..}

Mongo DB는 자바스크립트 문법으로 데이터를 다룸

 

MEAN: 자바스클비트만으로 Web Application을 제작하는 기술

* Mongo DB, Express.js, Angular,js, node.js

MERN으로 변하는 중

* React

 

2) Docker를 이용해 설치

docker run --name 컨테이너이름 -v ~/data/data/db -d -p 27017:27017 mongo
  • mongo 이미지를 다운로드 받아서 컨테이너 이름으로 생성
  • data/data/db라는 디렉토리 데이터를 저장하고 백그라운드로 실행
  • 27017 (mongo db의 기본 포트)로 접속 

 

3) bash shell에 접속 

  • shell 중에 가장 많이 사용됩
  • 운영체제와 사용자 사이에 인터페이스
  • 도커 컨테이너 안에 접속
  • cmd는 명령 프롬프트 창이지만, shell에서는 프로그래밍도 가능하다.
docker exec -it 컨테이너이름 bash

이렇게 바뀐다. 클라우드 하려면 명령어 연습하기!

 

4) Mongo DB Manual

https://www.mongodb.com/docs/manual/crud/

 

MongoDB CRUD Operations — MongoDB Manual

Docs Home → MongoDB Manual CRUD operations create, read, update, and delete documents.You can connect with driver methods and perform CRUD operations for deployments hosted in the following environments:Create or insert operations add new documents to a

www.mongodb.com

 

 

5) Mongo DB 작업

  • 로컬에 설치: 터미널에서 접속해서 사용
  • 도커에 설치:  bash shell에 접속해서 명령어를 실행
  • 접속도구 사용: Compass나 Robe 3T와 같은 GUT Tool을 이용해서 작업 수행 가능 

Connect만 하면 생김

 

 

6) 구성요소

  • 데이터베이스: 가장 큰 단위
  • 컬렉션: 테이블의 개념, 미리 생성하거나 구조를 만들 필요 없음
  • 도큐먼트: 하나의 데이터로 관계형 데이터베이스의 행의 개념
  • 필드: 관계형 데이터베이스에서 열의 개념
  • 인덱스: 데이터를 빠르게 접근하기 위한 객체
  • 조인 없음!! 대신 Embedding이나 Linking의 개념을 가짐
    • 데이터 안의 필드에 다른 데이터를 포함시킬 수 있음
  • SEELCT문의 결과로, 관계형 데이터베이스는 Row의 집합을 리턴하지만, 
    Cursor를 반환한다.

 

7) CRUD

데이터 작업을 위한 Application - RDBMS
                         ▼
Message Broker - Kafka
                         ▼
데이터 읽기를 위한 Applilcation - NoSQL

 

데이터 삽입

db.컬렉션이름.insertOne({키:값, 키:값})
db.컬렉션이름.insertMany([{키:값, 키:값..},{키:값, 키:값...}..])

db.users.insertOne({"name":"park", "age":26})
db.users.insertOne({"nick":"kim", "height":170})
  • 키는 문자열이고 값은 null, 숫자, 문자, 객체, 배열 boolean, 날짜 등이 가능
  • 데이터를 삽입할 때 ObjectId라는 타입의 _id라는 키 값이 같이 삽입된다. 

데이터 전체 확인

db.컬렉션이름.find({})

 

데이터베이스 생성 및 사용

use 데이터베이스이름;

switched to db 데이터베이스이름;

  • 쓰면 만들어지는 것이 특징

현재 데이터베이스 확인

db;

 

데이터베이스 삭제

db.dropDatabase();

 

전체 데이터베이스 확인 - 데이터가 존재하는 것만 확인 가능

show dbs;

 

데이터 확인

db.DB이름.find({});

 

 

Capped Collection

  • 일반 Collection과 다르게 정해진 크기를 초과하게 되면 자동으로 가장 오래된 데이터를 삭제하는 collection
  • 디스크가 한정된 상황에서 로그 데이터나 분석 결과를 저장할 때 사용

 

View

  • 데이터베이스 안에 쓸 수 는 없고 읽기만 가능한 데이터베이스 개체
  • 뷰를 만들면 읽기 속도가 빨라지고 보안을 유지할 수 있다.

 

 

8) Thread

Program : 동일한 목적을 달성하기 위한 파일의 집합

Process : 실행 중인 프로그램

 

Thread

  • 프로세스 안에서 자원을 할당에서 수행하는 작업 단위
  • 혼자서 동작할 수 없고 항상 Process 내에 속해서 동작해야 한다. 
  • 함수를 그냥 실행하면 함수는 수행이 종료될 때까지 다른 함수를 수행하지 못하는데, 
    함수를 Thread로 실행하면 수행 중간에 다른 Thread를 실행하고 돌아올 수 있다.
  • 실제 일하는 것보다 왔다갔다 하는 불필요한 시간이 긴 걸 OverHead라고 한다.

python에서 사용

import time

#스레드를 만들지 않고 2개의 함수를 호출하면 20초
def threadEx(id):
    for i in range(10):
        print('id={0} -> {1}'.format(id, i))
        time.sleep(1)
        
for i in range(2):
    threadEx("{0}번 스레드".format(i))

 

import time, threading

def threadEx(id):
    for i in range(10):
        print('id={0} -> {1}'.format(id, i))
        time.sleep(1)
        
for i in range(2):
    id = ("{0}번 스레드".format(i))
    th = threading.Thread(target=threadEx, args=(id, ))
    th.start()

print("메인 종료")
  • 스레드도 메인이다

 

asynchronous(비동기)

  • 동기: 순서대로 하나씩 실행
  • 비동기: 수행 중에도 다른 작업으로 제어권을 넘길 수 있는 것
  • 스레드 프로그래밍과 유사하게 사용
  • 스레드 프로그래밍에서 주의할 점 
    • 여러 개의 스레드에서 하나의 자원을 공유해서 수정할 때 문제: lock을 제외하면 이상한 결과가 출력
import time, threading

g_count = 0

class ThreadEx(threading.Thread):
    def run(self): 
        global g_count
        for i in range(10):
            print("id={0} 증가하기 전 --> {1}".format(self.getName(), g_count))
            g_count = g_count +1
            time.sleep(1)
            print("id={0} 증가하기 전 --> {1}".format(self.getName(), g_count))
            time.sleep(1)
    
for i in range(2):
    th = ThreadEx()
    th.start()

 

 

 

9) Mongo DB에서의 멀티 스레드를 이용한 데이터 삽입

  • name을 인덱스로 설정해서 유일무이하게 저장하도록 컬렉션을 생성
db.sample.createIndex({name:1}, {unique:true});

 

데이터 삽입

db.sample.insertOne({name:"adam"})
db.sample.insert([{name:"itstudy"}, {name:"adam"}, {name:"ggangpae"}])

MongoBulkWriteError: E11000 duplicate key error collection: test.sample index: name_1 dup key: { name: "adam" }

  • adam이 중복되기에 에러
db.sample.find({})

{
  _id: ObjectId('65af5043bd0803f0661363c7'),
  name: 'adam'
}

{
  _id: ObjectId('65af509dbd0803f0661363c8'),
  name: 'itstudy'
}

  • NoSQL은 싱글스레드 형태로 동작하기 떄문에 itStudy는 삽입이 되고 adam부터 삽입이 안됨
  • 멀티 스레드를 이용해서 삽입하려면 ordered:false라는 옵션을 추가
db.sample.insert([{name:"itstudy"}, {name:"adam"}, {name:"ggangpae"}], {ordered:false})

MongoBulkWriteError: E11000 duplicate key error collection: test.sample index: name_1 dup key: { name: "itstudy" }

  • 오류가 발생하지만 'ggangpae'까지 삽입된 걸 확인할 수 있다.

 

 

 

 

4. Python의 Exception Handling (예외 처리)

1) 오류의 종류

물리적 오류(Complie Error): 문법적인 오류

  • 전체를 컴파일하고 실행하는 프로그램에서는 이 오류가 있으면 실행하지 않는다.
  • 파이썬이나 자바스크립트의 경우는 괄호나 들여쓰기 오류를 제외하고 일단 실행되는 부분까지는 실행
  • 물리적 오류는 코드를 수정해서 해결

논리적 오류: 알고리즘 오류

  • 문법적인 오류는 없어서 실행이 잘 되는데 원하는 결과가 만들어지지 않는 경우
  • 디버깅으로 해결  - 순차적으로 프로그램을 실행시키면서 메모리 값을 확인하거나, 부분적으로 폐쇄시키면서 문제를 파악한다.

예외(Exception): 문법적인 오류는 없지만 실행 중 에러가 발생하고 프로그래밍이 중단되는 현상

  • 런타임 오류라 코드로 해결할 수 없는 경우
  • 런타임 오류가 아니라서 코드로 해결할 수 있는 경우

단언(Assertion)

  • 오류가 아닌데 강제로 예외를 발생시키는 것

 

2) 예외 처리 (Exception  Handling)

목적

  • 예외가 발생하더라도 계속 작업을 수행하기 위해
  • 예외가 발생한 경우 로깅을 하기 위해

예외 발생

def ten_div(x : int) -> float:
    return 10/x

print(ten_div(3))
print(ten_div(0))
print("메인 종료")
try: 
    예외가 발생할 가능성이 있는 코드
except:
    예외가 발생했을 때 수행할 코드
def ten_div(x : int) -> float:
    return 10/x

try:
    print(ten_div(3))
    print(ten_div(0))

except Exception as e:
    print(e)

3.3333333333333335
division by zero

 

  • 예외가 발생해도 프로그램이 중단되지 않음
  • Exception as e: 예외 발생한 이유 알려줌

 

 

3) 예외 종류 별 처리 

예외 처리 클래스 계층

https://docs.python.org/3/library/exceptions.html

 

Built-in Exceptions

In Python, all exceptions must be instances of a class that derives from BaseException. In a try statement with an except clause that mentions a particular class, that clause also handles any excep...

docs.python.org

 

예외를 별도로 처리: except절은 개수 제한이 없다.

ar = [10, 20, 30]

try:
    print(ar[0])
    print(ar[1])        
    print(ar[3])

except ZeroDivisionError as e:
    print("0으로 나누는 예외 발생")

except IndexError as e:
    print("인덱스 예외 발생")

10
20
인덱스 예외 발생

  • 예외 처리에서 except는 위에서 순차적으로 확인해서 자신의 타입과 일치하는 구문을 만나면 처리하고 빠져나간다.
  • 상위 클래스 타입의 참조형 변수에는 하위 클래스 타입의 인스턴스를 대입할 수 있다.
  • 반대는 불가: 순서가 반대로 되면 Not Reachable Code가 만들어진다.

 

4) else와 finally

  • except 아래에 절을 만들어서 예외가 발생하지 않은 경우게 수행할 로직을 작성할 수 있다.
  • finally는 예외 발생 여부에 상관 없이 수행할 로직을 작성할 수 있다.
ar = [10, 20, 30]

try:
    print(ar[0])
    print(ar[1])        
    print(ar[3])

except ZeroDivisionError as e:
    print("0으로 나누는 예외 발생")

except IndexError as e:
    print("인덱스 예외 발생")

except Exception as e:
    print()

else: 
    print("예외가 발생하지 않은 경우에 수행")

finally:
    print("무조건 수행")

10
20
인덱스 예외 발생
무조건 수행

 

 

5) 강제로 예외 발생 - 단언

raise 예외클래스이름(예외 메시지)
try:
    x = 10
    if x < 20:
        raise Exception("숫자가 너무 작음")
    print(x)

except Exception as e:
    print(e)

숫자가 너무 작음

 

 

 

5. Python과 Mongo DB 연동

1) 기본적인 사용법

패키지 설치

pip install pymongo

 

서버 연결

변수1 = pymongo.MongoClient("서버 IP", 포트번호)

 

데이터베이스 연결

변수2 = 변수1.데이터베이스 이름# 없으면 생성됨

 

컬렉션 연결

변수3 = 변수2.컬렉션이름 # 없으면 생성됨

 

데이터 1개 삽입

변수3.insert_one(dict 객체)

 

데이터 여러 개 저장

변수3.insert_many([dict 객체, dict 객체...])

 

from pymongo import MongoClient

#Mongo 데이터베이스 연결
con = MongoClient('127.0.0.1', 27017)
print(con)
    
#사용할 데이터베이스 연결
myDb = con.myDb
print(myDb)
    
#컬렉션 연결
col = myDb.col
print(col)

#1개 데이터 삽입
col.insert_one({'name':'kim', 'age':45})
#여러 개 데이터 삽입
col.insert_many([{'name':'lee', 'age':25}, {'name':'park', 'age':66}])

MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)
Database(MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True), 'myDb')
Collection(Database(MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True), 'myDb'), 'col')  

 

결과출력

result = col.find()
for row in result:
    print(row['name'])

kim
lee
park

 

 

NoSQL은 COMMIT을 안한다. 기본적으로 Transaction이 제공되지 않는다. 읽기 위주로 하기 때문이다. 

 

 

 

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
Transaction  (1) 2024.01.22
D2. SQL 문법  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

D3. 데이터 자료형

0ㅑ채
|2024. 1. 22. 19:21

A. 데이터 형식

정수형

데이터 형식 바이트 수 숫자 범위
TINYINT 1 -128 ~ 127
SMALLINT 2 -32,768 ~ 32,767
INT 4 약 -21억 ~ +21억
BIGINT 8 약 ~900경 ~ +900경
  • 그룹 인원을 지정할 때는 TINYINT도 충분
  • 평균 키를 지정할 때도 TINYINT를 사용할 수 있지만, 128cm 이상인 사람들을 위해
  • 값의 범위가 0부터 시작되는 UNSIGNED 예약어 사용! 255cm까지 커버 가능.

 

문자형

데이터 형식 바이트 수
CHAR(개수) 1~255
VARCHAR(개수) 1~16383
TEXT 1~65535
LONGTEXT 1~4294967295
BLOB 1~65535
LONGBLOB 1~ 4294967295
  • CHAR은 고정길이 문자형, CHAR(10)을 지정하면 입력된 글자수에 상관 없이 10자리를 모두 확보한다.
  • VARCHAR은 가별길이 문자형, VARCHAR(10)에 3글자만 저장하면 3자리만 사용한다.
  • VARCHAR가 공간을 더 효율적으로 사용하지만, 내부적인 성능(속도)면에서는 CHAR가 좋다.
  • LONGTEXT는 최대 약 42억자까지 저장한다.소설이나 영화 대본 등에 필요하다. 
  • BLOB은 글자가 아닌 이미지, 동영상 등의 데이터. 이진(Binary) 데이터!
  • LONG은 최대 4GB까지 입력 가능하다.

 

실수형

데이터 형식 바이트 수 설명
FLOAT 4 소수점 아래 7자리까지 표현
DOUBLE 8 소수점아래 15자리까지 표현

 

 

날짜형

데이터 형식 바이트 수 설명
DATE 3 날짜만 저장 YYYY-MM-DD
TIME 3 시간만 저장 HH:MM:SS
DATETIME 8 날짜 및 시간 저장

 

 

 

B. 변수 사용

SET @변수이름 = 변수의 값 ;
SELECT @변수이름 ;

 

데이터 형변환

CAST (값 AS 데이터_형식 [ (길이) ])
CONVERT (값, 데이터_형식 [ (길이) ])
  • CAST()에는 CHAR, SIGNED, UNSIGNED, DATE, TIME, DATETIME 등이 올 수 있다.
    • SIGEND: 부호가 있는 정수
    • UNSIGNED: 부호가 없는 정수
SELECT CAST(AVG(price)AS SIGNED) '평균 가격' FROM buy;
SELECT CONVERT(AVG(price), SIGNED) '평균 가격' FROM buy;

 

CONCAT(): 문자를 이어주는 함수

  • 숫자와 문자를 CONCAT(100, '200') 연결하면 자동으로 문자열 100200 출력
  • CONCAT() 사용 없이도 숫자 100과 문자 '200'을 더하면 자동으로 300 출력
SELECT num, CONCAT(CAST(price AS CHAR), 'X', CAST(amount AS CHAR), '=')
'가격X수량', price*amount '구매액'
FROM buy;

 

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
NoSQL  (1) 2024.01.23
Transaction  (1) 2024.01.22
D2. SQL 문법  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

Transaction

0ㅑ채
|2024. 1. 22. 18:31

 

 

Transaction

  • 한 번에 이루어져야 하는 작업의 논리적인 단위
  • All or Nothing. 다 되던지 하나도 되면 안 된다.
Table이 있으면 원본 Table에 작업을 하는게 아님. 우리 컴퓨터에 Table이 복사가 되고 그 테이블에 작업이 이루어짐 그리고 내 컴퓨터에서 COMMIT 하면 원본 데이터에 반영함. 로그아웃을 할 때 커밋을 해줌. 
그런데 복사하는 동안 다른 작업을 못하니까, 하루 몇백만건을 처리하는 은행은 중간에 튕기면 모든 거래가 다 날라가버리는 방법 대신, Save Point를 사용한다. 시간 단위로, 혹은 거래건수마다 S1, S2를 만들어서 Save Point로 Roll Back 한다.

 

TCM

COMMIT: 끝났따.

ROLL BACK: 트랜잭션의 시작점으로 돌아가라.

SAVE POINT: 저장했다가 여기로 롤백해. 

 

 

Transaction  실습

데이터베이스 확인

SHOW databases;

 

데이터베이스 생성

 CREATE database 이름;

 

데이터베이스 사용 설정

USE 이름;

 

데이터베이스 삭제

DROP database 이름;

 

 

실습할 테이블 생성

create table 테이블 이름(

    컬럼이름 자료형 컬럼제약조건
    ...
    테이블 제약조건
    ...
)ENGINE, AUTO_INCREMENT의 시작 숫자, 인코딩 등을 설정
create table transaction_test(
	account int,
	balance int);

 

데이터 삽입

insert into transaction_test(account, balance) values(1, 30);

 

데이터 확인

select *
from transaction_test;

 

트랜잭션 취소 - 트랜잭션이 만들어지는 시점으로 이동

ROLLBACK;

- 처음 로그인 했을 때 복사한 테이블로 돌아가는 것

- Commit 하는 동안은 다른 테이블에서는 Lock이 걸린다.

 

savepoint 생성

- 로그를 기록해서 돌아갈 때 다시 불러옴 

--데이터 추가
insert into transaction_test(account, balance) values(2, 40);
insert into transaction_test(account, balance) values(3, 40);

--save point 생성
savepoint s1; 

--데이터 추가 2
insert into transaction_test(account, balance) values(4, 40);
insert into transaction_test(account, balance) values(5, 40);

--rollback 명령어
rollback; -- 데이터 1개
rollback to s1; -- 데이터는 3개

 

 

 

Windows Function

1) 관계형 데이터베이스에서 group by를 사용할 때 주의할 점

> tStaff 테이블을 depart별로 depart와 salary의 평균을 조회 

select depart, salary
from tStaff
group by depart;

Error Code: 1055. Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'sys.tStaff.salary' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

  • group by는 그룹화 한 항목 별로 하나만 출력할 수 있는데, salary는 2개 이상이 될 수 있어서 어떤 것을 출력할지 몰라 error.
  • mysql의 fork인 Maria DB에서는 이 문법을 허용함.
select depart, avg(salary)
from tStaff
group by depart;

 

2) 사용 형식

SELECT <윈도우함수이름>(매개변수) OVER(
    [PARTITION BY 그룹화 항목 나열]
    ORDER BY 정렬할 항목
    출력할 컬럼이름 나열


FROM 테이블이름
[WHERE 조건];

  • partition은 선택인데 그룹을 만드는 것
  • partition이 없으면 전체 데이터를 가지고 수행

 

 

3) 순위 관련 함수

ROW_NUMBER: 중첩되지 않는 일련번호

DENSE_RANK: 중복된 순위에 동일한 순위를 할당하고 다음 순위를 건너뛰지 않고 리턴

RANK: 중복된 순위에 동일한 순위를 할당하고 다음 순위를 건너뛰고 리턴

NTILE(등분의 개수): 등분

 

 

4) 분석 함수

CUME_DIST(): 누적합
LEAD(컬럼, 인덱스): 다음 행
LAG(컬럼, 인덱스): 이전 행
FIRST_VALUE(컬럼): 첫 행
LAST_VALUE(컬럼): 마지막 행
PERCENT_RANK(): 백분율 순위

 

 

 

5) 정규화 / 반정규화

종속: 다른 데이터에 영향을 받는 것

1. 함수적 종속

  • 하나의 속성이 다른하나의 속성의 값을 결정하는 것
주민등록번호 -> 이름
주민등록번호가 이름을 함수적으로 종속했다.
반대로 하나의 이름에는 주민등록번호가 여러개 있을 수 있기 때문에 종속이 아님. 
주민등록번호를 결정자라고 한다.

 

부분 함수적 종속

  • 기본 키에 대해서만 적용이 된다.
  • 2개 이상의 속성으로 만들어진 기본키에서 1개의 속성으로 구별할 수 있는 경우

 

이행적 함수 종속

  • A → B
  • B → C
  • A → C

 

이 두 종속을 없애는 것을 정규화라고 한다.

 

 

2. 정규화

  • 읽기 이외 (특히 삭제) 할 때 유용하다.
주민등록번호 이름 수업 코드 수업료
1 C 30만원
2 C 30만원
1 D 15만원
  • 이런 경우 식별하기 좋은 키가 없다.
  • '이'가 수업 'C'를 철회할 경우 '이'에 대한 데이터가 모두 손실될 수 있다.
  • 따라서 테이블을 두개로 나눈다.
주민등록번호 이름
1
2
3
수강코드 수업료
C 30만원
D 15만원
F 15만원

 

 

 

3. 반정규화/역정규화

  • join을 하면 데이터가 많아져서 속도가 느려짐
  • 테이블 하나에 정보가 다 있으면 join을 할 필요가 없다.
  • 읽기 속도에 더 유리하다.

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
NoSQL  (1) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
D2. SQL 문법  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

D2. SQL 문법

0ㅑ채
|2024. 1. 22. 16:29

A. 기본 문법

SELECT 열_이름
    FROM 테이블_이름
    WHERE 조건식
    GROUP BY 열_이름
    HAVING 조건식
    ORDER BY 열_이름
    LIMIT 숫자

순서: FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER

 

 

회원 테이블 만들기

USE market_db;
CREATE TABLE member -- 회원 테이블
( mem_id      CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
  mem_name    VARCHAR(10) NOT NULL, -- 이름
  mem_number  INT NOT NULL,  -- 인원수
  addr        CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
  phone1      CHAR(3), -- 연락처의 국번(02, 031, 055 등)
  phone2      CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
  height      SMALLINT,  -- 평균 키
  debut_date  DATE  -- 데뷔 일자
);

* CHAR: 고정형 - 8개가 들어오지 않아도 8글자 저장

* VARCHAR: 가변형 - 들어오는 글자만큼 저장, 저장 효율 good

 

구매 테이블 만들기

CREATE TABLE buy -- 구매 테이블
(  num 		INT AUTO_INCREMENT NOT NULL PRIMARY KEY, -- 순번(PK)
   mem_id  	CHAR(8) NOT NULL, -- 아이디(FK)
   prod_name 	CHAR(6) NOT NULL, --  제품이름
   group_name 	CHAR(4)  , -- 분류
   price     	INT  NOT NULL, -- 가격
   amount    	SMALLINT  NOT NULL, -- 수량
   FOREIGN KEY (mem_id) REFERENCES member(mem_id)
);

 

 


데이터 조회

 

USE문

-- USE 사용
SELECT * FROM product;
USE shop_db;

-- USE 사용 안하려면
SELECT * FROM shop_db.product;
  • shop_db 데이터베이스를 대상으로 할거야. 
  • 이렇게 명시하지 않으면 모든 SQL문은 마지막으로 작업했던 DB에서 동작한다.

 

관계연산자, 논리연산자 사용

SELECT mem_name, height, mem_number
FROM member
WHERE height >= 165 AND mem_number > 6;

 

 

BETWEEN ~ AND: 범위값 구하기

SELECT mem_name, height, mem_number
FROM member
WHERE height BETWEEN 163 AND 165;

 

 

IN()

SELECT mem_name, addr
FROM member
WHERE addr IN('경기', '전남', '경남');

 

LIKE: 문자열의 일부 글자 검색

SELECT *
FROM member
WHERE mem_name LIKE '우%';

  • 제일 앞 글자가 '우'이고 그 뒤는 무엇이든(%) 허용한다.
  • 한 글자와 매치하기 위해서는 언더바(_)를 사용한다.
SELECT *
FROM member
WHERE mem_name LIKE '__핑크';

  • 앞 두 글자는 상관 없고 뒤는 '핑크'인 회원을 검색한다.

 

서브 쿼리

SELECT mem_name, height FROM member
	WHERE height > (SELECT height FROM member WHERE mem_name = '에이핑크');

 

ORDER BY

  • WHERE절과 함께 사용할 수 있다.
  • 다만 WHERE절을 먼저 사용해줘야 한다.
SELECT mem_id, mem_name, debut_date
FROM member
WHERE height >= 164
ORDER BY height DESC, debut_date ASC;

 

정렬 

  • ASC 오름차순
  • DESC 내림차순 

 

LIMIT

  • 출력하는 개수를 제한한다.
  • 전체 중 앞에서 n개까지만 조회 
SELECT *
FROM member
LIMIT 3;

  • LIMIT 시작, 개수 
SELECT mem_name, debut_date
FROM member
ORDER BY debut_date
LIMIT 3, 2;
  • 3번째부터 2건

 

 

DISTINCT

  • 중복된 결과를 제거
SELECT DISTINCT addr FROM member;

 

 

GROUP BY

  • 그룹으로 묶어준다.
  • 그룹을 묶어 집계한다.

 

집계 함수

  • SUM()
  • AVG()
  • MIN()
  • MAX()
  • STDDEV() : 표준편차 
  • VARIANCE() : 분산
  • COUNT()
  • COUNT(DISTINCT)
SELECT mem_id "회원 아이디", SUM(amount) "총 구매 개수"
FROM buy GROUP BY mem_id;

SELECT COUNT(*) FROM member;

  • 집계함수는 WHERE절과 함께 사용할 수 없다.
  • 대신 HAVING절을 사용한다.
  • HAVING절은 반드시 GROUP BY 뒤에 나와야 한다.
SELECT mem_id "회원 아이디", SUM(price*amount) "총 구매 금액"
FROM market_db.buy
GROUP BY mem_id
HAVING SUM(price*amount) > 1000;

 

 

 

 


데이터 입력

 

INSERT

INSERT INTO 테이블 [(열1, 열2, ...)] VALUES (값1, 값2, ...)
  • 테이블 이름 다음에 나오는 열은 생략 가능
  • 열 이름을 생략할 경우 VALUES 뒤에 나오는 값들의 순서 및 개수는 테이블을 정의할 때 열 순서 및 개수와 동일해야 한다.
USE market_db;
CREATE TABLE hongong1 (toy_id INT, toy_name CHAR(4), age INT);
INSERT INTO hongong1 VALUES (1, '우디', 25);
  • 만약 age는 입력하고 싶지 않다면 테이블 이름 뒤에 입력할 열의 이름을 써줘야 한다. 
INSERT INTO hongong1 (toy_id, toy_name) VALUES (2, '버즈');
  • age 열에는 NULL 값이 들어감

 

 

AUTO_INCREMENT : 자동으로 증가

  • 열을 정의할 때 1부터 증가하는 값을 입력해준다.
  • INSERT에서는 해당 열이 없다고 생각하고 입력한다.
  • 주의: 지정한 열은 꼭 PRIMARY KEY로 지정!
CREATE TABLE hongong2 (
    toy_id INT AUTO_INCREMENT PRIMARY KEY, 
    toy_name CHAR(4),
    age INT);
  • 자동증가하는 부분은 NULL 값으로 채워 놓으면 된다.
INSERT INTO hongong2 VALUES (NULL, '보핍', 25);
INSERT INTO hongong2 VALUES (NULL, '슬링키', 22);
INSERT INTO hongong2 VALUES (NULL, '렉스', 21);
SELECT * FROM hongong2;
  • 계속 입력하다가 현재 어느 숫자까지 증가되었는지 확인이 필요할 때
SELECT LAST_INSERT_ID();

 

만약 AUTO_INCREMENT로 처음부터 입력되는 값을 100으로 지정하고, 다음 값은 3씩 증가하도록 하려면

ALTER TABLE hongong2 AUTO_INCREMENT=100;
SET @@auto_increment_increment=3;

 

더보기

 시스템 변수!

- MySQL에서 자체적으로 가지고 있는 설정값이 저장된 변수

- SHOW GLOBAL VARIABLES : 전체 시스템의 종류를 보여줘

- SELECT @@시스템변수 : 실행

여러 줄을 한 줄로 작성할 수도 있다.

INSERT INTO hongong2 VALUES (NULL, '보핍', 25), (NULL, '슬링키', 22), (NULL, '렉스', 21);

 

 

 

INSERT INTO ~ SELECT : 다른 테이블의 데이터를 한 번에 입력

  • 주의: SELECT 문의 열 개수는 INSERT할 테이블의 열 개수와 같아야 한다.
INSERT INTO 테이블_이름 (열_이름1, 열_이름2, ...)
    SELECT문;
CREATE TABLE city_popul (city_name CHAR(35), population INT);

INSERT INTO city_popul
    SELECT Name, Population FROM world.city;

 

 

 


데이터 수정

 

UPDATE 문의 기본 문법

UPDATE 테이블_이름
    SET 열1=값1, 열2=값2, ...
    WHERE 조건;

 

city_popul 테이블의 도시이름(city_name) 중에서 'Seoul' -> '서울'로 변경

USE market_db;
UPDATE city_popul
SET city_name = '서울'
WHERE city_name = 'Seoul';
SELECT * FROM city_popul WHERE city_name = '서울';

 

도시이름(city_name)인 'New York'을 '뉴욕'으로 바꾸면서 동시에 인구(population)는 0으로 설정

UPDATE city_popul
SET city_name = '뉴욕', population = 0
WHERE city_name = 'New York';
SELECT * FROM city_popul WHERE city_name = '뉴욕';

 

주의: UPDATE 문에서 WHERE 절은 생략 가능하지만, 생략하면 테이블의 모든 행의 값이 변경된다. 

UPDATE city_popul
    SET population = population / 10000;
SELECT * FROM city_popul LIMIT 5;

 

 

 


데이터 삭제

 

DELETE

DELETE FROM 테이블 이름 WHERE 조건;

 

 

 

 

'SQL' 카테고리의 다른 글

JOIN  (0) 2024.01.23
NoSQL  (1) 2024.01.23
D3. 데이터 자료형  (0) 2024.01.22
Transaction  (1) 2024.01.22
D1. 데이터베이스 개요  (1) 2024.01.10

Github

0ㅑ채
|2024. 1. 19. 18:10

 

1. Git

  • 소스 코드 버전 관리를 위한 tool
  • git hub, git lab - git를 활용할 수 있는 웹사이트

 

2. 용어

repository: 하나의 큰 저장소, 기본 단위

branch: repository에 만드는 작은 저장소 - 실제 저장 단위

origin: 최초의 코드

remote: git hub이나 git lab 같은 원격 저장소

commit: 변경 내용을 적용

push: 로컬의 내용을 remote에 업로드

 

pull, fetch: remote의 변경 내용을 로컬에 반영

clone: branch의 내용을 로컬로 가져오는 것

merge: 변경한 내용을 하나로 합치는 것

 

 

3. git hub를 사용하기 위한 준비

1) git hub에 회원 가입

2) git 설치

3) 설치 확인

git --version

 

 

4. 깃의 기본 브랜치 이름을 main으로 설정

  • 기본 브랜치 이름은 master
  • git hub 이용자는 대부분 기본 브랜치 이름을 main으로 변경
git config --global init.defaultBranch main

 

 

5. 깃에 코드를 저장할 때 

git config --global user.name 이름

git config --global user.email 이메일

 

 

6. 설정 확인

git config --list

 

 

7. 현재 디렉토리의 내용을 git에 저장

현재 디렉토리를 로컬 git에 등록

git init

Initialized empty Git repository in C:/Users/USER/DX_DATA/dx_Code/0119/oop/.git/

  • 로컬 git 등록 해제
  • 디렉토리 안에서 .git 디렉토리를 삭제
rmdir.git

디렉터리가 비어 있지 않습니다.

 

8. git에 파일을 등록

git add 파일이나 디렉토리 이름 나열

git add main.py

 

현재 디렉토리의 모든 내용을 git에 등록

git add .

 

 

9. 현재 등록된 파일들을 로컬 git에 업로드

git commit -m "메시지"

 

 

'기타' 카테고리의 다른 글

Github 2  (1) 2024.01.26

Day8. 가상환경 만들기

0ㅑ채
|2024. 1. 19. 10:16

 

 

 

파이썬 애플리케이션 작성

  • 가상 환경을 만들어서 작성
  • 가상 환경: 별도의 파이썬 환경을 생성
    • 외부 라이브러리를 설치해서 만든 애플리케이션은 다른곳에서 실행하려면 개발한 환경과 동일한 환경을 만들어야 하고, 컴퓨터에 있는 외부 라이브러리도 전부 설치를 해줘야 한다.
    • 그런데 가상환경을 만들면 필요한 라이브러리만 별도로 다운로드 받아서 가져갈 수 있다.
파이썬
    A 라이브러리
    B 라이브러리
    C 라이브러리 추가
    D 라이브러리 추가

1번 프로그램을 만들 때 C를 추가: A, B, C
2번 프로그램을 만들 때 D를 추가: A, B, D
3번 프로그램을 만들 때 나만의 환경을 생성: A, B, X
    X 라이브러리 사용

 

가상환경 만들기

#가상환경 생성
python -m venv #디렉토리가 만들어짐

#디렉토리 가상환경으로 이동
cd 가상환경이름

 

*cd: change directory

 

가상환경 활성화

#Windows
가상환경이름/Scripts/activate

#Windows 이외
source 가상환경이름/bin/activate

*가상환경 나가려면 deactivate

 

이제부터 pip로 설치하는 패키지는 가상환경 안에 설치돼서 가상환경 안에서만 사용 가능

# 설치한 패키지 목록을 텍스트 파일로 내보내기
pip freeze > 파일명(requirements.txt)

# 다른 곳에서 패키지를 전부 설치 
pip install 파일명

 

 

 

 

 

'Python' 카테고리의 다른 글

Day10. REST API  (0) 2024.01.26
Day9. 웹 서버 만들기  (1) 2024.01.24
Day7. 웹프로그래밍 개요  (1) 2024.01.18
Day6. 객체지향 프로그래밍  (0) 2024.01.16
Day5. 함수  (1) 2024.01.08

 

개요 Application - Program - Service

  • All Same. 복잡하거나 반복되는 일을 컴퓨터가 할 수 있도록 만든 것

 

1) 컴퓨터

  • 하드웨어: 실제 장비
    • 하드웨어는 기계어만 인식
  • 소프트웨어: 실제 장비를 코드로 사용할 수 있도록 추상화한 것
  • 운영체제: 하드웨어와 소프트웨어 사이의 인터페이스(통역)
    •  대부분 어셈블러(어셈블리어를 기계어로 번역)와 C언어로 만든다.
    • 그러나 C언어는 플랫폼에서 독립적이지 못하다. 맥용 윈도우용 두개씩 만들어야 함. 
    • 플랫폼에서 독립적인 고급언어가 나와서 Python, Java. 
    • Python은 C로 다시 바꿔줘야 해서 느리다. (우리가 쓰는 건 C-Python) 
컴퓨터와 운영체제를 같이 쓰는게 아니라, 내가 운영체제를 선택하고 싶어져서 Unix 대신 만든게 Linux.
리눅스는 초반에 서버라서 텍스트 기반이었다. 그런데 컴퓨터를 일반인한테 팔려면 쓰기가 쉬워야 하니까,
Linux위에 그림을 입힌게 Mac OS 10. 이때까지는 운영체제를 번들로 줬지만, 따로 운영체제를 만들고 싶어서 빌게이츠가 코드를 받아가서 만든게 MS C언어. 이로 인해 윈도우즈 탄생. 
클라우드 플랫폼은 GO언어 사용!

 

 

2) Web Browser에서 동작하는 언어

 

HTML은 구조

  • 앞에서부터 순서대로 읽어서 트리를 만들고 공간을 확보한 후 콘텐츠를 나중에 주입하는 구조
  • 외부 자원을 가져올 때는 캐싱을 이용
    • 캐싱: 빨리 쓰기 위하여 경로를 기반으로 저장해두는 것
    • 인터넷이 끊겨도 불러올 수 있도록 경로를 저장해야 한다.

CSS는 디자인

  • HTML 구조를 전부 읽고 난 후 출력할 때 적용

JavaScript, TypeScript는 동작

  • 태그와 함께 위에서부터 순서대로 읽으면서 동작(저장)

Type Script

def 이름 (매개변수이름: int) -> None
	내용

 

 

3) Framework, Library, Solution

  • SDK(Software Evelopment Kit): 프로그램을 만들 수 있도록 도와주는 도구
    • API(Application Programming Interface), 데이터의 의미를 포함한 같은 말
  • Library: 프로그램을 만드는 데 도와주는 별도의 코드 모임 
    • 파이썬에서는 주로 패키지라고 부름
  • Framework: 라이브러리와 같은데 프로그램 제작도 함 
  • Solution: 특정 목적이 있음

 

4) JavaScript Framework

  • node.js: 자바스크립트가 브라우저 이외의 환경에서 동작하도록 해주는 플랫폼
  • jquery  크로스 브라우징(서로 다른브라우저에서 동일한 콘텐츠를 제공하는 기술)을 가능하게 하지만 최근엔 사용 금기
  • bootstrap  : 반응형 웹(하나의 코드로 브라우저의 크기에 상관없이 동일한 컨텐츠를 사용할 수 있도록 하는 기술)을 쉽게 만들어주는 라이브러리
  • D3.js : 그래프를 만들어주는 라이브러리
  • express.js, nest.js : 서버를 만들기 위한 프레임워크
    • 클라이언트에서 서버를 만들 수 있어서 보안이 되는데 핵이 가능
  • SAP(Single Page Application): 하나의 페이지를 가지고 모든 콘텐츠 제공 
    • 구글 angular.js 진행 종료
    • 중국에서 많이 쓰는 vue.js
    • 국내에서 많이 쓰는 react.js
    • 최근에 핫해진 next.js
  • ajax, fetch API: 외부에서 비동기적으로 데이터를 가져오는 기술
    • axios 라이브러리 
  • progressive web: 웹과 앱의 경계가 무너지면서 웹이나 앱의 디자인을 유사하게 만드는 기술
    • 구글의 머터리얼  디자인

'Python' 카테고리의 다른 글

Day9. 웹 서버 만들기  (1) 2024.01.24
Day8. 가상환경 만들기  (1) 2024.01.19
Day6. 객체지향 프로그래밍  (0) 2024.01.16
Day5. 함수  (1) 2024.01.08
Day4. 딕셔너리와 반복문  (1) 2024.01.05

 

 

함수형 프로그래밍

  • 기능 단위로 작성
  • 유사한 동작을 하는 함수들은 파일로 묶어서 구분
  • 일반적으로 속도가 빠르고 불필요한 내용을 포함하지 않는 것이 장점
  • 빅데이터 처리 분야에서 많이 사용

 

객체 지향 프로그래밍

  • 유사한 동작을 하는 함수나 데이터를 하나로 묶어서 프로그래밍 하는 방식
  • 유사한 동작을 하는 함수와 데이터를 클래스라는 템플릿으로 묶고 템플릿을 이용해서 인스턴스를 생성해서 사용하는 방식으로 클래스도 하나의 인스턴스로 취급

 

 

 

클래스와 인스턴스

  • 인스턴스 만들기: 메모리에 인스턴스를 생성하고 인스턴스의 참조(id)를 리턴
  • 한번만 쓸거면  클래스이름(매개변수 나열...)
  • 여러번 쓸거면 obj = 클래스이름(매개변수 나열...)
  • 인스턴스를 생성하고 참조하는 데이터가 없다면 언제인지는 알 수 없지만 자동으로 메모리가 정리된다.
  • 일반적으로 클래스 이름은 대문자로 시작하고 Camel 표기법을 사용한다. 

 

 

1) 데이터(속성 - attribute)

클래스 속성: 클래스 안에 데이터를 만들고 클래스와 인스턴스가 공동으로 사용

  • 클래스 안에 변수를 만들면 이것은 클래스 속성이 된다. 

인스턴스 속성: 인스턴스 안에 만들어서 인스턴스만 사용할 수 있는 것

  • 메서드 안에서 메서드의 첫번째 매개변수이름.속성으로 만들면 이는 인스턴스 속성이 된다.

속성에 접근할 때는

  • 내부에서는 이름만으로 가능하지만
  • 외부에서는 클래스/인스턴스이름.속성으로 접근
#자동차를 표현하는 클래스
class Car:
    #클래스 속성 (클래스, 인스턴스 모두 접근, 공유)
    maker = "KIA"

#Car 클래스의 인스턴스를 생성
car = Car()

print(car.maker)
print(Car.maker)

 

 

 

2) 기능(메소드)

  • 클래스 안에 있는 함수: 메소드(Method)

 종류

  • 초기화 메소드(init): 인스턴스를 만들 때 호출되는 메소드로, 만들지 않아도 기본적으로 아무일도 하지 않는 초기화 메소드가 존재하며 다른초기화 메소드를 만들면 제거된다. 다른 언어에서는 생성자(Constructor)라고 한다.
  • 클래스 메소드, 스태틱 메소드: 클래스 안에 특별한 decorator와 함께 사용, 클래스와 인스턴스 모두 호출 가능한 메소드
    • 인스턴스 속성을 만들거나 소유할 수 없다.
    • 인스턴스 속성이 필요없는 동작을 하고자 할 때 사용
  • 인스턴스 메소드: 클래스 안에 만들어지는 함수로, 무조건 1개의 매개변수(객체 자신의 참조)를 가지고 만들어지는 함수로 인스턴스만 호출할 수 있고 인스턴스 속성 생성이 가능하다. 
    • 호출방법 
    • Bound 호출: 인스턴스.메소드(매개변수를 나열 - self 값을 대입하지 않음) - a1.add(a2)
    • Unbound 호출: 클래스.메소드(인스턴스, self를 제외한 매개변수를 나열) - Math.add(a1, a2)
  • 인스턴스 메소드 안에서 첫번째매개변수.속성이름 = 값의 형태로 만들면 인스턴스 속성이 만들어진다.
  • 이 속성은 인스턴스 이름으로 접근하고 인스턴스마다 별도로 만들어진다.
#바운드 호출
car.method()
#언바운드 호출
Car.method(car)

print(help(str.capitalize))
x = "hello"
print(x.capitalize())
print(str.capitalize(x))
  • 리턴이 없으면 원본 데이터 자체를 변경해주는 것이다. 
  • 리턴이 있으면 바꾼 데이터를 주는 것이다. 

 

class Singer:
    className = "가수"

#인스턴스 생성
singer1 = Singer()
singer2 = Singer()

#데이터 비교
print(singer1 == singer2)

#id 비교
print(singer1 is singer2)

#클래스 변수 확인
print(singer1.className)
print(singer1.className)

#동일한 데이터인지 비교
print(singer1.className is singer2.className)
print(id(singer1.className))
print(id(singer2.className))
  • 인스턴스는 자기 안에 값이 없으면 클래스를 쫓아감!
  • 그래서 인스턴스는 다르지만 데이터의 id는 같다. 같은 클래스 변수를 가르키고 있음.
class Singer:
    className = "가수"

    #인스턴수 변수를 생성하기 위한 인스턴스 메서드를 생성
    def create(self, name:str) -> None:
        #매개변수로 받은 데이터를 self.name에 대입
        self.name = name
        groupName = "에스파" #self 붙이지 않으면 함수 안에서 쓰는 지역변수기 때문에 밖에서 호출 불가능
 
    #좋은 예
    def setHometown(self, hometown):
        self.homtown = hometown
        
    #나쁜 예
    def setAttr(self, name, hometown):
        self.name = name
        self.homtown = hometown

#인스턴스 생성
singer1 = Singer()
singer2 = Singer()

#인스턴스 메서드 호출
singer1.create("조이") #바운드 호출
Singer.create(singer2, "아이린") #언바운드 호출

print(singer1.name) 
print(singer2.name)

조이

아이린

  • 매개변수 데이터가 많아지는 것은 나쁜 예

 

3) Accessor(getter와 setter, 접근자 메소드)

  • 수정 가능mutable한 변수를 동시작업할 때 제어하는 메소드
  • 인스턴스가 소유한 속성의 값을 수정하거나 읽기 위한 메소드

getter

  • 속성의 값을 읽는 메소드
  • 동시에 접근이 가능하다.
get속성이름(self):
    속성의 값을 리턴
  • 속성의 자료형이 bool인 경우 is속성이름(self)
  • 메소드 이름에서 [속성이름]의 첫글자는 대문자.

setter

  • 속성의 값을 수정하는 메소드
  • 동시에 접근하면 안된다.
set속성이름(self, 매개변수):
    매개변수로 받은 데이터를 속성에 대입
    (리턴 None)
  • 메소드 이름에서 [속성이름]의 첫글자는 대문자.
class Singer:
    
    #name이라는 속성의 accessor
    def setName(self, name):
        self.name = name
    
    #name의 getter
    def getName(self):
        return self.name

 

참고로 요즘에는 아래와 같이 짜야 한다!

class Singer:
    
    #name이라는 속성의 accessor
    def setName(self, name:str) -> None:
        self.name = name
    
    #name의 getter
    def getName(self) -> str:
        return self.name
        
#인스턴스 생성
singer1 = Singer()

#name 설정
singer1.setName(name = "민지")
print(singer1.getName())

민지

singer2 = Singer() #에러
print(singer2.getName())

AttributeError: 'Singer' object has no attribute 'name'

  • setter를 호출하지 않고 getter를 호출해서 에러
  • setter를 항상 먼저 불러야 한다. 변수를 먼저 생성해야 하니까!
  • 혹은 인스턴스가 만들어질 때부터 변수가 있도록 하는 방법이 있다. 그게 __init__ !

 

파이썬의 메소드 이름 관습

  • 첫글자를 대문자로 사용해야 하는 경우 _로 시작
    • 소문자로 시작하기도 한다.
  • _ _뭐시기: 직접 접근 불가 메소드 (private)
  • _ _뭐시기 _ _: 직접 호출 불가, 다른 방법으로 호출해야 함.
...
    def __str__(self): #출력하는 메소드에 인스턴트를 넣으면 자동으로 출력한다.
        print("나의 이름은 ", self.name) #나의 이름은 민지
        return self.name
...

#name 설정
singer1.setName(name = "민지")
print(singer1) #민지

나의 이름은  민지

민지

 

 

4) 초기화 메서드와 소멸될 때 호출되는 메서드

생성자

  • 객체가 생성될 때 자동으로 실행, 메모리를 할당한다.
  • 그리고 멤버변수 값을 초기화하는 역할을 한다. 
  • 만약 초기화 작업이 필요 없다면 클래스 설계 시 생성자를 생략할 수 있다. (파이썬은 기본생성자를 자동 제공)
더보기

예문

#(1) 생성자 이용 멤버변수 초기화
class Multiply :
    #멤버 변수
    x = y = 0
    
    #생성자 : 초기화
    def __init__(self, x, y): #객체만 생성
        self.x = x
        self.y = y
    
    #메서드
    def mul(self):
        return self.x * self.y
    
obj = Multiply(10, 20) #생성자
print('곱셈=', obj.mul()) #곱셈=200

 

#(2) 메서드 이용 멤버변수 초기화
class multiply2 :
    #멤버 변수
    x = y = 0
    
    #생성자 없음 : 기본 생성자 제공
    def __init__(self):
        pass
    
    #메서드: 멤버변수 초기화
    def data(self, x, y):
        self.x = x
        self.y = y
    
    #메서드: 곱셈
    def mul(self):
        return self.x * self.y

obj = Multiply() #기본 생성자
obj.data(10, 20) #동적 멤버변수 생성
print('곱셈=', obj.mul()) #곱셈=200

 

더보기

self가 뭐야?

  • 클래스의 생성자와 메서드는 기본적으로 self라는 매개변수를 갖는다.
  • 클래스를 구성하는 멤버들 즉 멤버변수와 메서드를 호출하는 역할을 한다.
  • 예를 들어 생성자 안에서 멤버변수 값을 초기화하거나 메서드 안에서 멤버변수를 참조하거나 또는 다른 메서드를 호출할 경우 이용한다.
class multiply3:
    #멤버변수 없음
    #생성자 없음
    
    #동적 멤버변수 생성/초기화
    def data(self, x, y):
        self.x = x #동적으로 멤버변수가 만들어지고 매개변수에 의해서 값이 초기화된다.
        self.y = y
        
#곱셈연산
def mul(self):
    result = self.x * self.y
    self.display(result) #메서드 호출

#결과 출력
def display(self, result):
    print("곱셈= %d" %(result) ) #곱셈 = 200
    
obj = multiply3() #기본 생성자
obj.data(10, 20)
obj.mul()

 

 

초기화 메소드 __init__

  • 인스턴스를 만들 때 호출하는 메소드
  • 생성자와 다른 점, 메모리 할당을 하지 않는다!
  • 기본적으로 매개변수가 self 1개인 메소드가 제공된다. 
    • 기본적으로 제공되는 __init__은 아무일도 하지 않는다.
    • 무엇인가를 하도록 하려면 __init__을 재정의(overriding) 해야 한다. 
    • 직접 재정의를 하면 기본 제공되는 메소드는 없어진다. 
  • 인스턴스가 생성될 때 인스턴스 속성(attribute)을 초기화할 때 주로 사용
  • 외부에서 만든 데이터를 인스턴스 속성에 대입하는 작업을 Injection(주입)이라고 한다.
    ex. singer1.setName(name = "민지")
class Singer:
    
    def setName(self, name:str) -> None:
        self.name = name
    
    def getName(self) -> str:
        return self.name
    
    #초기화 메소드
    def __init__(self, name):
        self.name = name
        
 
singer1 = Singer() #에러발생
print(singer1.getName())

TypeError: Singer.__init__() missing 1 required positional argument: 'name'

  • name에 초기값을 줘야 함!
class Singer:
    
    def __init__(self, name = "noname"):
        self.name = name
  
 ...
  • 이제 초기값이 정의됐기 때문에 값을 주든 안주든 에러가 안난다.

 

소멸 메소드 __del__

  • 인스턴스가 소멸될 때 호출되는 메소드
  • 객체 사용이 완료되면 자동으로 실행되어 객체를 메모리에서 소멸시키는 역할을 한다.
__del__(self):
    내용
class Singer:
    
    #name이라는 속성의 accessor
    def setName(self, name):
        self.name = name
    
    #name의 getter
    def getName(self):
        return self.name
    
    #초기화 메소드
    def __init__(self, name = "noname"):
        self.name = name
    
    def __del__(self):
        print(self, "메모리 해제")        
 
singer1 = Singer() 
print(singer1) #<id>
singer1 = None 
#<id> 메모리 해제
singer1 = Singer() 
singer3 = singer1
singer1 = None
  • singer1이 가리키던 인스턴스를 해제(None을 가리키도록 설정 → 메모리 해제 대상)
  • 그러나 singer3도 이제 Singer()를 가리키기 떄문에 사실은 reference count = 1인 상태!
  • python은 reference count = 0이 될 때 메모리가 해제

인스턴스의 reference count = 0 이 되면 호출

  • 외부의 데이터를 사용하는 경우 무조건 정리를 하고자 할때 주로 사용
  • 생성자의 반대역할 
  • 하지만 파이썬 자체에서 메모리 관리를 자동으로 해주기 때문에 많이 사용되지는 않는다.

 

5) 클래스가 인스턴스 없이 호출할 수 있는 메소드 

static 메소드

  • self 없이 클래스 안에 만들 수 있는 메소드
  • 이 메소드는 클래스가 인스턴스 없이 호출할 수 있고 인스턴스를 이용해서 호출할 수도 있다.
@staticmethod
def 이름(self제외 매개변수):
    내용
  • 파이썬에서 @로 시작하는 단어는 decorator라고 하는데 코드를 하나의 단어로 작성하고자 할 때 사용
  • 이 코드는 메소드의 내용이 수행되기 전이나 수행된 후에 하고자 하는 작업에 대한 코드(Filter, AoP)

        *AoP 관점지향적 프로그래밍

        *JAVA에서는 Class method만 사용한다. (@Classmethod)

 

Heap 자료구조 Stack 자료구조
영구적 할당
Static: Class, Function, Literal


반영구적 할당
Dynamic: Instance
Function Call, 임시 영역
- LIFO구조 (Last In First Out)

 

  • 사용자는 Class에 접근하거나, stack을 통해서 Instance에 접근할 수 있다. 
  • Class에 있는 instance method를 사용하려면 singer = Singer()의 과정이 필요하지만
  • Class에 있는 static method를 사용하려면 바로 Class에 접근해서 사용하면 속도와 메모리 효율이 좋다.
  • 따라서 self가 없는 애들은 static으로 만드는게 좋다. 

@staticmethod

class Singer():
    #인스턴스 없이 클래스가 호출할 수 있는 메서드
    @staticmethod
    def staticMethodExam():
        print("static method")
    
    #클래스에 대한 정보를 갖는 매개변수 1개가 필수    
    @classmethod
    def classMethodExam(cls):
        print("class method")
            
#instance = Singer()
#instance.staticMethodExam()

Singer.staticMethodExam()
Singer.classMethodExam()

 

 

 

6) Inheritance(상속)

상속

  • 하위 클래스가 상위 클래스의 모든 것을 물려받는 것

        * 객체지향언어에서는 is a로 사용하기도 함

  • 여러 개의 클래스들에 공통된 내용이 있는 경우 공통 내용을 상위 클래스에 만들고 상속을 받는 방법으로 대체한다.
    • a = 10 변수를 설정해서 나중에 값을 수정할 때 변수만 수정하면 되는 맥락과 같음!
  • 객체지향 프로그래밍의 기본 원칙에서는 여러 하위 클래스에 공통으로 존재하는 기능을 상위 클래스로 올려보내는 것으로 간주한다.
상위 클래스
        ↑
하위 클래스

*그러니 부모클래스, 자식클래스라는 말은 절대 쓰지 말자!

 

단일 상속: 하나의 클래스로부터 상속받는다.

다중 상속: 여러 개의 클래스로부터 상속받는다. 파이썬은 다중 상속을 지원

 

목적

  • 여러 클래스의 공통된 내용이 존재해서 - 일반 프로그래밍
  • 제공되는 클래스의 기능이 부족해서 - 프레임워크
    • 프로그램을 여러개 만들면 공통적으로 사용하는 기능이 있다. 이런 공통 기능을 미리 만들어서 제공하기도 한다.
    • 이 경우는 클래스의 기능이 부족할 때 확장하기 위해서 상속을 하는 것
  • 공통된 인터페이스를 사용하기 위해서 - 다형성 구현

구현

class 클래스이름(상위클래스 이름 나열)
class Phone:
    def superMethod(self):
        print("phone 클래스의 메소드")

#다중상속받은 클래스
class Camera:
    def superMethod(self):
        print("Camera 클래스의 메소드")

#상속받은 클래스
class SmartPhone(Phone, Camera): #Camera가 Phone보다 먼저 오면 Camera superMethod 호출
    def subMethod(self):
        print("Smartphone 클래스의 메서드")


subOnj = SmartPhone()
subOnj.subMethod()
#SmartPhone 클래스는 phone 클래스를 상속받았으므로 phone 클래스의 멤버를 사용 가능
subOnj.superMethod()

Smartphone 클래스의 메서드
Camera 클래스의 메소드

 

상위 클래스의 __init__ 호출

  • 파이썬에서 하위 클래스의 __init__ 메소드에서 상위 클래스의 __init__를 자동으로 호출하지 않는다.
  • 대다수의 객체 지향 언어에서 상속을 받으면 하위 클래스의 생성자에서 상위 클래스의 생성자를 자동으로 호출한다.
  • 하위 클래스의 __init__ 안에서 상위 클래스의 초기화 메소드를 호출하고자 하는 경우는 super().__init__()를 호출
class Phone:
    def __init__(self):
        self.name = "전화기"
    
    def superMethod(self):
        print("phone 클래스의 메소드")

#상속받은 클래스
class SmartPhone(Phone):
    def __init__(self):
        #상위 클래스의 속성을 자동으로 호출하지 않기 떄문에 생성자라고 할 수 없음
        #상위 클래스의 __init__을 호출해줘야 한다.
        super().__init__()
        print(self.name)
    
    def subMethod(self):
        print("Smartphone 클래스의 메서드")

subOnj = SmartPhone()
subOnj.subMethod()
subOnj.superMethod()

 

 

 

7) Method Overriding

method overloading(중복 정의)

하나의 클래스에 동일한 이름이지만 매개변수의 개수나 자료형이 다르게 만들어진 메소드가 존재하는 경우

method overriding(재정의)

상위 클래스(내용이 있음)에 존재하는 메소드를 하위 클래스에서 다시 정의하는 것

 

목적

기능 확장 ★

  • 기능을 10개 주는데, 클래스가 확장이 되는게 아니라 메소드가 확장이 됐으면 좋겠다. 새로 만들면 이름이 바뀐다. 기존의 이름을 쓰되 다른 기능을 추가해주는 것을 오버라이딩이라고 한다. 
  • 오버라이딩을 하면 상황에 따라서 같은 이름이 다른 일을 한다. 
    • 똑같은 클릭인데 탐색기에서는 선택, 버튼에서는 하이퍼링크 따라가기. 
    • 어차피 같은 동작인데 여기서는 클릭, 여기서는 프레스라고 하면 스트레스니까..!

언어에서는 상위 클래스의 메서드를 호출하지 않는 것이 에러가 아니지만 프레임워크에서는 에러가 발생한다.

class Phone:
    def __init__(self):
        self.name = "전화기"
    
    def superMethod(self):
        print("phone 클래스의 메소드")

#상속받은 클래스
class SmartPhone(Phone):
    def __init__(self):
        super().__init__()
        print(self.name)
    
    #상위클래스에 존재하는 메소드를 하위 클래스에서 다시 구현
    #메소드 오버라이딩
    def superMethod(self):
        super().superMethod() #기능 확장, 순서 중요
        print("SmartPhone 클래스의 메소드")
    
    def subMethod(self):
        print("Smartphone 클래스의 메서드")

subOnj = SmartPhone()
subOnj.subMethod()
subOnj.superMethod()
  • 만들 때는 상위클래스부터, 지울 때(destroy, close)는 하위클래스부터! 
  • 대부분은 super()를 먼저 쓰지만, 파괴할 때는 super()가 뒤에 온다. 

 

 

8) Abstract(추상)

Abstract Class(추상 클래스)

  • 인스턴스를 만들 수 없는 클래스
  • 상속을 통해서만 사용하는 클래스

만드는 방법

import abc 
class 클래스이름(metaclass=abc.ABCMeta)
  • import는 파이썬 기본 모듈이 아닌 파일의 내용을 현재 프로그램에 가져올 때 사용하는 명령어
  • import abc는 abc.py라는 파일의 내용을 abc라는 이름으로 묶어서 가져오는 것이다. 
  • import abc as X: abc.py라는 파일의 내용을 X라는 이름으로 묶어서 가져오는 것이다. 

 

Abstract method (추상 메소드)

  • 내용이 없는 메소드
  • 반드시 추상 클래스에 존재
  • 하위 클래스에서 반드시 구현해야 하는 메소드

        *자바에서는 이것도 오버라이딩이라고 한다. 하지만 오버라이딩의 목적은 기능확장이니까, 정확히는 implements(구현)이라고 해야 한다.

 

생성 방법

@abc.abstractmethod
def 이름(매개변수):
    pass

 

사용 이유

  • 동일한 인터페이스를 제공하기 위해서!
  • 인터페이스는 프로토콜이라고도 한다. (규칙, 약속)
    • 음식점의 키오스크에는 내용물은 없고 이름하고 그림만 있다. 하지만 반드시 이 음식점에서 해줄 수 있어야 한다. 이 키오스크가 음식점과 대화하기 위한 인터페이스. 
    • 인터페이스를 만드는 이유는 고객과 소통하는 템플릿을 만들기 위해서다.
#추상 클래스를 만들기 위한 모듈
import abc

class Phone(metaclass=abc.ABCMeta):
    #추상 메소드
    @abc.abstractmethod
    def call(self):
        pass    

#추상 클래스를 상속받은 클래스
#추상 메소드를 반드시 구현
class SmartPhone(Phone):
    pass

smartPhone = SmartPhone()

TypeError: Can't instantiate abstract class SmartPhone with abstract method call

class SmartPhone(Phone):
    def call(self):
        print("성공")

SmartPhone = SmartPhone()
print(smartPhone.call())

성공

None

 

템플릿 메서드 패턴

  • 추상 메서드를 소유한 추상 클래스(인터페이스, 프로토콜)를 만들고 이를 구현한 클래스를 만들어서 
  • 고객의 요구를 처리하는 클래스 생성
#추상 클래스를 만들기 위한 모듈

import abc

class InsertService(metaclass=abc.ABCMeta):
    #추상 메소드
    @abc.abstractmethod
    def insert(self, data) -> bool:
        pass    

class InsertServiceImpl(InsertService):
    #대략적인 동작하는 코드를 작성하고 테스트 한 후 실제 코드를 구현하는 방식이 TDD
    def insert(self, data) -> bool:
        print("데이터 추가")
        return True

service = InsertServiceImpl()
print(service.insert("데이터"))

데이터 추가

True

 

 

 

9) Polymorphism(다형성)

  • 동일한 메시지에 대하여 다르게 반응하는 성질
  • 동일한 코드가 호출하는 인스턴스에 따라 다른 메소드를 호출하는 것
  • 상속과 오버라이딩을 이용해서 구현
import abc

class Starcraft(metaclass=abc.ABCMeta):
    #추상 메소드
    @abc.abstractclassmethod
    def attack(self, data) -> None:
        pass
    
class Protoss(Starcraft):
    def attack(self, data) -> None:
        print("프로토스 ", data, " 공격")
    
class Terran(Starcraft):
    def attack(self, data) -> None:
        print("테란 ", data, " 공격")
        
star = Protoss()
star.attack("드래군")
star = Terran()
star.attack("종이비행기")

프로토스  드래군  공격
테란  종이비행기  공격

  • 유사한 동작은 하나의 인터페이스로 동작이 되어야 한다.
  • 프로토스든 테란이든 단축키를 하나로! 

        * 프로그레시브 웹앱: 스마트폰과 웹에서 동일한 UI로 만들자. 그럼 배울 동작이 하나라 간편 (유튜브)

 

 

 

 

 

 

 

더보기

클래스와 객체 추가

 

클래스와 객체

클래스(Class)

  • 변수와 함수들을 하나로 묶어놓은 논리적 집합체
  • 속성(Attribute)와 행위(Action)로 구성된다. 
  • 클래스의 구성요소를 UML 표기법으로 도식화하면
  • 설계 도면은 필요한 속성만 정의해두지만, 클래스에는 자동차가 할 수 있는 동작도 정의해야 한다. 
  • 클래스의 속성은 자료(data)를 나타낸다. (변수, 필드의 개념)
  • 클래스의 행위는 자료를 연산하거나 조작하는 역할을 한다. (메소드, 함수의 개념) 
    • 함수(Function): 독립된 기능을 수행하는 코드(명령문)들의 집합
    • 메서드(Method): 클래스에 포함되어 있는 함수

* 클래스 변수는 객체를 생성하지 않아도 쓸 수 있는 광역변수

 

객체(Object)

  • 클래스에 의해서 만들어지는 결과물(instance)
  • 클래스를 선언해야 객채를 생성할 수 있다. 
    • 함수: 정의 → 호출
    • 클래스: 클래스 정의 → 객체 생성 → 멤버 호출
  • 클래스를 만들었으나 객체를 생성하지 않으면 클래스의 멤버(변수, 메소드)를 쓸 수 없다.
    • 멤버변수 = (클래스변수, 객체변수, 종단변수)
    • 클래스변수는 정적변수/전역변수, 객체변수는 동적변수
    • 클래스 변수가 객체변수보다 우선순위에 있기 때문에 클래스 변수는 객체 생성 없이도 사용할 수 있다.
  • 각 객체는 서로 독립적인 메모리 주소를 가지고 있으며, 메시지(Message)를 이용해서 상호작용도 가능하다.

 

# 함수 형식
def 외부함수(매개변수) :
    변수선언
    def 내부함수() :
        명령문
        return 값
    return 내부함수
    
# 클래스 형식
class 클래스명:
	변수 선언
    def 생성자() :
    	명령문
    def 함수명() :
    	명령문

* 생성자도 메서드의 일부로 보는게 편하다. 

# (1)함수 정의
def calc_func(a, b) : #외부함수
    #변수 선언: 자료저장
    x = a #10
    y = b #20
    
    def plus(): #내부함수
        p = x + y
        return p
    
    def minus(): #내부함수
        m = x - y
        return m
    
    return plus, minus #내부함수는 괄호 없이 호출

# (2)함수 호출
p, m = calc_func(10, 20)
print('plus =', p())
print('minus=', m())


# (3)클래스 정의
class Calc_class :
    #클래스 변수: 자료저장
    x = y = 0
    
    # 생성자: 객체 생성 + 멤버변수 초기화 (__생성자__)
    def __init__(self, a, b): #self는 26번의 x, y를 의미한다.
        self.x = a #10
        self.y = b #20
        
    #클래스 함수
    def plus(self):
        p = self.x + self.y #변수선언
        return p
    
    #클래스 함수
    def minus(self):
        m = self.x - self.y
        return m
    
# (4)객체 생성
obj = calc_class(10, 20) #객체를 만드는 문장이 실행될 때, 생성자는 자동으로 실행된다.

# (5)멤버 호출
print('plus=', obj.plus()) #plus = 30
print('minus=', obj.minus()) #minus = -10

 

객체와 인스턴스의 차이

인스턴스는 개념적으로 객체와  비교했을 때, 현재 가장 최근에 만들어진 객체를 의미한다.

 

 

클래스의 구성요소

클래스 구성요소: 멤버(Member) + 생성자(Constructor)

               멤버번수(자료) + 메서드(기능)

 

class Car:
    #(1) 멤버변수
    cc = 0 #엔진 cc
    door = 0 #문짝 개수
    carType = None #null
    
    #(2) 생성자
    def __init__(self, cc, door, carType):
        #멤버 변수 초기화
        self.cc = cc
        self.door = door
        self.carType = carType #승용차, SUV
    
    #(3) 메서드
    def display(self):
        print("자동차는 %d cc이고, 문짝은 %d개, 타입은 %s"
              %(self.cc, self.door, self.carType))
    
#(4) 객체 생성
car1 = Car(2000, 4, "승용차") #객체 생성 + 초기화
car2 = Car(3000, 5, "SUV")
    
#(5) 멤버 호출 : object.member()
car1.display() #car1 멤버 호출
car2.display() #car2 멤버 호출

 

(1) 멤버변수

Car 클래스의 선언부에 3개의 멤버변수(cc, door, carType)를 선언한다. 

 

(2) 생성자

생성자는 함수의 선언과 유사하지만 차이점은 이름이 정해져 있고 self라는 매개변수를 사용한다는 점이다.

예문에서 생성자는 def 명령어 다음에 '__init__'이라는 이름과 self라는 매개변수를 이용하여 선언된다.

self 매개변수는 생성자 내에서 클래스의 멤버를 호출하는 데 이용된다.

self 매개변수 다음에 오는 3개의 매개변수는 3개의 멤버변수 (cc, door, carType)에 값을 초기화하기 위한 매개변수다.

매개변수는 객체가 생성 시의 인수를 받아서 멤버변수에 초기화하는 역할을 한다.

 

(3) 메서드

메서드는 함수 선언과 동일하다. 차이점은 생성자와 마찬가지로 self라는 정해진 매개변수를 포함하고 있다는 점이다.

예문에서 display() 메서드는 self를 이용하여 3개의 멤버변수의 내용을 출력하는 역할을 한다. 

 

(4) 객체 생성

클래스의 생성자를 이용하여 객체를 생성한다.한 개의 클래스에 의해서 다수의 객체를 만들어낼 수 있다.

Car 클래스의 생성자를 이용하여 객체를 생성하는 방법은 참조변수 = Car(인수)

Car()는 Car 클래스의 생성자이고, 인수는 생성자의 매개변수에 전달할 실제값이다.

따라서 Car(2000, 4, "승용차") 형식의 명령문은 3개의 멤버변수에 각각 cc=2000, door=4, carType="승용차"가 할당되어 car1 객체가 생성된다.

 

(5) 멤버 호출

생성된 객체의 참조변수를 이용하여 객체의 멤버를 호출할 수 있다.  참조변수.멤버(멤버변수 or 메서드)

 

'Python' 카테고리의 다른 글

Day8. 가상환경 만들기  (1) 2024.01.19
Day7. 웹프로그래밍 개요  (1) 2024.01.18
Day5. 함수  (1) 2024.01.08
Day4. 딕셔너리와 반복문  (1) 2024.01.05
Day3. 조건문과 리스트  (2) 2024.01.04