관리 메뉴

나구리의 개발공부기록

Chapter 04 - 파이썬(연산자, 조건문 - if문, 반복문, 함수, 클래스, 클래스 상속) 본문

2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비)/실기 6강 - 프로그래밍 언어 활용

Chapter 04 - 파이썬(연산자, 조건문 - if문, 반복문, 함수, 클래스, 클래스 상속)

소소한나구리 2024. 6. 23. 21:34

2024년도 수제비 실기책(6판) 내용 정리


4. 연산자

  • 대부분 C언어 연산자와 동일하고 연산자의 종류가 많기 때문에 C언어에 없는 연산자만 다룸
  • 파이썬은 ++, -- 증감연산자를 지원하지 않음

1)  연산자 종류

  • Swap 연산자 : 두 변수의 값을 교환하며 ,(콤마) 를 기준으로 두 값을 교환함
  • 산술 연산자 : 두 수의 수치 계산을 위한 연산자이며 사칙(+, -, *, /, //), 지수(**), 나머지(%) 연산이 있음
  • 비교 연산자 : 두 피연산자가 같은지 다른지를 비교
  • 대입 연산자 : 변수에 값을 할당 (+=, -=, *=, /= 는 자바와 동일하며 파이썬에는 **=, //= 를 추가로 제공)
# swap
a, b, c, d = 1, 2, 3, 4
print(a, b, c, d)
a, b, c, d = c, a, d, b
print(a, b, c, d)

# 1 2 3 4
# 3 1 4 2

# 산술
print(3 / 2)    # 나눈 결과를 출력
print(3 // 2)   # 몫을 출력
print(3 * 2)
print(3 ** 2)   # 제곱

# 1.5
# 1
# 6
# 9

# 비교
print(3 == 3)   # 같으면 True
print(5 != 3)   # 다르면 True

# True
# True

# 대입
a, b = 3, 2
a *= b 
print(a)
a **= b     # a값과 b값을 거듭제곱한 값을 a에 저장
print(a)
a /= b      # / 연산은 실수형으로 바꿔서 출력됨
print(a)
a = int(a)  # a를 정수형으로 형변환
a //= b     # a를 b로 나눈 몫을 a에 저장
print(a)
a %= b      # a를 b로 나눈 나머지를 a에 저장
print(a)

# 6
# 36
# 18.0
# 9
# 1

5. 조건문  - if문

  • if : 조건문이 참일 경우 if안의 명령문 실행
  • elif : if문의 조건이 거짓이면서 elif문의 조건이 참일 경우 elif안의 명령문이 실행(자바, C의 else if의 개념), 여러개 사용 가능
  • else : if문과 elif문이 모두 거짓일 때 else문안에 있는 명령문 실행(else는 사용하지 않거나 한번만 사용)
score = input()		# 입력
score = eval(score) # 숫자로 변환
if score >= 90:		# 100 ~ 90 사이의 숫자가 입력되면 해당 코드 출력
    print('A')
elif score >= 80:	# 89 ~ 80 사이의 숫자가 입력되면 해당 코드 출력
    print('B')
elif score >= 70:	# 79 ~ 70 사이의 숫자가 입력되면 해당 코드 출력
    print('C')
else:				# 그 외에는 모두 해당코드 출력
    print('F')
    
# 입력 : 60
# F

6. 반복문

1)  while문 

  • 조건문 뒤에 콜론(:)을 붙히며 조건식에 ()가 없으나 작동 방식은 다른 언어의 while문과 동일
  • 파이썬에는 do-while이 없음
i = 0
sum = 0
while i < 4:
    i = i + 1
    sum = sum + i
    
print(sum)

2) for 문

  • in 연산자 뒤에 range함수를 사용하여 반복의 범위를 지정하거나 리스트 개수만큼 반복을 수행

(1) 일반 for문

 

  • range 함수는 범위를 지정하며 시작을 생략하면 0, 스텝값을 생략하면 1이 자동으로 들어감
  • range 함수에 값이 하나일 경우 시작 = 0, 스텝 = 1이 자동으로 들어가고 값이 두개일 겨우 스텝 = 1이 자동으로 들어감
  • range 함수의 범위는 종료값의 -1까지가 범위임
i, sum = 0, 0
for i in range (1, 4):  # 시작 = 1, 종료 = 4(3까지), 스텝 = 1(자동), i는 1, 2, 3
    sum = sum + i
print(sum)		# 6, 1 + 2 + 3

i, sum = 0, 0
for i in range (4): # 시작1(자동), 종료 = 4(3까지), 스텝 = 1(자동), i는 0, 1, 2, 3
    sum = sum + i
print(sum)		# 6, 0 + 1 + 2 + 3

 

(2) for each문

 

  • 시퀀스 자료형의 요소들을 차례대로 변수에 대입하면서 반복하는 명령어
li = [1, 2, 3]	# 리스트
for a in li:	# 리스트의 값을 하나씩 꺼내서 a에 저장
    print(a)	# a를 반환
# 1
# 2
# 3

7. 함수

1)  사용자 정의 함수(User-Defined Function)

  • 사용자가 직접 새로운 함수를 정의하여 사용
  • 다른 언어와 마찬가지로 사용자 정의 함수에서 매개변수나 생성된 변수는 해당 함수가 종료되면 사라짐
  • def 함수명(변수명, ...):
    명령어
    return 반환값
  • 기본값이 정의된 디폴트 매개변수를 지정할 수 있음
