Python Interpreter

 GIL을 이해하려면 먼저 Python 인터프리터란 것이 정확히 무엇인지 알아야 한다. Python 인터프리터란, Python으로 작성된 코드를 한 줄씩 읽으면서 실행하는 프로그램을 말한다. 그 프로그램의 구현체로는 여러 가지가 있을 수 있는데, 현재 Python 인터프리터의 표준 구현체로 받아들여지고 있는 것은 바로 CPython이다. CPython은 C 언어를 이용하여 구현한 Python 인터프리터이다. 이번 포스팅에서 다루는 내용은 전부 CPython을 기준으로 함을 미리 밝힌다.

 

GIL (Global Interpreter Lock)

In CPython, the global interpreter lock, or GIL, is 
a mutex that protects access to Python objects, preventing multiple threads from executing Python bytecodes at once.
 This lock is necessary mainly because CPython's memory management is not thread-safe.

해석하자면, Python의 객체들에 대한 접근을 보호하는 일종의 뮤텍스(Mutex)로서, 여러 개의 쓰레드가 파이썬 코드를 동시에 실행하지 못하도록 하는 것이라고 한다. 즉, 한 프로세스 내에서, Python 인터프리터는 한 시점에 하나의 쓰레드에 의해서만 실행될 수 있다는 것이다. 멀티 쓰레딩이 불가능하다는 것이 아니다. 원래 멀티 코어라면 멀티 쓰레딩 시에 여러 개의 쓰레드가 여러 코어 상에서 병렬(Parallel) 실행될 수 있는데, Python에서는 그러한 병렬 실행이 불가능하다는 것뿐이다. 이를 그림으로 나타내면 다음과 같다.

GIL이 필요한 이유

 괜히 멀티 쓰레딩 시 병렬 실행만 불가능해지고, GIL이 왜 필요한가 싶을 수 있다. 사실, 앞서 소개한 Python 위키에서의 GIL 정의가 이 의문에 대해 답을 해준다. 그것은 바로, GIL이 Python의 객체들에 대한 접근을 보호하는 일종의 뮤텍스(Mutex)라는 것이다. 이것이 무슨 말인지 한 번 차근차근 자세히 알아보자.

먼저, Python에서 모든 것은 객체(Object)이다. 그리고 각 객체는 참조 횟수(Reference Count)를 저장하기 위한 필드를 갖고 있다. 참조 횟수란 그 객체를 가리키는 참조가 몇 개 존재하는지를 나타내는 것으로, Python에서의 GC(Garbage Collection)는 이러한 참조 횟수가 0이 되면 해당 객체를 메모리에서 삭제시키는 메커니즘으로 동작하고 있다. 참고로, sys 라이브러리의 getrefcount() 함수를 사용하면 특정 객체의 참조 횟수를 알아낼 수 있다.

import sys

# x의 참조 횟수 : 1
x = []

# x의 참조 횟수 : 2
y = x

# getrefcount() 함수의 매개변수 할당 시 x의 참조 횟수가 1 증가(3이 됨)
# getrefcount() 함수의 반환 시 x의 참조 횟수가 다시 1 감소(2가 됨)
sys.getrefcount(x)

# 출력 결과 : 3

 

그렇다면 이것이 GIL이랑 무슨 상관인 걸까? 참조 횟수에 기반하여 GC를 진행하는 Python의 특성상, 여러 개의 쓰레드가 Python 인터프리터를 동시에 실행하면 Race Condition이 발생할 수 있기 때문이다. Race Condition이란, 하나의 값에 여러 쓰레드가 동시에 접근함으로써 값이 올바르지 않게 읽히거나 쓰일 수 있는 상태를 말한다. 이러한 상황을 보고 Thread-safe 하지 않다고 표현하기도 한다.

즉, 여러 쓰레드가 Python 인터프리터를 동시에 실행할 수 있게 두면 각 객체의 참조 횟수가 올바르게 관리되지 못할 수도 있고, 이로 인해 GC가 제대로 동작하지 않을 수도 있다는 말이다. 물론 이러한 Race Condition은 뮤텍스(Mutex)를 이용하면 예방할 수 있다.

뮤텍스(Mutex)란, 멀티 쓰레딩 환경에서 여러 개의 쓰레드가 어떠한 공유 자원에 접근 가능할 때 그 공유 자원에 접근하기 위해 가지고 있어야 하는 일종의 열쇠와 같은 것이다. 만약 한 쓰레드가 어떠한 공유 자원에 대한 뮤텍스를 가지고 있다면, 다른 쓰레드들은 그 공유 자원에 접근하고 싶을 때도 그 공유 자원에 접근하고 있는 쓰레드가 뮤텍스를 풀어줄 때까지는 기다려야 한다.

그런데 앞서 말했듯이, Python에서 모든 것은 객체이고, 객체는 모두 참조 횟수를 가진다. 따라서 GC의 올바른 동작을 보장하려면 결국 모든 객체에 대해 뮤텍스를 걸어줘야 한다는 말이 된다. 이는 굉장히 비효율적이며, 만약 이를 프로그래머에게 맡길 경우 상당히 많은 실수를 유발할 수도 있는 문제이다.

그래서 결국 Python은 마음 편한 전략을 택하였다. 애초에 한 쓰레드가 Python 인터프리터를 실행하고 있을 때는 다른 쓰레드들이 Python 인터프리터를 실행하지 못하도록 막는 것이다. 이를 보고 "인터프리터를 잠갔다"라고 표현한다. 즉, Python 코드를 한 줄씩 읽어서 실행하는 행위가 동시에 일어날 수 없게 하는 것이다. 그러면 모든 객체의 참조 횟수에 대한 Race Condition을 고민할 필요도 없어진다. 뮤텍스를 일일이 걸어줄 필요도 없어지는 것이다. 이것의 GIL의 존재 이유이다.

 

Python에서 멀티쓰레딩은 나쁜것인가 ..?

위에서 설명한 것만 보면, Python에서는 GIL 때문에 멀티 쓰레딩을 쓰지 않는 게 좋아 보인다. 실제로, CPU 연산의 비중이 큰 작업을 할 때 멀티 쓰레딩은 오히려 성능을 떨어뜨린다. 병렬적인 실행은 불가능한데 괜히 문맥 전환(Context Switching) 비용만 잡아먹기 때문이다. 다음 예시 코드를 보자. 멀티 쓰레딩을 사용하니 오히려 더 느려진 걸 볼 수 있다.

import time
import threading

def loop():
    for i in range(50000000):
        pass

# Single Thread
start = time.time()
loop()
loop()
end = time.time()
print('[Single Thread] total time : {}'.format(end - start))

# Multi Thread
start = time.time()
thread1 = threading.Thread(target=loop)
thread2 = threading.Thread(target=loop)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
end = time.time()
print('[Multi Thread] total time : {}'.format(end - start))

# [Single Thread] total time : 2.3374178409576416
# [Multi Thread] total time : 3.4128201007843018

하지만 GIL은 CPU의 연산 과정에서 공유 자원에 대해 발생할 수 있는 Race Condition 문제 때문에 필요했다는 걸 상기할 필요가 있다. 따라서 Python에서는 외부 연산(I/O, Sleep 등)을 하느라 CPU가 아무것도 하지 않고 기다리기만 할 때는 다른 쓰레드로의 문맥 전환을 시도하게 되어 있다. 이때는 다른 쓰레드가 실행되어도 공유 자원의 Race Condition 문제가 발생하지 않기 때문이다.

이러한 이유로, CPU 연산의 비중이 적은, 즉 외부 연산(I/O, Sleep 등)의 비중이 큰 작업을 할 때는 멀티 쓰레딩이 굉장히 좋은 성능을 보인다. 따라서 Python에서 멀티 쓰레딩이 무조건 안 좋다는 말은 사실이 아니다. 실제로, I/O 혹은 Sleep 등의 외부 연산이 대부분이라면 멀티 쓰레딩을 통해 큰 성능 향상을 기대할 수 있다. 다음 예시 코드를 보자. 멀티 쓰레딩을 통해 더 빨라진 걸 볼 수 있다.

import time
import threading

def sleep_for_2s():
    time.sleep(2)

# Single Thread
start = time.time()
sleep_for_2s()
sleep_for_2s()
end = time.time()
print('[Single Thread] total time : {}'.format(end - start))

