728x90
반응형

<제너레이터(Generator)>

📍이터레이터는 class 기반, 제너레이터는 함수 기반

📍함수를 이용해서 이터레이터(반복)의 기능을 구현

📍이터레이터와 동일하게 호출 시점에만 메모리를 사용하고 사용이 끝나면 소멸된다.

📍반환할 때 사용하는 명령어는 return이 아닌, yield를 사용한다.

📍이터레이터와 동일하게 전체 또는 next() 한건씩 출력 가능하다.

 

제너레이터 기본 문법

def simple_generator() :
    ### 첫번째 반환할 값
    yield 1

    ### 두번째 반환할 값
    yield 2

    ### 세번째 반환할 값
    yield 3

 

제너레이터 전체 출력하기

- 제너레이터에서는 수를 객체러 인지하고 사용한다.
- 함수를 생성한다는 의미 또는 제너레이터 객체를 생성한다는 의미를 사용한다.

for v in simple_generator() :
    print(v)
1
2
3

1부터 5까지의 숫자를 생성해서 반환하는 제너레이터 만들기

def number_generator() :
    for i in range(1, 6, 1) :
        yield i

 

전체 출력하기

- 함수 객체 생성하기

gen = number_generator()
for num in gen :
    print(num)
1
2
3
4
5


한건씩 출력하기

### - 함수 객체 생성하기
gen = number_generator()
try:
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen))
except:
    pass
1
2
3
4
5

※ try / except 가 없다면 오류 발생

파일 한줄씩 읽어서 반환하는 제너레이터 만들기

read_lines 함수 생성

- 파일처리 시 이터레이터와 다르게, with문을 사용해도 된다.

def read_lines(file_path) :
    with open(file_path, "r", encoding="utf-8") as file :
        for line in file :
            yield line.strip()

 

 

제너레이터 함수 생성하기

gen = read_lines("./04_example.txt")
for line in gen :
    print(line)

 

- 메모장 내용과 주피터 노트북 실행 결과

가가가
나나나
다다다
라라라

 

728x90
반응형
728x90
반응형

<이터레이터(Iterator)>

📍파이썬에서 반복 가능한 객체(클래스)를 표현하는 데 사용되는 인터페이스

📍이터레이터는 init() 함수와 next() 함수를 이용하여 반복(Iterator)을 수행함

📍__iter__() 메서드 

iter 메서드는 이터레이터 객체 자체를 반환한다. 이터레이터 객체는 __iter__() 메서드를 가지고 있어야 한다. 이는 파이썬에서 "순회 가능한(iterable)" 객체의 특징이다.

📍__next__() 메서드

next 메서드는 다음 요소를 반환한다. 만약 더 이상 반환할 요소가 없으면 StopIteration 예외를 발생시켜 순회를 종료시킨다. 이 메서드가 호출될 때마다, 다음 요소를 반환하고 내부 상태를 업데이트하여 다음 호출 시에 이전 요소의 다음 요소를 반환할 수 있도록 한다.

 

반복문 사용하여 이터레이터 사용하기

### 클래스 정의하기

- 아래 코드는 MyIterator 클래스를 정의하고 객체를 생성한 후, for 루프를 사용하여 이터레이터를 순회하고 있다. 이터레이터 객체를 생성하면 __init__ 메서드가 호출되고, 그 후에 __iter__ 메서드가 호출되어 이터레이터 객체를 반환한다. 그리고 for 루프에서 각 단계마다 __next__ 메서드가 호출되어 반복이 수행된다. 반복이 끝나면 StopIteration 예외가 발생하여 순회가 종료된다

### 클래스 정의하기
class MyIterator :
    ### 클래스 생성자 정의하기
    def __init__(self) :
        self.current_value = 0
        print(f"#1 (__init__) : self={self} / self.current_value={self.current_value}")

    ### 자신의 클래스를 반환하는 iter 함수 정의
    def __iter__(self) :
        print(f"#2 (__iter__) : self={self}")
        return self

    ### 반복을 수행하는 next 함수 정의
    def __next__(self) :
        print(f"#3 (__next__) : self={self}")
        ### current_valu의 값이 5보다 작을 때까지 반복 수행
        if self.current_value < 5 :
            # - 반환할 변수에 current_value의 현재값 저장
            result = self.current_value
            # - result 값 반환
            self.current_value += 1

            print(f"#4 : result={result} / self.current_value={self.current_value}")
            # - return 값 반환
            return result
        else :
            print("#5 : StopIteration 예외 발생")
            ### 이터레이터는 반복이 끝나면 종료시켜야함
            # - 종료시키는 방법은 강제로 오류 발생시킴
            raise StopIteration

 

### 이터레이터 실행시키기

- 클래스 생성하기

my_iterator = MyIterator()
#1 (__init__) : self=<__main__.MyIterator object at 0x0000014EF4FF4510> / self.current_value=0

 

### 반복문 실행시키기

- 이터레이터 기능은 반복문(for or while)을 사용해야만 작동하는 기능임

- 최초 __iter__() 함수를 호출하고, 출력 시 __next__() 함수가 한 번씩 수행하면서 값을 반환받아서 출력함

- 한번 반환된 후 메모리는 초기화되며, 다음 반복 시 다시 메모리 사용

- 메모리를 효율적으로 활용할 수 있음

- 반복 수행하여 result 값 출력하기

for value in my_iterator :
    print(value)
#2 (__iter__) : self=<__main__.MyIterator object at 0x0000014EF4FF4510>
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF4FF4510>
#4 : result=0 / self.current_value=1
0
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF4FF4510>
#4 : result=1 / self.current_value=2
1
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF4FF4510>
#4 : result=2 / self.current_value=3
2
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF4FF4510>
#4 : result=3 / self.current_value=4
3
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF4FF4510>
#4 : result=4 / self.current_value=5
4
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF4FF4510>
#5 : StopIteration 예외 발생