def fn(num = 5):    # 디폴트 매개변수로 값을 5를 지정
    if num % 2 == 0:
        return 'Y'
    else:
        return 'N'
    
a = fn()    # 함수 호출시 값을 지정하지 않고, 함수에 디폴트 매개변수가 정해져있다면 지정된 값으로 연산됨
print(a)	# N

b = fn(10)  # 함수 호출시 값을 지정하면 해당 값으로 연산됨
print(b)	# Y

2) 람다 함수(Lambda Function)

  • 함수 이름없이 동작하는 함수
  • 매개변수에 값을 전달하면 표현식에서 연산을 수행

(1) 람다함수 문법

 

  • 일반 람다 함수 : lambda 매개변수 : 표현식, 콜론(:)앞에서 매개변수를 입력받고 콜론 뒤에서 표현식을 처리
  • 변수를 이용 : 람다 함수를 변수에 할당하여 재사용 할 수 있음
  • 사용자 정의 함수를 이용 : 사용자 정의함수로 람다함수를 구현
  • 내장 함수를 이용 : map, filter 함수와 같이 사용할 수 있음
함수 형태 설명
map map(함수, 리스트) 리스트의 요소를 함수에 전달하여 반복을 수행
filter filter(함수, 리스트) 리스트의 요소를 함수에 전달하여 조건이 참인 값을 반환
# 일반 lambda 매개변수들 : 표현식
print(((lambda n , m : n + m)(2, 3)))  # (2, 3)을 전달
# 5

# 변수를 이용
sum = lambda x, y : x + y  # 람다식을 변수에 저장,
print(sum(1, 2))  # sum 변수를 함수 호출하는 것처럼 사용
# 3

# 사용자 정의 함수를 이용
def fn(n):  # 함수 정의
    return lambda a : a * n
k = fn(3)  # 3을 전달하여 호출 결과를 k에 저장 -> lambda a : a * 3이 저장됨
print(k(2))  # 변수를 이용한 람다식처럼 2를 전달하여 k를 호출하면 2 * 3을 연산하고 반환함
# 6

# map 함수 이용 - 리스트의 요소를 함수에 전달하여 반복 수행
a = [1, 2, 3, 4, 5]
m = list(map(lambda num : num + 2, a))  # a의 값을 하나씩 꺼내서 함수의 연산을 수행하고 반환
                                        # 반환된 값을 list()로 리스트를 생성
print(m) # [3, 4, 5, 6, 7]


# filter 함수 이용 - 함수의 조건이 참인 값을 반환
a = [1, 2, 3, 4, 5]
f = list(filter(lambda num : num > 2, a))  # a의 값을 하나씩 꺼내서 함수의 조건이 참인 값만 반환
print(f) # [3, 4, 5]

8. 클래스

  • 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 틀
  • 함수명에 매개변수 앞에 self라는 키워드를 적어야함(입력받는 값이 없다면 self만 사용)

1) self

  • 현재 객체를 가리키는 키워드, 클래스 내부의 변수와 함수를 가리킬 수 있음
class Soojebi:  # 클래스 정의
    def setS(self, a):  # 클래스 메서드 정의
        self.a = a      # 매개변수의 값을 클래스 변수 a에 저장
    def getS(self):
        return self.a   # 클래스변수 a에 반환

a = Soojebi()   # 변수 a에 클래스 생성
a.setS(5)       # 전달인자를 5로하여 setS함수 호출
print(a.getS()) # getS함수를 호출하여 Soojebi클래스의 변수 a값을 반환
// 5

2) 생성자(Constructor) / 소멸자(Destructor)

(1) 생성자

 

  • 해당 클래스의 객체가 생성될 때 자동으로 호출되는 특수한 종류의 메서드
  • __init__ 이라는 메서드 명을 사용하고 첫 번째 매개변수로 self를 작성하며 반환값이 없음

