1. 코루틴 개념

  • 모든 코루틴은 CouroutineScope 안에서 돌아감
  • 코루틴의 핵심은 suspend
    • 함수의 동작을 일시중단이 가능
  • 코루틴 내에서 thread는 놀지않게함. 처리되는 쓰레드가 일시중단 될경우 다른 것들을 처리함

1.1 Builder

  • 코루틴 함수들을 시작하는 지점이라고 보는 것이 옳음.
  • 즉, 코루틴 함수 스택이 시작되는 지점.

1.1.1 launch

//구현부분
public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {
    val newContext = newCoroutineContext(context)
    val coroutine = if (start.isLazy)
        LazyStandaloneCoroutine(newContext, block) else
        StandaloneCoroutine(newContext, active = true)
    coroutine.start(start, coroutine, block)
    return coroutine
}
  • 독립적으로 실행되는 새로운 coroutineScope를 생성
  • Thread를 생성하는 것과 비슷함.
    • 즉, 코루틴을 실행한 thread를 멈추지 않음.
fun main()
{
  GlobalScope.launch {
      delay(1000L)
      println("aa")
  }
}

//위와 같이 할 경우 "aa"는 실행되지 않음. 왜냐면 프로그램이 끝나버리니까.
  • CoroutineScope의 확장함수
CoroutineScope.launch()

1.1.2 runBlocking

  • 코루틴을 실행한 thread를 중단(blocking) 시킴
    • 새로운 코루틴을 시작후 완료될 때까지 현재 스레드를 중단 가능한 상태로 블로킹
    • dispatcher를 쓰면 다른 스레드에서 실행시킬수 있지만, 어쨌든 해당 스레드는 블로킹됨
  • 프로그램이 끝나지 않도록 하는 목적으로만 쓰임(현재는 suspend와 runTest를 사용함…)
    • Main함수 → suspend
    • Unit test 함수 → runTest

<aside> 💡 runBlocking은 다른 코루틴의 자식이 될 수 없음.

</aside>

1.1.3 async

  • launch와 동일하지만 값을 반환함.
  • CoroutineScope의 확장함수
CoroutineScope.async()

1.2 CouroutineScope

  • runBlocking과 같이 중단시킴
    • 아직은 잘 모르겠으나 runBlocking보다 좋다고 함
    • runBLocking은 실행한 현재 thead를 block 시키지만 얘는 어쨌든 코루틴의 블럭을 써서 메인 스레드를 중지시키지 않는 느낌
suspend fun main(): Unit = coroutineScope {
  launch {
    delpy(1000L)
    println("world")
  }
  println("hello")
}

1.3 CoroutineContext

  • 코루틴의 데이터를 저장하고 전달하는 객체
    • 컬렉션으로 처리됨
    • data object
  • 코루틴의 부모자식 관게를 Context를 상속받는것임
  • Job, CorutineName, CoroutineDispatcher와 같은 객체들의 모음임

1.3.1 컨텍스트 합치기

    • 연산자를 지원하며 같은 내용은 덮어쓰기, 다른 내용은 추가됨
data class CoroutineName(
    val name: String
) : AbstractCoroutineContextElement(CoroutineName)
{
    override fun toString(): String = "CoroutineName($name)"

    companion object Key : CoroutineContext.Key<CoroutineName>
}

fun main() {
    val ctx1: CoroutineContext = CoroutineName("Name1")
    println(ctx1[CoroutineName]?.name)

    val ctx2: CoroutineContext = CoroutineName("Name2")
    println(ctx2[CoroutineName]?.name)

    val ctx3 = ctx1 + ctx2
    println(ctx3[CoroutineName]?.name)
}

1.4 Job

  • CoroutineContext에 포함된 인터페이스로써 state를 가짐
  • 수명을 가지고 있으며 취소가능
  • 모든 코루틴은 자신만의 job을 가지고 있으며, CoroutineContext에서 상속되지 않는 유일한 값임
  • 기본적으로 active한 상태에서 시작하지만 옵셔널하게 lazy 시작을 위해 new 상태로 시작할 수 있음
  • active 상태에서 job이 실행되고 코루틴은 Job을 실행할 수 있음

구분 내용

new 시작 가능한 상태
active JOB을 실행할 수 있는 상태
completing 잡을 완료하고 자식들을 기다리는 상태
completed 자식들도 완료된 상태
cancelling 에러 후처리 상태
canceled 에러 후처리 완료

1.4.1 Job Factory 함수

  • 아래와 같이 Job을 코루틴 없이 생성후 할당할 수 있음
  • 팩토리함수로 만들경우 자식들이 완료되도 completed 상태로 가지않고 active상태로 존재
    • 계속 다른 코루틴에서 사용될 수 있기 때문에
  • 따라서 아래와 같이 해줘야 됨
suspend fun main(): Unit = coroutineScope {
    val job = Job()
    launch(job) {
        delay(1000)
        println("Text 1")
    }
    launch(job) {
        delay(1000)
        println("Text 2")
    }

    job.children.forEach { it.join() }
}