반복문 사용하지 않고 이터레이터 실행시키기

### 이터레이터 실행시키기

- 클래스 생성하기

my_iterator = MyIterator()
#1 (__init__) : self=<__main__.MyIterator object at 0x0000014EF601D110> / self.current_value=0

 

### 반복문 사용하지 않고 실행시키기

print(next(my_iterator))
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF5348E50>
#4 : result=0 / self.current_value=1
0

 

### try / except로 예외처리

try : 
    print(next(my_iterator))
    print(next(my_iterator))
    print(next(my_iterator))
    print(next(my_iterator))
except :
    print("이터레이터 종료")

 

- 처음 실행 했을 때 결과

3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF6549D10>
#4 : result=1 / self.current_value=2
1
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF6549D10>
#4 : result=2 / self.current_value=3
2
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF6549D10>
#4 : result=3 / self.current_value=4
3
#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF6549D10>
#4 : result=4 / self.current_value=5
4

 

- 두 번 실행했을 때 결과

#3 (__next__) : self=<__main__.MyIterator object at 0x0000014EF601D110>
#5 : StopIteration 예외 발생 이터레이터 종료

간단 실습

### 이터레이터 클래스 생성해서 Hello 각 단어 출력하기

- 클래스 이름 : StringIterator

- 임의 문자열을 받아서 처리한다.

- 임의 문자열은 외부에서 클래스 생성 시 넣어준다.

 

내가 만든 코드