(2) 소멸자

 

  • 객체의 수명이 끝났을 때 객체를 제거하기 위한 목적으로 사용되는 메서드
  • __del__ 이라는 메서드 명을 사용하고 첫 번째 매개변수로 self를 작성하며 반환값이 없음
class Soojebi:
    def __init__(self): # 매개변수가 없는 생성자
        print("생성자1")
    def __init__(self, a): # 매개변수가 있는 생성자
        print("생성자2")

    # 파이썬에서는 클래스 내에 여러 개의 __init__ 메서드를 정의할 수 없음 -> 마지막에 정의된 생성자만 작동됨

    def __del__(self):  # 소멸자
        print("소멸자")

    def fn(self):   # 일반 사용자 정의 함수
        print("일반함수")

s = Soojebi(5) # 객체 생성 -> 매개변수가 있는 생성자가 호출됨
s.fn()  # 일반 함수 호출
del s # 소멸자 호출. 소멸자는 호출하지 않아도 프로그램이 종료되면 가비지 컬렉터에 의해 자동으로 s가 정리되면서 소멸자가 호출됨


# 생성자2
# 일반함수
# 소멸자

3) 클래스 접근 제어자

  • 파이썬은 Private, public 등의 접근 제어자 키워드가 존재하지 않고 작명법(Naming)으로 접근제어를 함
종류 규칙 설명
public 밑줄이 접두사에 없어야 함 외부의 모든 클래스에서 접근이 가능
protected 한 개의 밑줄(_)이 접두사여야 함 같은 패키지 내부에 있는 클래스, 하위 클래스(상속받은 경우)에서 접근이 가능
자기 자신과 상속받은 하위 클래스 둘 다 접근이 가능
private 두 개의 밑줄(__)이 접두사여야 함 같은 클래스 내에서만 접근이 가능
class Soojebi:
    def __init__(self):
        self.public = "PUBLIC"          # public으로 설정된 변수
        self._protected = "PROTECTED"   # protected로 설정된 변수
        self.__private = "PRIVATE"      # private로 설정된 변수

    def fn(self):
        print(self.public)
        print(self._protected)
        print(self.__private)

s = Soojebi()
s.fn()  # s의 fn함수를 호출하면 클래스 내부에서 작동하기 때문에 모든 변수의 값이 출력됨

# PUBLIC
# PROTECTED
# PRIVATE

print(s.public)        # 클래스 외부에서 public 변수를 불러올 수 있음
print(s._protected)    # 클래스 외부에서 _protected 변수를 불러올 수 있음
# print(s.__private)   # 에러, 클래스 외부에서 __private 변수를 불러올 수 없음(private)
print(s._Soojebi__private)  # 이런 식으로 변수에 접근할 수 있지만 일반적으로 권장하지 않음

# PUBLIC
# PROTECTED
# PRIVATE

9. 클래스 상속(Inheritance)

  • 어떤 객체가 있을 때 그 객체의 변수와 메서드를 다른 객체가 물려받는 기능
  • class 자식 클래스명(부모클래스명):
    ...
  • ** 자바는 상속 시 부모 클래스 생성자를 호출하지만, 파이썬은 호출하지 않음, super로 직접 호출해야함

1) 메서드 오버라이딩(Overriding)

  • 하위 클래스에서 상위 클래스 메서드를 재정의
  • 메서드가 상위 클래스에 존재해야하고, 메서드 이름이 같아야하고, 매개변수의 개수, 데이터 타입이 같아야 함

2) 부모 클래스 접근

  • super 키워드로 상위 클래스의 변수나 메서드에 접근할 수 있음
class A:
    def __init__(self):
        print('A')
    def fn(self):
        print('B')


class B(A): # A클래스를 상속받은 B클래스, A - 부모, B - 자식
    def __init__(self):
        print('C')
        super().__init__()  # 조상 클래스의 생성자를 직접 호출
    def fn(self):   # 메서드 오버라이딩
        print('D')
        super().fn()


a = A() # a클래스 객체를 생성 -> 1. A 출력(클래스 A의 생성자 호출)
b = B() # b클래스 객체를 생성 -> 2. C 출력(클래스 B의 생성자 호출)
                            # 3. A 출력(super()로 조상클래스이 생성자 호출)
b.fn()  # b클래스의 fn메서드 출력 -> 4. D 출력(메서드 오버라이딩)
                            # 5. B 출력(메서드 오버라이딩으로 조상의 fn()함수를 호출)
                            
# A
# C
# A
# D
# B