※ 함수

def add(a, b):   #a, b라는 매개변수
    return a+b

print(add(10,14))   # 24출력

 

 

※ 입력값이 몇개가 될 지 모른다면?

def 함수명 (*매개변수):
    수행문장

 

Ex-1)

def adds(*arg):
    sum = 0
    for i in arg:
        sum += i
    return sum


print(adds(1,2,3,3,4,5,6,6,6,77))   # 113 출력

 

Ex-2)

def add_mul(choice, *args):
    if choice == "add":
        result = 0
        for i in args:
            result = result + i

    elif choice == "mul":
        result = 1
        for i in args:
             result = result * i

    return result

print(add_mul("add", 1,2,3,3,4,5,6,6,6,77))   # 113 출력
print(add_mul("mul", 1,2,3,3,4,5,6,6,6,77))   # 5987520 출력

 

 

※ 키워드 파라미터 - feat. 딕셔너리

입력값의 개수를 모르고 딕셔너리로 만들고 싶을 때, **를 이용할 수 있다.

def print_kwargs(**kwargs):
    print(kwargs)

print_kwargs(name = "V2LLAIN", age = 22)

#--------출력--------#
{'name': 'V2LLAIN', 'age': 22}

 

 

 

 

※ lambda 

함수를 생성 시 사용하는 예약어로 보통 함수를 한줄로 간결하게 만들 때 사용

add = lambda a, b: a+b

print(add(3, 4))

※ lambda 함수는 return 명령이 없어도 결과값을 돌려준다.

 

 

 

 

 

 

 

 

 

 

※ 클래스 

class Calculator:
    def __init__(self):
        self.result = 0

    def add(self, num):
        self.result += num
        return self.result

cal1 = Calculator()     # 객체 cal1 생성
cal2 = Calculator()     # 객체 cal2 생성

print(cal1.add(3))
print(cal1.add(4))
print(cal2.add(3))
print(cal2.add(7))


#----출력----#
3
7
3
10

 

class Calculator:
    def setAddData(self, first, second):
        self.first = first
        self.second = second
        return first+second

cal = Calculator()

print(cal.setAddData(4, 2))     # 6출력

python에서는 this대신 self를 사용한다. 이때, 첫번째 매개변수인 self는 관례적 사용이다.

python은 다른 언어와 달리 self를 명시적으로 구현한다.

출처: https://wikidocs.net/28

 

class Calculator:
    def setData(self, first, second):
        self.first = first
        self.second = second
    def AddData(self):
        result = self.first + self.second
        return result

cal = Calculator()
cal.setData(10, 14)

print(cal.AddData())     # 24출력

 

 

 

※ _ _init_ _  초기화 함수

파이썬 함수이름으로 __init__을 사용하면 이 함수는 생성자가 된다.

class Calculator:
    def __init__(self, first, second):
        self.first = first
        self.second = second

    def setData(self, first, second):
        self.first = first
        self.second = second

    def AddData(self):
        result = self.first + self.second
        return result

cal = Calculator(10, 14)

print(cal.AddData())     # 24출력

 

 

 

 

 

 

 

※ 클래스의 상속 

상속은 기존 클래스를 변경하지 않고 기능을 추가, 변경 시 사용한다.

class Calculator:
    def __init__(self, first, second):
        self.first = first
        self.second = second

    def setData(self, first, second):
        self.first = first
        self.second = second

    def AddData(self):
        result = self.first + self.second
        return result

class CalPower(Calculator):
    def power(self):
        return self.first ** self.second

cal = CalPower(10, 4)

print(cal.power())     # 10000출력

 

 

 

 

 

 

 

 

 

 

 

 

 

※ C++의 버전변화

C++98, C++03  ==>  C++11  ==>  C++14 ...

 

C++11: 기존 C++98에서 람다 표현식을 지원한 것

C++14: 일반화된 함수반환 형식 유추를 지원한 것

 

 

※ C++11/14 문법적 변경 사항

1. 초기화 리스트 및 초기화 방법의 통합

2. 새로운 타입의 추가 : long long형 정수

3. 새로운 스마트 포인터 추가 

4. 널 포인터 상수 추가 : nullptr

5. 열거체의 범위 지정