class StringIterator:
    def __init__(self, word):
        self.word = word
        self.index = 0

    def __iter__(self):
        return self 

    def __next__(self):
        if self.index < len(self.word):
            result = self.word[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration

 

 

- 코드실행

string_iter = StringIterator("안녕하세요")
for v in string_iter:
    print(v)




 

강사님 코드

- p_text 지역변수, 매개변수로써의 의미

- self.text 는 멤버 변수

- 둘이 저장되는 위치가 다름

class StringIterator_:
    ### 클래스 생성자
    def __init__(self, p_text) :
        # - next 함수에서 1씩 증가시키면서 반복 조건에 사용할 변수
        self.index = 0

        # - 받아온 문자열
        self.text = p_text

    ### 반복수행을 위한 iter 함수 정의
    def __iter__(self):
        return self 

    ### 한건 한건 처리를 위한 next 함수 정의
    def __next__(self) :
        if self.index < len(self.text) :
            ### 문자열에서 문자 하나씩 추출하기
            result = self.text[self.index]
            self.index += 1
            return result
        else:
            raise StopIteration

 

 

- 코드 실행

### 이터레이터 기능 사용하기
# 반복문을 이용해서 추출하기
# - 클래스 생성하기
msg = "Hello"
string_iter_ = StringIterator_(msg)

 

 

- 반복문을 이용해서 전체 추출하기

for char in string_iter_ :
    print(char)
H
e
l
l
o

 

- 따로따로 실행하기

print(next(string_iter_))
print(next(string_iter_))
print(next(string_iter_))
print(next(string_iter_))
print(next(string_iter_))
H
e
l
l
o

※ 예외처리를 안 했기 때문에 한번 더 실행하면 오류 발생

일반 프로그래밍 방식과 이터레이터 방식의 메모리 비교

### 메모리 확인을 위해 라이브러리 설치 필요

pip install memory-profiler

 

### 주피터 노트북 ver

## 라이브러리 불러오기

from memory_profiler import profile

### 주피터노트북에서는 아래 로드 처리 해야힘
%load_ext memory_profiler

 

## 이터레이터 클래스 생성하기

class SimpleIterator :
    def __init__(self, limit) :
        ### 반복 범위를 지정할 값(반복의 끝값)
        self.limit = limit
        ### 반복 시작값
        self.current = 0
        
    def __iter__(self) :
        return self

    def __next__(self) :
        if self.current < self.limit :
            self.current += 1
            return self.current
        else :
            raise StopIteration

 

## 데코레이터 함수 정의하기

### 이터레이터를 사용하지 않고 메모리 체크하기
@profile
def no_iterator(limit) :
    data = [i for i in range(1, limit+1)]

### 이터레이터를 사용해서 메모리 체크하기
@profile
def yes_iterator(limit) :
    data = SimpleIterator(limit)
    for item in data :
        ### 반복만 처리하고 별도 출력은 안함
        pass

 

## 데코레이터 함수 호출하기

limit = 1000000
try:
    %memit no_iterator(limit)

    %memit yes_iterator(limit)
except:
    pass
ERROR: Could not find file C:\Users\user\AppData\Local\Temp\ipykernel_3736\513312623.py
peak memory: 130.37 MiB, increment: 25.96 MiB
ERROR: Could not find file C:\Users\user\AppData\Local\Temp\ipykernel_3736\513312623.py
peak memory: 104.40 MiB, increment: 0.00 MiB

 

### 파이썬 ver

새로운 파일에 기존 주피터 노트북에 적은 코드에서 로드해오는 %load_ext memory_profiler 코드 빼고 작성하기

py 형태로 파일 저장한 뒤  프롬프트에서 실행하기

## 데코레이터 함수 호출하는 코드 수정

if __name__ == "__main__" :
    ### 데코레이터 함수 호출하기
    limit = 1000000

    print("no_iterator ------------------------\n")
    no_iterator(limit)
    
    print("yes_iterator ------------------------\n")
    yes_iterator(limit)

 

## 프롬프트에서 실행시 명령어

python -m memory_profiler 04_iterator_memory_test.py

 


간단실습

### 두개의 숫자(시작값, 종료값) 값을 이용해서, 짝수값만 반환하는 이터레이터 만들기

 

내가 만든 코드

class EvenNumberIterator :
    def __init__(self, start, end) :
        self.start = start
        self.end = end

    def __iter__(self) :
        return self

    def __next__(self) :
        if self.start <= self.end and self.start % 2 == 0  :
            self.start % 2 == 0
            result = self.start
            self.start += 2
            return result
        else :
            self.start += 1
            raise StopIteration

 

 

- 코드 실행

num_iterator = EvenNumberIterator(1, 20)
for v in num_iterator :
    print(v)
2
4
6
8
10
12
14
16
18
20

 

강사님 코드

class EvenNumberIterator :
    def __init__(self, start, end) :
        self.start = start
        self.end = end

    def __iter__(self) :
        return self

    def __next__(self) :
        # - 사용하는 값은 self.start 값만 사용
        for i in range(self.start, self.end, 1) :
            ### self.start가 짝수인지 체크
            if self.start % 2 == 0:
                ### 반환할 변수에 저장
                result = self.start
                # - self.start값은 1 증가
                self.start += 1
                # - 반환하기 : 반환하면 for문은 종료됨
                return result
            ### 짝수가 아니면
            else :
                # - 1증가만 시키고 반복을 계속 수행
                self.start += 1
                
        ### for문을 이용한 경우에는, 이터레이터 반복 종류 후 마지막에 아래 추가
        raise StopIteration

 

 

- 코드 실행

even_iter = EvenNumberIterator(1, 10)

for even in even_iter :
    print(even)
2
4
6
8

외부 함수를 이용해서 짝수값 추출하는 이터레이터 만들기

1. 이터레이터 클래스 생성하기

class EvenNumberIterator :
    ### 클래스 생성자 정의
    def __init__(self, start, end, func):
        # - 시작값
        self.start = start
        # - 종료값
        self.end = end
        # - 외부함수
        self.func = func

    ### 반복을 위한 이터레이터 함수 정의
    def __iter__(self):
        return self

    ### 반복 결과값을 처리할 함수 정의
    def __next__(self):
        ### 시작부터 종료까지 while 반복
        while self.start <= self.end :
            ### 외부함수로 짝수 or 홀수 체크
            # - 짝수면 True, 홀수면 False
            if self.func(self.start) :
                result = self.start
                self.start += 1
                return result
            else :
                self.start += 1
        ### 이터레이터 종료하기
        raise StopIteration

 

2. 짝수와 홀수를 판별하는 외부함수 정의하기

def is_even(num) :
    return num % 2 == 0

 

3. 이터레이터 클래스 생성하기

- 함수 이름을 그대로 변수로 넣으면 함수 자체를 실행

even_iter = EvenNumberIterator(1, 10, is_even)

### 이터레이터 반복 수행하기
for v in even_iter :
    print(v)

 텍스트 파일의 내용을 한줄씩 반환하는 이터레이터 만들기

1. 이터레이터 클래스 생성하기

- 파일명은 클래스가 받아서 처리

- readline() : 파일 정보중에 줄 하나 가지고 오는 함수

          >> 최초 이후부터는 다음 줄이 있는지 자동으로 체크 후 가지고 온다

          >> 다음 줄이 없으면 안가지고 온다.

class FileLineIterator :
    def __init__(self, file_path) :
    	# 파일 경로를 인스턴스 변수에 저장
        self.file_path = file_path
        # 파일 열기
        self.file = open(file_path, "r", encoding = "utf-8")
        
    def __iter__(self):
        return self
    
    def __next__(self):
        print("#1 ---------------------")
        
        # 파일에서 한 줄 읽어오기
        line = self.file.readline()
        
        # 읽어온 줄이 있으면 반환하고, 없으면 종료
        if line:
        	# strip은 문자열의 양 끝에서 공백 문자(공백, 탭, 개행문자 등)을 제거하는 역할
            return line.strip()
            
        else :
        	# 파일 닫기와 StopIteration 예외 발생
            print("#4 : 이터레이터 종료")
            self.file.close()
            raise StopIteration

 

 

2. 이터레이터 클래스 생성하기

file_path = "./04_example.txt"
file_iter = FileLineIterator(file_path)

 

3. 반복해서 파일 내용 한줄씩 출력하기

for line in file_iter :
    print(line)

 

- 메모장 내용과 주피터 노트북 실행 결과

# 결과
#1 ---------------------
가가가
#1 ---------------------
나나나
#1 ---------------------
다다다
#1 ---------------------
라라라
#1 ---------------------
#4 : 이터레이터 종료

 

 

 

728x90
반응형
728x90
반응형

커리큘럼

취업 마인드 형성

lT산업분석 및 채용 트렌드

IT직무 이해와 취업 전략

IT취업 성공사례와 SWOT 분석


 

VUCA

volatility 변동

uncertainty 불확실

complexity 복잡성

ambiguity 모호성

 

직업을 찾을 때 고려사항

1. 하는 일 :  실무에서 바로 활용할 수 있는 직무 역량을 갖춘 인재 선호

2. 요구되는 특성 : 업무수행능력, 시식, 성격, 흥미, 가치관, 신체적 조건 등

3. 요구되는 교육수준 : 학력 및 전공, 필요한 자격증, 업무숙달기간

4. 전망 : 임금(평균임금) / 일자리 전망

5. 직업적 특성 : 복리후생, 안정성, 근무여건(시간, 지역, 환경)

6. 기타 : 타 직종으로의 전직가능성, 요구되는 대인관계

 

관련 분야

1. 데이터 + AI

2. 인공지능

3. 비전공(도메인) + AI → 개발 + 서비스기획(개발에 대한 이해, UI/UX 능력 필요)

 

채용 트렌드의 변화와 직업

  변화 준비 상담 중요 MZ 특성 반영
산업 환경 변화 데이터 / DX / DT ESG 산업간 융합이해 빅블러의 시대
채용 환경 변화 올드루키, 알짜기업찾기  이직은 당연 챗GPT의 등장과 새로운 분야의 직업
서류 전형 변화 직무 교육 선호
무한 교육 현상
대학원 진학 직무 테크 중심
면접 전형 변화 인성면접 강화  MZ세대 맞춤형 면접 전형 인성검사 중요

취업 준비

◆  면접

CS 관련 질문/ PT/ 포트폴리오 질문 /직무 면접 /인성 면접

 

◆ 준비

프로젝트 / 토이프로젝트/ 클린코딩/ 배운내용 업로드

 

관련자격증

AWS / AICE / ADSP / COS PRO / 빅데이터분석기사 / 영어 / IH / GA

 

◆  공부

시각화 툴 : R, 테블루, 파워BI

프론트엔드 : 패스트 캠퍼스 (UI,UX 강의)


WHAT, WHERE, HOW 취업 전략

 

업종의 이해

▶ 이벤트 형 : 레저, 바이오, 엔터

1. 사회 이슈 및 특정 트렌드나 기술에 의해 매출과 이익에 영향을 받는 구조의 업정

2. 바이오 업종은 신약개발이 중심을 오랜 기간의 노력이 필요하며 엔터, 게임, 영화는 히트작의 유무가 중요하다.

3. 예측하기 어려운 구조이나 기존의 성공경험과 인력, 영업망을 통해서 기업과 채용을 예상해야 한다.

 

경기순환형 : 건설, 건자재, 금속, 기계, 자동차, 조선, 해운, 화학

 

생활 밀찰형 : 건강, 미용, 금융, 생활, 유통, 운수, 섬유, 패션, 음식료, 제약, 제지 

1. 말 그대로 생활 업종으로서 일상생활에 소비되는 제품, 브랜드를 생산하는 업종

2. 브랜드 파워가 매우 중요하다.

3. 매출과 이익의 폭발적인 성장보다는 얼마나 꾸준한 지가 중요하다.

4. 도메인 영향이 큼, 관련 경험치를 쌓은 포트폴리오가 중요 

 

 지식집약형 : IT, 디스플레이, 반도체, 스마트폰, 의료기기, 통신

 

→ 모든 산업과 업종에 IT가 관여한다.

 

IT 관련 기업

  IT 서비스

SI 삼성 : SDS, LG ONS

아웃소싱 : 위시캣, DB Inc, 농심 NDS

IT 지원 / 교육 : 멀티캠퍼스, 부트캠프, 엘리스 등

금융 : 시중은행, 코나아이, 핀다, 증권사 등

 

관련 분야

헬스케어 분야

인공지능 기반 영상기술

에너지 산업 분야

사물인터넷 분야

로봇 공학 분야

디지털 컨텐츠 분야

3D 프린팅 분야

무인 이동체 분야

빅데이터 분야 : 전 산업 데이터 확대 >> 금융, 마이데이터 산업 성장, 광고 미디어 분야, 모빌리티, 에듀테크

디지털 통화(핀테크) 분야

개인서비스 분야

정보보호 분야

 

관련 직무

 SW 개발자 : 게임프로그래머, 응용프로그래머(SI, SM), 웹프로그래머, 시스템프로그래머, 임베디드프로그래머, 보안프로그래머

  IT 기획 및 컨설팅

  IT 영업 및 마케팅

 

데이터 관련 직무

데이터 집중직무 : 데이터 사이언티스트, 데이터엔지니어, 데이터분석가

데이터 활용직무 : 퍼포먼스 마케터, CRM 마케터, 비즈니스분석가, HR분석가, 그로스 해커

 

※ 전략적인 취업준비를 통한 커리어 패스가 필요

비전공자라면 내 전공이 어필포인트로 여겨지는 산업 군을 선정하는 것이 필요

ex) 경영 > 금융관련