1.4.2 Job의 취소

  • 취소될경우 cancelling 상태로 변경되고 exception이 떨어짐
  • 그래서 try catch로 잡기보단 finally로 후처리 되어야 할것들을 처리해주는게 좋음
suspend fun main(): Unit = coroutineScope {
    val job = Job()
    launch(job) {
        try {
            delay(1000)
            println("Text 1")
        }
        finally {
            println("finally")

            launch {
                println("will not be print")
            }

            withContext(NonCancellable) {
                println("will be print")
            }
        }
    }

    job.cancelAndJoin()
    println("done")
}
  • 취소된 context 내에서는 코루틴을 추가로 실행될 수 없음… 단 withContext를 통해 처리가능

1.4.3 invokeOnCompletion

  • completed 또는 canceled 되기전에 실행되어야 할 내용을 정의
job.invokeOnCompletion { cause: Throwable? ->
        println("job completed with $cause")
    }

1.5 예외처리

  • 기본적으로 모든 예외는 부모-자식간으로 다 전파됨.
  • 중단점이 없을경우 모든 코루틴에 에러가 전파되어 모든 코루틴이 취소됨.

1.5.1 supervisorJob()

  • 기본적으로 자식에서 발생하는 예외를 무시시킴
suspend fun main(): Unit = runBlocking {

    launch(SupervisorJob()) {
        try {
            delay(1000)
            println("Text 1")

            throw Exception("Exception 1")
        }
        finally {
            println("finally")

            launch {
                println("will not be print")
            }
        }
    }

    launch(SupervisorJob()) {
        delay(1000)
        println("Text 2")
    }
    println("done")
}

//done
//Text 2
  • supervisorJob은 단 하나의 자식만 가짐
    • 따라서 아래와 같이 쓸경우 exception이 전파됨
suspend fun main(): Unit = runBlocking {

    launch(SupervisorJob()) {
        launch {
            delay(1000)
            throw Exception("exception")
        }

        launch() {
            delay(2000)
            println("출력 안됨")
        }
    }
    delay(3000)
    println("done")
}
// Exception.....
//done
  • 코루틴 내에서 try - catch는 Exception을 핸들링 할 수 없음

(2) Flow

  • stream 처리와 비슷
  • 생성자 → 중간 → 소비자(collect)
  • 중간
    • filter
    • map
fun main(): Unit = runBlocking(Dispatchers.Default) {
    flow { // producer
        repeat(times = 3) { data ->
            delay(300L)
            emit(data)
            println("produced $data")
        }
    }.collect { data -> // consumer
        delay(700L)
        println("consumed $data")
    }
}

(3) channel

val channel = lifecycleScope.produce<Int>{
	repeat(5){
		channel.send(20 + it)
	}
}

lifecycleScope.launch {
	for(temperature in channel) {
		Log.d("TEST", "$temperature")
	}
}

vs Flow

val flow: Flow<Int> = flow {
	repeat(5){
		emit(20 + it)
	}
}

lifecycleScope.launch {
	flow.collect { temperature ->
		Log.d("TEST", "$temperature")
	}
}

→ Chanel은 수신하기도 전에 보내기 시작. hot

→ Flow는 수신쪽에서 collect를 호출해야 보내기 시작. cold

(4) dispatcher

  • 실제 thread에 코루틴을 실행시키는 것
    • thread pool 같은 느낌이 없지는 않음.
  • 각 플랫폼에 따라 정해진 값이 있음
    • android에 경우 main, io, default 등
    • 커스텀한 이름을 지정할 수 있음

(5) 에러처리

  • 전파
    • 자동으로 에러를 전파함.
    • launch, actor
  • 노출
    • await()를 호출하기 전까지는 전파안됨
    • async, produce

→ 위 두개의 차이로 인해 잘 핸들링 해야함.

→ 코루틴의 에러는 try - catch로 처리되지 않음. → 이미 전파됨.

  • supervisorJon
    • 상위로의 전파를 막음
    suspend fun main() {
        // Child Job #2
        CoroutineScope(Dispatchers.Default + coroutineExceptionHandler).launch {
            // Child Job #5
            launch(SupervisorJob()) {
                delay(300)
                throw Exception("first coroutine Failed")
            }.join()
            // Child Job #6
            launch(SupervisorJob()) {
                delay(400)
                println("second coroutine succeed")
            }.join()
        }.join()
    }
    
    Caught: first coroutine Failed
    second coroutine succeed
    
    Process finished with exit code 0
    
  • supervisorScope
    • 범위를 지정해서 쓸수도 있음
suspend fun main() {
    // Child Job #2
    CoroutineScope(Dispatchers.Default + coroutineExceptionHandler).launch {
        supervisorScope {
            // Child Job #5
            launch {
                delay(300)
                throw Exception("first coroutine Failed")
            }.join()
            // Child Job #6
            launch {
                delay(400)
                println("second coroutine succeed")
            }.join()
        }
    }.join()
}

2. Coroutine in Vertx