6. 자동 타입 변환 : auto

7. 타입 변환 연산자 추가 : explicit

8. 범위 기반 for 문 추가

9. 람다 함수와 람다 표현식 추가

 

 

※ C++11/14  표준 라이브러리 변경 사항

1. 확장할 수 있는 난수 생성기의 추가 : random 헤더 파일

2. 튜플 템플릿의 추가: tuple 헤더 파일

3. 정규 표현식의 추가 : regex 헤더 파일

4. 다중 프로그래밍을 위한 스레드의 지원 : thread_local 키워드, automic 헤더 파일

5. 임베디드 프로그래밍을 위한 저수준 프로그래밍 지원

 

 

※ C++11의 move semantics

C++11에서 가장 널리 쓰이는 기능은 바로 이동 의미론이다. (move semantics)

이동의미론l-value와 r-value가 구분된다는 점에서 유용하다.

l-value: 이름, 포인터, 왼값 참조를 통해 지칭할 수 있는 객체 (주소를 취할 수 있음)

r-value:이동연산이 가능한 객체를 가리킴 (함수가 돌려준 임시객체)

class Widget {
public:
    Widget (Widget&& rhs);  // rhs의 형식은 r-value참조, rhs 자체는 l-value
};

여기서 유의할 점은 rvalue 참조 형식의 매개변수지만 매개변수자체는 lvalue이다.

Widget의 이동생성자 안에서 rhs의 주소를 취하고 있기 때문이다.

 

 

※ 복사생성자를 통해 생성된 복사본 vs 이동생성자를 통해 생성된 복사본

이 둘을 구분하는 용어는 없다. 아래 예시를 보면

대체로 rvalue 복사는 이동생성자로 생성되고 lvalue 복사는 복사생성자로 생성된다.

호출지점에서 함수에 전달하는 표현식을 argument, 인자라 하고 

인수는 함수의 매개변수, parameter를 초기화하는데 사용된다.

매개변수는 l-value이지만 매개변수의 초기화에 쓰이는 인수는 l,rvalue 둘 다 가능하다.

 

 

 

 

 

 

 

 

※  C++과 람다 표현식

람다표현식으로 만들어진 함수객체를 closure라 부른다.

람다표현식과 그로부터 생성된 클로저를 구분해야하는 경우는 드물다.

또한 함수템플릿과 템플릿함수를 구분하는 경우도 드물다. (클래스 템플릿과 템플릿 클래스도 마찬가지)

 

C++에서 함수는 크게 2가지로 나뉜다.

- 일반함수(General Function): 일반적인 반환타입을 갖는 함수

- 무명함수(Anonymous Function): 람다(Lambda)이지만 함수객체처럼 함수의 이름없이 사용가능한 함수

int main() {
    // 람다식 선언
    auto Func1 = [] {
        cout << "Hello, Lambda" << endl;
    };
    
    // 람다식 인수로 int n 선언
    auto Func2 = [](int n){
        cout << "val = " << n << endl;   
    };
    
    Func2(2);
}

람다는 일반 함수처럼 사전에 선언문과 정의문 없이 하나의 문장 || 다수의 문장으로 직접 정의하고 실행시킬 수 있다.

이런 람다는 1~2번 작업을 위한 임시적인 함수를 만드는데 적합하다.

 

 

※ 람다 만드는 법

[캡쳐절] { 본문 }
[캡쳐절] (인수) { 본문 }
[캡쳐절] (인수)->반환타입{ 본문 }
[캡쳐절] (인수) mutable(옵션) constexpr(옵션) 예외(옵션) 속성(옵션) -> 반환타입{ 본문 }

마지막은 C++17이후 추가된 람다형식이다. 이를 아래와 같이 표현할 수 있다.

[캡쳐 리스트](인수) mutable(optional) constexpr(optional) 예외속성 -> 반환데이터타입{ 본문 }

 

 

 

1. 캡쳐절 (Capture Clause)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

2. 인수 리스트 (Parameter List)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

3. mutable (옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

4. constexpr (옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

5. throw (옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

6. Attribute(옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

7. 반환 데이터 타입 (옵션)

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

8. 본문

람다는 일반함수에 없는 캡쳐절이 존재한다.

 

 

+ Recent posts