작성 해보기


취업 관련 사이트

 

https://thevc.kr/

 

더브이씨 (THE VC) - 한국 스타트업 투자 데이터베이스

한국 스타트업의 투자 동향과 스타트업, 비상장 기업, 액셀러레이터, 벤처캐피탈을 빠르게 파악하고 발견하세요.

thevc.kr

https://www.innobiz.net/

 

INNOBIZ 기술혁신형중소기업

 

www.innobiz.net

http://data.krx.co.kr/contents/MDC/MAIN/main/index.cmd

 

KRX 정보데이터시스템

증권·파생상품의 시장정보(Marketdata), 공매도정보, 투자분석정보(SMILE) 등 한국거래소의 정보데이터를 통합하여 제공 서비스

data.krx.co.kr

https://swgo.kr/

 

SW고성장클럽

SW고성장클럽,예비고성장기업,고성장기업,글로벌 SW전문기업지원

swgo.kr

https://startupspace.kr/

 

스타트업스페이스 StartupSpace

2100개사 스타트업의 투자 현황을 한눈에

startupspace.kr

https://www.thinkcontest.com/

 

씽굿-대한민국 대표 공모전 미디어 씽굿

 

www.thinkcontest.com

 

 

 

 

728x90
반응형
728x90
반응형

1. 숫자형 함수 적용과 그 결괏값이 올바르지 않은 것은?
1. ABS(-30) = 30
2. SIGN(-50) = -1
3
. MOD(7,3) = 2