(1) CoroutineVerticle()

  • Verticle의 start, stop을 suspend 함수로 시작하게 해줌
    • 또한 내부적으로 coroutine context를 vertx eventloop로 처리될 수 있도록 기본 dispatcher를 처리
    • verticle 이외의 코루틴에 영향이 없도록 supervisorJob으로 error handling 처리함
  • 아래는 코드 일부
abstract class CoroutineVerticle : Verticle, CoroutineScope {

  private lateinit var vertxInstance: Vertx
  private lateinit var context: Context

  override val coroutineContext: CoroutineContext by lazy 
      { context.dispatcher() + SupervisorJob() }

  override fun init(vertx: Vertx, context: Context) {
    this.vertxInstance = vertx
    this.context = context
  }

  override fun getVertx(): Vertx = vertxInstance

  override fun start(startFuture: Promise<Void>?) {
    launch {
      try {
        start()
        startFuture?.complete()
      } catch (t: Throwable) {
        startFuture?.fail(t)
      }
    }
  }

  override fun stop(stopFuture: Promise<Void>?) {
    val job = coroutineContext.job
    launch {
      try {
        stop()
        stopFuture?.complete()
      } catch (t: Throwable) {
        stopFuture?.fail(t)
      } finally {
        job.cancel()
      }
    }
  }
  • vertx에서는 runBlocking을 쓰면 안됨.

대안

  • 기본적으로 coroutineVerticle로 시작하면 모든 function을 suspend로 만들수 있음
  • 그 외에 새로운 블럭을 만들어야 한다면
val result: Future<List<CardInfo>> = vertxFuture {
      service.getCardRecommList(pageNo, pageLimit, cate_grp)
    }

Java 8 (2014년 출시)

Java 8은 매우 중요한 릴리스로, 다음과 같은 주요 기능이 포함되었습니다:

  • 람다 표현식: 함수형 프로그래밍 스타일을 지원하여 코드의 간결함과 가독성을 높입니다.
  • 스트림 API: 컬렉션을 효율적으로 처리하기 위한 스트림 처리 기능을 제공합니다.
  • 디폴트 메서드: 인터페이스에 메서드 구현을 추가할 수 있습니다.
  • java.time 패키지: 날짜와 시간을 다루기 위한 새로운 API를 도입합니다.
  • 메타스페이스: PermGen 공간을 대체하여 메모리 관리를 개선합니다.

Java 11 (2018년 출시)

Java 11은 장기 지원(LTS) 버전으로, 여러 새로운 기능과 변경 사항을 포함하고 있습니다:

  • 새로운 API:
    • HttpClient API: HTTP 요청을 처리하기 위한 표준 API입니다.
    • 파일 읽기/쓰기 메서드: Files.readString(), Files.writeString() 메서드가 추가되었습니다.
  • Local-Variable Syntax for Lambda Parameters: 람다 파라미터에 var를 사용할 수 있습니다.
  • 런타임 및 도구 개선:
    • 일부 Java EE 및 CORBA 모듈이 제거되었습니다.
    • JEP 328: Flight Recorder가 포함되어 애플리케이션 성능 분석을 돕습니다.
  • ZGC (Z Garbage Collector): 저지연 수집을 위한 새로운 가비지 컬렉터입니다.
  • 기타:
    • var 키워드를 사용한 로컬 변수 타입 추론(자바 10에서 도입됨)이 람다 파라미터에서도 사용 가능해짐.
    • 새로운 String 메서드: isBlank(), lines(), strip(), repeat() 등.

Java 17 (2021년 출시)

Java 17은 또 다른 장기 지원(LTS) 버전으로, 여러 개선 사항과 새로운 기능이 추가되었습니다:

  • 새로운 기능 및 API:
    • Sealed Classes: 상속을 제한하여 특정 클래스만 상속할 수 있도록 합니다.
    • Pattern Matching for instanceof: 타입 캐스팅을 더 간편하게 합니다.
    • Record 클래스: 불변 데이터 객체를 쉽게 생성할 수 있는 방법을 제공합니다.
  • 성능 개선:
    • G1 및 ZGC 가비지 컬렉터의 성능이 향상되었습니다.
  • 라이브러리 개선:
    • RandomGenerator 인터페이스 추가 및 Random 클래스 개선.
    • Vector API(Incubator): 벡터 계산을 최적화합니다.
  • 언어 기능:
    • Text Blocks: 여러 줄 문자열 리터럴을 쉽게 작성할 수 있습니다.
    • Switch Expressions: 더 간결한 switch 문법을 제공합니다.
  • 삭제 및 비활성화된 기능:
    • Applet API 제거.
    • Security Manager 비활성화.

Java 21 (2023년 출시)

Java 21은 최신 버전으로, 다음과 같은 주요 변경 사항이 포함됩니다:

  • 새로운 기능:
    • Virtual Threads: 더 많은 동시성을 처리하기 위한 경량 스레드.
    • Structured Concurrency: 스레드 작업을 구조적으로 관리하는 새로운 API.
  • 언어 기능:
    • Pattern Matching for switch: 더 간결하고 강력한 switch 문법.
    • Record Patterns: 레코드 타입의 패턴 매칭을 지원.
  • 성능 및 안정성 개선:
    • ZGC의 성능 향상 및 안정성 개선.
    • 새로운 Foreign Function & Memory API(FFM): Java 프로그램에서 외부 메모리와 상호작용하는 새로운 방식.
  • API 및 도구 개선:
    • 더 많은 HTTP/2 및 HTTP/3 지원.
    • 새로운 Vector API 개선 및 표준화.
  • 기타:
    • 여러 개의 incubator 및 preview 기능이 포함되어 더 많은 피드백을 수집하고 있습니다.

"먹고 싶은거로 골라. 나는 짜장면" 부장님 왈,

"저도 짜장이요"

"저도요"

"저도"

 

"오케이 그럼 짜장면 5개"

 

로 대두될수 있는 우리나라 사회의 집단주의적 문화를 꼬집으며 합리적 개인주의자가 많아져야

우리나라 사회가 행복해지고 발전할 수 있다고 얘기한다.

 

예로부터 우리나라 사회에서는 튀는 행동을 금기시하였으며 개인은 사회에 동화되어야 한다는

그러한 다양성이 존중받지 못하는 사회는 많은 부작용을 만들었다.

 

모두가 같은목표를 가지고 있다보니 자연스레 서열화가 될 수 밖에 없고

또한 천부적으로 타고난 '남의 눈치보기' 로 인해 우월감과 열등감이

가득한 사회

 

그런 사회의 병적인 부분을 단적으로 보여주는 몇몇 사례들을 통해 작가는 이야기한다.

 

"집단이 우선시되지 않고 개인이 우선시 되지만, 서로에게 합리적인 개인주의가 만연할때

단일적이지 않은 다양성이 존중받는 사회가 되었을때

우리사회가 더 나은 행복한 사회로의 발전을 할 수 있지 않은가?"

 

 

생각해보기

  • 나는 개인주의자인가요? 집단주의자인가요?

  • 다양성이 존중받지 못하여 목표를 중단할 수 밖에 없었던 사례?

  • 90년대생이 온다라는 것과 연계하여 생각하였을때 90년대생들은 개인주의자들일까요?

1. 개요

REST API를 만들때 API를 컨트롤하는 메인클래스와 실제 서비스를 하는 서비스 클래스를 분리해서 개발할 경우가 있다.

즉, 커맨드패턴을 응용하여 API에서 공통으로 사용하는 로깅이나 인증 등은 메인클래스에서 진행하고

실제 각 요청별로 서비스를 처리하는 것은 각각의 서비스 클래스가 처리하게 되는데...
그럴 경우 런타임에서 어떻게 호출하는지 알아보자!



2. 방법

 - 클라이언트 요청 API명 : apiServiceClass
라고 가정하면 아래와 같이 사용하면 된다.

include_once(/api/apiServiceClass";


$className = "apiServiceClass"


$obj = new $className();



만약, 생성자에 어떤 값을 넣어야 된다면?

include_once(/api/apiServiceClass";


$className = "apiServiceClass"


$obj = new $className("inputParameter");


가로안에 넣어주면 된다!!

'PHP' 카테고리의 다른 글

PHP에서 동시에 2개작업이 안되는 이유 및 해결법  (0) 2018.03.30

1개의 사이트에서 2개의 탭을 열고 동시에 작업수행이 안되는 경우가 있다.


상황)


1) A탭

 - 정산처리 등과 같이 오래 걸리는 작업을 실행.


2) B탭

 - 상품정보나 다른 페이지를 보려고 눌렀을 경우 먹통이 되는 경우.


위와 같은 상황이 생기는데 이것은 PHP의 세션 세이프한 처리 때문이다.


즉, session_start(); 로 시작하는 모든 페이지에서는

한 세션에서는 하나의 작업만 처리 가능하다.


In a nutshell, how session works:

Client side: php is sending back to the client, a cookie with the id of the session. So, the session ends when the server ends to process the script and not when session_write_close() is executed. So, using session_write_close() for fast saving the session in the client side is useless unless you are ob_flush() and flush() to the customer.

Server side: It could be changed but the normal behavior is to save the session information in a file.  For example:

sess_b2dbfc9ddd789d66da84bf57a62e2000  file

**This file is usually locked**, so if two sessions are trying open at the same time, then one is freezed until the file is unlocked. session_write_close() ends the lock.

For example:
<?php
$t1
=microtime(true);
session_start();
sleep(3);
session_write_close();
$t2=microtime(true);
echo 
$t2-$t1;
?>

If we run this code in two processes (using the same session, such as two tabs), then one will return 3 seconds while the other will return 6 seconds.

Its caused because the first process lock the session file.

However, changing to:
<?php
$t1
=microtime(true);
session_start();
session_write_close();
sleep(3);
$t2=microtime(true);
echo 
$t2-$t1;
?>
both files runs at 3 seconds.