# Multi Thread
start = time.time()
thread1 = threading.Thread(target=sleep_for_2s)
thread2 = threading.Thread(target=sleep_for_2s)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
end = time.time()
print('[Multi Thread] total time : {}'.format(end - start))

# [Single Thread] total time : 4.017191171646118
# [Multi Thread] total time : 2.002999782562256

 

 

GIL을 우회하는 방법

일반적인 CPU 연산에 대하여, 병렬 처리를 하려면 크게 두 가지 방법을 생각해볼 수 있다.

먼저, 멀티 프로세싱을 이용하는 것이다. 한 프로세스의 여러 쓰레드들은 서로 자원을 공유하지만, 여러 프로세스들은 각자 독자적인 메모리 공간을 가져서 서로 자원을 공유하지 않기 때문이다. 물론 자원을 공유하려면 할 수는 있지만, 별도의 처리가 필요하다. 다만, 멀티 프로세싱은 메모리를 더 필요로 하고 문맥 전환의 비용이 꽤 된다는 단점이 있다.

다음으로, CPython이 아닌 다른 Python 인터프리터 구현체를 사용하는 것이다. 예를 들면 Jython 등이 있다. 그러나 흔히 사용하는 방법은 아니므로 권장하지 않는다.

'Python 프로그래밍' 카테고리의 다른 글

[Python] *args와 **kwargs  (0) 2022.07.22
[Python] Asyncio  (0) 2022.06.05
[Python] Coroutine  (0) 2022.06.02
[Python] Future  (0) 2022.06.01
[Python] Object Reference  (0) 2022.05.27

 보통 아래와 같이 메인루틴 안의 서브루틴들로 구성된 기능에 익숙할 것이다. 주로 구현한 함수들은 한 번 실행되고 종료되는 함수들이었다. Python의 서브루틴은 이러한 서브 루틴의 사용을 조정하는 메인 함수에 의해서 호출된다.

 

Coroutine

 Python의 코루틴(Coroutine)이란 Cooperative Routine을 의미하며, 서로 협력하는 루틴이라는 뜻이다. 메인루틴과 서브루틴처럼 종속된 관계가 아니라 대등한 관계로서 동작하며, 특정시점마다 상대방의 코드를 실행한다. 즉, 동시성 프로그램을 가능하도록 한 기술이라고 이해하면 될 것이다.

 ( Main Routine이 대기중일 때, Sub Routine을 통해 연산한 이후에 다시 Main Routine으로 돌아오도록 하는 기술 )

 

 위의 그림처럼 Coroutine은 함수가 종료되지 않은 상태로 메인 루틴의 코드를 실행한 뒤 다시 돌아와서 코루틴의 코드를 실행하게 되는 것이다. 일반 함수를 호출하면 코드를 한 번만 실행할 수 있지만, 코루틴은 코드를 여러 번 실행할 수 있는 것이다. 참고로 함수의 코드를 실행하는 지점을 진입점(Entry Point)라고 하는데, 코루틴은 진입점이 여러개인 함수인 것이다.

 

Coroutine에 값 보내기

 코루틴(Coroutine)은 제너레이터(Generator)의 특별한 형태로, 제너레이터에서 yield를 이용해 값을 발생시켰다면, 코루틴에선 (yield) 형식을 통해 값을 받아올 수 있다.

  • 코루틴객체.send(값)
  • 변수 = (yield)
def number_coroutine():
	while Ture:		# 코루틴을 계속 유지하기 위해서 무한루프 사용
    	x = (yield)	# 코루틴 외부에서 값을 받아옴, yield를 괄호로 묶어야 한다.
        print(x)
        
co = number_coroutine()
next(co)			# 코루틴 안의 yield까지 코드 실행(최초실행)

co.send(1)			# 코루틴에 숫자 1을 보냄
co.send(2)			# 코루틴에 숫자 2을 보냄
co.send(3)			# 코루틴에 숫자 3을 보냄

 코루틴은 while을 이용한 무한 루프를 통해 메인 루틴을 유지하고, 코루틴 외부에서 코루틴에 값을 보내는 형태로 이루어진다. 또한 코루틴을 무한루프상태에서 종료하기 위해서는 객체.close()를 선언해 주면 된다. 

def number_coroutine():
	while True:
    	x = (yield)
        print(x, end=' ')
        
co = number_coroutine()
next(co)

for i in range(20):
	co.send(i)
    
co.close()

# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

 

 

GeneratorExit 예외처리

 코루틴 객체에서 close() Method를 호출하면 종료될 때 GeneratorExit 예외가 발생하게 된다. 따라서 이 예외를 처리하면 코루틴의 종료시점을 파악할 수 있다.

def number_coroutine():
	try:
    	while Ture:
        	x = (yield)
            print(x, end=' ')
		except GeneratorExit		#코루틴이 종료될 때 GeneratorExit 예외 발생
    		print()
            print('코루틴 종료')
            
co = number_coroutine()
next(co)

for i in rnage(20):
	co.send(i)
    
co.close()

# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# 코루틴 종료

 

Coroutine과 스레드의 차이점

 스레드는 비동기로, 여러 스레드가 있다면 한꺼번에 동시에 실행되는 반면, 코루틴은 프로그램이 실행 중일 때 특정 시점에 코루틴으로 이동하고 그 전에 진행 중이던 루틴은 정지합니다. 즉, 한번에 하나의 코드만 실행됩니다. 이는 기존의 프로그래밍과 유사한 성격으로 보일 수 있습니다. 하지만 기존의 프로그래밍은 에러가 나지 않는 이상 실행 중인 코드를 빠져나올 수 있는 부분은 return과 같이 가장 마지막 부분이지만 코루틴은 실행 중간에 해당 함수를 빠져 나와 다른 코드를 실행할 수 있고 다시 실행 중이였던 코드 라인으로 이동할 수도 있습니다. 다시 말해서 코루틴은 yield 키워드로 실행을 중지할 수 있고 yield 키워드를 호출했던 곳으로 와서 실행을 재 시작합니다.

 싱글코어에선 코루틴은 이동 시점이 더 잘 조절되고 context switching이 적어 성능면에서 멀티 스레드보다 좋을 수 있지만 멀티코어 프로세서를 활용할 수 없다는 문제점이 있으며 스레드보다 성능이 떨어지게 됩니다.

'Python 프로그래밍' 카테고리의 다른 글

[Python] Asyncio  (0) 2022.06.05
[Python] GIL  (0) 2022.06.03
[Python] Future  (0) 2022.06.01
[Python] Object Reference  (0) 2022.05.27
[Python] mutable과 immutable  (0) 2022.05.26

 Python의 동시성을 처리하는 기능 중 하나인, Future 클래스에 대해 알아보고자 한다. Future는 concurrent.futures와 asyncio 내부에 있는 핵심 컴포넌트입니다.

사용자가 직접 다룰 일은 거의 없지만, 지연된 계산을 표현하기 위해 사용됩니다. 이 때, 그 객체의 계산은 완료되었을 수도 있고, 완료되지 않았을 수도 있습니다.

Future는 대기 중인 작업을 큐에 넣고, 완료 상태를 조사하고, 결과 혹은 예외를 가져올 수 있도록 캡슐화합니다.

주의할 점은, Future의 실행을 스케줄링하는 프레임워크만이 어떤 일이 일어나는지 확실히 알 수 있기 때문에, 사용자가 Future 객체를 직접 생성하거나 변경해서는 안된다는 것입니다. 이 주의사항을 무시한다면 큰 고통에 빠질 수 있습니다.

 