4. CEIL(38.12) = 39
 
✏️

더보기

정답 : 3

SIGN(n) : 결과값이 0 또는 양수, 음수인지에 따라 0 /1 /-1 반환

SIGN(0-5) -> -1 / SIGN(0) -> 0 / SIGN(5-1) -> 1

 

MOD(n,m) : 나머지 값 반환(n%m, n MOD m로 표현가능)

MOD(29,9) -> 2 / MOD(34.5,3) -> 1.5 / MOD(N,0) -> nul


2. 아래 SQL에서 출력되는 ROWS의 개수를 구하시오.

1. 10건
2. 14건
3. 18건
4. 20건
 
✏️

더보기

정답 : 3

DEPTNO로 조인을 하고 DNAME과 JOB으로 CUBE를 실행했다. CUBE는 전체합계와 각 칼럼별로 부분합계를 출력한다.


3. 다음의 SQL문에 대한 설명으로 올바르지 않은 것은?

가. 실제 데이터
DEPTNO   SAL
--------------------
    10
    10         1000
    10         2000
    20
    20          500

나. SELECT문
SELECT DEPTNO, SUM(NVL(SAL,0)) FROM DEPT GROUP BY DEPTNO;

1. SELECT문에 WHERE 조건이 없으므로 연산에 참여하는 총 행 수는 5개이다.
2. DEPTNO 10의 합계는 3000이고 20의 합계는 500이다.
3. NVL(SAL, 0)문에서 NVL은 NULL에 대한 합계오류를 예방한다.
4. 부서별 합계를 계산할 때 NULL값을 만나면 0으로 치환한다.
 
✏️

더보기

정답 : 3

그룹 함수를 사용하는 경우 NULL값은 연산에서 제외된다. 그래서 NVL 함수를 사용하는 것은 합계오류 예방과는 전혀 관계가 없다.


4. 다음 SQL문의 실행 결과로 올바른 것을 고르시오.

1. 10, 20
2. 10, 20, 30
3 .10, 20, 30 ,40
4. 10, 20, 30, 40, 50
 
✏️

더보기

정답 : 2

ALL 연산자는 서브쿼리(Subquery) 값 모두가 조건에 만족하면 True를 반환한다.


5. 자신의 속성이 없어도 다른 속성을 이용하여 결과를 도출할 수 있는 특징을 가진 속성의 이름은?
1. 설계 속성(Designed Attribute)
2. 기본 속성(Basic Attribute)
3. 파생 속성(Derived Attribute)
4. 관계 속성(Associative Attribute)
 
✏️

더보기

정답 : 3

파생 속성(Derived Attribute)은 다른 속성을 이용하여 계산된 속성으로 자신의 고유값을 갖지 않고 파생, 유추되어 재산정될 수 있는 속성이다.


6. 엔터티에 대한 개념 중 엔터티 정의의 공통점 3가지가 아닌 것은?
1. 데이터베이스 내에서 변별 가능한 객체이다.
2. 엔터티는 사람, 장소, 물건, 사건, 개념 등의 명사에 해당된다.
3. 저장되기 위한 어떤 것(Thing)이다.
4. 업무상 관리가 필요한 관심사에 해당된다.
 
✏️

더보기

정답 : 1

엔터티(Entity)의 3가지 공통점은 다음과 같다.
•개념, 사건, 사람, 장소 등과 같이 명사이다.
•비즈니스 프로세스에서 관리되어야 하는 정보이다.
•저장이 필요한 어떤 것이다.


7. 다음의 데이터베이스에서 ‘부양가족을 2명 이상 가진 사원의 사번(eno), 성명(ename), 부양가족 수를 검색’하는 질의를 SQL로 적절하게 표현한 것은?

employee(eno, ename, adddress, score, dno)
dependent(eno, ename, birthday, relation)

1.
SELECT eno, ename, count(*)
FROM employee e, dependent d
WHERE e.eno = d.eno and count(*) >= 2
GROUP BY d.eno;
2.
SELECT e.eno, e.ename, count(*)
FROM employee e, dependent d
WHERE EXISTS (SELECT * FROM dependent
GROUP BY eno
HAVING count(*) >= 2)
GROUP BY e.eno, e.ename;
3.
SELECT e.eno, e.ename, t.cnt
FROM employee e, (SELECT eno, count(*) as cnt
FROM dependent GROUP BY
eno HAVING count
(*) >= 2) t
WHERE e.eno = t.eno;
4.
SELECT e.eno, e.ename, count(*)
FROM employee e, dependent d
WHERE e.eno = d.eno
GROUP BY e.eno, e.ename
HAVING count(*) >= 3;
 
✏️

더보기

정답 : 3

1번 집계함수에 대한 조건절은 HAVING을 사용해야 함

2번 GROUP BY절을 사용했으나 SELECT 절 COUNT(*)는 전체 개수 반환 함


8. 릴레이션 Emp, Dept가 다음과 같이 정의되어 있다. 부서에 사원이 한 명도 없는 부서(deptno)를 검색하는 질의를 작성했을 때, 가장 거리가 먼 것은? (단, Emp의 deptno는 Dept의 deptno를 참조하는 외래키이다)

Emp(empno, ename, job, mgr, hiredate, sal, comm, deptno)
Dept(deptno, dname, loc)