For PHP 7.0 and higher, we could use session_start(true); for auto close after the first read.

This operation is highly important for AJAX when we used to do many operations in parallel by using the the same session


 - 출처 : http://php.net/manual/en/function.session-write-close.php


이것을 동시에 병렬처리 하기 위해서는 크리티컬 섹션(뮤텍스) 등을 걸지않고 풀어줘야 한다.


방법은 session_write_close(); 함수를 사용하면

뮤텍스를 해제하게 된다.


저 함수 호출이후 오래 걸리는 작업이나 원하는 작업등을 처리하는 로직을 작성하면 된다.


ex)

<?php

session_start();

session_write_close();


DoLongTimeWorks();


?>


'PHP' 카테고리의 다른 글

PHP에서 변수로 클래스 호출방법  (0) 2018.04.14

아웃사이더 유형 (귀족형)


한국사회에서 가장 피곤하게 사는 타입, 정신적인 스트레스가 많음
살면서 질투가 가장 문제가 된다.
경계성 성격장애, 마조이즘이 될 수 있다.
결핍이 강하다.
사람과 소통되길 원한다. 
4번은 애니어그램 중에서 가장 섬세한 성격
문제가 됐을 땐 감정적이고 예민하게 반응함
부자, 특권층, 선망하는 사람들의 능력을 시기한다. 
자기 능력에 대해 비하하고 책망한다.
항상 자책하고, 자기학대하는 타입

- 지대넓약 요약


자동 대체 텍스트를 사용할 수 없습니다.

에니어그램 4번 유형은 개인주의적인 성향이 많다. 어릴 적부터 혼자 있는 경험이 많은 아이들이 상상을 하면서 자기 세계를 만들어 간다. 식구들이 많은 집안에서 태어났어도 그 아이의 경험에서 사람들과의 접촉이 많지 않을 수도 있었기에. 예를 들면 목사집안에 태어난 아이가 부모들이 새벽기도 가느라고 자는 아이를 두고 나갔는데 아이는 깨어서 혼자 버림받은 것 같이 느껴서 울었던 경험이 많은 아이, 가정 형편 상 어릴 때 외갓집에 맡겨진 아이, 연년생으로 동생이 태어나, 부모의 돌봄이 모자랐던 아이 등이다.

이런 아이는 부모에게 부정적인 감정을 가지게 된다. 그러나 혼자 상상을 하면서 이야기도 만들고, 생각을 계속 하면서 예술성이 자라날 수 있다. 하늘과 맞닿는 촉각이 있어서 직관력이 강하다. 자기를 돌아보며 과거의 경험을 되씹는 경향이 있다. 불건강한 상태로 내려가면 나쁜 추억을 끌어내어 슬퍼하고 아파한다. 실제적으로 몸이 자주 아프다. 4번은 ‘병주머니’인 사람이 많다, 자기의 병이나 고민을 한탄조로 표현 하면서 다른 사람에게 은근히 동정을 요구한다.

4번은 자기애가 강해서 공주병, 왕자 병이 많다. 속으로 자기는 독특하며, 다른 사람과는 다르다는 생각을 늘 하면서 살고 있다

그래서 유행을 잘 타지 않으며 옷 입는 것도 독특하다. 평범한 것을 기피하기 때문에 창작을 하고 예술 작품을 만들어 낸다. 화가, 소설가, 작곡가, 등이 많이 나온다. 사람과의 관계를 맺을 때도 먼저 다가가지 않는다. 그 쪽에서 나에게 다가 오도록 보이지 않는 유도를 한다. 친한 사람이 많지는 않지만 함께 이야기를 할 때에는 매력적으로 말을 잘 한다.


자기에게 없는 것을 다른 사람들이 가지고 있는 것을 볼 때에는 시기심이 발동한다. 그러나 그것이 곧 열등감으로 변하여 "나는 왜 이럴까?" 라는 생각으로 의기소침 해 진다. 그래서 4번은 자기 성격유형을 찾을 때 자기에게는 시기심이 없고, 오히려 열등감이 많다고 느낀다. 그러나 그 열등감이 시기심으로부터 오는 것이다.


매사에 "이것이 옳은 것인가?, 그런 것인가?, 잘못 되면 어쩌나?"를 많이 따지느라고 어떤 결정을 빨리 내리지 못한다. 운전을 하면서 길을 가다가도 네비게이션을 정확하게 숙지했다는 확신이 서지 않으면 네거리 에서도 우왕자왕한다. 이렇게 해도 되고, 저렇게 해도 되는 일에도 얼른 결정을 내리지 못한다. 그러나 자기가 옳다는 확신이 드는 일에는 흔들리지 않고 그 일을 계속한다. 개인주의 적인 성향이 강할지라도 건강한 상태로 가면, 다른 사람의 감정을 잘 이해하고 동정해 주는 일이 많다. 8번의 리더십 못지않게 은근하면서도 강하게 리더십을 발휘할 수 있다.


