7. 함수
(1) 사용자 정의 함수
- 사용자가 직접 새로운 함수를 정의해서 사용하는 방법
- 사용자 정의 함수의 매개변수나 생선된 변수는 사용자 정의 함수 종료 시, 소멸
[1] 사용자 정의 함수 선언
def 함수명 (변수명, ...) :
명령어
return 반환값
파이썬도 자바나 C 언어와 같이 재귀함수 사용 가능
# 파이썬 사용자 정의 함수
def fn(num):
if num%2 ===0:
return 'Y'
else:
return 'N'
a=fn(5)
print(a)
# N
- fn 함수 호출하고 전달인자로 5 넣은 반환값을 변수 a에 대입
- 사용자 정의 함수 fn이 매개변수로 전달받은 num=5 > 5%2!=0 이므로 else 문에 따라 'N'을 반환
- a에는 반환값이 저장되고 print 문에 의해 출력되므로 'N' 출력
[2] 디폴트 매개변수
- 기본값이 정의된 매하 매개변수
- 함수 호출 시, 매개변수 명시되어 있지 않으면 디폴트 매개변수 값이 전달
def 함수이름 (매개변수=디폴트값):
명령문
# 파이썬 디폴트 매개변수
def hoxypot(num1, num2=2):
print('a=', num1, 'b=', num2)
hoxypot(20)
hoxtypot(20,3)
# a= 20 b= 2
# a= 20 b= 3
- 사용자 정의함수 hoxypot을 호출, 전달인자로 20 전달
- hoxypot 실행 > 전달받은 매개변수가 1개이므로 앞에 있는 num1에 20을 대입, num2는 디폴트 매개변수로 지정된 2 값을 대입 > num1=20, num2=2
- print 문에 따라 a= 20 b= 2 출력
- 사용자 정의함수 hoxypot 호출, 전달인자로 20, 3 2개 전달
- hoxypot 실행 > 전달받은 매개변수가 2개이므로 앞에 있는 num1에 20을 대입, num2도 전달받은 값인 3을 대입 > num1=20, num2=3
- print 문에 따라 a=20 b= 3 출력
(2) 람다 함수 (Lambda Function)
- 람다 함수는 이름 없이 동작하는 함수를 의미
- 매개변수에 값을 전달하면 표현식에서 연산 수행
[1] 람다 함수 문법
- 일반 람다 함수
- lambda 함수는 콜론 (:) 앞에서 매개변수 입력 받고, 콜론 뒤에서 표현식 처리
lambda 매개변수 : 표현식
# 파이썬 람다 함수
(lambda n, m : n+m)(2,3)
# 5
- lambda 함수 설정 > 매개변수 n, m 2가지 > n+m 연산 수행 > 매개변수로 2,3 전달 받음, n=2, m=3
- n+m=2+3=5 출력
- 변수 이용 람다 함수
- 람다 함수 변수에 할당해서 재사용 가능
# 파이썬 사용자 정의 함수를 이용한 람다 함수
sum= lambda n,m : n+m
print(sum(2,3))
# 5
- 매개변수 n, m을 전달받아 n+m 연산을 수행하는 lambda 함수를 sum 변수에 할당
- print 문에 따라 sum 변수에 2,3 을 전달인자로 전달 > lambda 함수의 n에 2, m에 3 대입 > n+m=2+3=5이므로 sum에 5 저장 > 5 출력
- 사용자 정의 함수를 이용한 람다 함수
- 람다 함수는 사용자 정의 함수로 구현 가능
# 파이썬 변수 이용한 람다 함수
def f(n):
return lambda a:a*n
k=f(3)
print(k(10))
# 30
- 사용자 정의 함수 f에 3을 전달한 결괏값을 변수 k에 대입
- 사용자 정의 함수 f의 매개변수 n에 3이 전달되어 lambda a:a*3 이 결괎값으로 반환 > k= lambda a:a*3
- print 문에 따라 변수 k에 10을 전달인자로 전달한 값을 출력 > k는 매개변수 a를 이용하는 lambda 함수로 a=10을 대입 > 10*3= 30 출력
- 내장 함수 이용한 람다 함수
- 람다 함수는 파이썬 map 함수, filter 함수와 같이 사용 가능
1. map 함수 : map (함수, 리스트)
- 첫 번째 매개변수는 함수, 두 번째 매개변수는 리스트 전달
- 리스트 요소를 함수에 전달하여 반복 수행하는 함수
2. filter 함수 : filter (함수, 리스트)
- 첫 번째 매개변수는 함수, 두 번째 매개변수는 리스트 전달
- 리스트 요소를 함수에 전달하여 조건이 참인 값 반환하는 함수
# 파이썬 map 이용한 람다 함수
a= [1,2,3,4,5]
m=list(map(lambda num : num+100, a))
print(m)
# [101,102,103,104,105]
- 리스트 a 선언 > [1,2,3,4,5] 대입
- map 함수에 따라 lambda 함수 num : num+100에 리스트 a의 요소를 반복해서 대입 > 대입 결괏값을 다시 리스트로 변환해서 변수 m에 저장
- lambda 함수 num : num+100은 매개변수 num에 100을 더한 값을 반환하는 함수 > 리스트 a의 요소 1,2,3,4,5에 각각 lambda 함수 적용
- 1+100=101, 2+100=102, 3+100=103, 4+100=104, 5+100=105 > 리스트 변환 [101,102,103,104,105] 가 m에 저장 > 출력
# 파이썬 filter를 이용한 람다 함수
a=[1,2,3,4,5]
m=list(filter(lambda num : num >2, a))
print(m)
# [3,4,5]
- 리스트 a 선언 > [1,2,3,4,5] 대입
- filter 함수에 따라 lambda 함수 num : num > 2에 리스트 a의 요소를 매개변수인 num 값으로 순차적으로 전달 > lambda 함수에 의해 a 요소 > 2 연산 수행
- a 요소 [1,2,3,4,5] 가 lambda 함수의 매개변수로 전달되어 num>2 값을 만족하는 값만 list로 변환하여 변수 m에 대입
- 1>2 = F, 2>2 =F, 3>2=T, 4>2=T, 5>2=T 이므로 True 값인 3,4,5 만 list 함수의 매개변수로 전달되어 리스트 [3,4,5] 가 변수 m에 저장 > 출력
8. 클래스 (Class)
- 객체 지향 프로그래밍 (OOP : Object-Oriented Programming) 에서 특정 객체 생성을 위해 변수와 메서드를 정의하는 틀
(1) 클래스 정의
- 클래스의 변수는 변수 선언과 동일, 메서드는 사용자 정의 함수와 문법 동일
class 클래스명 :
def 메서드명 (self, 변수명, ...) :
명령어
return 반환값
- 파이썬은 함수명에 매개변수 앞에 **self** 키워드 적어야 함
class Hoxypot:
def fn(self): # 입력받는 값, 즉 매개변수가 없을 경우에는 'self' 만 사용
print(5)
- 파이썬의 주석
파이썬 소스코드에서 '#'은 주석을 의미하며 # 뒤 문장은 프로그램에서 영향을 주지 않음
(3) self
- self는 현재 객체를 가리키는 키워드
- 클래스 내부 변수와 함수를 가리킬 수 있음
self.변수명
self.함수명(매개변수)
# 파이썬 self
class Hoxypot:
def setS(self, a):
self.a=a
def getS(self):
return self.a
a= Hoxypot( )
a.setS(5)
print(a.getS( ))
# 5
- 변수 a에 Hoxypot 클래스 생성
- Hoxypot 클래스 타입 a 변수의 setS 메서드에 전달인자 5 전달
- Hoxypot 클래스의 setS 메서드에 따라 setS (self, a) : self.a=a > self는 현재 객체를 의미, a= 전달받은 매개변수 5이므로 self.a=5
- self.a 는 클래스 내부 변수이고 a는 전달받은 매개변수 > 매개변수 a에 5가 저장되어 있으므로 클래스 내부 변수인 self.a = 5
- print 문에 따라 Hoxypot 클래스 타입 a 변수의 getS 메서드의 결괏값을 출력
- getS(self) : return self.a > self는 현재 객체, self.a는 위에서 정의한 클래스 내 변수이므로 저장된 값인 5를 반환 >5 출력
(4) 생성자 (Constructor)
- 생성자는 해당 클래스 객체 생성 시, 자동으로 호출되는 특수 메서드
- 생성자는 __init__ 메서드 명 사용, 첫 번째 매개변수로 self 작성하며 반환값은 없음
- 생성자 정의
class 클래스명:
def __init__ (self, 매개변수):
명령어
- 생성자 호출
클래스 변수 = 클래스(매개변수)
(5) 소멸자 (Destructor)
- 소멸자는 객체 수명 끝났을 때, 객체 제거 목적으로 사용되는 메서드
- 소멸자는 __del__ 메서드명 사용, 첫 번째 매개변수에 self 작성하며 반환값은 없음
- 소멸자 정의
class 클래스명:
def __del__(self):
명령어
- 소멸자 호출
del 클래스 변수
클래스 변수 = 클래스(매개변수) # 생성시
del 클래스 변수 # 소멸시
# 파이썬 생성자/소멸자
class Hoxypot:
def __init__(self):
print('생성자1')
def __init__(self, a):
print('생성자2')
def __del__(self):
print('소멸자')
def fn(self):
print('일반함수')
h=Hoxypot(5)
h.fn()
del h
# 생성자2
# 일반함수
# 소멸자
- 변수 s에 Hoxypot 클래스 생성 > 전달인자 5를 전달하여 매개변수 1개를 받을 수 있는 생성자 호출
- def __init__(self,a) 호출되어 생성자2 출력
- Hoxypot 클래스 타입 h 변수에 fn 메서드 호출 > 일반함수 출력
- del h 에 의해 소멸자 호출 > 소멸자 출력
(6) 클래스 접근 제어자
- 파이썬은 private, public 등의 접근제어자 키워드 존재 X
- 작명법(Naming)으로 접근제어
- public - 외부 모든 클래스에서 접근 가능한 접근 제어자
밑줄이 접두사에 없어야 함
- protected - 같은 패키지 내부 클래스, 하위 클래스에서 접근 가능한 접근 제어자 / 자기 자신 & 상속 받은 하위 클래스 둘 다 접근 가능
한 개의 밑줄 _이 접두사
- private - 같은 클래스 내에서만 접근 가능한 접근 제어자
두 개의 밑줄 __이 접두사
# 파이썬 self
class Hoxypot:
def __init__(self):
self.public='PUBLIC'
self._protected='PROTECTED'
self.__private='PRIVATE'
def fn(self):
print(self.public)
print(self._protected)
print(self.__private)
h=Hoxypot()
h.fn()
print(h.public)
print(h._protected)
# print(h.__private) # h의 pirvate 변수는 내부 클래스가 아닌 외부에서 접근할 수 없음, 주석 문장이므로 실행 X
# PUBLIC
# PROTECTED
# PRIVATE
# PUBLIC
# PROTECTED
- Hoxypot 클래스 객체인 변수 h 생성
- Hoxypot 클래스 타입 변수 h의 생성자 __init__ 메서드 호출 > self.public 변수 ='PUBLIC', self._protected 변수 ='PROTECTED', self.__private 변수='PRIVATE' 값 대입
- Hoxypot 클래스 타입 변수 h의 fn 메서드 호출 > 3번의 print 문에 따라 self.public, self.protected, self.private 변수 값 출력
- Hoxypot 클래스 객체 h의 내부가 아닌 외부에서 print문을 사용하여 h.public 변수 출력 > h.public 변수는 public 접근제어자이므로 외부 모든 클래스에서 접근 가능하기 때문에 'PUBLIC' 출력
- Hoxypot 클래스 객체 h를 상속받은 하위 클래스에서 print 문 사용하여 h._protected 변수 출력 > h._protected 변수는 protected 접근제어자로 자기 자신과 하위 클래스에 의한 접근이 가능하기 때문에 'PROTECTED' 출력
- h.__private 변수는 private 접근제어자로서 자기 자신이 아닌 곳에서는 접근 불가하기 때문에 명령 자체를 수행할 수 없음 > 주석 처리
파이썬의 주석문(#)
파이썬에서 #은 주석으로 뒤에 문장은 실행하지 않음
#파이썬 self 소스코드에서 # print(h.__private) 코드 앞의 주석(#)을 삭제하면 에러 발생
9. 클래스 상속 (Inheritance)
- 상속은 어떤 객체가 있을 때, 그 객체 변수와 메서드를 다른 객체가 물려받는 기능
class 부모_클래스명:
...
class 자식_클래스명(부모_클래스명):
...
# 파이썬 상속
class A:
def fnA(self):
print('A')
class B(A):
def fnB(self):
print('B')
b= B()
b.fnA()
b.fnB()
# A
# B
- B 클래스 객체인 변수 b 생성 > B 클래스는 A 클래스를 상속 받았으므로 B 클래스 생성 시, B 클래스 생성자 __init__을 호출해야 하나 없으므로 생략
- B 클래스 타입 변수 b의 fnA 메서드 호출 > fnA 메서드는 클래스 B에 없으므로 부모 클래스인 A 클래스로 가서 fnA 메서드 실행 > A 출력
- B 클래스 타입 변수 b의 fnB 메서드 호출 > 클래스 B의 fnB 메서드 시행 > B 출력
파이썬의 오버로딩
파이썬은 정식으로 오버로딩을 지원하지는 않음
> 파이썬은 변수 타입을 Run Time(실행 시간)에 검사하기 때문에 오버로딩 지원 X
*오버로딩 : 메서드명은 동일하지만 매개변수 타입이 달라지는 형태
(2) 메서드 오버라이딩 (Overriding)
- 하위 클래스에서 상위 클래스 메서드를 재정의할 수 있는 기능
- 오버라이딩 특징
- 오버라이드하고자 하는 메서드가 상위 클래스에 존재해야 함
- 메서드 이름은 동일
- 메서드 매개변수 개수, 데이터 타입 동일 필요
class 부모_클래스명:
def 메서드명(self, 변수명):
명령어
class 자식_클래스명(부모_클래스명):
def 메서드명(self, 변수명): # 부모 클래스와 메서드명, 매개변수가 같아야 함
명령어
# 파이썬 오버라이딩
class A:
def fn(self):
print('A')
class B(A):
def fn(self):
print('B')
a=B()
a.fn()
# B
- 클래스 B 객체 a 변수 생성 > 생성과 동시에 B 클래스 생성자가 실행되어야 하지만 없으므로 생략
- 클래스 B 타입 변수 a의 fn 메서드 호출 > 부모 클래스 A 에서 fn 메서드를 정의했지만 동일한 메서드명과 매개변수 개수 0개로 하위 클래스인 B 에 의해 fn 메서드 재정의(오버라이딩)됨
- 클래스 B의 fn 메서드에 의해 'B' 출력
자바와 상속 클래스에 대한 차이점
클래스 상속 받을 경우,
- 자바
: 클래스 생성 시, 부모 클래스와 해당 클래스 둘 다 생성자 호출
- 파이썬
: 클래스 생성 시, 부모 클래스 생성자 호출 X / 호출 필요한 경우, super().__init__() 을 통해 직접 호출 필요
# 파이썬 생성자 / 오버라이딩
class A:
def __init__ (self):
print('A')
def fn(self):
print('B')
class B(A);
def __init__ (self):
print('C')
def fn(self):
print('D')
a=A()
b=B()
b.fn()
# A
# C
# D
- 클래스 A 객체 변수 a 생성 > 클래스 A 생성과 동시에 생성자 __init__ 호출 > A 출력
- 클래스 B 객체 변수 b 생성 > 클래스 B 생성과 동시에 생성자 __init__ 호출 > C 출력
- 클래스 B 타입 변수 b의 fn 메서드 호출 > 상속 받은 A 클래스에 fn 메서드가 존재하지만 하위 클래스 B에도 동일한 이름의 fn 메서드가 존재하므로 오버라이딩됨 > B 클래스의 fn 메서드에 의해 D 출력
(3) 부모 클래스 접근
- 파이썬은 **super** 키워드 이용, 상위 클래스 변수나 메서드 접근 가능
super( ). 메서드명()
# 파이썬 부모 클래스 접근
class A:
def fn(self):
print('A')
class B(A):
def fn(self):
super().fn()
print('B')
a=B( )
a.fn()
# A
# B
- 클래스 B 객체 변수 a 생성 > B 클래스 생성자 호출해야 하나 없으므로 생략
- 클래스 B 타입 변수 a의 fn 메서드 호출 > 변수 a는 B 클래스이므로 B 클래스 fn 메서드 호출 > fn(self)의 self는 현재 객체인 a 를 의미
- super.fn()에 의해 부모 클래스인 A 클래스의 fn 메서드 실행 > A 출력
- 다시 B 클래스의 fn 메서드로 돌아와서 B 출력
'WorkOut > 정보처리기사' 카테고리의 다른 글
SQL 응용 | 데이터베이스 기본 _DDL (2) | 2024.04.04 |
---|---|
SQL 응용 | 데이터베이스 기본_트랜잭션 (0) | 2024.04.04 |
파이썬 | 입출력 함수와 연산자, 반복문 (0) | 2024.03.26 |
파이썬 | 기본 구조와 자료형 (0) | 2024.03.26 |
자바 | 메서드와 클래스, 인터페이스 (0) | 2024.03.23 |