심리학 스토리 교육

주문하고 진정하십시오. 평온

다음 단계를 넘은 것 같으면 Shadows는 반드시 기어 나와 춤을 추는 동안 균형과 정신이 유지되는지 확인할 것입니다.

그림자에 대한 반응은 자아의 추를 흔들고 무자비한 진실을 드러냅니다. 균형은 줄타기꾼의 경고처럼 긴장되고 용감한 사람을 과거의 심연으로 던질 것입니다.

진정한 균형은 편향된 관찰이 없는 것입니다. 여기서 일어나고 있는 옳지 않은 일을 찾는 것입니다.

주변에 전염병이 있거나 위협이 쏟아져 들어오더라도 "모든 것이 평소와 같습니다"라고 내면의 명상자는 말합니다. "이 사람들은 상처를 입었고 그들의 길을 알아야 할뿐입니다.

그러나 다른 반응이 있다면, 그 길은 완성되지 않은 것이고 아직 단계의 완성도 이루어지지 않은 것입니다.

- 이게 왜 필요한데? – 당신은 이제 레벨 여행의 시작 단계에 있습니다.
나는 죽을 때까지 싸울 준비가 되어있습니다! 당신은 1/4 지점에 있습니다.
나는 이런 종류의 모험을 좋아합니다! - 벌써 절반이 지나갔습니다.
- 나에게로 오십시오. 내가 당신을 구해 줄 것입니다. 당신은 4분의 3 길을 갔습니다.
– 당신이 바로 그 사람이라는 사실에 얼마나 감사합니까! – 레벨 끝까지 가는 길이의 2/10입니다.
– Wayfarer, 당신은 어디로 향하고 있으며 공격성을 통해 무엇을 달성하고 싶습니까? - 당신은 이 레벨을 통과했으며 위협적인 섀도우 시험을 치르고 있습니다.

Shadow에는 많은 사랑과 예술성이 있습니다. 훌륭한 교사로서 그녀는 폭군, 피해자, 구조자를 완벽하게 연기하여 균형을 테스트합니다. 결국, 게이머의 언어로 말하면 균형은 신의 수준입니다.

©마크 이프라이모프(Mark Ifraimov)

********

평화의 규칙

놓아줄 준비를 하세요.

당신을 속이고, 조종하고, 비난하고, 불평하고, 불행하고, 당신을 미치게 만들고, 당신의 정서적 평화를 빼앗는 사람들.

평등하세요.

모든 사람이 자신의 삶에 책임을 지고, 누군가가 그들을 행복하게 해주거나 사는 방법을 알려주기를 기다리지 않는 평등입니다.

경계하십시오.

불만과 조작에 굴복하지 마십시오. 관계는 다른 사람의 구원이 아니라 다른 사람의 삶에 존재하는 것입니다. 직접적인 도움 요청과 혼동하지 마십시오. 물어보세요 - 가능한 한 많이 도와주세요.

떠날 준비를 하세요.

분해와 비난에 관여하지 마십시오. 변명하지 마십시오. 당신이 틀렸다면 사과하십시오. 충분 해. 당신이 누군가의 감정에 큰 상처를 입혔다면, 보상하기 위해 어떻게 할 수 있는지 물어보십시오. 응답이 없으면 다른 곳으로 이동할 준비를 하십시오. 이것은 당신의 죄책감에 관한 것이 아니라 그의 비난에 관한 것입니다.

단호하게 행동하십시오.

“당신은 칭찬을 받았습니다. 기뻐하지 마십시오. 그들은 꾸짖습니다 – 화를 내지 마십시오”(c). 항상 승리할 수도, 패배할 수도 없습니다. 모든 것을 손실과 이익으로 나눌 수도 없습니다. 이 이벤트를 통해 배운 내용과 스스로 발견한 내용을 찾아보세요. 굳건한 발걸음으로 자신의 길을 가십시오.

지나가세요.

남의 갈등, 험담, 잣대, 평가, 분노, 복수, 징징거림, 낙인, 시기를 지나쳐라. 이 모든 일에 관여하지 말고 지원하지 말고 시간을 낭비하지 마십시오 ... 어서 ...

떠날 준비를 하세요.

우리는 C++ 17 표준의 언어 혁신에 대해 계속해서 알아가고 있습니다. 이 기사에서 우리는 언어의 고귀함의 지속을 고려할 것입니다. 저것들. 기능적 관점에서 완전히 새로운 것을 보지 못할 것입니다. 오히려 기존 기능을 더 수용 가능한 상태로 만드는 것입니다. 여기에서는 하위 표현식의 실행 순서가 어떻게 변경되었는지, 선택적 복사 제외와 관련하여 어떤 새로운 보장이 나타났는지, 그리고 람다에 무엇이 추가되었는지 살펴보겠습니다.

일을 정리하기

많은 C++ 프로그래머는 논란의 여지가 있는 코드가 제공되고 "무엇이 출력될 것인가?"라는 질문이 있는 "흥미로운" 문제를 접했습니다. 이러한 코드의 일반적인 예는 다음 예입니다.

정수 i = 0; 나는 = 나는 ++ + 나는 ++;

이러한 "스마트" 코드는 네트워크와 인터뷰에서 모두 발견됩니다. 이러한 질문의 목적은 응답자가 C++에서 표현식 실행 순서의 특성에 얼마나 친숙한지 알아내는 것입니다.

적어도 이것이 선언된 목표입니다. 사실, 나는 대부분의 경우 그러한 질문을 하는 사람이 단지 자신의 허영심을 즐겁게 하고 싶어 한다고 믿습니다. 그러한 코드가 무엇을 출력할지 아는 것은 완전히 선택 사항입니다. 왜냐하면 그러한 코드는 단순히 작성할 수 없기 때문입니다. 그리고 당신은 글을 쓸 수 없는데 왜 지원자에게 이것에 대해 물어 보나요? 이러한 질문은 동료 프로그래머들이 극단적인 사례를 논의하는 "흡연실"에 적합합니다. 인터뷰에는 적합하지 않습니다. 이 주제에 대한 Raymond Chen의 생각을 읽어 보시기 바랍니다. "사람들이 무표정한 얼굴로 여러 개의 부작용이 겹치는 미친 코드를 작성합니까?"

그러나 이것은 육안으로 볼 수 있는 병리적인 경우이고, 앞서 언급했듯이 일반 프로그래머는 절대 그렇게 작성하지 않을 것입니다. 그러나 숙련된 프로그래머라도 작성할 수 있는 덜 명확한 사례가 있습니다. 다음 코드를 살펴보겠습니다.