1.
SELECT deptno
FROM Dept
WHERE deptno NOT IN (SELECT deptno FROM Emp);
2.
SELECT deptno
FROM Dept a
WHERE NOT EXISTS (SELECT * FROM Emp b WHERE a.deptno =b.deptno);
3.
SELECT b.deptno
FROM Emp a RIGHT OUTER JOIN Dept b
ON a.deptno = b.deptno
WHERE empno IS NULL;
4.
SELECT deptno
FROM Dept
WHERE deptno < > ANY (SELECT deptno FROM Emp);
 
✏️

더보기

정답 : 4

4번 ANY()실행 시 하나라도 조건값을 만족하면 결과를 도출하기 때문에 모든 deptno 값이 도출 된다.


9. 실행 계획에 대한 설명으로 적절하지 않은 것은?
1. 실행 계획은 SQL문의 처리를 위한 절차와 방법이 표현된다.
2. 실행 계획이 다르면 결과도 달라질 수 있다.
3. 실행 계획은 액세스 기법, 조인 순서, 조인 방법 등으로 구성된다.
4. 최적화 정보는 실행 계획의 단계별 예상 비용을 표시한 것이다

✏️

더보기

정답 : 2
동일 SQL문에 대해 실행 계획이 다르다고 결과가 달라지지는 않는다. 그러나 실행 계획의 차이로 성능이 달라질 수 있다.



10. 사원 테이블에 사원번호는 기본키로 설정되어 있다. SQL문으로 사원번호 1번을 검색하는데 사원 테이블에는 하나의 ROW만 저장되어 있다. 이때 유리한 스캔 방식은 무엇으로 판단되는가?
1. Unique Index Scan
2. Non-Unique Index Scan
3. Index Full Scan
4. Table Full Scan
 
✏️

더보기

정답 : 4

하나의 데이터(행)를 읽기 위해서는 인덱스를 사용하지 않고 테이블을 FULL SCAN하는 것이 효율적이다. 즉, 검색되는 행이 1건이므로 굳이 인덱스를 읽지 않고 바로 테이블을 검색해야 한다.


11. Case문에서 ELSE를 생략하면 어떤 현상이 발생되는가?
1. ELSE를 생략하고 작성하면 실행 시 ELSE 조건이 참이 되며 오류가 발생한다.
2. ELSE 조건이 만족하게 되면 공집합이 리턴 된다.
3. ELSE 조건을 만족하게 되면 무시된다.
4. ELSE 조건이 만족하게 되면 NULL이 된다.
 
✏️

더보기

정답 : 4

CASE문은 IF~THEN~ELSE를 구현할 수 있는 SQL문이다. 즉, 어떤 조건이 참이면 A를 실행하고 그렇지 않으면 B를 실행하라는 것이다. CASE문에서 ELSE 조건을 생략하면 NULL이 되돌려진다.

  •  

12. 다음 모델의 배송 엔터티에서 고객의 정보를 찾을 때, 성능 향상과 SQL 문장을 단순화하는 가장 적절한 반정규화 방법은 무엇인가? (단, 주문목록 엔터티에서는 고객의 주식별자를 상속받기를 원하지 않음, 배송 엔터티에서는 고객 엔터티의 모든 속성을 참조하기를 원함)
1. 고객과 배송 엔터티의 관계를 추가(1:M관계)하는 관계 반정규화
2. 배송과 고객의 엔터티를 통합하는 반정규화
3. 배송 엔터티와 주문목록 엔터티 관계를 식별자 관계로 수정
4. 고객의 모든 정보를 모두 배송 엔터티의 속성으로 반정규화
 
✏️

더보기

정답 : 1

고객 엔터티의 모든 속성을 참조하기를 원할 때 가장 효율성이 좋은 반정규화 기법은 관계를 중복하는(관계의 반정규화) 방법이며 이를 적용하면 두 테이블의 조인 경로를 단축하게 되고 SQL 문장을 단순하게 구성할 수 있다.


13. 다음 중 아래 테이블 정의와 인덱스 구조를 참고하여, 인덱스를 효율적으로 액세스할 수 없는 검색조건을 고르시오.

1. where 주문번호 between 1 and 10
2. where 주문자명 like ‘%홍길동%’
3. where 주문일자 >= ‘20181201’
4. where 주문일자 = ‘20181201’
 
✏️

더보기

정답 : 2

LIKE 검색 문자열 앞뒤에 모두 ‘%’ 기호를 붙였으므로 정상적인 Index Range Scan이 불가능하다.


14. 두 개 릴레이션 Student와 Department가 있을 때, 질의문 “SELECT * FROM Student s, Department d WHERE s.dept > 100;”을 수행하려고 한다. 이 질의 수행으로 생성되는 결과 릴레이션의 차수(Degree)와 카디널리티(Cardinality)는 각각 얼마인가? (단, 릴레이션 Student의 애트리뷰트 ‘소속(dept)’은 릴레이션 Department의 애트리뷰트 ‘코드(dno)’를 외부키로 참조한다)

1. 차수=5, 카디널리티=3
2. 차수=5, 카디널리티=2
3. 차수=8, 카디널리티=9
4. 차수=8, 카디널리티=3
 
✏️

더보기

정답 : 3

차수(Degree)와 카디널리티(Cardinality)를 구하는 문제로 차수는 결과 릴레이션의 칼럼 수이다. 그래서 Student와 dept 테이블을 조인하여 모든 컬럼을 출력하기 때문에 (SELECT *) 각각 Student 테이블에서 5개 , dept 테이블에서 3개 , 총 8개의 컬럼(=차수)을 가지게 된다.
카디널리티는 선택된 행들의 개수이다. Where문을 보면 결과 릴레이션에서 Student 릴레이션의 dept값이 100보다 큰 것만 조회한다. 위 조건에 부합하는 결과 행수는 9건이므로 카디널리티는 9가 된다.
(Student와 Dept를 카티션곱 조인하면 15개의 행이 나오고, 이중 where 조건에 부합하는 대상은 9건이다)


