제어문
조건문이라고 한다. if문의 조건이 맞으면 그 안에 있는 코드를 실행한다.
==> weather = "비"
if weather == "비" :
print('우산을 챙기세요~')
만약 여러가지의 조건을 넣고 싶으면 'elif'문을 사용한다.
==> weather = "비"
if weather == "비" :
print('우산을 챙기세요~')
elif weather == "미세먼지" :
print('마스크를 챙기세요~')
else :
print('날씨가 맑아요~')
위에서부터 실행하며, 조건이 맞는 곳에서 코드를 실행시키고 종료시킨다.
or나 and문을 사용해서 조건을 더 넣을 수 있다.
==> weather = "비"
if weather == "비"or weather == "흐림" :
print('우산을 챙기세요~')
elif weather == "미세먼지" :
print('마스크를 챙기세요~')
else :
print('날씨가 맑아요~')
1부터 20까지 순서대로 출력한다.
함수
function(함수)
function(함수)란?
함수란 프로그래밍 코드를 작성하다보면 반복되는 코드를 줄여주기 위해 특정 코드를 함수안에 정의하고, 그 코드를 함수명칭을 호출함으로써 코드를 실행하게 해줍니다.
함수의 구조는 아래와 같습니다.
return은 생략될 수 있습니다. return이 수행되면 함수가 종료됩니다.
def 함수명(파라미터):
실행될 코드
return 결과 값
간단한 function(함수) 작성
REPL을 활용하여 간단한 함수를 작성해봅니다.
squre라는 명칭의 함수를 정의했습니다.
x라는 파라미터(인수)를 받아 x * x 값을 반환하였습니다.
5를 파라미터로 squre함수를 호출하였습니다.
def square(x):
... return x * x
...
square(5)
25
return을 생략한 함수입니다.
def eat_dinner():
... print("저녁 잘 먹었습니다.")
...
eat_dinner()
저녁 잘 먹었습니다.
return을 결과값을 반환하지 않고, 함수의 종료목적으로만 사용할 수 있습니다.
def even_or_odd(n):
... if n % 2 == 0:
... print("even")
... return
... print("odd")
...
even_or_odd(3)
odd
even_or_odd(4)
even
a = 1
def varteast(a):
a=a+1
vartest(a)
print(a)
당연히 vartest함수에서 매개변수 a의 값에 1을 더해 2가 나올거 같지만 함수 안에서 새로 만든 매개변수는 함수 안에서만 사용하는 함수만의 변수이기 때문에 vartest(a)의 값은 나오지않고, print(a)만 출력되어 1이 출력된다
그렇다면 vartest라는 함수를 사용해서 함수 밖에 변수 a를 1만큼 증가시킬 수 있는 방법은 2가지가 있다.
vartest함수는 입력으로 들어온 값에 1을 더한 값을 돌려준다. 따라서 a= vartest(a)라고 대입하면 a가 vartest 함수의 결괏값으로 바뀐다.
위 예를 보면 vartest 함수 안의 global a문장은 함수 안에서 함수 밖의 a변수를 직접 사용하겠다는 뜻이다. 하지만 프로그래밍을 하 때 global 명령어는 사용하지 않는 것이 좋다. 왜냐하면 함수는 독립적으로 존재하는 것이 좋기 때문이다. 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니다.
클래스
클래스는 하나의 틀과 같다. 그 틀을 가지고 만든 과자들은 객체(object)라고 한다.
즉, 클래스는 하나의 도면이라고 생각하면 편하다. 그리고 그 도면을 바탕으로 만든 것이 객체이다.
클래스를 통해 만든 객체는 각 고유의 특징을 가진다. 그래서 서로에게 영향을 전혀 주지 않는다.
다음은 파이썬 클래스의 가장 간단한 예이다.
class Cookie:
pass
위의 클래스는 아무 기능도 갖고 있지 않은 껍질뿐인 클래스이다. 하지만 이렇게 껍질뿐인 클래스도 객체를 생성하는 기능이 있다. "과자 틀"로 "과자"를 만드는 것처럼 말이다.
객체는 클래스로 만들며 1개의 클래스는 무수히 많은 객체를 만들어 낼 수 있다. 위에서 만든 Cookie 클래스의 객체를 만드는 방법은 다음과 같다.
a = Cookie()
b = Cookie()
Cookie()의 결괏값을 돌려받은 a와 b가 바로 객체이다. 마치 함수를 사용해서 그 결괏값을 돌려받는 모습과 비슷하다.
[객체와 인스턴스의 차이]
클래스로 만든 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각해 보자. a = Cookie() 이렇게 만든 a는 객체이다. 그리고 a 객체는 Cookie의 인스턴스이다. 즉 인스턴스라는 말은 특정 객체(a)가 어떤 클래스(Cookie)의 객체인지를 관계 위주로 설명할 때 사용한다. "a는 인스턴스"보다는 "a는 객체"라는 표현이 어울리며 "a는 Cookie의 객체"보다는 "a는 Cookie의 인스턴스"라는 표현이 훨씬 잘 어울린다.
일단 클래스 구조를 만든다.
class Fourcal():
pass
a = Fourcal()
Fourcal이라는 클래스를 만들고, a라는 객체를 만든다. 현재는 아무 기능을 못하는 클래스와 객체이다.
이제 +,-,*,/ 의 가능을 하는 객체를 만들어야 한다.
앞에서 만든 클래스에 pass라는 것을 지우고 그 대신 setdata함수를 만든다.
class FourCal: def setdata(self, first, second): self.first = first self.second = second
클래스 안에 구현된 함수는 다른 말로 메서드(Method)라고 부른다. 메서드도 클래스에 포함되어 있다는 점을 제외하고는 일반 함수와 같다.
setdata메서드는 매개변수로 self, first, second 3개의 값을 받는다. 일반 함수와 다르게 첫 번째 매개변수로 self는 특별한 의미를 가진다.
self에는 setdata메서드를 호출한 객체 a가 자동으로 전달된다.
파이썬 메서드는 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문이다.
이제 setdata 메서드를 호출하게되면 first = 4, second = 2가 들어가는 것을 알 수 있다. 그러면 self = a이기때문에
a.first = 4
a.second = 2 라고 해석을 할 수 있다.
그럼 이제 2개의 숫자값이 설정되었으니 계산을 할 수 있어야한다.
class FourCal:
.... def setdata(self, first, second):
.... self.first = first
.... self.second = second
.... def add(self):
.... result = self.first + self.second
.... return result
.... def mul(self):
.... result = self.first * self.second
.... return result
.... def sub(self):
.... result = self.first - self.second
.... return result
.... def div(self):
.... result = self.first / self.second
.... return result
메서드를 호출하기 위해서는
a = FourCal() 객체를 생성한다.
a.setdata(2,4) 초기값을 설정해준다.
print(a.add()) 메서드를 실행하면 6이 나온다.
객체에 초깃값을 설정해야 할 필요가 있을 때에는 생성자를 구현하는 것이 좋다. 생성자란 객체가 생성될 때 자동으로 호출되는 메서드를 의미한다.
def __init__(self, first, second): self.first = first self.second = second
setdata와 메서드명만 다르고 내부는 똑같다. 하지만, 생성자로 인식되어 객체를 생성하는 동시에 자동으로 호출된다.
그래서 따로 a.setdata(2,4)를 할 필요없이 a = FourCal(2,4)
이렇게 객체 생성과 동시에 값을 넣어주면 된다.
클래스는 다른 클래스를 만들 때 기능을 물려받을 수 있다. 기존에 만들어 놓은 클래스에서 기능을 추가하거나, 기존 기능을 변경하려고 할 때 사용한다.
class 클래스명(상속받을 클래스명): 추가or 수정할 코드입력
메서드 오버라이딩은 부모 클래스에서 있던 메서드를 상속받은 클래스에서 수정? 하는 것이다. 기존에 있던 메서드에 동일한 이름으로 상속받은 클래스에서 메서드를 만들어 다른 코드를 작성하면 기존 클래스의 메서드와는 다르게 실행된다.