이렇게 되기까지에는 실수하는 경험을 많이 겪게 된다. 4번은 자기가 하려고 마음먹었던 일도 다른 사람이 시키면 그것을 놓아 버릴 수 있다. 거절을 잘하는 사람들이라 4번과 함께 일 하고 싶으면 이해시키는 일을 잘 해야 한다. 그래서 4번은 공동체적으로 하는 일을 하기보다는 직업을 가져도 혼자 할 수 있는 일이 더 좋다.



인물상 _ 4번은 드라마틱하고 감정적이며 로맨틱하고 다른 유형들보다 더 고통스러워하는 것처럼 보인다. 흔히 4번에게는 진심으로 만족해본 적이 한 번도 없다는 데에 대한 내면의 절망감에서 비롯한 비극적인 기질이 있다. 그 내면의 비탄은 위로할 길이 없으며 영원히 변하지 않을 것처럼 보인다. 물론 매우 즐겁고 열의가 넘쳐보이는 4번도 있다. 그러나 이렇게 경쾌하고 낙천적으로 보이려는 4번의 열성은 그 얼굴 뒤에 숨은 절망을 증명한다.


4번은 독특하고 유일하며 심미적이고 창의적으로 보이길 원한다. 자신의 세련된 취향과 감수성을 높이 평가하며, 대개 자신이 그런 면에서는 남들보다 더 깊고 심오하다고 느낀다. 흔히 거만하고 쌀쌀맞아 보이지만 속으로는 사회적으로 위태로워 하면서 사랑받지 못하고 소속되지 못할까봐 두려워한다. 4번은 자신이 혼자이고 버림받았으며, 남들과 멀리 떨어져 있고 그들과 닿을 수 없다고 느끼는 경향이 있다.



함정 _ '고유성'에 대한 욕구가 4번의 함정이다. 4번은 예술 그리고 창작자나 감상자 같은 심미적인 일에 끌린다. 4번은 진정으로 독창적이고 창의적은 물건과 인물에게 접근함으로써 거기에 더불어 참여하려고 한다. 그러나 세련되고 아름다운 대상의 가치가 더없이 고귀하다는 지경에까지 이르러 그 대상에게 과장되게 아첨할 수도 있다.독창적이고, 창의적이고, 고유하고, 자연스러우면서 특별한 사람처럼 보이려고 애쓰는 노력은 이 경험을 모방하려는 4번의 시도다.


4번의 극적인 분위기는 이 자기표상 또는 복제된 자기의 느낌에 무게를 실으려는 시도이고, 동시에 '궁극점'의 경험을 모방하여 뭔가 중요하고 의미가 깊이가 있는 인기 주인공처럼 느끼려는 시도로 볼 수 있다. 4번이 실제감을 불어넣으려는 대상은 바로 이 자기이미지이다. 그렇기 때문에 자기이미지에서 나오는 감정이 4번에게는 신성하고 '진짜 같다'. 그래서 이들은 자기 반응의 정당성을 확신하고, 그 반응을 방어한다. 이런 각도에서 보면 어떤 상황에 대해 4번이 내 외적으로 보여주는 특직정인 저항이 성격의 가짜 자기관념, 즉 자시표상을 지탱하려는 시도임을 이해할 수 있다.


방어기제 _ 4번의 방어기제는 '함입(introjection)'이다. 함입이란 사랑하는 대상의 속성, 태도, 특징의 일부를 자신의 정신 속으로 합병시키는 것이다. 이걸 방어기제라고 하기엔 억지스럽다고생각할 수도 있다. 그러나 대상에 대한 완전한 상실감, 그 결과로 자기 관념의 상실감을 회피하는 방법이라고 보면 이해하기가 쉽다. 우울증에 걸린 사람이 공격성을 자신에게 향하도록 하는 내면의 움직임 전체가 곧 대상과이 접촉을 유지하는 방법이기 때문에, 자신의 분노와 증오를 드러낸다는 것은 이들의 정신 속에서는 사랑하는 대상을 잃어버리는 것과 똑같다. 마찬가지로, 4번은 말로는 행복을 원한다지만 사실은 고통스러워하면서 그 고통에 매달려 있다. 고통을 통해 잃어버린 대상과 연결을 유지할 수 있기 때문이다.


행동 및 정서 습관 _ 4번의 심리에서는 수치심이 아주 두드러지게 나타난다. 수치심은 '거부당하고, 조롱당하고, 폭로당하거나 타인의 존중을 잃은 느낌에 따르는 고통스러운 감정(당혹감, 모욕감, 굴욕감, 망신)의 광범위한 스펙트럼을 일컫는다. 자신의 있는 모습을 그대로 표현하고 드러내는 것은 4번에게 수치심의 원천이다. 자기가 이상적으로 생각하는 모습에 미치지 못하기 때문이다. 4번은 이런 상황을 피하기 위해 주로 움츠러들다 보니 초연하고 냉담해진다. 이렇게 물러서는 행동을 대개 자기가 거리를 두려는 상대의 탓으로 돌리면서 사이가 멀어진 느낌을 유지한다. 이들은 또한 내향적이고 자신을 거의 드러내지 않으며, 초연하고 혼자 있기를 좋아하며, 부자연스럽다는 인상을 준다. '