15. Subquery의 종류 중에서 Subquery가 Mainquery의 제공자 역할을 하고 Mainquery의 값이 Subquery에 주입되지 않는 유형은 무엇인가?
1. Filter형 Subquery
2. Early Filter형 Subquery
3. Associative Subquery
4. Access Subquery
 
✏️

더보기

정답 : 4

Access Subquery는 제공자 역할을 하는 서브쿼리이다.


16. 다음 설명에 해당하는 모델링 관점은 무엇인가?

업무가 어떤 데이터와 관련이 있는지 또는 데이터 간의 관계는 무엇인지에 대해서 모델링 하는 관점

1. 프로세스 관점
2. 데이터와 프로세스의 상관 관점
3. 데이터와 데이터 간의 상관 관점
4. 데이터 관점
 
✏️

더보기

정답 : 4

데이터 모델링의 세 가지 관점
1. 데이터 관점 : 업무가 어떤 데이터와 관련이 있는지 또는 데이터 간의 관계는 무엇인지에 대해서 모델링 하는 방법(What, Data)
2. 프로세스 관점 : 업무가 실제로 하고 있는 일은 무엇인지 또는 무엇을 해야 하는지를 모델링 하는 방법(How, Process)
3. 데이터와 프로세스의 상관 관점 : 업무가 처리하는 일의 방법에 따라 데이터는 어떻게 영향을 받고 있는지 모델링하는 방법(Interaction)


728x90
반응형
728x90
반응형

<데코레이터(Decorator)>

- 대량 데이터 처리할때 사용

- wrapper는 한번 사용 하면 없어지므로 대용량 데이터에 대해 return으로 결과 값만 받아와서 사용
- 함수의 재사용성을 확장한 개념의 방법
- 자바의 오버라이드와 비슷한 개념


<함수 실행 시간 확인하는 데코레이터 프로그래밍 작성>

 

### 데코레이터 함수 정의하기
- func : 실제 처리할 함수 받아오는 매개 변수
- 외부에 있는 처리하고하 하는 함수가 func로 들어와야 함

- *args : 함수에 임의의 개수의 위치 인자를 전달할 때 사용한다. 함수 정의에서 *args는 튜플로 위치 인자들을 받는다. 이를 통해 함수는 몇 개의 위치 인자가 전달되든지 처리할 수 있다.

- **kwargs : 함수에 임의의 개수의 키워드 인자를 전달할 때 사용한다. 함수 정의에서 **kwargs는 딕셔너리로 키워드 인자들을 받는다. 이를 통해 함수는 몇 개의 키워드 인자가 전달되든지 처리할 수 있다.

def timer_decorator(func) :
    print(f"#1 : func = {func}")
    
    ### 실제 실행될 함수 정의(함수 이름은 자유롭게)
    # - func로 받은 함수를 아래 함수로 재정의하게 됨
    def wrapper(*args, **kwargs) :
        # - 시작시간
        start_time = time.time()
        print(f"#2 : start_time = {start_time}")

        ### 실제 처리할 함수 : func
        rs = func(*args, **kwargs)
        print(f"#3 : rs = {rs}")
        # - 종료시간
        end_time = time.time()
        print(f"#4 : end_time = {end_time}")
        return rs
    print("#5---------------")    
    return wrapper

 

### 데코레이터 호출 및 처리할 함수 정의하기

- 데코레이터 호출은 @로 사용함

- 데코레이터 함수 호출 시 및에 정의된 함수(exe_function)가 자동으로 전달 됨
- 매개변수 func은  메모리로 exe_function의 주소값을 이용
- 데코레이터 함수가 리턴한 wrapper함수는 exe_function이 된다. 즉, wrapper가 exe_function로 재정의 된다.
- 맨 처음 함수는 3개. 주소도 3개 그러나 재정의 할 경우 exe_function의 주소는 wrapper의 주소로 바뀜

# (재정의 되는 시점)
@timer_decorator 
def exe_function() : 
    print("실제 처리할 함수")
    ### 2초간 대기 : 데코레이터가 처리되는 시간을 벌어주기 위해서 
    time.sleep(2)
#1 : func = <function exe_function at 0x00000113C2EE1F80>
#5---------------

 

### 실제 처리하기

exe_function()
#2 : start_time = 1699930626.0731795
실제 처리할 함수
#3 : rs = None
#4 : end_time = 1699930628.0737495

<로그 데코레이터>

def log_decorator(func) :
    print(f"#1 : func = {func}")
    def wrapper(*args, **kwargs) :
        print(f"Logo : {func.__name__} 함수 호출됨")
        rs = func(*args, **kwargs)
        print(f"Logo : {func.__name__} 함수 종료됨")
        return rs
    print("#2-------------")
    return wrapper

 

### 데코레이터 호출 및 처리함수 정의

@log_decorator
def another_function():
    print("집에 가고싶다")
#1 : func = <function another_function at 0x00000113C3148B80>
#2-------------

 

### 처리함수 호출

another_function()
Logo : another_function 함수 호출됨
집에 가고싶다
Logo : another_function 함수 종료됨

<데코레이터 내부함수에서 처리된 결과를 받아보기>

# 함수 총 4개 사용
def check_permission(param_id) :
    print(f"#1: param_id = {param_id}")
    def decorator(func) :
        print(f"#2: func = {func}")
        def wrapper(*args, **kwargs) :
            check_id = "admin"
            print(f"#3: check_id = {check_id}")
            if check_id == param_id :
                args = ["인증성공"]
                print(f"#4: args = {args}")
                return func(*args, **kwargs)

            else :
                print(f"#5: raise 명령으로 강제 오류 발생시킴-----------")
                raise PermissionError("접근 불가")
        print(f"#6 -----------")
        return wrapper
    print(f"#7 -----------")
    return decorator

 