Future

 concurrent.futures.Future 비동기로 호출된 함수 콜이 객체로 캡슐화된 형태이다. Executor 클래스 인스턴스의 .submit() 호출에 의해 인스턴스가 만들어진다. 특히 이 객체는 asyncio의 Future 클래스와 유사한 API를 가지고 있다. (둘이 호환되는 객체는 아니다.)

 따라서 단일 스레드 비동기 코루틴을 사용하는 방식과 concurrent.futures를 이용한 병렬처리 방식은 매우 비슷한 형태로 사용 가능하다. 이 Future 클래스는 자바스크립트의 Promise API와 매우 비슷하다. 아직 완료되지 않은 (혹은 완료되었는지 당장은 모르는) 작업을 외부에서 객체로 다룰 수 있게 된다.

 다음의 메소드들이 지원된다. 특히 하나의 작업에 대해서 하나 이상의 완료 콜백을 추가할 수 있다는 점이 흥미롭다.

  • cancel() : 작업 취소를 시도한다. 만약 현재 실행중이고 취소가 불가능할 경우 False를 리턴한다. 작업이 취소되었다면 True가 리턴된다.
  • canceled() : 취소가 완료된 작업이면 True를 리턴한다.
  • running(): 실행 중인 경우 True를 리턴한다.
  • done(): 작업이 완료되어고 정상적으로 종료되었다면 True를 리턴한다.
  • result(): 해당 호출의 결과를 리턴한다. 만약 작업이 아직 완료되지 않았다면 최대 타임아웃시간까지 기다린다음, None을 리턴한다.
  • exception(): 해당 호출이 던진 예외를 반환한다. 역시 작업이 완료되지 않았다면 타임아웃 시간까지 기다린다.
  • add_done_callback(): 콜백함수를 Future 객체에 추가한다. 이 함수는 future 객체하나를 인자로 받는 함수이다. 콜백은 취소되거나 종료된 경우에 모두 호출된다.
# flags_threadpool.py
from concurrent import futures
# Reuse functions in flags.py
from flags import save_flag, get_flag, main 

# 하나의 국기 이미지를 다운받는 함수. 각 worker가 이 함수를 수행함
def download_one(cc: str):
	image = get_flag(cc)    
	save_flag(image, f'{cc}.gif')    
	print(cc, end=' ', flush=True)    
	return cc 

def download_many(cc_list: list[str]) -> int:
	# context manager로서 ThreadPoolExecutor를 인스턴스화 합니다.    
	# executor.__exit__() 메소드는 executor.shutdown(wait=True)를 호출하는데,    
	# 이는 스레드가 완료될 때까지 블락시킵니다.   
	with futures.ThreadPoolExecutor() as executor:        
		# map 메소드는 내장 함수 map과 유사합니다.        
		# 첫 번째 인수인 download_one 함수는 여러 스레드에서 동시에 호출됩니다.        
		# map 메소드는 각 함수 호출에서 리턴되는 값들을 반복할 수 있는 제너레이터를 반환합니다.      
		# 여기서는 country code를 반환        
		res = executor.map(download_one, sorted(cc_list))        

	return len(list(res)) 


if __name__ == '__main__':    
	# 이 스크립트에서 구현한 downlaod_many 콜러블을 인수로 전달하여,    
	# flags.py에서 구현한 main 함수 호출   
	main(download_many)

 

'Python 프로그래밍' 카테고리의 다른 글

[Python] GIL  (0) 2022.06.03
[Python] Coroutine  (0) 2022.06.02
[Python] Object Reference  (0) 2022.05.27
[Python] mutable과 immutable  (0) 2022.05.26
[Programming] 암호화 알고리즘 (Encryption Algorithms)  (0) 2022.05.22

 고정금리와 변동금리는 대출상품 중 주택대출과 관련되어 많이 사용되는데, 대출금리의 결정 구조를 살펴보면 대출금리는 대출의 기준이 되는 기준금리와 가산금리가 더해져서 대출금리가 결정이 되고, 여기에 은행별 우수고객에 적용할 수 있는 우대금리의 할인을 받으면 최종적으로 대출금리가 산정된다. 

https://mbanote2.tistory.com/

  대출 기준금리라고 하는 것은 변동금리 대출의 기준이 되는 금리를 뜻하는데 주로 코픽스 금리나 CD금리, 금융채 금리 등이 대출의 기준금리로 사용이 되고 있다. 가산금리는 대출 기준금리와 더불어서 대출금리를 구성하는 각종 항목들을 의미하고 있는데 여기에는 리스크 프리미엄, 유동성 프리미엄, 신용 프리미엄, 자본비용, 업무원가 등이 포함되어 있다.

 즉, 은행이 고객에게 대출해주기 위해 감수해야 되는 부분들을 개별항목으로 정해놓고, 대출금리 결정의 합리적 체계를 만들어 놓은 것이 바로 가산금리이다. 우대금리는 은행별로 우수고객들에게 제공이 되는 금리인하율을 뜻한다. 

 

고정금리

 고정금리란 채무의 이행을 완료할 때까지 은행이 그 율을 변경할 수 없음을 원칙으로 하는 것으로 '은행 여신거래 기본약관' 에 쓰여져 있다. 즉, 대출을 받는 당시에 정해진 금리로 대출을 모두 상환할 때 까지 금리가 고정되는 대출상품인 것이다. 하지만 '은행 여신거래 기본약관'에 쓰여진 내용을 살펴보자면 변경할 수 없음을 원칙으로 한다는 것이지 절대 변경할 수 없다고 쓰여있진 않다. 그렇기 때문에 채무이행 완료 이전에 국가경제나 금융사정의 급격한 변동 등으로 계약 당시에 예쌍할 수 없는 현저한 사정 변경이 생긴 때에는 은행이 채무자에 대한 개별통지에 의하여 그 율을 인상 혹은 인하할 수 있다는 것이다.

 실제로 IMF 직후인 2000년 즈음 고정금리로 주택자금대출을 받은 개인에게 금융사정의 변화를 이유로 금리를 인상하자 소송을 제기한 사건이 있었는데 2심을 거치고 대법원에 올라가면서 은행이 금리를 올릴 수 있다는 쪽의 손을 들어준 사건이 있었다. 

 

변동금리

 채무의 이행을 완료할 때 까지 은행이 그 율을 수시로 변경할 수 있는 것 이라 정의되어 있다. 그러므로 한국은행이 기준금리를 인상하거나 인하하게 되면 변동금리로 대출받은 대출금리는 인상되거나 인하될 수 있는 것이다. 

 

고정금리와 변동금리의 차이

 고정금리란 대출기간동안 약정한 금리가 변하지 않고 만기 때까지 그대로 유지되는 방식을 말합니다. 반대로 변동금리는 대출 기간 동안 적용되는 금리가 시장 상황에 따라 달라지는 방식입니다.
 
 대출금리는 은행 대출의 기준이 되는 지표금리에 가산금리를 더한 뒤 우대금리를 빼는 방식으로 책정합니다. 코픽스, 은행채 등 지표금리는 말 그대로 대출금리의 지표 역할을 하는데요. 지표금리가 상승하면 고정금리든 변동금리든 대출 금리는 오를 수밖에 없습니다. 가산금리는 업무원가, 고객신용도, 은행의 마진율 등을 고려하여 책정한 금리입니다. 우대금리는 이용 실적 등에 따라 은행에서 제공해주는 일종의 서비스 금리를 말하죠. 
 
 고정금리는 5년물 은행채 금리를 지표금리로 삼아 가산금리를 더해 기본금리를 책정한 후 여기에 우대금리 등을 빼서 정해집니다. 변동금리는 코픽스금리에 가산금리를 더해 기본금리를 책정하고 우대금리를 제한 값이 됩니다.
 
 여기서 5년물 금융채 금리는 은행끼리 발행하는 채권 즉 은행채의 금리를, 코픽스는 은행연합회가 국내 8개 은행들로부터 정보를 제공받아 산출하는 자금조달비용지수를 각각 말합니다.

 