-위 컨텐츠는 《에니어그램의 영적인 지혜》에서 편집·발췌한 내용입니다.-






[1] 한마디로 마음가능대로임

애니어그램 4번 유형인 개인주의자를 움직이는 것은 하트(마음)입니다. 이 부류는 자신이 바라는 것을 상상하고 창조할 줄 알며, 모든 기운을 자신의 내면으로 집중하는 경향이 있습니다. 그래서 실제로 일어나는 일 그자체 보다는 자신의 감정에 집중하게 되는데요.


이 감정은 상황을 자신만의 방식으로 해석하여 만들어진 자신만의 독특한 감성을 말합니다. 즉, 있는 그대로가 아닌 나만의 해석으로 상황을 재창조하고, 그것을 유지하려고 하는 것이죠. 그래서 안좋은 점은 비관적인 상황이 발생했을때 우울한 상황을 불필요하게 오랫동안 간직한다는 것입니다.


[2] '남들과 다름'이 핵심이다.

애니어그램 4번 유형의 정체성은 한마디로 남들과 다르다는 생각입니다. 그래서 이런 생각을 하게 될 수 있습니다. 나는 스페셜하고 유니크하기 때문에 누구보다 가치가 있는 인간이다. 긍정적으로 작동한다면, 성취와 성과를 창출하는 인재가 될 수 있습니다.


[3] 추구하는 것 정리

애니어그램 4번 유형이 추구하는 것은 해결사 역할 입니다. 또는 예술가 타입이라고 할 수 있죠. 즉, 자신이 이해하는 방향으로 모든 것을 해결하여 사람들로부터 존경을 받기를 원하는 것입니다. 꼭 남들의 인정이 필요한 것은 아니지만, 적어도 외부에 알려지기를 바라는 마음이 있는 것이죠.


[4] 두려워하는 부분 정리

이 부분은 추구하는 것과 반대 개념입니다. 개인주의자 유형이 가장 두려워 하는 것은 내팽개쳐 지는 것입니다. 예를 들어, 이것은 학업이나 직장에서 자신이 하는 일에서 성과가 없고 귀하게 여김을 못 받을 때를 말하는데요. 상황 그 자체가 잘못 돌아가고 있는 것이 싫은 것입니다.


즉, 발생한 안 좋은 일들은 충분히 복구할 수 있지만, 이를 계기로 사람들로부터 충분한 존경이나 서포트를 받지 못하는 상황이 두려운 것입니다. 그리고 잠시나마 스스로를 포기하거나 망가질때까지 내버려 두는 경우도 있죠.


[5] 집착하는 습관이 있다.

이들은 마음이 어느 한곳에 머무는 경향이 있습니다. 주로 사랑, 학업, 직장, 인간관계와 같이 삶의 모든 부분에서 나타나는데요. 간혹가다 자신만의 세계와 과거 그리고 감정에 휩싸여 현실을 잘 못 보는 일도 벌어집니다. 생활습관을 예로 들자면, 자신이 정해놓은 물건들이 원위치에 있지않아서 화가날 수 있습니다. 


그런데 중요한 것은 자신이 자기 것을 마음대로 바꾸는것은 관계없지만, 타의에 의해 기존의 것이 의도치 않게 변형되는 것은 잘 견디지 못합니다. 이 유형과 함께 생활하시는 분들은 유의해야 할 점이기도 합니다. 그리고 음악을 감상 할 때에도 특정 1곡을 계속 반복해서 듣는 경우도 있습니다. 특정한 상황을 계속 유지하기 위한 습관이기도 합니다.


[4] 해결해야할 부분은 2글자입니다.

개인주의자 유형이 극복해야할 것은 인정하기 싫으시겠지만 바로 질투입니다. 이는 사랑이라는 주제에 국한된 것이 아니라 자신이 갖지 못한것에 대한 소유의 문제일 수도 있습니다. 그리고 자신이 그리는 이상향과 현실이 맞지 않는 순간들에 힘들어하고, 불안정하다고 느낄 수 있습니다.


그래서 네번째 유형은 사회적으로 두각을 나타내고 경제적이나 사회적으로 상류층에 속하는 경우가 많습니다. 하지만, 불만족하고 감사하는 마음이 부족한 분들이 더러 있습니다.

-출처 : http://sapi21.tistory.com/301