### 데코레이터 호출 및 처리함수 정의

@check_permission(param_id="admin")
def admin_function(re_msg) :
    print(f"인증 결과 : {re_msg}")
#1: param_id = admin
#7 -----------
#2: func = <function admin_function at 0x00000113C398B560>
#6 -----------

 

### 처리함수 호출

admin_function()
#3: check_id = admin
#4: args = ['인증성공']
인증 결과 : 인증성공

<영문 소문자 2개를 매개변수로 받아서, 대문자로 변환하는 데코레이터 프로그램>

- 함수이름 자유롭게 생성

- 데코레이터 함수 생성해서 대문자로 출력하기

 

작성해본 코드

def change_lang(func) :
    def lang_decorator(char1, char2) :
        char1_upper = char1.upper()
        char2_upper = char2.upper()
        result = func(char1_upper, char2_upper)

        return result
    return lang_decorator

@change_lang
def change_function(char1, char2) : 
    print(f"첫 번째 문자: {char1}")
    print(f"두 번째 문자: {char2}")

change_function('abcd', 'efgh')
첫 번째 문자: ABCD
두 번째 문자: EFGH

 

강사님 코드

def decorator_upper(func) :
    # args : 값 여러개 받음
    # kwargs : 리스트, 딕셔너리 받음
    ### 인자로 넘어온 2개의 소문자는 args 매개변수가 받게됨
    def wrapper(*args, **kwargs) :
        ### 인자로 넘겨받은 2개의 소문자를 대문자로 처리하는 영역
        args = [arg.upper() for arg in args]
        ### 대문자로 변환된 값 2개를 args에 리스트 타입으로 담아서 넘기면 됨
        return func(*args, **kwargs) 
    return wrapper

### 데코레이터 호출 및 처리 함수 정의
@decorator_upper
def getUpper(param1, param2) :
    print(f"대문자로 변환 : {param1} / {param2}")

### 처리하는 함수 호출 : 소문자 2개를 인자로 넘겨주기
getUpper("abcd", "efgh")
대문자로 변환 : ABCD / EFGH

 

데코레이터 실행 과정 이해하기

@decorator_upper가 실행 되면 getUpper함수가 같이 실행되면서

decorator_upper 주소 만들어지고 wrapper 주소 만들어짐
getUpper의 주소도 동시에 만들어졌지만 decorator_upper  호출되는 순간 getUpper 를 변수인 func에 넣게 됨
func는 getUpper의 주소를 갖는 변수가 된다
그때 return wrapper 하면 getUpper 가 바라보는 주소를 wrapper주소로  바꿔버림
wrapper 안에서 호출되는 func은  getUpper 의 주소를 받아서 갖고 있기 때문에 wrapper 에서 func의 원본인 getUpper 함수에 변수를 넣어 사용할 수 있는 것


<실습> 어제 작성한 도서관리 프로그램에 데코레이터를 적용하기

https://mzero.tistory.com/42

 

[Python] 파이썬 도서 관리 프로그램 만들기 실습 2

주제 : 도서 입고/대출/반납 관리를 위한 키오스크 파이썬 프로그램 실습 1. 주요내용 : 실습1에서 작성한 도서 관리 프로그램에 데코레이터를 적용하기 데코레이터 추가한 코드 ### 기능을 수행

mzero.tistory.com

 

728x90
반응형
728x90
반응형

매개변수

 

### 위치 매개변수를 사용하는 함수

def function1(a, b) :
    print(a, b)

function1(1, 2)
1 2

 

### 기본값(default) 정의 매개변수를 사용하는 함수

 

▶ 기본값이 2번째 매개변수로 오는 경우

def function2(a, b=3) :
    print(a, b)

function2(1)
1 3

 

 매개변수에 모두 기본값을 설정한 경우

def function2(a=5, b=3) :
    print(a, b)

function2()
5 3

 

 기본값이 1번째 매개변수로 오는 경우 > 오류발생!

def function2(a=5, b) :
    print(a, b)

function2(1)
 Cell In[12], line 1
    def function2(a=5, b) :
                       ^
SyntaxError: non-default argument follows default argument

 

### 키워드 정의 방식

def function3(a, b) :
    print(a, b)
function3(a=3, b=5)
function3(a=6, b=4)
3 5
4 6

 

### 가변형 매개변수를 사용한 함수1
- 전달할 값이 몇개 인지 모를때 사용하는 방식
- 튜플타입으로 반환

def function4(*args) :
    print(args)
function4(1, 2, 3)
function4(1, 2, 3, 6, 9)
(1, 2, 3)
(1, 2, 3, 6, 9)

 

### 가변 키워드 매개변수를 사용한 함수 2
- 전달할 값이 몇개 인지 모를때 사용하는 방식
- ** 뒤에 변수 이름은 아무거나 상관없음. 그러나 대부부 args 사용
- 딕셔너리 타입으로 반환

def function5(**args) :
    print(args)
function5(a=1, b=2, c=3)
function5(a=1, b=2, c=3, d=6, e=9)

dic = {"a" : 33, "b" : 55}
function5(a=33, b=55) #딕셔너리를 넘기면 a=33, b=55의 형태로 변환되어 처리됨
function5(**dic)
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2, 'c': 3, 'd': 6, 'e': 9}
{'a': 33, 'b': 55}
{'a': 33, 'b': 55}
728x90
반응형

+ Recent posts