고정금리와 변동금리 중 선택

 고정금리와 변동금리 중 어떤 것을 선택해야 할지 모르겠다면 우선 예상 대출 기간 향후 시장금리 전망을 따져봐야 합니다.
 
 단기대출자, 즉 대출 후 일반적으로 1~2년 안에 상환 계획이 있는 이들에게는변동금리가 유리합니다. 연내 한국은행의 금리 인상 의지가 강하기는 하지만 아직은 고정금리보다 변동금리가 더 낮기 때문입니다고정금리도 큰 폭으로 상승하고 있는 만큼 당장 몇 개월이라도 더 저렴한 이자를 부담하다가 변동금리가 고정금리를 역전하는 상황이 오면 그때 고정금리 상품으로 갈아타는 것도 방법입니다.

 다만 변동금리에서 고정금리로 변경할 때 한도심사를 다시 받아야 한다는 점에 유의해야 합니다. 이 과정에서 대출한도가 낮아질 수 있습니다. 최근 DSR(총부채원리금상환비율)이 확대되고 대출규제가 엄격해졌기 때문입니다. DSR이란 대출을 받으려는 사람의 소득 대비 전체 금융부채의 원리금 상환액 비율을 말합니다. 개인 차주가 상환능력 이상의 무리한 대출을 받지 못하도록 한 대출 안전장치입니다.
 
 아울러 중도상환수수료에도 주의를 기울일 필요가 있습니다. 대출 후 3년 이내 금리 유형을 바꿀 경우 중도상환수수료를 내야 하는데요. 통상 대출금의 1.5% 정도로 산정됩니다. 금리를 갈아타면서 낮아진 이자보다 중도상환수수료가 더 높다면 오히려 내야 할 돈이 불어날 수 있습니다. 배보다 배꼽이 더 큰 격이죠.

 대출 기간을 길게 보고 있다면 고정금리가 더 효과적일 수 있습니다. 코픽스와 연동된 변동금리는 매월 지속적으로 바뀌는 금리를 바로 반영하지만 고정금리는 5년간 금리를 고정합니다. 지금처럼 금리가 들썩이거나 추후 상승이 예상되는 시기에 변동금리형 대출을 덜컥 받으면 미래의 이자 부담이 커질 수 있기에 장기대출자는 고정금리를 많이들 선택합니다.

 최근에는 일정기간 동안 고정금리를 적용하다 변동금리로 바뀌는 혼합형 상품들이 다수 출시돼 있는데요. 고정금리로만 대출 상품을 선택하기에 확신이 모자라다면 혼합형 상품을 활용하는 것도 방법입니다.

It has been my experience that folks who have no vices have very few virtues.

 

 


브라운필드 (Brown Field)

외국인직접투자(FDI) 형태 가운데 이미 설립된 회사를 사들이는 것

 브라운필드 투자는 이미 설립되어 있는 회사를 인수합병(M&A) 하는 것을 말한다. 이는 초기 설립 비용이 들지 않아 저렴하게 인력 및 생산라인의 확장을 꾀할 수 있다는 장점이 있다. 과거 제네럴모터스(GM)가 우리나라 외환위기 이후 대우자동차 공장 생산라인을 그대로 사들여 생산한 것이 브라운필드 투자의 사례이다.


 그린필드 (Green Field)

 외국인직접투자(FDI)의 형태 가운데 투자 대상국의 용지를 직접 매입해 공장이나 사업장을 새로 짓는 방식

 국외자본이 투자 대상국의 용지를 직접 매입해 공장이나 사업장을 새로 짓는 방식의 투자이다. 대표적인 사례로는 현대자동차의 체코 공장과 기아차의 미국 조지아 공장 등이 있다. 그린필드 투자는 신규투자를 함으로써, 신규고용창출, 기술이전 등의 긍정적효과가 있기 때문에 해당국 정부로부터 보조금, 세금감면 등의 혜택을 받을 수 있다는 장점이 있다. 반면 비용이 많이 들고, 생산하기까지 시간이 오래 걸린다는 단점이 있다. 


 카드종류

신용카드, 체크카드, 직불카드