Void f2() ( std::string s = "하지만 믿지 않더라도 작동한다고 들었습니다."; s.replace(0, 4, "") .replace(s.find("even" ), 4, "only") .replace(s.find("don"t"), 6, ""); 주장(s == "당신이 그것을 믿을 때만 작동한다고 들었습니다."); )

이 코드는 Stroustrup의 최신 저서인 The C++ 프로그래밍 언어 4판의 섹션 36.3.6에 나와 있으며 언뜻 보면 매우 유용하고 정확해 보입니다. 그러나 이는 언뜻 보기에 불과하며 실제로 위 코드가 예상된 문자열을 형성할 것이라는 보장은 없으며 그에 따라 어설션이 작동하지 않을 것입니다.

우리가 볼 수 있듯이 C++의 창시자조차도 이렇게 작은 코드에서 실수를 범했습니다. 그것은 무엇을 말하는가? 우선, 다양한 일이 발생하는 하나의 표현식에 많은 코드를 집어넣을 필요가 없습니다. 책의 같은 페이지에 제시된 이 코드의 첫 번째 버전은 훨씬 더 간단하고 더 좋습니다.

Void f() ( std::string s = "하지만 믿지 않더라도 작동한다고 들었습니다."; s.replace(0, 4, ""); s.replace(s.find(" even"), 4, "only"); s.replace(s.find("don"t"), 6, ""); 주장(s == "당신이 그것을 믿을 때만 작동한다고 들었습니다." ); )

이 옵션은 프로그램 실행의 관점에서 정확할 뿐만 아니라 읽기도 더 쉽습니다. 그러나 이것이 우리가 끌어내야 하는 유일한 결론은 아닙니다. 제안 P0145R3의 작성자가 이미 우리를 위해 내린 결론이 하나 더 있습니다. C++에서 표현식 하위 표현식의 실행 순서에 문제가 있습니다.

오래된 주문

제안 자체와 그 채택으로 인한 변경 사항을 살펴보기 전에 현재 규칙을 기억할 것을 제안합니다. 이는 위의 두 가지 예가 잘못된 C++ 코드인 이유를 새로 고치는 데 도움이 될 것입니다(미학적인 측면이 아니라 언어 측면에서만). 따라서 다른 많은 프로그래밍 언어와 달리 C++에서는 표현식의 하위 표현식 실행 순서가 표준에 의해 결정되지 않고 컴파일러에 맡겨집니다. 물론 여전히 일정한 순서가 있지만 여기서 모든 미묘함을 설명하지는 않겠습니다. 그것들은 충분합니다. 일반적으로 하나의 큰 표현식의 하위 표현식 2개는 다음과 같이 서로 독립적으로 실행된다는 점을 이해하는 것이 중요합니다. 무기한순서(이 규칙의 가장 큰 예외는 쉼표 "," 연산자입니다).

예를 들어 첫 번째 예를 들어보겠습니다. i = i++ + i++; . 큰 표현식에는 i , i++ , i++ 및 i++ + i++ 4개의 작은 하위 표현식이 있습니다. C++14 표준은 무엇을 보장하나요? 이는 합계가 계산되기 전에 두 i++ 표현식이 모두 평가되고 합계 결과가 할당되기 전에 i 표현식이 평가된다는 것을 보장합니다( expr.ass ). 또한 i++ 표현식은 i의 이전 값을 반환한 다음 i를 1씩 증가시킨다는 점을 상기시켜 드립니다. 이는 결과적으로 i의 이전 값이 수신될 때 표현식이 평가되는 것으로 간주됨을 의미합니다.

따라서 컴파일러는 전체 표현식을 평가하기 위해 여러 가지 방법을 선택할 수 있다는 것이 밝혀졌습니다. ++의 효과가 i에 적용되어야 하는 경우에는 제한이 없습니다. 결과적으로 우리는 i 에서 다른 값을 얻을 수 있는데, 이는 물론 좋지 않습니다. 프로그램은 컴파일러의 변덕에 관계없이 예측 가능한 결과를 생성해야 합니다. 예를 들어 순서는 다음과 같습니다.

    첫 번째 i를 계산하면 0과 같습니다.

    두 번째 i를 계산하면 0과 같습니다.

    두 번째 증분의 결과를 쓰면 i == 1 을 얻습니다.

    첫 번째 증분의 결과를 쓰면 i == 2 가 됩니다.

    등호 왼쪽의 i를 계산합니다.

    합계를 계산합니다: 0 + 0 == 0 .

    우리는 합의 결과를 i에 씁니다.

    우리는 전체 표현식의 결과를 반환합니다. 즉, i 는 0 입니다.

표준에서 제공하는 보증을 위반하지 않는 범위에서 위의 단계를 순서에 관계없이 수행할 수 있으며 결과적으로 다른 답변을 얻게 됩니다.

그런데 더 간단한 옵션을 고려해 볼 수 있습니다. i = ++i + i++; . 여기에서 ++i 또는 i++ 중 무엇을 먼저 평가할지에 따라 결과가 달라지는 것을 즉시 확인할 수 있습니다. 첫 번째 표현식에는 평가되기 전에 부작용(i가 1씩 증가)이 있습니다.

두 번째 옵션이 더 설명적이지만 둘 다 소위 정의되지 않은 동작(NP, 영어 정의되지 않은 동작). 모든 노련한 C++ 프로그래머는 이 용어에 익숙하지만 C++ 언어에서 이 동작이 발생할 수 있는 모든 위치를 아는 사람은 거의 없습니다. 이것은 하나 이상의 기사에서 다룰 수 있는 광범위하고 흥미로운 주제이므로 이에 대해 더 자세히 설명하지 않겠습니다. 사실 이렇게 표현에 대한 자세한 분석은 필요하지 않았습니다. 표준(intro.execution/p15)에 따르면 우리의 표현은 다음과 같습니다. 하나의 표현식에는 동일한 스칼라 객체를 수정하는 두 개의 하위 표현식이 있고 변경 순서가 정의되지 않았기 때문에 이미 NP입니다. 그렇다면 내가 왜 이런 분석을 하였는가? 그 이유를 보여주려고 노력했어요 NP는 표현식 실행에 대한 현재 제한 사항에 따라 나타납니다. 목표는 현재의 규칙으로는 표준이 어깨를 으쓱하는 것 외에는 다른 선택이 없다는 것을 보여주는 것이었습니다.

이제 두 번째 예제로 넘어가서 무엇이 문제인지 알아봅시다. 이해를 더 쉽게 하기 위해 이 예를 다음 표현으로 단축하겠습니다. s.replace(s.find("even"), 4, "만"). 여기에는 무엇이 있나요? 객체 s 가 있고 멤버 함수 std::string::replace 에 대한 호출, 또 다른 함수 std::string::find 및 이러한 함수에 대한 인수가 있습니다. 표준은 우리에게 어떤 보증을 제공합니까? 표준은 함수가 호출되기 전에 함수 인수가 평가되도록 보장합니다. 또한 함수가 실행되는 객체는 함수가 호출되기 전에 평가되어야 합니다. 이 모든 것은 명확하고 논리적입니다. 사실, 다른 보장은 없습니다. 교체 함수에 대한 인수가 평가되기 전에 s가 평가된다는 보장도 없으며 이러한 인수가 평가되는 순서에 관한 보장도 없습니다. 따라서 s.find("even") , "only" , 4 , s , s.replace(...) 와 같은 평가 순서를 얻을 수 있습니다. 또는 이전에 지정된 표준 보증을 위반하지 않는 기타 모든 것.

위의 텍스트에서 두 가지 주요 사항을 구별해야 합니다. 1) 점의 왼쪽과 오른쪽에 있는 표현식은 순서에 관계없이 평가될 수 있습니다. 2) 함수 인수는 순서에 관계없이 평가될 수 있습니다. 이를 바탕으로 이제 Stroustrup의 책에 있는 코드가 잘못된 이유가 명확해졌습니다. 표현식에서:

S.replace(0, 4, "") .replace(s.find("even"), 4, "only") .replace(s.find("don"t"), 6, "");

find에 대한 두 호출 모두 이전(코드 내) 교체가 완료되기 전에 종료될 수 있습니다. 그리고 아마도 그 이후에. 첫 번째도 이전에 가능하고 두 번째는 나중에 가능합니다. 왜냐하면 알 수 없기 때문입니다. 순서가 정의되지 않았습니다. 결과적으로 이 코드는 예측할 수 없는 결과를 제공합니다. NP. 그러나 내가 말했듯이 유능한 프로그래머는 그러한 코드를 작성하지 않을 것이며 그것이 Stroustrup의 책에 있다는 사실이 그가 그렇게 작성할 것이라는 의미는 아닙니다. 그는 단지 호출 체인의 예를 제시했습니다.

또한 호출 체인이 그렇게 명확하지 않을 수도 있습니다. 예를 들어 코드는 다음과 같습니다.

표준::cout<< first << second;

이는 또한 다음과 같은 호출 체인이기도 합니다.

표준::cout.operator<<(first).operator<<(second);

또는 다음과 같습니다:

운영자<<(operator<<(std::cout, first), second);

그 차이는 근본적인 것이 아닙니다. 갑자기 첫 번째와 두 번째 표현식이 동일한 객체를 참조하고 이러한 표현식 중 하나가 이 객체를 수정하는 경우 출력에서 ​​불안정한 코드를 얻을 가능성이 높습니다. NP.

위 문장의 또 다른 흥미로운 예는 다음과 같습니다.

표준::지도 사전; 사전 = Dictionary.size();

예, 코드는 무의미해 보이지만 결과적으로 어떤 결과가 나올까요? 의미 없는 코드라도 예측 가능한 결과를 생성해야 합니다. 불행하게도 2014년 스타일의 C++는 어깨를 으쓱할 뿐입니다. 저는 잘 모르겠습니다.

함수 및 연산자

호출 체인을 살펴보면서 우리는 또 다른 흥미로운 점, 즉 std::cout에 대한 호출이 실제로 무엇으로 바뀌는지 알게 되었습니다.<< first << second; . Как мы уже видели, в зависимости от того, чем являются first и second , мы можем получить либо цепочку вызовов функций-членов, либо же вложенные вызовы свободных функций. Но ведь в изначальном варианте записи у нас есть три выражения и 2 оператора << , у нас нет вообще никаких функций!

이 코드가 C++ 프로그래머에게 문제를 일으킬 가능성은 거의 없습니다. 조만간 우리 모두는 연산자 오버로드에 대해 배우고 이를 모두 당연하게 여기지만 이 오버로드에는 한 가지 뉘앙스가 있습니다. 이 미묘한 차이를 보여주기 위해 다음 함수 템플릿을 작성해 보겠습니다.

주형 << "first\n", value++) && (cout << "second\n", value++); }

예, 템플릿은 가장 유용하고 주목할만한 것은 아니지만 지금 보시다시피 매우 시사적입니다. 이 함수를 인스턴스화하는 int 인수를 사용하여 CleverFun 함수를 호출해 보겠습니다.

Bool CleverFun(int& value) ( ​​​​return (cout<< "first\n", value++) && (cout << "second\n", value++); }

이 함수가 호출되면 출력은 다음과 같이 보장됩니다.

첫 번째 값++가 0을 반환하면 그렇지 않으면 다음과 같습니다.

첫번째 두번째

그리고 다른 것은 없습니다. 이는 명백합니다. && 연산자에 대한 강력한 보장이 있습니다. 단락(KZ, 영어 단락) 및 왼쪽을 오른쪽으로 실행합니다. 반면에 후위 연산자++와 연산자&&를 모두 재정의하는 Int 유형을 만든 다음 이를 사용하여 템플릿을 인스턴스화하면 다음 함수를 얻습니다.

Int CleverFun(Int& value) ( ​​​​return (cout<< "first\n", value.operator++(0)) .operator&&((cout << "second\n", value.operator++(0))); }

나는 이미 읽기 쉽지 않은 코드를 더 이상 낭비하지 않기 위해 cout 호출이 어떻게 될지 밝히지 않았습니다. 지금까지 다룬 내용에 따르면 이 코드의 출력이 일반 int 에 대해 얻는 출력과 다르다는 사실은 놀랄 일이 아닙니다. 여기에서는 두 가지 옵션도 얻을 수 있지만 서로 다릅니다.

첫번째 두번째

두 번째 먼저

분명히 재정의된 연산자에 대한 단락 회로가 작동하지 않기 때문에 먼저 옵션을 얻을 수 없습니다. 이 예제를 자세히 살펴보면 이유를 이해해야 합니다. 재정의된 연산자&& 를 실행하려면 인수를 평가해야 합니다(즉, 단락에 작별). 또한 단락은 왼쪽 표현식이 다음과 같은 경우에만 작동합니다. bool , 재정의된 경우 연산자가 있을 수 없습니다. 따라서 단락에 대한 환상은 있을 수 없습니다. 이는 재정의된 연산자에는 존재하지 않으며 결코 존재하지 않습니다.

글쎄, 단락이 있을 수 없으므로 첫 번째 출력 옵션을 얻을 수 없습니다(첫 번째만). 하지만 두 줄의 출력이 있는 옵션도 다를 수도 있고 다를 수도 있습니다! 생각해 보세요. 함수 템플릿 내부에는 동일한 코드가 있습니다. 이 코드는 일부 템플릿 인수를 사용하여 하나의 규칙에 따라 실행되고 다른 규칙에 따라 완전히 다른 규칙에 따라 실행됩니다.

이는 C++14에서 연산자와 피연산자에 대한 보장이 피연산자가 무엇인지에 따라 다르기 때문입니다. 표준에 따르면 정수 유형의 경우 모든 연산자는 표준에 설명된 대로 작동하지만 재정의된 연산자의 경우 함수 호출을 제어하는 ​​규칙이 이미 작동합니다. 저것들. 재정의된 연산자의 경우 표현식은 컴파일러에 의해 함수 호출 체인에 "다시 작성"되고 그 후에 해당 체인에 대해 정의된 표준의 규칙이 적용됩니다. 재정의된 연산자에는 표준의 연산자 보장이 적용되지 않습니다..

이전에 설명한 모든 내용은 매우 암울한 그림을 그립니다. C++에는 표현식 평가와 관련하여 너무 많은 혼란이 있습니다. 사람들이 그런 일을 참는 데 지친 것은 놀라운 일이 아니며, 이 모든 것이 일종의 신화적 최적화에 필요하며 변경되어서는 안 된다는 영원한 진술이 더 이상 충분한 정당화로 간주되지 않습니다. 상식이 우세했고, C++17은 이 혼란을 정리하기 위해 몇 가지 변경 사항을 받았습니다. 그리고 우리는 지금 어떤 종류의 변화를 고려하고 있습니까?

새로운 주문

C++17에서 가져온 첫 번째 변경 사항은 순서입니다. 이행후위 연산자, 할당 연산자 및 비트 시프트 연산자. 이제 모든 후위 연산자와 비트 시프트 연산자는 왼쪽에서 오른쪽으로 실행되고 할당 연산자는 그 반대로 오른쪽에서 왼쪽으로 실행됩니다. 이 문맥에서 "실행"이란 표현식이 평가되고(즉, 결과가 반환됨) 표현식과 관련된 모든 부작용이 커밋된다는 의미입니다.

이제 표현식의 순서가 어떻게 지정되는지 설명하기 위해 문장의 예를 살펴보겠습니다(아래 예에서는 표현식 a가 먼저 실행된 다음 b가 실행됩니다).

A.b a->b a->*b a(b1, b2, b3) b @= a a[b] a<< b a >>b

여기서 @는 이 컨텍스트에서 유효한 연산자입니다(예: + ). 따라서 새로운 규칙에 따라 C++11에 대한 Stroustrup의 책에 제공된 예제는 마침내 C++17에서 정확해지며 항상 정확하고 예상되는 결과를 생성합니다. 보시다시피, 새로운 규칙은 함수 인수의 서로 상대적인 실행 순서에 영향을 주지 않습니다. 여전히 어떤 순서로든 실행될 수 있지만 실행이 서로 인터리브될 수는 없습니다. 즉, 서로 상대적으로 순서가 지정되어 있지만 순서가 규제되지는 않습니다.

이제 C++14에서 몇 가지 "흥미로운" 예를 살펴보겠습니다. NP이지만 C++17에서는 사라졌습니다. 나는 이러한 예를 나만의 소비를 위해서만 제공합니다. 인터뷰에서 사람들을 고문하지 말 것을 간청합니다.

나=나++; f(++i, ++i) f(i++, i++) 배열 = i++ i<< i++ cout << i++ << i++

그러나 이러한 예는 여전히 남아 있습니다. 새로운 표준의 NP:

나는 = 나는++ + 나는++ 나는 = ++i * 나는++

산술 연산자의 하위 표현식이 실행되는 순서를 규제하는 규칙이 추가되지 않았기 때문입니다. 그러나 사실은 이 예제에서 NP가 사라졌다고 해서 코드를 유사한 코드로 포화시킬 때가 됐다는 의미는 아닙니다. 이러한 각 예에는 세심한 주의가 필요하며, 그렇지 않다는 증거가 필요합니다. NP. 저것들. 이와 같은 코드를 본 프로그래머는 중지하고, 기억하고(또는 표준에 올라서) 자신 앞에 올바른 코드가 있는지 확인해야 합니다. 코드는 "스마트"해서는 안 되며, 이해할 수 있어야 합니다.더욱이 이러한 표현의 조합은 실제로 거의 제공하지 않습니다.

그건 그렇고, 주의 깊은 독자라면 cout 라인을 알아차렸을 것입니다.<< i++ << i++ в вышеприведённых примерах, и если он не знает обо всех правилах и поверил автору, то он наверняка воспользовался такой логикой: пример переписывается как

cout.operator<<(i++).operator<<(i++)

그 후 . 그래서 코드에는 없습니다 NP. 그러한 추론은 논리적인 것처럼 보이지만 전적으로 사실은 아닙니다. 사실, 모든 것이 더 간단합니다. 예제는 제가 제공한 예제에 대해 컴파일러에 의해 실제로 "다시 작성"되지만 실행 순서는 다시 작성되기 전에 구성됩니다! 저것들. 새로운 규칙에 따라 오버로드된 연산자는 내장 연산자의 실행 규칙을 따릅니다., 적어도 하위 표현식이 평가되는 순서 측면에서는 그렇습니다. 따라서 연산자의 왼쪽 피연산자가<< вычисляется до правого у нас и нет 코드의 NP.

내장 연산자와 오버로드된 연산자에 대한 표현식이 실행되는 순서와 이전 섹션의 예에는 더 이상 불일치가 없는 것으로 나타났습니다.

주형 bool CleverFun(T& value) ( ​​​​return (cout<< "first\n", value++) && (cout << "second\n", value++); }

모든 유형에 대해 항상 먼저 먼저 출력한 다음 두 번째를 출력합니다. 이제 출력의 역순은 표준에 의해 제외됩니다. 물론 이는 코드에서 생성될 내용이 아니라 작성된 코드에 대해 추론할 수 있게 해주는 매우 중요한 혁신입니다. 이 혁신으로 인해 오버로드된 연산자의 명시적 호출과 암시적 호출 간에 차이가 발생했다는 점은 흥미롭습니다. 예를 들어보자:

#포함하다 네임스페이스 std 사용; 클래스 SomeClass( 친구 int 연산자<<(const SomeClass& obj, int&); public: SomeClass(int var): m_Var{var} { } private: int m_Var; }; int operator<<(const SomeClass& obj, int& shift) { return obj.m_Var << shift; } int main() { int i = 0; int result = SomeClass{i = 1} << (i = 2); cout << "First result: " << result << "\n"; result = operator<<(SomeClass{i = 1}, i = 2); cout << "Second result: " << result << "\n"; };

첫 번째 결과는 4 가 보장되고 두 번째 결과는 2 또는 4 일 수 있습니다. 이 예는 C++17에서 오버로드된 연산자의 명시적 호출과 암시적 호출 간의 차이점을 잘 보여줍니다.

분명히 새로운 질서가 도입되면서 다양한 복잡한 표현이 등장했습니다. 과거 표준의 NP는 이제 유효하지만 이것이 코드에서 한꺼번에 나타나기 시작해야 한다는 의미는 아닙니다. 단지 그들이 그렇기 때문에 있어서는 안 된다. 복잡한, 그리고 이해하기 어려운 모든 것은 피해야 합니다. 그러나 새로운 규칙은 프로그램이 손상될 염려 없이 f(i++, i++)와 같은 함수를 호출할 수 있는 능력만 제공하는 것이 아닙니다. 새로운 규칙은 C++ 코드에 더 엄격하고 질서를 부여하며, 그 덕분에 우리는 이제 일련의 호출(명시적이든 암시적이든 상관 없음)을 사용하여 신뢰할 수 있는 코드를 작성할 수 있습니다.

Stroustrup의 책에서 코드에 대해 "fi"라고 말했지만 체인 방지와는 거리가 멀고 명령형 언어를 사용하여 작성된 최신 코드를 보면 코드에 체인이 점점 더 많이 포함되어 있음을 알 수 있습니다(예: C#에서는 LINQ 및 Task+ContinueWith, JS에서는 Lodash/밑줄 및 Promise+를 사용합니다. C++도 그 방향으로 나아가고 있으며, 곧 Range-v3 및 future+then이 향후 C++ 표준에서 위의 예와 동등한 것을 보게 될 것입니다. 그러나 새로운 표준이 출시되기 전에도 호출 체인 사용을 권장하는 인터페이스를 갖춘 다양한 라이브러리를 사용할 수 있습니다.

제 생각에는 표현식을 평가하기 위한 규칙의 변경은 C++17의 가장 중요한 혁신 중 하나이지만 거의 눈에 띄지 않을 것입니다. 왜냐하면 모든 것(또는 거의 모든 것)이 예상대로 작동하기 때문입니다. 상식적으로. 그리고 C++ 표준에는 매일 점점 더 많은 상식이 있습니다.

복사 최소화

C++ 학습의 첫 번째 단계 중 하나는 복사 생성자를 배우는 것입니다. 결국, 그것의 도움으로 무엇을 언제 복사할지 쉽게 결정할 수 있습니다. 저것들. 우리는 우리 자신의 클래스를 작성하고 거기에 복사 생성자를 추가하여 cout을 통해 출력을 작성하고 출력을 즐기며 그 결과 우리가 만든 복사본 수를 확인합니다.

이동 의미론의 출현으로 상황이 다소 복잡해졌으므로 이제 완벽함을 위해 이동 생성자도 만들어야 합니다. 하지만 이 섹션에서는 중요하지 않습니다. 왜냐하면. 복사와 이동 모두에 대해 다음 사항이 모두 적용됩니다.

예를 들어, 다음 코드를 작성해 보겠습니다.

#포함하다 네임스페이스 std 사용; 클래스 SomeClass ( 공개: SomeClass() = 기본값; SomeClass(const SomeClass&) ( cout<< "Copy ctor called.\n"; } }; SomeClass meReturn() { return SomeClass{}; } int main() { auto some = meReturn(); };

C++14를 구현하는 컴파일러에서 이 코드를 빌드하고 프로그램을 실행하면 "복사 호출됨"이라는 문구가 화면에 몇 번이나 나타날까요? 0회, 1회, 아니면 2회? 정답: 알 수 없음.

놀랍게도 응답을 받은 사람들에게는 설명이 필요합니다. 이제 이에 대해 살펴보겠습니다. 따라서 우선 표준을 알아보고 여기에서 최대 사본 수는 얼마인지 고려해 보겠습니다. 아마도생성됩니다. 여기서 가능한 최대 복사본 수는 숫자 2입니다. 첫 번째 복사본은 return 문이 실행될 때 생성되고 두 번째 복사본은 some 개체가 생성될 때 생성됩니다. 그러나 이 코드를 다소 현대적인 컴파일러(추가 스위치 없음!)에서 실행하면 이중 출력이 표시될 가능성이 없습니다. 더 가능성 있는 결과는 한 줄이거나 전혀 출력되지 않는 것입니다. 이제 함수의 코드를 약간 수정하겠습니다. 이것이 두 번째 옵션이 됩니다.

SomeClass meReturn() ( SomeClass some(); 일부를 반환; )

널리 사용되는 컴파일러에서 이 코드를 실행하면 출력이 변경될 수도 있고 변경되지 않을 수도 있습니다(디버그 모드의 MSVC 2017에서는 변경됨). 마지막으로, 함수의 코드를 조금 더 변경하겠습니다. 이번에는 출력이 변경되는 것이 보장됩니다(첫 번째 옵션과 관련하여 컴파일러의 현재 상태를 고려).

SomeClass meReturn() ( SomeClass some(); if (false) return SomeClass(); return some; )

따라서 기능은 모든 변형에서 본질적으로 동일하지만 동작은 다릅니다. 어쨌든 여기서 무슨 일이 일어나고 있습니까? 다시 시작하다. C++ 표준에 따르면 어떤 경우에는 컴파일러가 개체를 복사하지 못할 수도 있습니다. 이 상황을 이라고 합니다 복사 건너뛰기(PC, 영문 복사 생략). 복사 건너뛰기가 허용되는지 여부를 결정하는 데 사용할 수 있는 전체(다소 짧은) 기능 목록은 class.copy/p31 에 설명되어 있습니다. 우리는 유사하지만 여전히 다른 두 가지 상황에 관심이 있습니다.

원래 예에서 함수는 임시를 반환합니다. 이름없는객체. 이러한 상황에서 컴파일러는 두 복사본을 모두 생략하고 일부 . 이 상황은 널리 알려져 있습니다. 반환 값 최적화(OVZ, eng. 반환 값 최적화). gcc/clang/MSVC를 보면 이러한 함수의 경우 두 복사본이 모두 제거되므로 출력이 비어 있음을 알 수 있습니다.

이 최적화는 return 뿐만 아니라 이름이 지정되지 않은 임시 객체로 초기화가 발생하는 다른 위치에서도 허용됩니다. 따라서 meAccept(SomeClass()) 처럼 호출되는 void meAccept(SomeClass) 함수가 있는 경우 컴파일러는 중복 복사본을 자유롭게 생략할 수 있습니다.

이제 우리가 만든 두 번째 옵션으로 이동하겠습니다. 명명 된스택에 있는 개체입니다. gcc/clang의 출력은 변경되지 않았지만 MSVC(디버그 모드)의 경우 출력에 한 줄이 나타났습니다. 이 경우 MSVC는 두 번째 복사본만 제거한 것이 분명합니다. 위의 내용을 바탕으로 컴파일러도 PC를 사용한다는 것이 분명해졌지만 여기서는 약간 다른 기준에 따라 발생합니다. 복사를 제거할 권리가 있습니다. 명명 된함수에서 반환된 스택의 개체입니다. 이 최적화는 다음과 같이 널리 알려져 있습니다. 명명된 반환 값 최적화(OIVZ, 영어 명명된 반환 값 최적화).

이 최적화는 컴파일러가 수행하기가 더 어렵습니다. 세 번째 옵션에서 볼 수 있듯이 절대적으로 쓸모 없는 if 를 추가하여 세 가지 주요 컴파일러가 모두 통과하고 복사본을 만들도록 했습니다. 따라서 OIV는 단순한 OIV보다 더 "취약한" 최적화이며 코드에 여러 가지 다른 반환이 있는 경우 일반적으로 비활성화됩니다. 이는 함수에 반환이 하나만 있어야 하는 이유 중 하나입니다(이 주장이 매우 설득력이 있다고는 말할 수 없습니다).

흥미로운 사실은 최적화가 비활성화된 상태(-O0, /Od)로 컴파일할 때에도 위의 최적화가 컴파일러에 적용된다는 것입니다. 게다가 gcc와 clang만이 모든 복사본을 강제로 만들 수 있습니다. 이 작업을 수행하려면 -fno-elide-constructors 스위치를 사용해야 하며 MSVC는 어떤 상황에서도 두 개의 복사본을 만들지 않으며 이 동작을 비활성화하는 [public] 스위치가 없습니다.

언급해야 할 또 다른 점이 있습니다. C++14에서는 컴파일러가 두 복사본을 모두 제거할 수 있으므로 복사 생성자를 한 번도 실행하지 않지만 그러한 생성자가 없으면 컴파일 오류가 발생합니다. 저것들. 기존 복사 생성자 대신 이것을 작성하면: SomeClass(const SomeClass&) = 삭제, 그러면 컴파일러가 합법적으로 복사를 제거할 수 있는 경우에도 프로그램은 빌드되지 않습니다. 생성자는 여전히 있어야 합니다.

그리고 마지막으로 세 번째 요점은 움직임입니다. 컴파일러가 복사를 생략할 수 있으면 재배치를 생략할 수 있습니다. 저것들. 이 점에서 그들은 절대적으로 동일합니다. 그런데 이와 관련하여 한 가지 흥미로운 상황이 연결됩니다. 많은 프로그래머(인터넷에서 본 코드를 기반으로 많은 프로그래머에 대해 결론을 내렸습니다)는 move의 의미를 잘 이해하지 못하고 다음과 유사한 코드를 작성합니다. return std::move(someObject) . 겉보기에 이 코드는 전혀 무해하며 코드를 작성한 사람이 예상한 대로 작동합니다. 이 코드만 보장 OIVZ를 끕니다. 저렴한 이동 생성자를 하나만 사용하는 것이 더 낫다고 생각하시나요? 아니면 아무것도 하지 않는 것이 더 낫다고 생각하시나요?

새로운 현실

이제 PC와 관련하여 C++17에서 변경된 사항을 고려해 볼 차례입니다. 이 섹션에서 논의할 모든 변경 사항은 원래 P0135R1 제안에서 찾을 수 있습니다. 이 문서를 살펴보면 표현 범주 측면에서 표준에 대한 수많은 변경 사항이 설명되어 있음을 알 수 있습니다(주로 ) 및 명시적으로 실행해야 하는 위치를 명확히 하는 다양한 편집 내용 직접(직접) 및 사자(복사-) 초기화. 이 전체 세트 중에서 우리는 stmt.return/p2에 설명된 변경 사항 하나만 관심이 있습니다.

따라서 위의 혁신에 따르면 함수의 반환 유형과 동일한 유형(즉, 변환이 필요하지 않음)의 명명되지 않은 임시 개체(prvalue)를 함수에서 반환하면 결과의 복사 초기화가 수행됩니다(dcl. init/p(17.6.1) , 복사를 건너뛸 수 있습니다). 위 문장에 적힌 내용은 본질적으로 동일한 HIA이지만 이번에만 필수적인. 저것들. C++14 컴파일러의 경우 ~할 수 있었다그런 경우에는 복사/이동을 제거하세요. 이제 ~ 해야 하다해. 컴파일러 자체가 훌륭한 작업을 수행한다는 것을 이미 보았기 때문에 이것이 우리에게 무엇을 제공합니까? 그리고 이 코드를 사용하면 다음을 제공합니다.

SomeClass meReturn() ( SomeClass()를 반환; )

복사 및 이동 생성자를 전혀 가질 수 없으며 여전히 컴파일됩니다. 명명되지 않은 임시 객체에서 다른 객체가 생성될 때 대소문자만 변경되었다는 점에 유의하는 것이 중요하지만 명명된 객체(OIVZ)를 반환하는 경우 컴파일러가 복사를 건너뛸 수 있더라도 적절한 생성자가 있어야 합니다. .

반환 값이 아닌 인수 전달과 관련된 것이 하나 더 있습니다. 이 코드가 있는 경우:

Void meAccept([] SomeClass s) ( )

그런 다음 meAccept(SomeClass()) 함수를 호출하면 복사도 발생하지 않으며 이는 다시 더 이상 최적화가 아니라 표준 요구 사항입니다. 이는 prvalue( basic.lval ) 정의의 변경과 해당 변경에 수반되는 내용 때문입니다. meAccept(SomeClass()) 줄을 분석해 보겠습니다. 이전 prvalue 측면에서 SomeClass()는 임시 개체이며 함수 매개 변수에 복사됩니다. 그러나 가치의 새로운 정의는 그것이 더 이상 존재하지 않는다는 것입니다. 객체, 하지만 표현, 그 평가는 객체의 초기화입니다. 이것이 우리에게 무엇을 의미합니까? 이는 우리가 고려하고 있는 표현식에서 SomeClass()가 임시 객체가 아니라 함수 매개변수 초기화 표현식임을 의미합니다. 여기에는 이전에 dcl.init/p(17.6.1)에서 설명한 규칙이 포함되어 있으며 복사가 발생하지 않습니다. 초기화가 직접 수행됩니다.

언뜻보기에 이것은 다소 중요하지 않은 혁신입니다. 모든 것이 같은 방식으로 발생했기 때문에 컴파일러는 이를 수행할 필요가 없었습니다. 그러나 이러한 혁신은 가치 개념의 본질 자체를 변화시켰으므로 이를 대수롭지 않게 여겨서는 안 됩니다. 예, 순전히 실용적인 관점에서 볼 때 이러한 변화에 대해 알아야 합니다. 왜냐하면 언어를 배울 때 경험적으로 배우고 이 과정에서 복사/이동 생성자를 사용한 실험이 매우 일반적이기 때문입니다. 따라서 C++17부터는 컴파일러가 이전에 설명한 예제에서 복사본을 만들도록 강제할 수 있는 방법이 없습니다. 프로그램이 C++17용으로 컴파일되고 컴파일러가 실제로 이를 지원하는 경우에는 플래그가 도움이 되지 않습니다. 일상적인 코드의 경우, 이 혁신을 통해 복사/이동 생성자가 없는 객체를 반환하는 팩토리 함수를 생성할 수 있습니다. 얼마나 필요합니까? 시간이 보여 줄 것이다.

람다

위원회는 계속해서 람다에 대한 애정을 보여주며 표준이 새로 개정될 때마다 새로운 것을 추가합니다. 2017년에도 예외는 아니었고 람다는 혁신의 일부를 받았습니다. 짧은 구문(예: C#의 x => x )을 계속 기다리고 있고 이 표준의 혁신이 사소하다고 생각하지만 여전히 이를 피할 수는 없습니다.

이것을 캡처

이것이 첫 번째 혁신입니다. 이제 this 포인터를 사용하여 개체의 복사본을 캡처 목록에 전달할 수 있습니다. C++17 이전에는 현재 개체의 복사본을 람다에 전달하려면 다음과 같이 작성해야 했습니다.

#포함하다 네임스페이스 std 사용; class SomeClass ( public: SomeClass(size_t value): m_Value(value) ( ​​​​) void someMethod() ( autolamda = [_this = *this] ( for(size_t i = 0; i< _this.m_Value; ++i) cout << "This is lambda!!!\n"; }; lambda(); } private: size_t m_Value; }; int main() { SomeClass some{3}; some.someMethod(); };

이 접근 방식의 가장 큰 단점은 액세스할 때마다 *this 를 복사한 객체의 이름을 명시적으로 지정해야 한다는 것입니다. C++17에서는 다음과 같이 작성할 수 있도록 하여 이 단점을 해결합니다.

자동 람다 = [*this] ( for(size_t i = 0; i< m_Value; ++i) cout << "This is lambda!!!\n"; };

저것들. 개체 멤버에 대한 액세스는 캡처 목록을 사용하여 람다를 만든 것과 똑같은 방식으로 수행되지만 이 경우 현재 개체(예: 이 포인터)가 아니라 해당 복사본이 람다에 전달됩니다. . 그런 코드를 작성할 필요가 없었기 때문에 혁신의 유용성을 평가하기는 어렵지만 분명히 누군가가 살기가 더 쉬워질 것이라는 점을 지적하고 싶습니다. 나는 그들에게만 기뻐하고 다음 혁신으로 나아갈 수 있습니다.

더 많은 일관성이 필요합니다!

오랫동안 요구되어 온 또 다른 변화는 상수 표현식에 람다를 사용할 수 있는 기능의 추가입니다. 물론 이러한 람다도 일정해야 합니다. 예를 들어:

자동 11 = ( return 11; ); 정렬 arr;

보시다시피 람다 정의에는 아무것도 변경되지 않았지만 해당 호출은 컴파일 타임 상수의 사용이 필수인 컨텍스트에서 사용됩니다. 왜냐하면 이 코드가 성공적으로 컴파일되면 주의 깊은 프로그래머라면 누구나 람다에서 생성된 클래스의 Operator()가 constexpr 멤버라고 결론을 내릴 수 있으며 이 결론은 의심의 여지 없이 정확합니다. C++17부터 모든 람다 표현식은 기본적으로 constexpr 이지만 C++17 이전에는 그냥 const였습니다. 그러나 람다 함수의 본문이 모든 constexpr 함수가 준수하는 기준 중 하나 이상을 충족하지 않으면 const로 강등됩니다(기준은 dcl.constexpr에 설명되어 있음). 코드를 최소한으로 변경하면 람다는 더 이상 constexpr이 아닙니다.

자동 11 = ( int x; return 11; );

이러한 람다를 사용하면 배열 생성 코드에서 컴파일 오류(우리가 실제로 원했던 것)가 발생하지만 람다 생성 자체에서는 오류가 발생하지 않습니다. 그러나 나사를 조여 람다가 위의 규칙을 준수하는 본체를 갖도록 요구할 수 있습니다.

자동 11 = () constexpr ( int x; return 11; );

기능적 부하를 전달하지 않고 표준의 변덕만을 제공하는 명백한 constexpr과 ()를 모두 추가해야 했습니다. 따라서 constexpr 컨텍스트에서 사용이 보장되는 람다 함수를 만들 수 있습니다.

이 변경 사항은 오랫동안 제안되어 왔으며 누구에게도 놀랄 일이 아닙니다. 간단한 함수는 constexpr 일 수 있고 멤버 함수도 될 수 있습니다. 왜 람다가 더 나쁜가요? constexpr 람다는 얼마나 필요한가요? 이것은 더 흥미로운 질문입니다. 나는 간단한 코드가 필요로 하는 만큼 constexpr 코드도 그것들이 필요하다고 생각합니다. 현재 C++에는 constexpr 붐이 일고 있습니다. 사람들은 런타임에서 컴파일 타임으로 작업을 이동하는 데 누가 더 나아갈 수 있는지 경쟁하고 있습니다.

그들은 JSON 파서를 작성하고 심지어 정규식을 실행하는 데까지 이릅니다(관심 있는 사람들은 CppCon2017의 비디오를 시청하십시오: "모든 것을 구성하세요!"). 또한 점점 더 많은 표준 알고리즘이 constexpr이 되고 있으며, 이는 단순히 알고리즘용으로 만들어졌기 때문에 람다의 가장 확실한 사용을 제공합니다. 따라서 내 생각에는 constexpr을 추가하는 것이 좋은 진전이며, 이를 통해 컴파일 타임에 실행될 더 많은 코드를 작성할 수 있습니다.

반면에, 컴파일 시간을 위해 그렇게 많이 움직여야 할까요? 물론, 컴파일 타임에 다중 동적 실행에서 단일 실행으로 무언가를 전송할 수 있다면 이는 확실한 이점입니다. 아니면? 이는 작업과 실행 중에 얻는 이점에 따라 다릅니다. 많은 RAM을 소비하고 컴파일 시간을 늘리는 JSON 파서를 작성했다고 가정해 보겠습니다(위 비디오의 마지막 3분 이상 시청). 이것이 우리에게 무엇을 제공합니까? 예, 이제 컴파일 타임에 구성을 구문 분석하여 코드에서 사용할 수 있습니다. 그러나 결국 JSON을 사용하지 않고도 이전에 이 작업을 수행할 수 있었으며 이는 실행 시간에 대한 로드도 0이 될 것입니다(예를 들어 헤더에 플래그 집합만 있으면 됩니다). 이것은 나에게 수염 난 농담을 생각나게 한다:

두 친구가 만나다:

— 차를 샀다고 들었는데?

- 예! 그리고 그는 어떻게 살았습니까! 이제 나는 모든 것을 할 수 있다! 어제 나는 하루 만에 기름을 갈고, 새 타이어를 사고, 자동차 시장에 펜더를 사러 갔다가, 즉시 자동차 서비스를 받고 교체하고, 부동액을 사러 가게로 운전했습니다. 차가 없이 어떻게 이 모든 일을 할 수 있겠습니까?

JSON이 더 편리하다는 점에 반대할 수도 있습니다. 순리에 맡기다. 그런 다음 동일한 Python(또는 일반적으로 CMake)에 스크립트를 추가해 JSON에서 구성 개체를 생성해 보겠습니다. 예, 프로젝트를 빌드하려면 한 단계를 더 추가해야 합니다. 하지만 JSON을 구문 분석하는 C++ 코드를 작성하는 것보다 어렵습니까? 그리고 아무도 컴파일 시간을 취소하지 않았습니다(이 이유가 훨씬 더 중요하다고 생각합니다). 코드를 컴파일하는 데 오랜 시간이 걸리면 개발이 지옥으로 변할 것입니다. 따라서 복잡한 내용을 constexpr 레일로 포팅하는 것이 전혀 의미가 없습니다. 제 생각에는 이것은 컨퍼런스에서 보여줄 수 있는 불필요한 복잡함이지만 실제 코드에서는 전혀 필요하지 않습니다. 컴파일 시간 계산의 사용은 "이제 할 수 있습니다!"라는 이유만으로 정당화되어야 하는 것이 아닙니다.

마지막 두 단락은 이 혁신에 대한 나의 태도에 대해 잘못된 생각을 줄 수 있습니다. 나는 그것에 반대하는 것이 아니라 현미경으로 못을 박는 것에 반대하는 것뿐입니다. 그게 전부입니다. 후자의 예는 CppCon 비디오에서 명확하게 볼 수 있지만 constexpr 람다의 등장은 확실히 좋은 소식입니다. 왜냐하면 람다는 기능적으로 일반 함수와 어떤 식으로든 다르지 않아야 하기 때문입니다. 그들은 모두 동일한 기능을 가져야 하며, 만약 내 기억은 변하지 않습니다. 추가해야 할 것은 람다에 대한 명명된 템플릿 매개 변수뿐입니다. 우리는 C++20에서 그것들을 기다리고 있나요?

이해할 수 없는 상황에서는 진정하고, 누워서, 포옹하고, 가서 맛있는 음식을 먹으십시오. 신경 조심하세요 :)

실수는 과거에 남겨두세요.

진짜를 감사하십시오.

미래를 향해 웃으세요

당신을 괴롭히는 상황을 놓으면 그 상황도 즉시 당신을 놓아줄 것입니다.




놀라지 마세요. 귀하가 부재 중일 때 어떤 일이 일어날 수 있는지는 알려져 있지 않습니다.

나무로 오세요. 그것이 당신에게 평화를 가르쳐주기를 바랍니다.

당신의 마음의 평화의 비결은 무엇입니까?

“불가피한 일을 완전히 받아들이면서” 스승님이 대답하셨습니다.

생각을 정리하면 다른 눈으로 세상을 보게 될 것입니다.

마음을 깨끗이 하는 것을 잊지 마세요.

휴식이란 무엇입니까?

불필요한 생각은 하지 마세요.

그리고 불필요한 생각은 무엇입니까?

(웨이더한)

당신의 가장 중요한 보물은 당신의 영혼의 평화입니다.

카모마일은 진정 효과가 있습니다.

기분을 관리하십시오. 순종하지 않으면 명령을 내리기 때문입니다.


덧없는 삶의 과정을 침착하게 바라 보는 관찰자가 되어야만 평화를 찾을 수 있습니다. 어빈 얄롬



평온함은 감정보다 강합니다.

침묵은 비명보다 더 크다.

그리고 무슨 일이 일어나더라도 마음에 두지 마십시오. 세상의 작은 것은 오랫동안 중요합니다.

에리히 마리아 레마르크 "개선문" ---

비를 맞을 때 이것으로부터 유용한 교훈을 배울 수 있습니다. 예기치 않게 비가 내리기 시작하면 젖는 것이 싫어서 길을 따라 집으로 달려갑니다. 그러나 집에 도착하면 여전히 젖어 있다는 것을 알게 됩니다. 처음부터 속도를 높이지 않기로 결정하면 젖게 되겠지만 소란스럽지는 않을 것입니다. 다른 유사한 상황에서도 마찬가지입니다.

야마모토 츠네토모 - 하가쿠레. 사무라이 책



내일은 그래야 할 모습이 될 것이다

그러면 안되는 일은 없을 것입니다.

소란 피우지 마세요.

우리 안에 평화가 없다면 밖에서 그것을 찾는 것은 쓸모가 없습니다.

걱정 없이-
인생을 즐깁니다.
얻는 것은 행복하지 않다
패배는 슬퍼하지 않는다. 왜냐하면 그는 알고 있기 때문이다.
그 운명은 영원하지 않습니다.
우리가 사물에 얽매이지 않을 때
평온함은 완전히 알려져 있습니다.
몸이 긴장을 풀지 못하면
닳아 없어져요.
심령이 늘 근심하면
그는 사라진다.

장자 ---

개에게 막대기를 던지면 개는 이 막대기를 쳐다볼 것입니다. 그리고 사자에게 막대기를 던지면 사자는 고개를 들지 않고 던지는 사람을 쳐다볼 것입니다. 이것은 대담자가 말에 집착하기 시작하고 중요한 것을 보지 않았을 때 고대 중국의 분쟁 중에 말한 공식적인 문구입니다.

숨을 들이마시면 몸과 마음이 안정됩니다.
숨을 내쉴 때 나는 미소를 지었다.
지금 이 순간에 있기 때문에 나는 이 순간이 놀랍다는 것을 압니다!

심호흡을 하고 자신을 틀 속으로 몰아넣지 마십시오.

힘은 자신의 힘을 믿는 사람의 것입니다.

자기 관찰을 통해 정신-감정 상태를 모니터링하는 습관을 기릅니다. 정기적으로 스스로에게 "나는 지금 차분한가?"라고 자문해 보는 것이 좋습니다. 정기적으로 스스로에게 물어보는 것이 유용한 질문입니다. "지금 내 안에서 무슨 일이 벌어지고 있는 걸까?"라고 질문할 수도 있습니다.

에크하르트 톨레

자유는 걱정으로부터의 자유입니다. 당신이 결과에 영향을 미칠 수 없다는 것을 깨닫고 당신의 욕망과 두려움에 주의를 기울이지 마십시오. 그들이 왔다가 가도록 놔두세요. 관심과 주의를 기울여 먹이지 마십시오. 실제로 모든 일은 당신이 아니라 당신과 함께 이루어집니다.

니사르가다타 마하라즈


사람이 더 차분하고 균형이 잡힐수록 그의 잠재력은 더 강력해지고 선하고 가치 있는 행동에서 더 큰 성공을 거둘 수 있습니다. 마음의 평정은 지혜의 가장 큰 보물 중 하나입니다.


모든 지혜의 기초는 평온함과 인내입니다.

걱정을 멈추세요. 그러면 멋진 패턴을 보실 수 있습니다...

마음이 쉼에 이르면 달빛과 바람의 숨결을 감상하기 시작하고 세상적인 소란이 필요 없음을 깨닫게 됩니다.

당신의 영혼에 평화를 찾으십시오. 그러면 당신 주변의 수천 명이 구원을 받을 것입니다.

당신이 정말로 원하는 것은 평화와 사랑입니다. 당신은 그들에게서 나왔고 그들에게로 돌아갈 것이며 당신은 그들입니다. 파파지


가장 아름답고 건강한 사람은 어떤 일에도 짜증을 내지 않는 사람이다.


인간 지혜의 최고 수준은 외부 폭풍에도 불구하고 침착함을 유지하는 능력입니다.



당신은 경험에 얽매이지 않고, 그것에 집착함으로써 얽매이게 됩니다.

성급한 결정을 내리지 마십시오. 모든 장단점을 평가해 보세요. 거의 모든 사람에게는 두 번째 "나"인 천상의 안내자가 있습니다. 그것에 대해 생각하고 그에게 물어보십시오. 당신이 계획한 일을 할 가치가 있는지 없는지?! 관찰하는 법, 보이지 않는 것을 보는 법, 상황을 예측하는 법을 배우십시오.

산림과 돌 위를 흐르는 시냇물을 바라보면 세상의 더러움으로 흐려진 마음이 점차 맑아집니다. 고대 대경을 읽고 고대 거장의 그림을 보면 세속적인 저속한 정신이 조금씩 사라져갑니다. 홍자성, 뿌리의 맛.


지혜는 침착함과 함께 온다. 그냥 보고 들어보세요. 다른 것은 필요하지 않습니다. 당신이 평화롭게 보고 듣기만 하면 당신 안에 있는 개념 없는 지성이 활성화됩니다. 평화가 당신의 말과 행동을 인도하게 하십시오.

에크하르트 톨레


내면에서 평화를 이루기 전까지는 외부 세계의 평화를 결코 이룰 수 없습니다.

균형의 본질은 집착하지 않는 것입니다.

휴식의 본질은 참지 않는 것입니다.

자연스러움의 본질은 노력하는 것이 아니다.

시기하지 않고 누구에게도 해를 끼치고 싶지 않은 사람은 균형을 이룬 사람입니다. 그에게는 온 세상이 행복으로 가득 차 있습니다.

인생이 다시 피어나고 신나는 기쁨과 행복으로 가득 차려면 멈춰야합니다 ... 멈추고 즐거움에 녹아들도록 허용하십시오 ...

미래에 대해 걱정하지 마십시오. 지금 평화롭게 지내십시오. 그러면 모든 것이 제자리로 돌아갈 것입니다.

물을 휘젓지 않으면 저절로 가라앉습니다. 거울이 더럽지 않으면 스스로 빛을 반사합니다. 인간의 마음은 의지로 순수해질 수 없습니다. 그것을 오염시키는 것을 제거하면 그 순수함이 드러날 것입니다. 기쁨은 자신 밖에서 찾을 수 없습니다. 당신에게 불안을 주는 것을 제거하면 기쁨이 저절로 당신의 영혼을 지배할 것입니다.


가끔은 그냥 내버려두세요...

허리케인의 중심에는 항상 조용합니다. 회오리바람이 몰아쳐도 중앙의 조용한 곳이 되십시오.

당신은 하늘입니다. 다른 모든 것은 단지 날씨일 뿐입니다.

잔잔한 물에서만 사물이 왜곡되지 않고 반사됩니다.

오직 고요한 의식만이 세상을 인식하는 데 적합합니다.

무엇을 해야할지 모를 때는 잠시 기다리십시오. 조용히 하세요. 당신이 사는 방식대로 살아라. 조만간 표시가 나타날 것입니다. 가장 중요한 것은 당신이 기다리고 있다는 것을 알고 당신이 기다리고 있는 것을 만날 준비를 하는 것입니다. 루이스 리베라

미래에 대해 걱정하지 마십시오. 지금 평화롭게 지내십시오. 그러면 모든 것이 제자리로 돌아갈 것입니다.


평온함은 적의 힘을 앗아갑니다. 평온함 속에는 두려움도 과도한 분노도 없습니다. 감정적 폭발로 인한 왜곡과 간섭이 제거된 현실만이 있을 뿐입니다. 당신이 침착할 때, 당신은 정말로 강한 사람입니다.

따라서 상대방은 항상 당신을 이 상태에서 벗어나게 하기 위해 최선을 다할 것입니다. 즉, 두려움을 불러일으키고, 의심을 심고, 분노를 불러일으키기 위해 노력할 것입니다. 내부 상태는 호흡과 직접적인 관련이 있습니다. 어떤 상황에 처해 있든 즉시 숨을 진정시키십시오. 다음에는 정신이 진정될 것입니다.


영적 생활에서 가장 중요한 것은 마음을 평안하게 유지하는 것입니다.

생명을 믿어야 합니다.
삶은 우리보다 무한히 현명하기 때문에 두려움 없이 현재에 자신을 맡기는 것이 필요합니다.
그녀는 여전히 당신을 자신만의 방식으로 대하고 때로는 매우 가혹하게 대합니다.
하지만 결국 당신은 그녀가 옳았다는 것을 깨닫게 될 것입니다.

이제 평화롭게 지내십시오. 그러면 모든 것이 제자리로 돌아갈 것입니다.

당신의 영이 동요되어서는 안 되며, 당신의 입술에서 악한 말이 나오지도 말아야 합니다. 당신은 은밀한 악의가 없이 사랑으로 가득 찬 마음으로 자비로운 태도를 유지해야 합니다. 그리고 심지어 악한 소원을 품은 사람들도 사랑의 생각, 관대하고 깊고 무한하며 모든 분노와 증오가 제거된 생각으로 감싸야 합니다. 나의 제자들이여, 여러분은 그렇게 행동해야 합니다.

잔잔한 물만이 하늘을 정확하게 반영합니다.

의식 수준을 가장 잘 나타내는 지표는 삶의 어려움에 침착하게 대처하는 능력입니다.

그들은 무의식적인 사람을 끌어내리는 반면, 의식적인 사람은 점점 더 위로 올라갑니다.

에크하르트 톨레.


조용히 앉아 있으면 매일의 걱정이 얼마나 헛된 것인지 깨닫게 될 것입니다. 조금만 닥치면 일상적인 말이 얼마나 공허한지 이해하게 될 것입니다. 일상적인 문제를 포기하면 사람들이 얼마나 많은 에너지를 낭비하는지 이해하게 될 것입니다. 첸 지주.


평온함은 우리가 가장 어려운 상황에서 벗어날 수 있는 길을 찾는 데 도움이 됩니다.

인내심이 부족했나요?... ​​다시 부풀려보세요!)

3초 동안 조용히

모든 것을 이해하려면 3초 동안 침착하게 생각하는 것만으로도 충분합니다.

그게 바로 그것들을 얻을 수 있는 곳입니다. 정말 조용한 3초인가요? 우리는 우리 자신의 환상에 너무 흥분해서 잠시도 멈출 수 없습니다.


스트레스에 빠진 떡갈나무, 우울한 기분에 빠진 돌고래, 자존감이 낮아진 개구리, 긴장을 풀지 못하는 고양이, 원망에 가득 찬 새를 본 적이 있나요? 그들에게서 현재를 참는 능력을 배우십시오.
에크하르트 톨레

천천히하세요. 각 새싹은 고유한 시간에 열립니다. 새싹이 꽃이 되도록 강요하지 마세요. 꽃잎을 구부리지 마십시오. 그들은 온화합니다. 당신은 그들에게 상처를 입혔습니다. 기다리면 스스로 열릴 것입니다. 스리 스리 라비 샹카르

하늘에 있는 수염난 사람이나 책에 나오는 우상에게 절하지 말라. 들숨과 날숨, 얼굴을 스치는 겨울 바람, 지하철의 아침 군중, 무슨 일이 일어날지 전혀 알지 못하는 살아 있는 느낌을 숭배하세요.낯선 사람의 눈에서 하나님을 바라보고, 망가지고 평범한 사람들 속에서 섭리를 보십시오. 당신이 서 있는 땅을 예배하십시오. 매일매일 춤을 추고, 눈에 눈물을 흘리며, 매 순간 신성을 묵상하고, 모든 상대적인 것의 절대성을 알아차리고, 사람들이 당신을 미쳤다고 부르게 하십시오. 웃고 농담하게 해주세요.

제프 포스터

더 높은 힘은 남을 이기는 능력이 아니라, 남과 하나가 되는 능력이다.

스리 친모이

최소한 작은 방법으로 마음을 가져오지 않도록 노력하십시오.
세상을 보세요 - 그냥 보세요.
"좋아요" 또는 "싫어요"라고 말하지 마세요. 아무 말도 하지 마세요.
말은 하지 말고 그냥 보세요.
마음이 불편할 것입니다.
내 마음은 뭔가를 말하고 싶습니다.
당신은 마음에 이렇게 말합니다.
"조용히 해라, 나 좀 지켜볼게"…

Chen Jiru의 6가지 현명한 조언

1. 조용히 앉아 있으면 일상의 걱정이 얼마나 헛된 것인지 깨닫게 될 것입니다.
2. 조금만 닥치면 일상의 말이 얼마나 공허한지 이해하게 될 것입니다.
3. 일상적인 문제를 포기하면 사람들이 얼마나 많은 에너지를 낭비하는지 이해하게 될 것입니다.
4. 문을 닫아라. 그러면 친분의 유대가 얼마나 부담스러운지 알게 될 것이다.
5. 욕망을 적게 가져라. 그러면 인류의 질병이 왜 그토록 많은지 이해하게 될 것이다.
6. 좀 더 인간적으로 행동하면 평범한 사람들이 얼마나 영혼이 없는지 이해하게 될 것입니다.

생각으로부터 마음을 자유롭게 하십시오.
마음을 진정시키세요.
세상의 혼란을 침착하게 따라가세요
모든 것이 제자리로 돌아가는 것을 지켜보세요...

행복한 사람은 알아보기가 매우 쉽습니다. 그는 평온함과 따뜻함의 기운을 발산하는 것 같고 천천히 움직이지만 모든 일을 처리하고 침착하게 말하지만 모두가 그를 이해합니다. 행복한 사람들의 비결은 간단합니다. 긴장이 없다는 것입니다.

당신이 히말라야 어딘가에 앉아 있고 침묵이 당신을 둘러싸고 있다면 그것은 당신의 것이 아니라 히말라야의 침묵입니다. 당신은 그 안에서 당신만의 히말라야를 찾아야 합니다.

생각의 상처는 다른 상처보다 치유하는 데 더 오랜 시간이 걸립니다.

JK 롤링, '해리포터와 불사조 기사단'

지혜는 침착함과 함께 온다.그냥 보고 들어보세요. 다른 것은 필요하지 않습니다. 당신이 평화롭게 보고 듣기만 하면 당신 안에 있는 개념 없는 지성이 활성화됩니다. 평화가 당신의 말과 행동을 인도하게 하십시오.

에크하르트 톨레 <침묵이 말하는 것>

사람이 더 차분하고 균형이 잡힐수록 그의 잠재력은 더 강력해지고 선하고 가치 있는 행동에서 더 큰 성공을 거둘 수 있습니다. 마음의 평정은 지혜의 가장 큰 보물 중 하나입니다.

제임스 앨런

자신과 조화롭게 살면 다른 사람들과도 잘 지낼 수 있습니다.

동양의 지혜 -

당신은 앉아 있고 스스로 앉아 있습니다. 당신은 가십시오 – 그리고 스스로 가십시오.
가장 중요한 것은 - 헛된 소란을 피우지 마십시오.

당신을 괴롭히는 일에 대한 태도를 바꾸면 그 일로부터 안전해질 것입니다. (마르쿠스 아우렐리우스)

태양 신경총에주의를 기울이십시오. 작은 태양 공이 당신 안에서 빛을 발한다고 상상해보십시오. 그것이 타오르게 하고, 더 커지고 더 강해지도록 하세요. 그 광선이 당신을 비추게 하십시오. 태양이 광선으로 몸 전체를 포화시키도록 하십시오.

조화는 모든 것의 균일함입니다. 소란을 피우고 싶다면 10까지 세고 태양을 "시작"하십시오.

진정하세요, 그냥 진정하세요 :)

당신을 둘러싼 것만큼이나 당신 안에서 일어나는 일에도 관심을 가지십시오. 내면 세계에서 모든 것이 순조롭게 진행된다면, 외부 세계에서도 모든 것이 제자리를 찾을 것입니다.

에크하르트 톨레 ---

바보와 무지한 사람에게는 다섯 가지 징후가 있습니다.
이유 없이 화가 난다
불필요하게 말하다
이유 없이 바뀌다
자신과 전혀 상관없는 일에 간섭하다
누가 선을 바라는지, 누가 악을 원하는지 구별하는 방법을 모릅니다.

인도 속담 ---

무슨 일이 있어도 놔두세요.
무엇이 오든 그대로 두십시오.
당신은 당신 자신 외에는 아무것도 갖고 있지 않으며, 가져본 적도 없습니다.

기억과 기대로 오염되지 않은 내면의 침묵을 유지할 수 있다면 사건의 아름다운 패턴을 볼 수 있습니다. 혼란을 일으키는 것은 바로 당신의 불안입니다.

니사르가다타 마하라즈 ---

행복으로 가는 유일한 길은 우리의 의지를 넘어서는 일에 대해 걱정하지 않는 것입니다.

에픽테토스 ---

자기 중요성을 잃으면 우리는 무적 상태가 됩니다.

강해지려면 물과 같아야 합니다. 장애물이 없습니다. 흐르고 있습니다. 댐 - 멈출 것이다. 댐이 무너지면 다시 흐를 것입니다. 사각형 용기에서는 사각형입니다. 라운드에서 - 그것은 둥글다. 이는 매우 규정을 준수하기 때문에 가장 필요하고 가장 강력합니다.

세상은 우리가 항상 기다리고 있다가 서두르는 기차역과 같습니다.

당신의 마음과 감각이 심장의 박동에 맞춰 느려지면 당신은 자연스럽게 우주의 리듬과 조화를 이루게 됩니다. 당신은 신성한 눈으로 세상을 인식하기 시작하고 모든 것이 그 자체로 그리고 그 시간에 어떻게 일어나는지 지켜봅니다. 모든 것이 이미 우주의 법칙에 맞춰져 있음을 발견하면 당신은 세상과 세상의 주님과 다르지 않다는 것을 이해하게 됩니다. 이것이 바로 자유입니다. 무지

우리는 너무 많은 고통을 받습니다. 우리는 그것을 너무 심각하게 받아들입니다. 모든 것이 더 쉬워져야 합니다. 그러나 현명하게. 신경이 없습니다. 가장 중요한 것은 생각하는 것입니다. 그리고 어리석은 짓은 하지 마세요.

당신이 침착하게 받아들일 수 있는 것이 더 이상 당신을 통제하지 못합니다...

스스로 평화를 찾지 못한 사람은 어디에서도 평화를 찾을 수 없습니다.

화를 내고 짜증을 내는 것은 다른 사람의 어리석음에 대해 자신을 처벌하는 것에 지나지 않습니다.

당신은 하늘입니다. 그리고 구름은 일어나고, 오고 가는 것입니다.

에크하르트 톨레

평화 속에 살다. 봄이 오면 꽃이 저절로 피어납니다.


사람이 차분해 보일수록 다른 사람들이 그 사람과 모순되고 논쟁하는 빈도가 줄어드는 것으로 알려져 있습니다. 반대로 어떤 사람이 자신의 관점을 격렬하게 옹호하면 그는 논쟁을 벌이고 격렬하게 저항합니다.

서두르지 마. 밥 먹을 시간에 먹으라 그리하면 여행할 시간이 오리라- 길을 가세요.

파울로 코엘료 <연금술사>

양보한다는 것은 있는 그대로를 받아들이는 것을 의미합니다. 그래서 당신은 삶에 열려 있습니다. 저항은 내부 클램프... . 그래서 당신은 완전히 닫혔습니다. 내부 저항(부정성이라고도 함) 상태에서 무엇을 하든 외부 저항은 더욱 커질 것이며 우주는 당신 편이 아닐 것이며 삶은 당신을 돕지 않을 것입니다. 빛은 닫힌 셔터를 통해 들어올 수 없습니다. 내면적으로 굴복하고 싸움을 멈추면 의식의 새로운 차원이 열립니다. 행동이 가능하다면... 그것은 이루어질 것입니다... 창조적인 마음의 지원을 받으며... 내면의 열린 상태에서 당신은 하나가 됩니다. 그러면 상황과 사람들이 당신을 돕기 시작하고 당신과 하나가 됩니다. 행복한 우연이 있습니다. 모든 것이 당신에게 유리합니다. 행동이 불가능하다면, 당신은 싸우지 않음으로써 오는 평화와 내면의 평화 속에 있습니다.

에크하르트 톨레 뉴 어스

"진정하세요" 메시지 어떤 이유로 든 항상 더 짜증납니다.또 다른 역설.보통 그런 전화 후에아무도 진정할 생각을 하지 않습니다.

베르나르 베르베르 카산드라의 거울

자신을 낮추어 적을 물리치신 분입니다.

아토스의 실루안

평온함은 하나님을 자기 안에 두는 사람입니다.


당신이 바보와 논쟁을 벌이면 그도 같은 일을 하고 있을 가능성이 크다.

사람의 진정한 힘은 충동이 아니라 파괴할 수 없는 평온함에 있습니다.

인간 지혜의 최고 수준은 상황에 적응하고 외부 폭풍에도 불구하고 침착함을 유지하는 능력입니다.

방해하는 감정과 생각은 주의를 기울이지 않으면 사라질 것입니다. 라마 올레 니달

당신은 침묵을 지킨 것을 결코 후회하지 않을 것입니다.
--- 동양의 지혜 ---

모든 사건이 중립적으로 인식되는 의식 상태를 위해 노력할 가치가 있습니다.

평온함과 질서, 일반적인 마음의 평화 - 이것은 모든 사람이 원하는 상태입니다. 우리의 삶은 기본적으로 부정적인 감정에서 행복감으로, 그 반대의 경우처럼 그네처럼지나갑니다.

세상이 긍정적이고 차분하게 인식되고 짜증나거나 두렵지 않고 현재 순간이 영감과 기쁨을 가져올 수 있도록 균형점을 찾고 유지하는 방법은 무엇입니까? 그리고 장기적인 마음의 평화를 찾는 것이 가능합니까? 예, 가능합니다! 더욱이, 평화와 함께 진정한 자유와 단순한 삶의 행복이 옵니다.

이것은 간단한 규칙이며 종교적으로 작용합니다. 변화하는 방법에 대한 생각을 멈추고 적용을 시작하면 됩니다.

1. "왜 나한테 이런 일이 일어났지?"라고 묻지 마세요. 스스로에게 또 다른 질문을 해보세요. “무슨 놀라운 일이 일어났나요? 이것이 나에게 무슨 소용이 있겠습니까?” 좋은 점은 거기에 있습니다. 당신은 그것을 보기만 하면 됩니다. 어떤 문제라도 처벌이나 불의가 아닌 기회로 생각한다면 위로부터 오는 진정한 선물이 될 수 있습니다.

2. 감사를 실천하세요. 매일 저녁 요약하자면, 당신이 살아온 하루에 대해 "고마워요"라고 말할 수 있는 것입니다. 마음의 평화를 잃었다면 당신이 가진 좋은 것들과 인생에서 감사할 수 있는 것들을 기억하십시오.

3. 신체 운동으로 몸에 힘을 실어주세요. 신체 훈련 중에 뇌는 "행복의 호르몬"(엔돌핀과 엔케팔린)을 가장 적극적으로 생성한다는 점을 기억하십시오. 그러므로 문제, 불안, 불면증에 시달린다면 밖으로 나가서 몇 시간 동안 걸어가십시오. 빠른 발걸음이나 달리기는 슬픈 생각에서 벗어나 뇌를 산소로 포화시키고 긍정적인 호르몬 수치를 높입니다.

4. "명랑한 자세"를 개발하고 자신을 위해 행복한 자세를 만드십시오. 마음의 평화를 회복해야 할 때 신체는 놀라운 도움을 줄 수 있습니다. 허리를 곧게 펴고, 어깨를 펴고, 행복하게 스트레칭을 하고 웃기만 하면 기쁨의 느낌을 '기억'할 것입니다. 의식적으로 잠시 동안 이 자세를 유지하면 머릿속의 생각이 더 차분해지고, 더 자신감 있고, 행복해지는 것을 보게 될 것입니다.

5. 지금 여기로 돌아오세요. 간단한 운동은 불안을 없애는 데 도움이 됩니다. 주변을 둘러보고, 보이는 것에 집중하세요. "지금"과 "여기"에 가능한 한 많은 단어를 삽입하여 정신적으로 그림의 "음성"을 시작하십시오. 예를 들면 다음과 같습니다. “나는 지금 길을 걷고 있는데 여기는 태양이 빛나고 있습니다. 지금 보니 남자가 노란 꽃을 들고 있더군요… 인생은 오직 "지금"의 순간들로만 이루어져 있다는 사실을 잊지 마세요.

6. 문제를 과장하지 마십시오. 결국 파리를 눈 가까이로 가져가도 코끼리만큼 커질 것입니다! 어떤 경험이 극복할 수 없는 것처럼 보인다면 이미 10년이 지났다고 생각하십시오. 이전에는 얼마나 많은 문제가 있었습니까? 모두 해결했습니다. 그러므로 이 문제도 지나갈 것입니다. 머리로 뛰어 들지 마십시오!

7. 더 많이 웃으세요. 현재 상황에서 재미있는 것을 찾아보십시오. 작동하지 않습니다. 그러면 진심으로 웃을 이유를 찾으십시오. 재미있는 영화를 보고, 재미있는 사건을 기억하세요. 웃음의 힘은 대단해요! 유머를 많이 사용하면 마음의 평화가 찾아오는 경우가 많습니다.

8. 더 많이 용서하세요. 원한은 당신이 가지고 다니는 무겁고 냄새나는 돌과 같습니다. 그런 부담을 안고서 무슨 마음의 평화가 있을 수 있겠습니까? 그러므로 악을 품지 말라. 사람은 사람일 뿐이고 완벽할 수 없으며 항상 좋은 것만 가져옵니다. 그러므로 가해자를 용서하고 자신을 용서하십시오.

10. 더 많이 소통하세요. 내면에 숨겨진 고통은 배가되어 새로운 슬픈 열매를 맺게 됩니다. 그러므로 경험을 공유하고, 사랑하는 사람들과 토론하고, 그들의 지원을 구하십시오. 인간은 혼자가 아니라는 것을 기억하십시오. 마음의 평화는 우정, 사랑, 가족 등 가까운 관계에서만 찾을 수 있습니다.

11. 기도하고 묵상하십시오. 나쁜 생각이 당신을 통제하도록 두지 말고 공황, 고통, 짜증을 뿌리십시오. 짧은 기도(하나님께 호소하는 기도)나 묵상(생각이 없는 상태)으로 바꾸십시오. 내부 대화의 무질서한 흐름을 중지하십시오. 이것이 좋고 안정된 마음 상태의 기초입니다.