평범함을 싫어하고 창의적이고 감정적인 사람입니다. 자의식이 강해 본인을 특별한 능력이 있는 사람으로 생각하지만 동시에 죄책감이나 후회 등이 심해, 쉽게 좌절하기도 합니다. 본인의 능력을 과도하게 믿는 듯 하다가도 사소한 실수에 쉽게 후회합니다. 내면적으로는 남과 공감하는 능력이 발달하였고, 역지사지의 정신을 갖고 있는 사람들입니다. 그러나 이런 내면을 드러내기 싫어합니다. 평소에 공상을 잘하는 편이며, 생각이 깊고 신중한 타입이죠. 또한 본인은 타인과 다른 능력이 있다고 믿으며, 거만하기 까지 하여 평범한 삶을 거절하는 사람들이 많습니다.

 

 감정적인 마음상태를 드러내기 싫어하여, 인기인이 되고싶고 주목받고 싶으나 마음만 앞설 뿐, 말이나 행동이 경직되기 일쑤입니다. 그래서 특별한 표현, 과격한 행동, 남들과는 다른 무언가를 추구하는 경향이 있습니다. 남들과 다른 독특한 면으로 인해 주목받으려고 하는 것입니다. 이러한 심리로 인해 남들과는 다른 취미를 가질 수 있고, 한 분야에 꽂히면 열정적으로 임할 수도 있고, 예술적 감각이 발달한 사람들이 많습니다. 남들과는 차별된 그 무언가를 갈구하는 형상이죠. 이루어질 수 없는 것을 갈망하며, 이러한 것들을 내면을 통해 의미를 부여하기도 합니다.  


애니어그램 4번 유형은 에너지를 한 군데로 응집시킬 수 있는 능력이 탁월합니다. 본인이 관심있는 분야에서는 주위상황이나 배경을 신경쓰지 않고 몰두하기도 합니다. 본인이 의도해서 최고가 되는 것이 아니라, 본인이 좋아해서 계속 하다 보니 어느새 최고가 되어있는 것이죠. 남들의 호감을 얻을 수 있는 차별화 된 것을 좋아합니다. 이들의 폭발적인 에너지는 이런 심리에서 나옵니다. 본인 자식의 유형이 애니어그램 4번유형이라면 이들의 독특한 통찰력, 심오함을 존중해줘야 능력을 크게 발휘할 수 있습니다.

 

 

이들의 리더십 유형은 열정과 낭만을 겸비한 영화감독 스타일입니다. 남들과 의사소통을 할 때에는 깊게 공감할 수 있는 단어를 즐겨 쓰며, 때로는 극적이고 심오한 표현을 하며 대화합니다. 이들과 대화할때에는 평범한 듯 하다가도, 이들의 열정적인 에너지와 에너지를 쏟는 분야를 보면 보통 사람과는 다른 비범한 사람이라는 생각을 하게 될 것입니다. 이들은 쉽게 기분이 다운되기도 하며, 고집이 세고 자의식이 강한 편입니다. 이 유형의 비범하고 독특한 인상은 타인에게 오만하고 건방지게 비춰질 수도 있습니다.

출처 : limsul.tistory.com/260

검사 : http://www.anylover.com/html/test.html






1. 전처리 지시자


 - 헤더의 중복 Include가 되는 것을 막기위해 다음의 전처리 지시자를 사용할 수 있음.


#ifndef [key]

#define [key]


... 헤더내용



#endif


예시

#ifndef __SONGCLASS_H__

#define __SONGCLASS_H__


#include<iostream>


class CSONGClass

{

private:



protected:


public:

CSONGClass();

~CSONGClass();


};


#endif //__SONGCLASS_H__


위와 같이 헤더를 선언하면 여러 다른 파일에서 위의 헤더를 Include 하더라도 한번만 Include 하게된다.



2. 네임 스페이스


 - 스코프(영역) 설정을 통해 함수, 변수등이 중복되어도 영역을 설정해줌으로써 어떤 변수 또는 함수를 쓸지 Specific 하게 해주는 기능

 - 스코프 설정 연산자 :: 을 사용

InsertFuction::Init();



3. 삼항 연산자

 - 만약 ? 하면 A이고 아니면 B 다.

(I > 5) ? "YES" : "no"

 >> I 가 5보다 크면 YES, 아니면 NO이다.



4. 단락논리

 - OR 연산을 할 때 왼쪽에서 오른쪽 순서로 연산이 진행되며 그중 하나라도 참이면 그 뒤에 연산을 진행하지 않음.

 -> 계산이 빨리 끝나는 것부터 왼쪽에 코딩하면 훨씬 더 빠른 프로그램 개발을 할 수 있을듯.




CPU 정보 : cat /etc/proc/cpuinfo

RAM 정보 : cat /etc/proc/meminfo
HDD 정보 : fdisk -l
CPU 사용율 : top

하위폴더 파일목록 : find [경로] -type f

tar 복사 : tar -cf - [원본경로] | (cd [복사할경로] ; tar -xf -)

nohup tar -cf - ./SourceDir/ | (cd /home/song/TargetDir ; tar -xf -) &

대량파일 삭제
find [디렉토리경로] –type f –exec rm {} \; 

find [디렉토리경로] -type f ! -ctime +250 -exec rm -rf {} \; // 생긴지 250일 이후 파일만 삭제



강제 언마운트
fuser -cu [경로]
fuser -ck [경로]


하위폴더 내 특정파일 삭제

find ./ -name *.cfg -exec rm {} \;


+ Recent posts