①신용카드는 사용자가 물건을 구매하면 카드회사가 사용자를 대신해 가맹점에 먼저 돈을 지불하고, 사용자는 매월 지정한 날짜에 카드회사에 돈을 갚아야 한다. ②체크카드는 이용 대금이 거래 승인과 동시에 이용자의 계좌에서 즉시 지급 및 결제된다. 계좌의 잔액이 한도 범위 내에서 사용이 가능하지만, 신용 등급에 따라서 소액의 신용한도 금액이 부여될 수 있다. ③직불카드는 자동화기기(ATM)에서 돈을 인출할 때 사용하는 현금카드와 비슷하자만 가맹점에서 물품 및 서비스를 구매할 수 있는 카드이다. 사용자가 가맹점에서 카드를 이용하면 사용자의 계좌에서 자동 인출되어 가맹점 계좌로 자동 입금된다. 


 MRP (Material Requirements Planning)

 재고관리에서 자재소요계획, 종속수요 재고의 발주와 일정계획을 다루기 위해 설계된 컴퓨터 정보시스템

 재고관리 방법은 재고품목의 수요 성질에 따라 이루어진다. 완성제품을 생산할 때 사용되는 원자재, 부품 및 조립부품과 품목 등 완성품의 생산게획에서 바로 계산될 수 있는 품목들은 종속수요(Dependent Demand)라 한다. 예컨대 자동차의 생산에 투입되는 원자재와 부품의 수량은 완성될 자동차의 대수에 의해 결정되기 때문에 종속수요가 된다.

 그러나 완성될 자동차의 수는 어떤 고수준 품목(Higher-level Item)의 수요에 의해 결정될 수 없으므로 독립수요(Independent Demand)가 된다. 독립수요는 질적 변동에 대한 허용치가 정해지면 안정적이지만 종속수요는 무더기(Lumpy)로 발생하는 경향을 띠고 있다. 이에 독립수요 품목은 재고가 계속 유지되어야 하지만 종속수요 품목은 생산공정에서 필요로 하는 시점에 바로 앞서 발주하는게 합리적이다. 

 MRP는 종속수요 재고의 발주와 일정계획을 다루기 위해 설계된 컴퓨터 정보시스템이다. 재고 수준을 합리적으로 하면서 최종 품목을 적시에 완성할 수 있도록 발주 생산 및 조립의 일정계획 수립을 용이하게 하도록 설계된 것이 MRP 시스템이다. 

 MRP의 목적은 ①고객에 대한 서비스의 개선, ②재고투자비용의 절감, ③설비 가동 능률의 개선 등 세가지를 들 수 있다. 


 토빈의 Q (Tobin's Q)

 기업 설비투자가 얼마나 이윤을 창출하는지, 얼마나 자산을 효율적으로 운용하는지 파악하는 지표

 설비투자의 동향을 설명하는 지표로 미국 예일대 토빈 교수가 개발한 개념이다. 기업이 실시하는 설비투자가 얼마나 이윤을 창출하는지에 대한 개념으로 기대 이윤을 설비자금의 조달비로 나눈 것이다. 실제로는 주식의 시가총액과 부채의 합계가 기업의 장래이윤을 반영한 것으로 간주하고 자산의 시가평가액을 설비갱신의 비용이라고 생각해서 양자의 비율을 구하여 산출한다. 이 비율이 1보다 작으면 기업에는 투자할 자극이 생기지 않고 1보다 크면 투자의 자극이 생긴다. 

 토빈의 Q = 기업의 총 시장가치 / 기업의 총 자산가치


 MM 이론 (Modigliani-Miller Theory)

 자본구조이론, F.모딜리아니와 M.H.밀러에 의하여 발표된 기업금융에 관한 이론 

 MM이론의 등장은 자본구조의 개념이 새롭게 등장하는 계기가 되었다. MM 이론은 기업의 가치를 산출하는 데 필요한 할인율을 최소화하는 최적자본구조가 존재하는지에 대한 연구로서 1958년 이론에서는 기업의 가치는 부채의 사용 유무와는 관련이 없음을 보였다. 자본구조의 변경, 즉 부채의 차입 여부는 기업가치와 가중평균자본비용에 아무런 영향을 미치지 못한다는 것이다.

 그러나 1963년 수정모형에서는 법인세를 고려하였을 때 기업의 할인율을 최소로 하는 최적자본구조가 존재하며 이러한 최적자본구조하에서 기업의 가치가 가장 크다는 결론을 내렸다. 기업이 투자계획을 실시함에 잇어서 자기자본(주식)과 부채(사채, 차입금) 등을 이용하여 외부에서 자금(자본)을 조달하게 되는데, 여기에는 각기 자본 코스트가  소요된다. 기업은 이 코스트의 서로 다른 조달방법을 적절히 조합시킴으로써 평균 자본코스트를 최소가 되게 하는 최적의 자본구성을 달성할 수 있다는 것이었다. 하지만 MM 이론을 제시한 밀러는 1977년 균형부채이론을 통해 개인소득세를 고려할 경우 부채사용 유인이 사라지게 되어 다시 최적자본구조는 존재하지 않는다는 주장을 제시하였다. 


 고든 성장모형(Gorden Growth Model)

항상 성장 모형, 일정하게 성장하는 기업의 가치와 주가를 나타내는 모형

 기업의 이익과 배당이 매년 g% 만큼 일정하게 성장한다고 가정할 경우 주식(기업)의 이론적 가치를 나타낸 것으로 고든에 의해서 고안되었다. 이 모형에 따르면 ①성장에 필요한 자금을 내부금융만으로 조달하고, ②기업의 이익과 배당은 일정한 성장률(g)로 영속적으로 성장하며, ③요구수익률(k)가 일정하나 성장률(g)보다는 크고, ④기업 내부 유보율과 배당성향이 일정하다고 가정할 경우 주식(기업)의 내재가치는 다음 기의 예상 배당액(D1)을 요구수익률과 성장률의 차로 나누어 구할 수 있다. 

P = D1 / (k - g)   

P = 주가  ,  D1 = 다음 기의 예상 배당액  ,  k = 주식에 대한 요구수익률  ,  g = 배당성장률


 PR (Public Relations)

 기업이나 단체가 공중의 이해와 협력을 얻기 위해 자신의 태도와 의지를 커뮤니케이션 수단을 통해 설득하는 행위

 PR은 '공중의 이익'과 관련된다는 점에서 광고와 구별된다. 또 PR은 궁극적으로는 상호이익을 도모하기 위한 선의의 설득이라는 점에서 이기적인 목적을 가지고 대상을 설득하는 선전과 다르다. 홍보는 자사와 관계된 뉴스 정보를 언론에 실리도록 하는 일이므로 홍보는 PR에 속하는 활동이다. 

 PR의 종류는 지향하는 목표에 따라 크게 CPR과 MPR로 분류되며 세부적으로는 시행주체 또는 목적에 따라 기업홍보, 정부홍보, 국제홍보, 위기관리 홍보 등이 있다. 

①CPR(Corporate Public Relations)은 소유, 생산, 경영의 주체가 되는 단위로서, 영리를 추구하고 사회적 욕구를 창조하는 조직체의 홍보활동 또는 홍보주체로서 기업이 공중과의 다양한 관계를 통해 기업에 대한 공중의 이해와 호의, 협조를 얻어내기 위한 일련의 커뮤니케이션 활동을 말한다. CI(Corporate Identity)를 수신자가 느끼는 기업의 이미지(Corporate Image)와 일치시키고 공유하여 기업의 투명성을 확보하고 좋은 기업을 넘어 착한 기업으로 인식되는 것을 목표로 한다. 

②MPR(Marketing PR)은 회사와 그 회사의 제품을 소비자의 필요, 요구, 관심, 흥미 등에 맞춘 생각과 정보의 신뢰할 수 있는 전달을 통해 소비자의 구매와 만족을 높이는 프로그램들을 계획, 실행, 평가하는 과정으로 정의된다. 말 그대로 MPR은 마케팅 목표를 달성하기 위한 일련의 PR활동이라 정의할 수 있다. 


쿠르노모형 (Cournot Composition)

과점 기업간의 경쟁모형

 쿠르노 모형은 경제학자 쿠르노가 주창한 과점모형으로, 시장에 두개의 기업이 있는 경우(복점시장)를 분석하는 모형이다. 쿠르노경쟁(Cournot Competition)이라고 불리기도 한다.

 쿠르노 모형의 특징은 다음과 같다. ①시장가격은 독점시장보다는 낮지만, 완전경쟁시장보다는 높다. ②생산량은 독점시장봐는 높지만, 완전경쟁시장보다는 낮다. ③이윤은 독점시장보다는 낮지만, 완전경쟁시장보다는 높다. ④소비자잉여는 독점시장보다는 높지만, 완전경쟁시장보다는 낮다. 

 쿠르노 경쟁하에서는 기업의 이윤이 독점시장보다 낮기 때문에 쿠르노 경쟁을 하는 기업들은 카르텔 형성, 담합, 합병 등을 하려는 유인이 있다. 쿠르노 경쟁하에서는 자유로운 기업의 진입이 사회후생의 증가를 가져온다. 또한 쿠르노 경쟁하에서 경쟁하는 기업의 수가 많을수록 쿠르노 경쟁의 결과는 완전경쟁시장에 가까워지게 된다. 이를 '쿠르노 정리'라고 부르기도 한다. 만약 쿠르노 경쟁하에서 한 기업의 한계비용이 낮아진다면 그 기업의 시장점유율 및 이윤은 높아지게 되고, 다른 기업들의 시장점유율 및 이윤은 낮아지게 된다.


 종가세 (Ad Valorem Duty)

과세대상 물품의 화폐적 가치를 기준으로 하여 부과되는 조세 체계

 출고가격 또는 수입물건 등 과세물건의 금액을 기준으로 세율을 표시하는 조세체계를 말한다. 종가세는 금액으로 표시가 되며, 세율은 백분위로 표시가 된다. 종가세는 인플레이션 상태에서 세수가 증대될 수 있고, 공평과세를 실행할 수 있다는 장점이 있다. 반면에 디플레이션 상태에서는 세수가 감소된다는 단점도 가지고 있다. 관세 중 수출입물품의 가격을 과세표준으로 하는 것을 말하기도 한다. 종가세는 우리나라 세율 결정법의 대부분을 차지하며, 가격에 따라 세금을 메긴다. 

 종가세 적용 물품에 대한 관세 = 과세가격(실제 거래가격 * 과세환율) * 과세환율

💬 내용 요약

인터넷전문은행을 주축으로 형성된 중·저신용자 대상 서민대출 시장에 정부가 확대 참전하기로 방향을 잡았다. 빅테크에서 활용하는 보험가입·세금납부 등 ‘비금융 정보’를 반영한 통합신용평가모형을 개발해 금융정보가 부족한 이들에게도 대출 길을 확대해준다는 계획이다.

29일 금융권에 따르면 서민금융진흥원은 정책서민금융상품 ‘햇살론’에 사용되는 신용평가 시스템을 새롭게 구축 중이다. 올해 신규 부임한 이재연 원장의 ‘1호 지시’로 알려졌다.

서금원이 새롭게 구축하는 통합신용평가모형의 핵심은 비금융정보를 이용한 신용도 평가다. 보험가입 정보, 세금납부(자동이체) 정보, 소액결제 정보 등이 반영된다. 서금원 금융교육이나 부채컨설팅을 이수한 차주에게는 가점을 부여하는 등 정성평가도 이뤄진다. 상환 의지를 객관적으로 평가해 성실하게 빚을 갚지만 정작 정책금융에서는 소외된 ‘씬파일러(금융이력부족고객)’들을 구제한다는 목적이다.

기존 신용평가 시스템은 차주의 금융정보에 의존해 신용 점수를 매겼다. 따라서 상환 의지가 강하다고 해도 금융정보상 연체 이력이 있거나 과거 불찰로 금융질서 문란 정보가 등록되는 등 요건에 미달했다면 대출이 거절됐다.

기존 모형의 이 같은 단점을 보완하기 위해 나온 것이 자체 신용평가모형(CSS)이다. 현재 인터넷은행 3사(카카오뱅크·토스뱅크·케이뱅크)는 은행업권에서 대중적으로 쓰이는 신용평가모형 대신 비금융정보를 활용한 고유의 모형을 사용 중이다. 카카오뱅크 신용평가모형(CSS)의 경우 통신·교통정보를 반영해 인공지능(머신러닝) 방식으로 신용도를 평가한다. 토스뱅크(TSS)는 아르바이트 근무내역, 자영업자 매출정보까지 취합해 신용점수를 매긴다. 네이버·쿠팡 등 빅테크도 빅데이터를 활용해 사실상의 소액대출인 BNPL(Buy now pay later·후불신용결제) 시스템을 시행 중이다.

서금원 관계자는 “정책성 대출일지라도 가장 중요한 것은 상환 능력인 만큼 지금까지는 연체 이력이 있는 등 분들에게는 대출을 내주기 쉽지 않았다”며 “독일 등 선진국의 경우 마을 이장이 성실상환자에 대한 보증을 서주는 등 다양한 방법으로 신용을 평가한다. 갚을 능력이 있는지를 조금 더 심층적으로 바라보고 사각지대를 줄여나가자는 취지로 신규 신용평가모형을 개발하고 있다”고 말했다.

업계에서는 민간 빅테크 기술력을 정부가 받아들임에 따라 금융소외계층에 대한 대출 공급이 더 원활해질 것으로 기대하고 있다. 서금원 통계를 보면 지난해 기준 햇살론15 신청자 26만6592명 중 12만4042명(46.5%)이 금융정보 부족 등을 이유로 탈락했다.

반면 기존 신용평가모형에서 ‘부적합’ 판정을 받은 이들 중 상당수는 인터넷은행 자체평가에서 고신용자로 재평가돼 대출 길이 열렸다. 토스뱅크의 경우 중·저신용자의 26.3%를 고신용자로 재평가했다. 케이뱅크는 중·저신용 고객 대출 승인율이 18%, 씬파일러 승인율이 32% 올랐다.

새 체계가 도입되면 현재 민간은행이 사실상 떠맡고 있는 중·저신용자 대상 대출을 정부도 상당부분 부담하게 될 것으로 보인다. 서금원 통계에 따르면 지난해 기준 햇살론 대출실행액은 1조962억원이었다. 인터넷은행업계(카카오뱅크 1조7166억원·케이뱅크 7510억원)의 중·저신용자 대출실행액 절반에도 미치지 못한다. 이 때문에 일각에서는 정부가 금융소외자에 대한 구제를 은행에 떠넘긴 게 아니냐는 지적이 있어왔다.

김정식 연세대 경제학부 교수는 “현재는 대출기관과 차주 간 정보의 비대칭성으로 인한 부실대출 리스크 문제로 중·저신용자에 대한 대출이 쉽지 않은 상황”이라며 “교통, 납세, 통신 등 비금융정보를 활용해 이 정보격차를 줄이면 이들에 대한 대출 저변을 확대하는 데 도움이 될 것”이라고 말했다.

💭 생각 정리

 카카오뱅크는 2017년부터 은행 영업 시작 이후 쌓아온 카카오뱅크 대출 신청 고객들의 금융 거래 데이터를 분석해 반영한 신용평가모형(CSS)를 적용하고 있다. 대출신청 데이터를 바탕으로 머신러닝 방법으로 개발한 새 신용평가 모형은 신용점수가 낮은 대출신청 고객들의 신용평가 변별력을 높이는 방식으로 설계되어 있어 중금리 이하의 대출을 받는 고객들에게 더 경쟁력 있는 금리와 대출 한도를 제공할 수 있다고 한다.

 개인사업자 등 처럼 금융거래 이력 (4대보험, 국민연금, 신용카드 거래, 대출실적 등)이 없는 씬파일러(Thin Filler) 들의 신용점수를 평가하는데 있어 어려움이 있어 비금융정보를 반영한 통합신용평가모형으로 금융정보가 부족한 이들에게도 대출의 길을 확대해준다는 계획으로 생각할 수 있다. 

 비금융정보란 통신, 전기, 가스요금 납부 이력이나 온라인 구매정보, 포인트 적립정보, 소셜네트워크 서비스 정보, 이메일, 모바일 데이터 등을 활용하여 신용점수를 평가하는 방식을 말한다. 그렇기 때문에 금융거래 이력이 많지 않은 씬파일러들에게도 좋은 금리로 대출을 받을 수 있는 기회가 생긴다는 것이다. 

 이러한 신용평가모델로 정보격차를 줄여 더 많은 중, 저신용 고객에게 대출해줄 수 있게 되었다. 그만큼 대출상품을 이용하는 고객들이 많아진다는 것을 의미한다. 이러한 상황에서 위험도(부도율) 등을 체계적으로 확인하여 각 은행에서도 위험을 관리해야 할 필요성이 있어 보인다. 하지만 고객들의 입장에서는 금리가 상대적으로 높은 2금융권 등에서 대출을 받지 않고 보다 낮은 금리로 1금융권에서 대출을 받을 수 있는 기회가 생겨 가계부채의 부담을 덜어줄 수 있을 것이라 예상한다. 

 

📌 용어 정리  

  • 씬파일러

 금융거래가 거의 없어 관련 서류가 얇은 금융고객을 뜻한다. 다시 말해 신용카드 사용내역, 대출실적 등이 없는 사람을 일컫는 말로 주로 사회초년생이 해당된다. 엄밀하게는 최근 2년간 신용카드 사용내역이 없고, 3년간 대출실적이 없는 이들로, 주로 은퇴자들과 사회초년생들이 해당된다. 이들은 시중은행의 현행 신용등급 평가방식으로는 낮은 등급을 받을 가능성이 높아 저금리 대출을 받기란 사실상 거의 불가능하다. 

  • BNPL(Buy now pay later·후불신용결제) 시스템

 '선 구매 후 지불' 을 의미하며, 물건을 구매할 당시 현금을 결제하는 것이 아닌, 물건을 구매한 이후 정해놓은 날짜에 맞춰 자동으로 결제되는 방식입니다. 신용카드와 다른 점은 할부결제에도 수수료가 발생하지 않는다는 점이다. 

  • 신용평가모형(CSS) [개인신용평가시스템]

 과거 일정 기간 축적된 고객의 신용거래 행태 등의 정보를 현재 시점에서 통계적으로 분석해 가까운 미래의 고객 신용도를 예측하는 선진국 개인신용평가 기법 또는 대출심사제도를 말한다. 영문 머리글자를 따서 CSS로 약칭하기도 한다. 이미 개발된 모형을 가지고 시스템을 구축해 효율적인 위험관리는 물론, 시스템 심사를 통한 경비절감과 합리적인 의사결정, 신속하고 일관성 있는 심사지원을 통한 고객만족 실현을 목적으로 도입하였다.
 
 평가 내용은 개인신상 정보, 거래실적 정보, 신용거래불량 정보, 신용한도·신용소진·연체 등이 없는 신용거래 내역 등이다. 이를 통해 얻어진 신용평점이 높으면 신용위험이 적은 우수고객, 낮으면 연체 등 불량을 일으킬 위험이 상대적으로 높은 위험고객으로 분류된다. 이렇게 평점이 정해지면 평점의 높고 낮음에 따라 대출한도 및 이자율을 차등화함으로써 위험을 사전에 예측하고 위험관리와 수익성을 제고할 수 있다는 장점이 있다.

  • 비금융정보

 새로운 통합 신용평가모형에서 사용되는 정보로 개인이 일상생활에서 이용하는 핸드폰요금, 수도세, 전기세, 국민연금, 건강보험 등의 납입정보를 포함하며 SNS 사용이력이나, 이메일 등의 정보도 포함되기도 한다. 

 

[출처]

https://news.kmib.co.kr/article/view.asp?arcid=0017127155&code=61141111&cp=nv

https://www.mk.co.kr/dic/

 

Idleness is not doing nothing,
Idleness is being free to do anything.

 


후입선출법 (LIFO, Last-In First-Out)

 나중에 입고된 물품을 먼저 불출하는 방법

 재고자산의 물리적 흐름과는 상관없이 나중에 사들인 상품이 먼저 판매된다고 가정하는 방법이다. 이 방법을 따르면 기말재고액은 오래 전에 매입한 재고자산의 매입원가로 기록되고 매출원가는 최근의 매입원가로 기록된다. 후입선출법은 최근의 원가와 현행수익을 대응시킴으로써 수익, 비용의 대응이 적절하게 이루어지고, 물가 상승으로 인해 매출원가가 높게 계상되면 당기순이익이 작아지게 되므로 세금을 적게 낼 수 있는 절세 효과를 기대할 수 있으나 손익 왜곡이 발생할 수 있다.


매출원가 (Cost of Goods sold)

 기업의 영업 활동에서, 영업수익을 올리는 데 필요한 비용

 매출원가는 상기업의 경우 상품의 구입과 관련된 원가이며, 제조기업인 경우는 판매된 제품을 생산하는 데 소요된 재료비, 노무비, 그리고 경비로 이루어진 제조원가를 말한다. 매출원가는 매출을 올리기 위해 사용 및 소비된 자원인 비용 중에서 가장 큰 비용이다. 매출액에서 매출원가를 빼면 매출총이익이 산출된다. 매출원가는 기업의 장기경쟁우위를 판단하는 데 중요한 지출인 매출총이익에 영향을 준다.

 매출원가 = 기초재고액 + 당기매입액 - 기말재고액


 명목임금 (Nominal Wage)

 근로자들이 일한 댓가로 받는 임금을 화폐 단위의 금액으로 표시한 것

 명목임금은 물가의 상승을 고려하지 않고 현재 돈을 기준으로 임금을 표시한 것이다. 일반적으로 명목임금은 단순한 임금수준의 명목적 척도를 나타내는 용어이다. 명목임금으로는 근로자의 보수가 높은지 낮은지 알 수 없어 명목임금을 그 당시의 물가지수로 나누어 명목임금의 실제구매력을 볼 필요가 있는데 이를 실질임금이라고 한다.


 스톡옵션 (Stock Option)

 주식매수선택권, 기업의 임직원에게 일정 기간이 지난 후에 자사의 주식을 미리 약정한 가격에 살 수 있는 권리를 부여하는 것

 스톡옵션은 자사의 주식을 싼 값으로 살 수 있도록 보장해줌으로써 직원들의 근로의욕을 북돋는 일종의 보상제도이다. 스톡옵션은 회사의 경쟁력 향상을 지원하기 위한 제도이며, 자본이 부족한 중소기업도 쉽게 고급인력을 확보할 수 있다는 장점이 있다. 

 스톡옵션을 부여받은 사람은 일정한 시점이 지난 후 회사의 주식을 약정한 가격으로 구매할 권리를 갖는다. 해당 기업의 주가가 상승하면 이 권리르 행사하여 주식을 구매하고, 이 주식을 시가에 매각하여 이익을 볼 수 있다는 점에서, 회사의 가치를 높이는 일이 개개인에게도 도움이 되는 제도이다. 


 어음 및 수표 이득상환 청구권

 어음이나 수표에 대한 권리가 절차상의 흠 때문에 소멸되었거나 소멸 시효가 지났더라도 해당 어음이나 수표의 소지인이 실질적인 이득을 본 채무자에게 그가 받은 이익의 한도 내에서 상환할 수 있는 것을 청구할 수 있는 권리

 어음채무의 시효가 완성되거나 상환청구권의 보전절차를 밟지 못하여 상환청구권이 소멸된 경우에 발행인, 배서인과 같은 상환청구 의무자는 이득을 얻고 있다고 할 수 있다.  이 경우에 어음권리자는 이러한 이득을 일정한 요건이 충족되는 경우에는 상환받을 수 있고 이것을 이득상환청구권이라고 한다. 

 일반적으로 '어음법' 이 정하고 있는 배서인, 환어음 및 수표의 발행인에 대한 상환청구권은 엄격한 요건에 의해 인정되고 있다. 이득상환청구권의 인정근거는 '어음법'상 권리행사를 위한 요건의 엄격성 때문에 발생하는 어음권리자들의 불이익을 구제하기 위해서이다.

 특히 어음행위의 이면에는 그 원인관게가 존재하는 것이 일반적이기 때문에 비록 어음상의 권리가 모두 소멸했다고 하더라도 원인 관계에 의한 채권 및 채무관계는 여전히 남아있다고 할 수 있고, 이에 근거하여 발행인, 배서인 등이 가지는 이득의 반환을 청구하는 것이다.


 임의적립금

회사가 정관의 규정, 또는 주주총회의 결의에 의하여 임의로 적립하는 준비금

 잉여금 내의 당기 미처분이익 또는 당기 미처분손실을 제한한 것을 임의적립금이라고 한다. 임의준비금의 폐지 변경 사용 등도 적립의 경우와 같이 정관의 변경 또는 주주총회의 결의에 의하여 자유롭게 할 수 있다.

 이용 먹적에 따라 ①사업의 영구적 확장을 목적으로 하는 것(감채적립금, 신축적립금, 사업확장적립금) ②장래의 손실에 대비하는 것(임원퇴직적립금, 우발손실적립금, 진부화적립금) 그리고 배당의 평균을 목적으로 하는 것(배당평균적립금)과 ③목적을 한정하지 않는 것으로서 별도적립금이 있다. 또한 임의적립금은 그 설정목적을 달성 후 소멸하느냐, 안하느냐에 따라 ①적극적 적립금과 ②소극적 적립금으로 구분된다.


 분식회계

 재무상태를 고의로 조작하는 회계

 '분식'의 사전적 의미는 '실제보다 좋게 보이도록 거짓으로 구미는 것'을 의미한다. 가공의 매출을 기록한다든지 비용을 적게 계상하거나 누릭시키는 등 기업 경영자가 결산 재무제표상의 수치를 고의로 왜곡시키는 것이다. 특히 관계회사를 통한 매출액을 이중으로 계상하거나 위장계열사 거래 내역을 조작하는 것이 자주 발생하는 분식회계 사례이다. 분식회계는 불황기에 회사의 신용도를 높여 주가를 유지시키고 자금 조달을 용이하게 할 수 있으나 주주, 하도급업체, 채권자 등에 불이익을 줄 수 있다. 회사의 재무상태를 거짓으로 좋게 만들어 투자자나 채권자들의 판단을 흐리게 할 수 있어 엄격히 금지되어 있다.


 IFRS (International Financial Reporting System)

 국제회계기준, 기업의 회계 처리와 재무제표 에 대한 국제적 통일성을 높이기 위해 국제회계기준 위원회에서 마련해 공표하는 회계기준

 일반적으로 인정되는 회계기준(GAAP, Generally Accepted Accounting Principles) 중의 하나로서, 국제 민간회계사 단체인 국제회계기준위원회(IASB, International Accounting Standards Board)에 의해 작성, 공표되는 국제회계기준이다.

 대한민국은 2007년 '국제회계기준 도입 로드맵'을 발표하였고 2009년부터 국내의 상장기업에 도입하기 시작하였으며, 2011년부터 IFRS 기준에 따라 일반 상장기업과 금융회사를 중심으로 IFRS를 도입하였다.


WACC (Weighted Average Cost of Capital)

 가중평균자본비용, 기업의 총 자본에 대한 평균조달비용을 말한다.

 기업이 현재 보유중인 자산을 활용하여 자사의 주식 가치를 유지하기 위해 벌여들여야 하는 수익률을 의미한다. 이것은 기업가치 극대화를 위한 투자결정과 자금조달결정의 기준이 되어 기업의 재무적 의사결정에 있어 가장 중욯나 변수가 된다. 한편, MM이론(모딜리아니-밀러 이론)의 법인세 존재 가정에 따르면, 부채로 인한 절세효과가 있다는 것을 알 수 있다.

WACC = (자기자본비용 * 자기자본비중) + (타인자본비용 * 타인자본비중)


DART (Data Analysis, Retrieval and Transfer System)

전자공시시스템

 금융감독원에서 운영하는 전자공시시스템(DART)은 상장법인 등이 공시서류를 인터넷에 제불하면 투자자 등 누구나 인터넷으로 관련 정보를 조회할 수 있도록 마련된 종합적 기업공시시스템이다. 기업의 사업내용, 재무상황, 경영실적 전반을 담은 사업보고서 등을 열람할 수 있고 증권의 공모발행을 위한 증권신고서, 투자설명서, 증권발행실적 보고서 등을 검색할 수 있어 어떤 증권들이 발행되고 있고 해당 증권의 특징은 무엇인지 파악할 수 있다. 


 사내유보금

 이익잉여금 + 자본잉여금

 이익잉여금은 기업이 벌어들인 이익에서 배당 등을 하고 남은 것이고, 자본잉여금은 액면가 초과 주식 발행 등 자본거래에서 생긴 차익이다. 이들의 합을 사내유보금이라 한다. 현금이라는 인식기 악ㅇ하지만 현금외 항목도 많다. 참고로, 주자에 대한 배당금, 임원 상여금, 세금 등의 지불을 사외유출이라고 한다.


 이익준비금

 기업에 유보되는 이익 중 법률에 의하여 강제로 적립되는 법정준비금

 매 결산기마다 현금에 의한 배당액의 1/10 이상을 발행주식자본금의 1/2에 달할 때까지 적립해야 하는 법정적립금이다. [상법]의 규정에 의하여 적립되기 때문에 강제적립금이라고도 하며, 결손에 보전하거나 자본금에 전입하는 것 이외에는 처분하지 못한다. 자본의 1/2을 초과하여 적립한 금액은 임의적립금으로 취급된다. 

  • 이익준비금 당기적립액 >= [순자산액 - (자본액 + 법정준비금액)] * 1/11
  • 이익준비금 당기적립액 >= [(순자산액 - 자본액) - 특정이연자산액] * 1/10

 이부가격제 (Two-Part Tariff)

 기업이 가입비와 사용료 두 가지 가격을 동시에 부과하는 가격정책

 독접기업들이 이윤을 극대화하기 위하여 쓰는 가격정책으로 기업이 가격 설정 시 가입비와 사용료 두 가지 가격을 동시에 부과하는 것을 의미한다. 놀이공원의 입장료와 놀이기구 탑승요금, 휴대폰의 기본요금과 사용요금 등이 이부가격제에 속한다. 미국 로체스터대학교의 윌터 오아이 교수가 1971년에 디즈니랜드의 입장료와 놀이기구 탑승요금 설정에 대해 연구하면서 널리 알려졌다. 독점기업의 가격정책에는 이외에도 소비자를 그룹으로 나누어 요금을 부과하는 가격차별, 시점에 따라 요금을 달리 부과하는 가격차별 등이 있다.


 감가상각비

 기업이 사용하는 기물과 설비의 소모되는 가치를 반영하는 비용

 제품이나 서비스 등을 생산하면서 기물, 설비가 노후한 만큼의 가치를 제품생산원가에 포함시킬 목적으로 계산한 비용을 말한다. 

 감각상각비 계산방식은 직접법과 간접법 두 가지가 있다. 직접법은 감가상각액을 해당 고정자산계정에 넣는 방식이며, 간접법은 해당 고정자산계정은 원래대로 두고, 감각상각충당금 비용계정을 만들어 기입하는 방식이다. 회계상으로 반영할 때는 일반적으로는 정액법, 정률법, DDB(Double Declining Balance)등을 사용한다.


 매몰비용

 어떤 선택의 번복 여부와 무관하게 회수할 수 없는 비용

 의사결정을 하고 실행을 한 이후에 발생하는 비용 중 회수할 수 없는 비용을 말하며 함몰비용이라고도 한다. 매몰비용의 오류는 실패한 사업을 당장 멈추는 것이 더 이익이라는 것을 알고 있음에도 불구하고 이미 투자한 비용이나 노력, 시간 등이 아까워서 심리적으로 이를 정당화하거나 사업을 지속하는 오류를 말한다. 이를 '콩코드 오류' 라고도 한다. 콩코드 초음속 여객기는 경제성 부족이 인지되었지만 막대한 사전 투자비ㅛㅇㅇ 때문에 무리하게 사업이 지속돼 막대한 매몰비용을 낳았기 때문이다.

 여러 프로그래밍 언어들에서 사용되는 함수 인수 전달방식에는 크게 3가지로 구분된다. 

  1. Call By Value
  2. Call By Reference
  3. Call By Object Reference

 

Call by Value

 함수에 인수를 전달하는 방식으로 변수의 값을 복사해 함수의 인자로 전달한다. 따라서, 함수 내에서 전달된 인자를 조작해도 함수 외부의 변수에는 영향을 미치지 않는다. C언어에서 이러한 함수인수전달 방식을 사용한다. 

 

Call by Reference

 함수에 인수를 전달하는 방식이다. JAVA언어나 C언어의 포인터로 함수의 인자에 전달하는 방식이 Call By Reference 같은 방식이다. 변수가 가리키는 주소값을 함수의 인자로 전달하게 된다. 그렇기에 함수 내에서 전달된 인자를 조작하면 함수 외부에 있는 원본 변수의 주소값에 있는 값을 바꿀 수 있다. 따라서, 함수 내에서 변경된 사항이 함수 외부에도 영향을 미치게 되는 것이다. 

 

Call by Object Reference

 파이썬은 Call by Value 같기도.. Call by Reference같기도 하다.. 결론부터 정의하자면 어떠한 데이터를 매개변수로 넘기는지에 따라 달라지는 것이라고 볼 수 있다. 

 파이썬은 모든 것이 객체이기 때문에 immutable(불변)한 자료형을 넘긴다면 Call by Value가 되는 것이고, mutable(가변)한 자료를 넘긴다면 Call by Reference가 되는 것이다. 그렇기 때문에 파이썬은 Passed by Assignment라고도 한다 ! 

 python에서 변수를 선언할 때, a="galaxy"라는 선언문이 있다고 생각해보자. 선언문이 실행되면 "galaxy"라는 문자열 객체가 생기고, 그 객체에 대하여 a라는 이름표를 붙이게 된다. 즉, python에서 변수는 위에서처럼 특정 메모리 공간을 할당받은 컨테이너 개념이 아니라, 어떤 객체에 붙여진 이름표일 뿐이다.

 물건에는 위치가 존재할 수 있다. 예를 들어 갤럭시워치을 남영역 31번 사물함에 숨겨뒀다면 "갤럭시워치"은 객체, "남영역 31번 사물함"은 갤럭시워치의 위치, 즉 주소 값이 된다. 그러나 갤럭시워치에 붙여진 이름표, 즉 변수에 대해서도 위치(주소값)를 지정해 두지는 않는다. "갤럭시워치"에는 여러 가지 이름표(변수)가 붙어있을 수도 있다. 예를 들어 해당 인형에 "호준이의 갤럭시워치", "복학생의 갤럭시워치"등의 여러 이름표가 붙어있다고 하자. 이때 변수"호준이의 갤럭시워치"의 주소 값(위치)과 변수"복학생의 갤럭시워치"의 주소 값(위치)은 객체 "갤럭시워치"의 주소 값(위치)으로 같다.

 다시 Call by object-reference이야기로 돌아가자면, python에서는 global인지 local인지 영역에 따라 변수들의 정보를 저장하는 namespace가 따로 있다. 즉, 전역 변수를 함수에서 인자로 받아오더라도 함수 내에서는 지역변수(이름표)에 불과하다. 함수 내에서 이름표를 떼서 다른 객체에 붙인다고 하더라도, 그 이름표는 함수 내에서만 사용하는 이름표일 뿐이다. 결국 함수 호출이 끝나면 전역 변수(이름표)가 여전히 그 객체에 붙어있다.

 예를 들어 list 1 = [1,2,3,4] 일 때, 함수 내에서 list 1을 [5,6,7,8]이라는 새로운 객체랑 binding 한다고 해도 함수 호출이 끝나면 list 1은 그대로 [1,2,3,4]이다.

 주의할 점은 이름표(변수)만 떼고 붙이는 것이 아니라, 이름표가 붙여진 물건(객체)의 구성품을 직접 조작하는 경우이다.  예를 들어 위의 예시와 같이 list 1 = [1,2,3,4] 일 때, 함수 내에서 list 1이라는 이름표가 붙여진 객체 [1,2,3,4]에 대하여  list 1 [0] = 5 이와 같이 객체 내의 요소(element)를 조작할 수 있다.

이 경우에 함수의 호출이 끝나서 지역 이름표가 전역 이름표로 바뀐다고 하더라도 객체가 변한 상태이므로 list 1은 [5,2,3,4]가 된다.

"복학생의 갤럭시워치" 이름표가 붙은 갤럭시워치의 끈을 초록색으로 염색했다면

"호준이의 갤럭시워치" 이름표가 붙은 갤럭시워치의 끈도 초록색인 게 당연하지 않겠는가?

(하나의 갤럭시워치에 두 개의 다른 이름표가 붙어있으므로)

 

 이때, 객체 자체를 바꾸려면 당연히 객체가 mutable, 즉 가변적인 포맷이어야 한다. 따라서 Call by object-reference 방식은 immutable 한 포맷의 객체(tuple 등)는 변경할 수 없지만, mutable한 포맷의 객체(list, dictionary, 직접 만든 클래스 등)는 변경할 수 있다는 특성을 갖는다.

'Python 프로그래밍' 카테고리의 다른 글

[Python] Coroutine  (0) 2022.06.02
[Python] Future  (0) 2022.06.01
[Python] mutable과 immutable  (0) 2022.05.26
[Programming] 암호화 알고리즘 (Encryption Algorithms)  (0) 2022.05.22
[Python(Web)] Robots.txt  (1) 2022.05.21

+ Recent posts