이진 거래의 장점

마지막 업데이트: 2022년 7월 23일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
그렇다면 이러한 문제는 어떻게 해결할까?
→ 구성 (Composition) 을 통해 해결

수익률 극대화를 위한 최적의 포지션 사이징 전략

여러분이 개인투자자이고 유동성의 제약이 없다면, 수익률을 극대화하기 위해 한 포지션에 많은 자금을 집어넣어 집중투자의 효과를 누려야 합니다. 하지만 포지션의 규모가 너무 크다면 과도한 리스크를 떠안게 됩니다. 포지션 규모가 너무 작고 분산투자를 하게 된다면 뛰어난 실적을 낼 수 없습니다. 그 사이 어딘가에 반드시 여러분만의 최적화된 포지션 사이즈가 있습니다.

포지션 사이징 전략은 최고의 퍼포먼스를 위한 '최대 벳 사이즈'를 찾는 것에서 시작됩니다. 그리고 '최대 벳 사이즈'는 여러분이 감당해야 할 최대 리스크와 포지션의 최대 보유 갯수를 결정합니다. 아래의 가이드라인을 봅시다.

① 거래당 최대 손실액은 계좌의 1.25% - 2.50% (Risk of Total Equity)

④ 한 이진 거래의 장점 이진 거래의 장점 개의 포지션의 최대 사이즈는 계좌의 25%

(1) 1.25% - 2.50% Risk of Total Equity

: '리스크 비율 고정 전략'이라는 이름으로 소개되고 있는 이 개념은 자금 관리 기법에 관심이 있는 트레이더들에게 끊임없이 인용되고 있는 전략입니다. 이 전략은 한 거래에서의 최대 손실액을 '계좌의 n%'로 제한하여 자신의 리스크 수준을 감정의 개입 없이 손쉽게 통제할 수 있도록 도와줍니다.

예를 들어 1억 원의 계좌를 운용할 때 최대 손실액을 계좌의 1%로 결정했다면, 거래당 최대 손실액은 1억의 1%인 100만 원이 되는 것입니다. 이 전략은 지금까지 다양한 시뮬레이션을 통해 수학적인 최적화와 설정값에 따른 리스크 수준이 연구되어 왔습니다. 일반적으로 거래당 리스크가 '1~2% risk of total equity' 사이일 때 가장 효율이 높은 것으로 알려져 있습니다.

계좌의 규모나 공격성에 따라 0.5% 또는 4%로 설정하는 경우도 있습니다. 그러나 '리스크 비율 고정 전략'을 완벽하게 이해하기 위해서는 이 전략이 말 그대로 리스크 비율(%)을 고정하고 있다는 사실을 명심해야 합니다. 비율이 고정되어 있다는 말은 계좌의 규모가 커질수록 진입 사이즈가 커지며, 계좌의 규모가 작아질수록 진입 사이즈가 작아진다는 것을 의미합니다. 돈을 벌수록 배팅액을 키우고 돈을 잃을수록 배팅액을 줄이도록 설계되어 있습니다. 이는 수익률에 매우 큰 영향을 줍니다.

리스크 비율을 높게 설정할수록 기대 수익률은 극단적으로 올라갑니다. 1%에서 2%로 상향조정하면 기대 수익률은 거의 2배가 증가합니다. 그리고 파산확률도 2배가 증가합니다. 만약 모든 거래에 4%를 초과하는 리스크 비율을 적용한다면 반드시 파산하게 되어 있습니다. 훈련된 거래자가 아니라면 2%도 매우 위험한 수치입니다.

또한 리스크 비율이 높을수록 집중투자가 되고, 비율이 낮을수록 분산투자를 하게 됩니다. 최적의 포지션 사이징을 위해 리스크 비율을 1% 안팎으로 조절하는 것을 권유하며, 가장 공격적일 때 최대 1.25~2.50% 사이의 비율을 초과하지 않는 것이 좋습니다.

(2) 최대 손절폭, 평균 손절폭

: 포지션 사이징과 손절매 전략은 리스크 관리 측면에서 매우 밀접하게 연결되어 있습니다. 왜냐하면 손절 범위에 따라 포지션 사이즈가 달라지기 때문입니다. 제가 제안하는 최대 손절 범위는 10%입니다. 그 이상의 변동성을 허용하게 되면 손익비율을 계획적으로 통제할 수 없고 약간의 연속 손실만으로 계좌는 큰 피해를 당하게 됩니다.

만약 1억 원의 계좌에서 리스크 비율을 계좌의 2.5%로 잡고 최대 250만원의 손실을 감수하려고 한다면, 손절폭이 10%일 때 진입 사이즈는 2,500만원(=25%)이 최대 규모입니다. (그림1)

image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

그러나 능숙한 트레이더는 최대 손절폭을 거의 허용하지 않습니다. 손절폭은 매입하려는 주식의 변동성에 따라 매번 다르게 설정해야 하며, 일반적으로 -5%~8% 사이에서 손실을 잘라내는 것이 이상적입니다. 그리고 주식이 내 진입 방향과 반대로 움직이면 계획보다 더 일찍 빠져나오거나 분할 손절매 전략을 사용하기도 합니다. 드물게 갭하락이 발생하여 최대 손절범위를 넘기는 것을 포함해서 평균적인 손절 범위는 약 5%에 수렴하게 됩니다. 는 동일한 진입 사이즈에 평균 손절폭(약 5%)을 적용하여 리스크 범위를 다시 계산한 것입니다.

image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

이렇듯 25%의 포지션 사이즈로 진입하게 되면 최대 리스크 비율인 1.25% ~ 2.50%를 맞출 수 있게 됩니다. (각각 손절폭 5%, 10%) 즉 최대 리스크 비율 = 최대 포지션 사이즈입니다. 포지션 사이즈, 손절폭, 리스크 비율은 시소처럼 서로에게 영향을 줍니다. 예를 들어 리스크 비율을 고정하면 손절폭과 포지션 사이즈가 움직입니다. (그림3)


하지만 우리는 손절폭의 '평균'이 5~6%로 거의 고정된다는 사실을 알아보았기 때문에, 고려해야 할 요소는 포지션 사이즈와 리스크 비율을 시장 상황에 맞게 조절하는 것입니다. 이는 마지막 파트인 '점진적 노출 전략'에서 자세히 이야기할 것입니다.

image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

: 리스크 비율과 손절폭은 포지션 사이즈에 영향을 주고 포지션 사이즈는 포지션 갯수에 영향을 줍니다. 각 포지션의 최대 사이즈가 25%라면 계좌 전액을 모두 시장에 노출시켰을 때 총 4개의 포지션을 보유하게 됩니다. (25% x 4개 = 100%)

이 형태는 리스크를 안전 범위 안에 두면서 가장 공격적인 포지션을 구축할 수 있는 집중투자 방법 중 하나입니다. 이 경우 각각의 포지션의 최대 손실액이 계좌의 1.25%~2.50%이므로, 보유 포지션이 모두 스탑아웃 됐을 때의 총 포트폴리오 리스크는 5%~10%입니다. 전체 계좌의 5~10% 정도가 위험에 노출되는 것입니다. 한 셋트 당 MDD가 10% 이하인 것은 결코 높은 수치가 아닙니다. 10% 손실을 복구하기 위한 수익률은 약 11%입니다. 50% 손실을 복구하기 위한 수익률이 100%인 것을 감안하면 고마운 수치인 것이죠.

25%의 포지션 사이즈는 '최대 벳 사이즈'입니다. 주식 시장에선 장세에 따라 자신의 전략이 효과적일 때가 있고 효과가 없을 때가 있습니다. 항상 최대 사이즈로 배팅할 필요는 없습니다. 매번의 진입마다 최대 금액을 배팅하는 것은 가장 위험한 투자 방법 중 하나입니다. 최적의 포지션 사이즈는 수익률을 극대화하기 위한 가장 공격적인 방침일 뿐입니다. 2020년과 같은 강세장에서 이런 전술은 매우 높은 수익률을 보장합니다. 그러나 시장 상황이 좋지 않다면 1/2포지션, 1/4포지션 등 여건에 맞는 배팅을 해야 합니다.

리스크 감수성은 사람마다 다릅니다. 리스크를 허용할 수 있는 범위와 전략도 모두 다릅니다. 누군가에게 25% 사이즈는 아무리 최대 사이즈라고 해도 너무 크게 느껴질 수 있습니다. 가족 계좌를 운용해야 하거나, 계좌 사이즈가 수백억 원에 달한다면 25%는 적합한 규모가 아닙니다. 리스크를 더 적극적으로 방어해야 하는 사람들은 리스크 비율을 0.5% 이하로 낮추고 12~20개의 포지션에 분산투자하는 것이 유리할 수 있습니다. 손절 범위가 좁은 데이 트레이더는 50%~100% 규모의 포지션을 구축할 수 있고, 진입 이후 몇분 내에 빠져나와야 하는 스캘퍼는 신용거래를 활용해 200%~400% 규모의 포지션을 움직여야 할 수도 있습니다. 중요한 것은 환경에 따라 자기만의 최적의 포지션 사이징을 찾는 것입니다.

2. 포트폴리오 노출(Portfolio Exposure)

지금까지 개별 포지션의 최대 진입 규모와 리스크 범위를 이야기했습니다. 이제는 한 발짝 뒤로 물러서서 전체 포트폴리오의 위험 노출과 위험 수준을 관리하는 방법을 살펴볼 것입니다.

25% 포지션은 '최대 벳 사이즈'일 뿐 매번 그렇게 투자해서는 안 된다는 말을 했었습니다. 최대 규모로 배팅하는 것이 제한적이고 기회주의적이라면, 총 자본을 시장에 노출하는 비중도 적절하게 조정되어야 합니다. 매월 전액투자를 할 수는 없는 법입니다.

최적의 포지션 사이즈가 25%이고 최적의 포지션 보유갯수가 4개라는 전제를 바탕으로, 포트폴리오 노출 비중을 총 4개의 층위로 나눌 것입니다. (그림 4)


image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

이것으로 알 수 있는 사실은 투자 비중 25%당 평균 리스크가 계좌의 1.25%라는 것과, 전액을 투자했을 때 기대 수익률이 최소한 5%를 넘겨야 한다는 것입니다. 왜냐하면 위험보다 보상이 더 커야 하기 때문입니다. 만약 모든 거래의 손실제한주문을 최대 손절폭인 10%로 설정했다면 전액 투자는 총 포트폴리오를 10%의 위험에 빠뜨릴 것이고, 이를 극복하기 위해서는 20% 이상의 수익률을 기대해야 합니다(손익비율 2:1 기준). 이는 쉬운 일이 아니죠. 그래서 손실을 빨리 자를 수 있을 때 손절매를 실행해서 평균 손실폭을 낮추는 것이 중요합니다.

다음은 세부적인 요소를 봅시다. 만약 현금 상태에서 주식 비중을 25%로 증가시키고 싶을 때 몇 개의 포지션을 보유하는 것이 좋을까요? 와 같이 여러 방식으로 조합할 수 있지만 역시 가장 중요한 것은 각자의 리스크 감수성과 환경입니다. 현재 시장 환경에 대해 확신이 있고 리스크를 충분히 감수할 수 있다면 25% 포지션 한 개를 보유해도 됩니다. 만약 이진 거래의 이진 거래의 장점 장점 그렇지 않고 보수적으로 접근하고 싶다면 포지션을 쪼갠 뒤 더 다양한 주식을 매수해서 시장의 온도를 테스트해볼 수 있습니다. 제가 권유하는 것은 후자입니다. 이 내용은 다음 파트에서 자세히 이야기합니다.

image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

3. 점진적 노출 전략

- 추운 겨울날 샤워를 한다고 상상해봅시다. 수도꼭지를 온수 방향으로 돌려놓고 물을 틉니다. 샤워기에서 물이 콸콸 흘러나오고 있습니다. 추운 겨울입니다. 이때 가장 먼저 하는 행동은 물줄기에 손가락을 대보는 일입니다. 물의 온도를 체크하기 위해서죠. 자신의 몸을 지키기 위한 본능적인 행동인 것입니다. 온도를 확인하지도 않고 한겨울 발가벗은 전신에 물을 끼얹는 사람은 바보인 것이 분명합니다.

잠깐의 사소한 몸서리도 치기 싫어서 이와 같은 행동을 하는데, 위험도가 훨씬 높은 주식 시장에서는 왜 그런지 모르게 안전불감증이라도 걸린 것 같습니다. 샤워기 물줄기에 대어 본 손가락이 따뜻하지 않으면 몸에 끼얹어 봐도 따뜻하지 않습니다. 마찬가지로 25%의 주식 비중으로 수익을 낼 수 없다면 50% 투자를 해도 수익을 낼 수 없습니다. 75%, 100% 투자로 뛰어들 이유는 더더욱 없습니다.

최적의 '최대 포지션 사이즈'가 25%라는 것을 알아냈다면 이번에는 '테스트 포지션 사이즈'를 결정해야 합니다.
우선 현금 상태에서 다시 시장에 진입할 때는 전체 자본의 25% 이하만 위험에 빠뜨리는 것이 좋습니다. 아무 포지션도 없이 현금만 가지고 있었다는 것은 그동안 장세가 악화되고 있었기 때문일 겁니다. 다시 투자하기로 결정했다고 해서 시장이 좋아질 거라는 보장은 없습니다. 온도를 확인하기 위해 손끝 발끝부터 먼저 대봐야 합니다.

위의 에서 설명한 바와 같이, 포트폴리오 노출이 25%일 때 개별 포지션의 사이즈를 결정하기 위한 여러가지 옵션이 있음을 알 수 있습니다. 가이드라인은 5% 사이즈의 개별 포지션을 5개 이하로 매수하는 것입니다. 설명을 위해 5% 포지션 5개를 매수했다고 가정한 뒤 을 봅시다.

image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

4회를 실패했다는 것은 5% 포지션 5개가 모두 스탑아웃 되고 이 행동을 4번 반복했는데 모두 실패하여 총 20번의 연속 손실을 겪는다는 뜻입니다. 최악의 상황을 가정한 것입니다. 테스트 포지션으로 시장에 진입하는 경우 20회의 연속 손실을 겪어도 최대 드로다운은 5%밖에 안 됩니다. 최대입니다. 앞서 말했듯 리스크 비율 고정 전략은 돈을 잃을수록 배팅액이 작아져서 연패를 할 경우 손실액은 점점 줄어들게 됩니다.

또한 테스트 포트폴리오의 첫 셋트가 실패하게 되면 다시 현금으로 돌아가는 것이 좋기 때문에 5%의 계좌 손실을 볼 확률은 낮습니다. 헐값에 시장의 온도를 체크할 수 있는 셈입니다.

(2) 최대 벳 사이즈로 가기 위한 빌드업

- 테스트 포지션으로 수익이 발생할 경우 너무 적게 배팅한 것을 후회하는 마음이 들지도 모릅니다. 그러나 이런 마음가짐은 또다시 투자자를 '발을 담가보기도 전에 다이빙부터 하는 바보'로 만듭니다. 물이 차가운 것 같다면 발을 먼저 넣고 다리, 허리, 상체 순으로 천천히 입수해야 합니다.

우리의 목표는 최고의 마켓 컨디션에서 최대 규모의 배팅을 하는 것입니다. 기회가 오기도 전에 칩을 잃을 수는 없습니다.

"수익성이 있을 때 사이즈를 키우고, 수익성이 없을 때 사이즈를 줄이세요."

작은 성공은 큰 성공을 부릅니다. 점진적 노출 전략의 핵심은 작은 수익을 쌓아 큰 배팅을 하는 것입니다. 작은 포지션에서 발생한 수익을 다음 배팅의 리스크로 조달(Financing Risk)하는 것이죠. 은 전략의 개요를 설명합니다.

image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

의 목표 손익은 설명을 위한 예시입니다. 이와 같이 점진적 노출은 'Risk Free' 상태가 되어 계속해서 더 큰 포지션으로 넘어가는 것입니다. 비대칭적인 레버리지 효과를 발생시키죠. 의 세 번째 트레이드는 손실로 마감했지만, 만약 세 번째 트레이드마저 성공했다면 총 손익은 50+100+200 = 350만 원이 되어 20% 포지션 3개를 구축할 수 있습니다. (그림 8)

image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

이렇듯 리스크를 계속 제거하며 비대칭적인 레버리지 상태를 만드는 것이 수익률을 극대화하는 가장 좋은 방법입니다. 마지막으로 는 점진적 노출 전략이 최대 포지션 사이즈를 구축하는 과정을 나타냅니다.

image.png 수익률 극대화를 위한 최적의 포지션 사이징 전략

4. 점진적 노출의 전술적 목표와 주의사항

- 가이드라인이 있다고 해서 환경과 상관없이 무조건 6.25%, 12.5%, 25%와 같은 고정값을 입력할 필요는 없습니다.

테스트 포지션이 2.5%가 될 수도 있고, 최대 포지션이 15% 또는 30%가 될 수도 있습니다. 피라미딩 전략에도 활용될 수 있습니다. 또한 마진 거래를 활용한다면 또 다른 전술적 변화를 시도해야 합니다.


기억해야 할 핵심은 단 한 가지입니다.

수익이 날 때 이진 거래의 장점 늘리고, 손실이 발생할 때 줄이는 것이 점진적 노출 전략의 열쇠입니다.

(2) 손실이 발생하면 점진적으로 노출을 감소시켜라

- 점진적 노출 전략의 가장 우월한 장점 중 하나는, 시장 환경이 악화될 때 자연스럽게 노출을 줄일 수 있다는 것입니다. 수익이 날 때 25%투자에서 50%, 100%로 가듯이, 손실이 나기 시작하면 100%에서 75%로, 그리고 50%에서 25%, 현금으로 옮겨가야 합니다. 점진적 노출은 시장의 위기를 가장 빨리 발견할 수 있는 전략 중 하나입니다.

- 노출을 늘리거나 줄이는 속도는 최대한 빨라야 합니다. 자신의 손익결과는 어떤 지표들보다 훨씬 민감한 조기경보기입니다. 굼벵이처럼 행동할 이유가 없습니다. 수익이 날 때 과감하게 공격적으로 투자하고, 손실이 나기 시작하면 과감하게 현금을 향해 가십시오.

- 점진적 노출 전략은 작은 수익을 다음 배팅의 리스크로 조달하는 시스템입니다. 언제나 머릿속에 먼저 떠올려야 하는 질문은 "얼마를 잃는가?"입니다. 그렇게 해야만 전략의 이면에 있는 수학을 이해할 수 있습니다.

리스크를 점진적으로 증감시킨다는 이미지를 상상하세요. 리스크 비율을 0.25%, 0.5%, 1%로 올린다는 느낌으로 접근해야 합니다.

당근마켓 중고거래 세금 내야 하나요?

당근마켓이나 번개장터에서 빈번히 물건을 사고파는 사람들이 많습니다. 과연 당근마켓을 통한 중고거래도 세금을 내야 할까요? 아직은 세법에 근거가 없어 세금을 내지 않아도 되지만 2023년부터는 세금 내야 할 수도 있다고 합니다. 안 쓰는 물건을 판매하려는 것일 뿐인데 정말 세금을 내야 할까요?

당근마켓 중고 거래도 세금 내야 할 수도?

우리나라 국세청의 입장은 모든 소득이 있는 곳에는 세금이 있다 라는 입장입니다. 중고거래로 인해 얻는 소득도 세금이 될 수가 있죠. 반대로 우리나라는 '조세법률주의'를 채택하고 있어요. 세금은 법률에 근거해야만 부과가 가능하다는 뜻입니다. 세금 내야 한다는 전자와 세금을 안내도 된다는 후자, 어느 것이 맞을까요?

아직은 세금을 낼 법적 근거가 없어

과연 당근마켓의 중고거래는 전자와 후자, 어디에 속할까요? 아직까지는 세금납부 대상이 아니다는 것이 전문가들의 의견입니다. 하지만 반복적으로 사업을 목적으로 중고거래를 반복한다면 세금 부과 대상이 될 수 있으니 조심하셔야 합니다.

우리나라 소득세법에는 이/배/사/근/연/기/퇴/양 의 경우에만 세금을 부과하고 있어요. 이자소득, 배당소득, 사업소득, 근로소득, 연금소득, 기타 소득, 퇴직소득, 양도소득입니다. 이 6가지 모두 중고거래에 대한 세금에 대해서는 언급하지 않고 있어요. 중고거래는 세금납부 대상이 아니라는 것입니다.

금괴, 시계, 명품가방을 당근마켓으로 판매?

하지만 최근 금괴, 명품가방 등을 당근마켓에서 판매하면서 세금을 탈세하는 경우가 많이 발생하고 있다고 해요. 중고거래 플랫폼을 통한 중고거래를 하면서 세금을 한 푼도 안 내고 있습니다. 중고거래 시장의 규모는 2008년 4조 원에서 2021년 24조 원으로 6배나 성장하면서 생기는 부작용인 것이죠.

당근마켓에 수백만원 시계가…정부 `꼼수 탈세` 과세 검토

`개인 중고거래 비과세` 악용 중고 위장한 고가명품 팔며 세금 내지 않는 사업자 늘어 플랫폼업체에 거래정보 요구 기재부, 부가세법 개정 추진

반복적, 계속적으로 판매할 경우 세금 부과

위 기사의 사례처럼 반복적이고 계속적으로 중고 물건을 판매할 때는 부가가치세와 종합소득세를 내게 될 수도 있습니다. 특히 미개봉 제품이나 내가 산 가격보다 비싸게 판매하는 일이 자주 발생한다면 국세청이 세금을 부과할 수도 있습니다. 하지만 반복적이고 계속적이라는 것에 근거가 아직은 없습니다. 그리고 중고거래는 현금을 주고받다 보니 거래의 증거도 남지 않는 경우가 대부분입니다. 이러니 국세청도 세금을 부과하기가 난감한 실정입니다.

기재부, 세법 변경 추진

국세청과 기획재정부는 중고거래에도 세금을 부과하려고 세법 변경을 추진합니다. 딱 중고거래를 타깃으로 세법을 변경하려는 것은 아니고 매년 진행하는 2022년 세제개편안에 그 내용을 담았습니다. 앞으로는 중고거래 세금 내야 할지도?

전자게시판이라고 함은 당근 마켓, 번개장터, 중고나라와 같은 중고거래 플랫폼을 비롯한 게시판이 있는 모든 사이트입니다. 쉽게 말하면 당근마켓이라는 회사에 사람들이 중고거래를 하는 증거를 국세청에 신고해달라고 하는 것 이에요. 아마도 당근마켓에서 자료를 받아서 분석을 하려는 것 같습니다. 그리고 반복적으로 큰 이윤을 남기는 사람에게는 세무조사를 나가고 세금을 징수하겠죠.

당근마켓의 세법상 지위

당근마켓의 세법상 지위

중고거래 세금납부 기준은?

아직은 중고거래의 세금납부 기준이 정해지진 않았습니다. 대부분의 중고거래는 내가 샀던 가격보다 저렴하게 살 수 있으니, 중고거래 때문에 세금을 낼 일은 없을 거예요.

뉴스에서 언급이 된 것처럼 국세청은 앞으로 금괴나 명품가방을 대량으로 판매하는 사람에게 세금을 징수하려는 의도인 것 같습니다. 미개봉품을 상습적으로 판매하는 행위도 세금납부 대상이 될 수 있을 것 같습니다.

세금은 소득이 있는 모든 곳에 있습니다. 국세청이 중고거래에 세금을 부과하려는 이유는 세금을 공평하게 걷으려고 하는 것이고 꼼수를 쓰는 사람을 잡으려고 하는 것입니다. 당근마켓으로 용돈을 벌고 계신 분들보다는 당근마켓을 사업장으로 이용하고 계신 분들은 세법이 어떻게 바뀌는지 예의 주시하셔야 할 것 같습니다.

당근마켓도 세금을?

당근마켓도 세금을?

직장인들을 위한 2022년 세제개편안, 최대 80만원 절세

기획재정부는 7.25일에 2022년 세제개편안을 발표했습니다. 부자들을 위한 감세도 있지만 직장인들을 위한 감세도 찾아볼 수 있습니다. 연봉 7800만 원인 직장인이라면 100만 원 치의 세금이 줄어들

정보관리기술 위키

[미분류] 탐색자료구조(Binary Tree, B-Tree, B+ Tree, B* Tree, Bitmap Index) ( 8 판 )

목차 펼치기

Binary Tree

Binary Tree의 개요

Binary Tree의 정의

자식노드가 최대 두 개인 노드들로 구성된 트리

Binary Tree 특징

  • 특정데이터를 검색하고 노드의 삽입/삭제 연산이 빈번한 문제에 가장효과적이다.
  • 좌우 방향성을 가지며 다루기가 매우 편하다
  • 부모노드를 중심으로 [부모보다 큰 데이터 노드]와 [부모보다 작은 데이터 노드]로 구분됨
  • 노드의 갯수가 많아 지면 트리와 높이가 커짐

Tree 용어

엣지

노드와 노드 사이를 이어주는 선

경로(Path)

엣지로 연결된, 즉 인접한 노드들로 이뤄진 시퀀스(sequence)

경로의 길이(Length)

트리의 높이(Height)

루트노드에서 말단노드에 이르는 가장 긴 경로의 엣지 수

레벨

트리의 특정 깊이를 가지는 노드의 집합

잎새노드

루트노드

Internal Node

Binary Tree의 종류

정이진트리(full binary tree)

잎새노드를 제외한 모든 노드가 자식노드를 2개 또는 0개 갖는 이진트리

완전이진트리(complete binary tree)

  • 마지막 레벨을 제외한 모든 레벨에서 노드들이 꽉 채워진 이진트리
  • 데이터가 왼쪽부터 채워진다.

균형이진트리(balanced binary tree)

  • 모든 잎새노드의 깊이 차이가 많아야 1인 트리
  • 예측 가능한 깊이(predictable depth)를 가지며 한 쪽으로 완전 치우치지 않고 적당한 균형만 이루면 된다

포화이진트리(Perfact Binary Tree)

  • 전 이진 트리이면서 완전 이진 트리인 경우, 모든 말단 노드는 같은 높이에 있어야 하며, 마지막 단계에서 노드의 개수가 최대가 되어야 한다. 완벽한 피라미드 구조
  • 모든 내부 노드가 두 개의 자식 노드를 가진다. 모든 말단 노드가 동일한 깊이 또는 레벨을 갖는다.

트리순회(Tree Traversal)

  • 트리의 각 노드를 체계적인 방법으로 방문하는 과정
  • 하나도 빠뜨리지 않고, 정확히 한번만 중복없이 방문해야 하는데 노드를 방문하는 순서에 따라 전위, 중위, 후위 순회로 나뉜다.

전위순회(Preorder Traversal)

  • 루트노드에서 시작하여 부모노드 -> 좌측 자식노드 -> 우측 자식노드 순으로 순회하는 방식. 깊이 우선 순회라고도 한다.

중위순회(Ineorder Traversal)

  • 좌측 자식노드 -> 부모 노드 -> 우측 자식노드 순으로 순회하는 방식. 대칭순회라고도 함

후위순회(Postorder Traversal)

  • 좌측 자식노드 -> 우측 자식노드 -> 부모 노드 순으로 순회하는 방식.

B-Tree

B-Tree 개요

B-Tree 정의

데이터를 정렬하여 탐색, 삽입, 삭제 및 순차 접근이 가능하도록 유지하는 트리형 자료구조

  • 자식 노드의 개수가 2개 이상이며 노드내의 데이터가 1개 이상인 트리
  • 노드 내 최대 데이터 수가 M이라면 M차 B-Tree라 한다.

B-Tree 특징

  • 노드 내 데이터 수가 N이라면 자식노드의 수는 N+1이다
  • 노드 내 데이터는 반드시 정렬되어 있어야 한다.
  • 노드의 자식 노드 들은 노드 데이터를 기준으로 왼쪽부터 정렬되어 있어여 한다.
  • 루트 노드가 자식 노드를 갖는다면 2개 이상의 자식을 가져야 한다.
  • 루트노드를 제외한 모든 노드는 적어도 최대 노드 데이터 수인 M의 1/2 개 데이터를 갖고 있어야 한다. (3차 B-Tree는 1개 데이터, 4차는 2개 등등)
  • 잎새노드로 가는 경로의 길이는 모두 같아야 한다. - 다음의 예는 B-Tree가 될 수 없다.
  • 입력 자료가 중복되지 않아야 한다.

B-Tree 장단점

B-Tree 탐색

작은 값은 왼쪽 서브트리, 큰 값은 오른쪽 서브트리에 이루어 있어 탐색 하고자하는 값을 루트노드 부터 시작해 하향식으로 탐색

B-Tree 삽입과 삭제

  1. 해당원소가 들어 가야할 리프노드를 찾는다
  2. 노드에 빈 자리가 있다면 새로운 원소를 삽입한다.
  3. 노드에 빈 자리가 없다면 노드를 2 개로 분할한다.
  4. 기존 노드의 원소와 새로운 원소 중에 중간 값을 분할된 부모 노드의 값으로 한다.
  5. 중간 값보다 작은 값은 왼쪽 노드로 큰 값은 오른쪽 노드에 넣는다.
  6. 중간 값을 부모 노드로 넣을 때, 부모 노드에 자리가 없으면 부모 노드도 위의 규칙에 의해 분할한다.

리프노드인 경우

  • 삭제하려는 값을 검색
  • 리프노드 값이면 삭제
  • 재배열 필요시, 재배열 실행

중간노드인 경우

  • 내부 노드의 값은 하위 노드의 구분 값으로 사용되기때문에 대체할 수 있는 값 필요
  • 삭제될 값의 자리는 왼쪽 노드의 최대 값 또는 오른 쪽 노드의 최소 값으로 대체
  • 대체된 원소가 원래있던 노드의 원소의 갯수가 필요한 만큼 존재하지 않을 경우, 리프노드로 부터 재배열 실행

B+ Tree

B+ Tree 개요

B+ Tree 정의

B-트리의 특징을 가지고 있지만, 모든 키 값들이 잎 노드에 정렬되어있는 트리 구조로 잎 노드를 순차적으로 연결하는 포인터 집합을 가지고 있는 자료 구조.

  • Index node들과 data node(레코드)로 구성이 되어있다.
    • Index node: leaf node를 제외한 나머지 node들
    • Data node: leaf node

    B+ Tree의 특징

    • 모든 키 값은 잎 노드가 가지고 있으며, 키 값의 실제 데이터 주소도 잎 노드만 가지고 있다.
    • B-트리와 동일하게 루트와 잎 노드를 제외한 트리의 노드는 최소 ⌈m/2⌉개의 서브트리를 가져야 한다.
    • 루트 노드 또한 최소 2개의 서브트리를 가져야 한다.
    • 노드에 빈 자리가 있으면 삽입을 하고, 노드에 빈 자리가 없으면 노드를 분리하고 중간 값을 가진 노드를 부모 노드에 삽입한다.
    • 삭제 시에는 잎 노드에서만 키 값을 삭제한다.
      • 만약 삭제로 인해 잎 노드가 없어지게 되면 형제 노드를 확인해 형제 노드를 재분배해 작은 키 값을 삭제한 노드 위치에 둔다.
      • 인접 형제 노드가 재분배 할 수 없으면 삭제할 키 값의 잎 노드와 형제노드를 병합한다.

      B+ Tree의 장단점

      • Leaf 노드끼리 연결 리스트로 연결되어 있어서 탐색에 매우 유리하다.
      • B+ 트리의 높이는 B 트리 보다 낮게 구성되므로 검색시간과 디스크에 접근하는 횟수가 줄어든다
      • B트리는 삭제과정이 복잡하지만 B+ 트리는 data node에서 삭제를 수행한다. 삭제 된 key값이 index node에 존재한경우 재귀적으로 확인하여 index node를 변경시킨다

      B+ Tree 삽입과 삭제

      B+ Tree 삽입

      • B-tree와 거의 동일하게 이루어진다.
      • 노드의 분열이 일어나면 중간 key 값이 부모 노드로 올라갈 뿐 아니라 새로 분열된 노드에도 포함되어야 한다.
      • 새 노드는 leaf 노드끼리의 linked list에도 삽입되어야 한다.

      B+ Tree 삭제

      • 재배치와 합병이 필요하지 않을 때는 leaf 노드에서만 삭제된다.
      • Index 부분은 다른 key 값을 찾는데 사용될 수 있기 때문에 leaf node의 값이 삭제되어도 삭제하지 않는다.
      • 재배치할 경우 index 부분의 node의 key 값은 변하지만 tree 구조는 변하지 않는다.
      • 합병을 할 경우 index 부분에서도 key 값을 삭제한다.

      B-Tree와 비교

      공통점차이점
      1. 모든 leaf의 depth가 같다
      2. 각 node에는 k/2 ~ k 개의 item이 들어있어야 한다.
      3. search가 비슷하다.
      4. add시 overflow가 발생하면 split 한다
      5. delete 시 underflow가 발생하면 redistribution하거나 merge 한다.
      1. B-tree의 각 노드에서는 key 뿐만 아니라 data도 들어갈 수 있다. 여기서 data는 disk block으로의 포인터가 될 수 있다.
      B+tree는 각 node에서는 key만 들어가야 한다. 그러므로 B+tree에서는 data는 오직 leaf에만 존재한다.
      2. B+tree는 B-tree와는 달리 add, delete가 leaf에서만 이루어진다.
      3. B+ tree는 leaf node 끼리 linked list로 연결되어 있다.

      B* Tree

      B* Tree 개요

      B* Tree 정의

      구조를 유지하기 위해 추가적으로 연산을 해야 하는 (삽입시 분열하거나,, 삭제할때 재분배,합병하거나. )B tree의 문제점을 개선하기위해 B-Tree에서 최소 2/M의 키값을 가져야 하는 제약 사항을 2/3의 키값으로 변경한 자료구조

      B* Tree 특징

      리프를 제외한 모든 노드는 m개의 서브트리 이상을 가질 수 없다

      루트와 리프를 제외한 모든 노드는 적어도 [(2m-2)/3]+1개의 서브트리를 갖는다.

      루트는 리프가 아닌 이상 최소 2개, 적어도 2[(2m-2)/3]+1개의 서브트리를 갖는다.

      모든 리프는 같은 레벨에 있다.

      리프가 아닌 노드의 키 값의 수는 그 노드의 서브트리수보다 하나 적다

      각 리프노드는 최소[ (2m-2)/3]개, 최대 m-1개의 키 값을 갖는다.

      B* Tree 장단점

      B* Tree 삽입과 삭제

      B* Tree 삽입

      원소가 들어가야 할 노드가 차 있다면 분열하지 않고 인접 형제 노드에게 재 분배한다. 인접 노드까지 가득차있으면 이들을 분열해 3개의 노드로 만든다.

      예를들어보자, m=5 인 b* 트리이다.

      B* Tree 삭제

      삭제는 원래 B-tree와 동일하나 세개의 노드를 두개의 노드로 합병하는것이다 다르다.

      최악의 경우 노드와 두 자식노드가 한개의 노드로 합병되어 트리의 높이가 낮아지는것

      Bitmap Index

      Bitmap Index의 개요

      Bitmap Index의 정의

      비트맵인덱스는 컴퓨터에서 사용하는 최소단위인 비트를 이용하여 컬럼값을 저장하고, ROWID를 자동으로 생성하는 인덱싱 기법

      Bitmap Index의 장단점

      • 테이블이 많은 행을 가지며 키 열은 적은 분포도를 가질 때, 즉 열이 갖는 서로 다른 값이 몇 개 안 될 때 유리하다.(성별이나 결혼여부 등..)
      • 질의문이 OR 연산자를 포함하는 여러 개의 WHERE 조건을 자주 사용할 때 유리하다 .
      • 비트를 직접 관리하므로 저장공간이 크게 감소하고 비트연산을 수행할 수 있다
      • INSERT, UPDATE, DELETE와 같은 Query에서는 무의미 하다.
      • 분포도가 좋은(Unique성:값의종류가 많다) 값에 대해서는 일반적인 B-Tree인덱스가 유리하다. 즉, Bitmapped Index적용 Column의 후보는 대개 5가지 정도 이내의 값(cardinality)을 갖 는다

      Bitmap Index의 구성

      • Bitmap Index는 Index key value + Start Rowid + End Rowid + Bitmap 엔트리로 구성
      • Start Rowid 와 End Rowid 의 Range사이에 있는 모든 row수만큼 Bitmap이 존재해야 하지만, 오라클에서는 내부적인 압축 알고리즘을 사용하여 Bitmap을 생성하기 때문에 그렇지 않은 경우도 있다
      • 비트맵도 B-트리처럼 구성되어 있지만, leaf 노드는 ROWID 값 들 대신 각 키 값에 대한 비트맵을 저장 한다.

      Bitmap 이진 거래의 장점 Index의 B-Tree Index와의 비교

      구분B-TreeBitmap Index
      적용대상 큰 분포도(Cardinality)를 갖는 테이블에 적합 적은 분포도를 갖는 테이블에 적합
      키갱신 비용 비교적 키의 갱신 비용이 적음 갱신 비용이 매우 큼
      OR Query 적용시 OR사용 Query문에 비 효율적 OR사용 Query문에 효율적
      유용한 분야 OLTP에 유용 DSS에 유용

      1. B-Tree와 Bitmap Index

      B-Tree와 Bitmap Index를 비교 설명하시오

      2. B-Tree와 B+ Tree 비교

      1. B-Tree와 B+ Tree의 정의와 차이점
      2. B-Tree의 삽입 알고리즘
      3. B-Tree의 삭제 알고리즘
      4. 26, 57, 5, 33, 72, 45를 순서대로 삽입하고, 72, 33, 45를 순서대로 삭제하는 B-Tree를 그리시오

      3. B-Tree와 B+ Tree

      데이터베이스의 인덱스 접근 방법에서 가장 중요한 문제는 인덱스 엔트리 자체를 어떻게 조직하는냐 하는 것이다. 다음에 대해 설명하시오

      객체지향 프로그래밍, JVM

      객체지향 프로그래밍 (Object Oriented Programming : OOP)

      : 컴퓨터 프로그래밍 패러다임 중 하나

      : 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체르 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법

      : 문제를 여러 개의 객체 단위로 나눠 작업하는 방식, 객체들이 서로 유기적으로 상호작요하는 프로그래밍 이론

      • 장점
        • 코드 재사용이 용이 : 남이 만든 클래스 이용, 상속을 통해 확장해서 사용 가능
        • 유지보수가 쉬움 : 수정해야할 부분이 클래스 내부에 멤버변수 혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
        • 대형 프로젝트에 적합 : 클래스 단위로 모듈화시켜서 개발할 수 있으므로
        • 생산성 향상: 잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로 써 개발의 생산성을 향상
        • 처리속도, 개발속도가 상대적으로 느림
        • 객체가 많으면 용량이 커질 수 있음
        • 설계시 많은 시간과 노력 필요
        • 코딩난이도 상승
        1. 클래스+인스턴스(객체)
          1. 클래스 :
          2. 인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것
          1. 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 작업
          2. 클래스를 설계한는 것 자체를 의미
          3. 세부적인 사물들의 공통적인 특징을 파악한 후, 하나의 묶음으로 만들어내는 것이 추상화다.
          • 정의
            • : 기능과 특성의 모음을 클래스라는 캡슐에 분류에서 넣는 것
            • : 정보 은닉화를 통해 높은 응집도, 낮은 결합도를 유지할 수 있도록 설계하는 것
            • 코드의 재수정 없이 재활용하는 것
            • 접근 제어자를 통한 정보 은닉
            • 정의 : 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것
            • 다중상속은 불가

            상속을 활용하면 상위 클래스의 구현을 활용함으로써, 코드 재사용이 용이해진다.그러나, 상속을 통한 재사용을 할 때 나타나는 단점이 명백하다. 따라서 객체지향 프로그래밍에서 '코드 재사용'을 목적으로 하는 상속 행위는 엄격히 금한다.

            1. 부모 클래스의 변경이 불편해짐
            → 부모 클래스에 의존하는 자식 클래스가 많을 때 부모 클래스의 변경이 필요하다면, 이를 의존하는 자식 클래스들이 영향을 받게 됨
            2. 불필요한 클래스의 증가
            → 유사 기능 확장시, 필요 이상의 불필요한 클래스를 만들어야할 수 있음
            3. 잘못된 상속 사용
            → 같은 종류가 아닌 클래스의 구현을 재사용하기 위해 상속을 받게 되면, 문제가 발생할 수 있음.상속받는 클래스가 부모 클래스와 IS-A 관계가 아닐 때 발생

            그렇다면 이러한 문제는 어떻게 해결할까?
            → 구성 (Composition) 을 통해 해결

            객체 구성은 객체 내부 필드에서 다른 객체를 참조하는 방식으로 구현한다.
            상속에 비해 런타임 구조가 복잡하고 구현이 어렵지만, 변경시 유연함을 확보할 수 있다는 장점이 크다.
            같은 종류가 아닌 클래스를 상속하고 싶을 땐, 객체 컴포지션을 먼저 적용해볼 것

            이러한 상황에서만 사용해야 한다. 상속을 코드 재사용의 개념으로 이해하면 안 된다. 코드를 재사용할 수 있다고 무지성으로 상속을 사용하는 경우가 있는데, 이렇게 되면 클래스간 결합도가 너무 높아져 유지보수 효율이 똥망한다. 일반적인 개념을 구체화하는 상황에서 상속을 사용하자.

            말 그대로 포함 관계를 의미한다. 한 클래스 A 가 이진 거래의 장점 다른 클래스 B 의 자식 클래스임을 이야기한다.
            e.g. 햄스터는 동물이다. (소의 부모 클래스는 동물)

            상속이 아닌 구성 (Composition) 관계를 의미한다. 한 객체가 다른 객체에 속한다는 이야기다.
            e.g. 컴퓨터안에는 CPU 가 있다. (컴퓨터 객체가 CPU 객체를 구성함)

            • 정의 : 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석 가능
            • 오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의
            • 오버로딩 : 같은 이름의 함수 여러개 정의, 매개변수 타입, 개수 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 한것

            : private에서 선언된 멤버변수 정보를 가져오거나 바꿀때 사용

            • 메소드명 자리에 가져올 멤버변수 첫번째 글자 대분자로 변경 후, get이나 set을 붙여준다.
            • https://velog.io/@gillog/OOP%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

            Java Virtual Machine의 줄임말.

            직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다.

            Java 는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되기 위해선 OS 위에서 Java 를 실행시킬 무언가가 필요하다. 그게 바로 JVM이다.

            즉, OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.

            Java 소스코드, 즉 원시코드(*.java)는 CPU가 인식을 하지 못하므로 기계어로 컴파일을 해줘야한다.

            하지만 Java는 이 JVM 이라는 가상머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 Java bytecode(*.class)로 변환된다.

            Java compiler 가 .java 파일을 .class 라는 Java bytecode로 변환한다.

            💡 여기서 Java compiler는 JDK를 설치하면 bin 에 존재하는 javac.exe를 말한다. (즉, JDK에 Java compiler가 포함되어 있다는 소리임)
            javac 명령어를 통해 .java를 .class로 컴파일 할 수 있다.

            변환된 bytecode는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다.

            이 때, JVM 이 OS가 bytecode를 이해할 수 있도록 해석해준다. 따라서 Byte Code는 JVM 위에서 OS 상관없이 실행될 수 있는 것이다.

            OS에 종속적이지 않고, Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행할 수 있다.

            컴파일 하는 방법

            아래는 Java Compiler에 의해 .java 파일을 .class 라는 Java bytecode로 만드는 과정이다.

            Java Compiler는 JDK를 설치하면 javac.exe라는 실행 파일 형태로 설치된다. 정확히는 JDK 의 bin 폴더에 javac.exe 로 존재한다.

            Java Complier 의 javac 라는 명령어를 사용하면 .class 파일을 생성할 수 있다.

            "Hello World"를 출력하는 .java 파일을 생성하고 이를 .class 파일로 변환시켜보자.

            Windows를 기준으로, cmd 창을 열고 해당 .java 파일이 있는 곳으로 이동한다.

            해당 위치에서 javac 명령어로 컴파일을 진행한다.

            현재 위치(바탕화면)에 .class 파일이 생성된 걸 확인할 수 있다.

            실행하는 방법

            java 명령어로 .class 파일을 실행 시킬 수 있다.

            .class 파일이 위치한 곳으로 이동 후 java 을 입력해 실행시킨다.

            test.class 실행 결과

            "Hello World"가 출력되면서 test.class 파일이 실행된걸 확인할 수 있다.

            바이트코드란 무엇인가

            가상 컴퓨터(VM)에서 돌아가는 실행 프로그램을 위한 이진 표현법.

            자바 바이트 코드(Java bytecode)는 JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미한다.

            자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있다.

            바이트 코드는 다시 실시간 번역기 또는 JIT 컴파일러에 의해 바이너리 코드로 변환된다.

            💡 기계어란?

            0과 1로 이루어진 바이너리 코드이다.
            기계어가 이진코드로 이루어졌을 뿐 모든 이진코드가 기계어인 것은 아니다.
            기계어는 특정한 언어가 아니라 CPU가 이해하는 명령어 집합이며, CPU 제조사마다 기계어가 다를 수 있다.

            즉, CPU가 이해하는 언어는 바이너리 코드, 가상 머신이 이해하는 코드는 바이트 코드이다.

            JIT 컴파일러란 무엇이며 어떻게 동작하는가

            JIT 컴파일(just-in-time compliation) 또는 동적 번역(dynamic translation) 이라고 한다.

            JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러이다.

            인터프리터 방식의 단점을 보완하기 위해 도입되었다.

            인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식이다.

            기계어(컴파일된 코드)는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행하게 된다.
            물론 JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅하는 것이 유리하다.

            따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도를 넣을때에만 컴파일을 수행한다.

            자바에선 자바 컴파일러가 자바 프로그램 코드를 바이트 코드로 변환한 다음,
            실제 바이트 코드를 실행하는 시점에서 자바 가상 머신(JVM, 정확히는 JRE)이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환한다.

            JVM 구성요소

            JVM은 크게 아래와 같이 이루어져 있다.

            • 클래스 로더(Class Loader)
            • 실행 엔진(Execution Engine)
              • 인터프리터(Interpreter)
              • JIT 컴파일러(Just-in-Time)
              • 가비지 콜렉터(Garbage collector)

              클래스 로더
              JVM 내로 클래스 파일(*.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
              런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다.
              즉, 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크한는 역할을 한다.

              클래스를 실행시키는 역할이다.

              클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행된다.

              자바 바이트 코드(*.class)는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다. 그래서 실행 엔진은 이와 같은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다.

              실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.

              하지만 한 줄씩 수행하기 때문에 느리다는 단점이 있다.

              ↳ JIT(Just-In-Time)

              인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 해당 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식이다. 자세히

              더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제함.

              Runtime Data Area

              프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

              ↳ PC Register

              Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재한다.

              Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.

              즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행 중인 것을 말한다.

              이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다.

              💡 스레드(thread)란?

              스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미

              모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행한다.

              또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.

              JVM 스택 영역

              프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.

              각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장한다.

              메소드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성된다. 메서드 수행이 끝나면 프레임 별로 삭제를 한다.

              메소드 안에서 사용되는 값들을 저장한다. 또 호출된 메소드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.

              Native method stack

              자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역.

              JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간.

              Java Native Interface를 통해 바이트 코드로 전환하여 저장하게 된다.

              일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역

              Method Area (= Class Area = Static area)

              클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간

              Runtime Constant Pool

              스태틱 영역에 존재하는 별도의 관리영역.

              상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.

              💡 스태틱 영역에 저장되는 데이터

              Field Information (멤버 변수!)
              멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보

              Method Information (메소드!)
              메소드의 이름, 리턴타입, 매개변수, 접근 제어자에 대한 정보

              Type Information (타입!)
              class인지 interface인지의 여부 저장. Type의 속성, 전체 이름, super 클래스의 전체 이름. (interface이거나 object인 경우 제외된다. 이건 Heap에서 관리함)

              Heap 영역

              객체를 저장하는 가상메모리 공간. new 연산자로 생성되는 객체와 배열을 저장한다.

              Class Area(Static Area)에 올라온 클래스들만 객체로 생성할 수 있다.(당연함)

              힙은 세 부분으로 나뉘어 진다.

              Permanent Generation

              생성된 객체들의 정보의 주소값이 저장된 공간이다. 클래스 로더에 의해 load되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역이고 JVM에 의해 사용된다.
              Reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다.

              💡 Reflection이란?
              객체를 통해 클래스의 정보를 분석해 내는 프로그래밍 기법
              구체적인 클래스 타입을 알지 못해도, 컴파일된 바이트 코드를 통해
              역으로 클래스의 정보를 알아내어 사용할 수 있다는 뜻이다.

              New/Young 영역

              이곳의 인스턴스들은 추후 가비지 콜렉터에 의해 사라진다.
              생명 주기가 짧은 “젊은 객체”를 GC 대상으로 하는 영역이다.
              여기서 일어나는 가비지 콜렉트를 Minor GC 라고 한다.

              Eden: 객체들이 최초로 생성되는 공간

              Survivor 0, 1: Eden에서 참조되는 객체들이 저장되는 공간

              Old 영역

              이곳의 인스턴스들은 추후 가비지 콜렉터에 의해 사라진다.
              생명 주기가 긴 “오래된 객체”를 GC 대상으로 하는 영역이다.
              여기서 일어나는 가비지 콜렉트를 Major GC 라고 한다. Minor GC에 비해 속도가 느리다.

              New/Young Area에서 일정시간 참조되고 있는, 살아남은 객체들이 저장되는 공간이다.

              JDK와 JRE의 차이

              Java Development Kit (자바 개발 키트)

              Java 를 사용하기 위해 필요한 모든 기능을 갖춘 Java용 SDK (Software Development Kit)이다.

              JDK 는 JRE를 포함하고 있다.
              JRE에 있는 모든 것 뿐만 아니라 컴파일러(javac)와 jdb, javadoc 과 같은 도구도 있다.

              즉, JDK는 프로그램을 생성, 실행, 컴파일할 수 있다.

              Java Runtime Environment (자바 런타임 환경)

              JVM + 자바 클래스 라이브러리(Java Class Library) 등으로 구성되어 있다.
              컴파일 된 Java 프로그램을 실행하는데 필요한 패키지이다.

              요약
              JDK는 자바 프로그램을 실행, 컴파일, 개발용 도구.
              JRE, JVM를 모두 포함하는 포괄적이 키트이다.
              JRE는 자바 프로그램을 실행할 수 있게 하는 도구이다. JVM을 포함하고 있다.

              💡 SDK란?
              Software Development Kit (소프트웨어 개발 키트)
              하드웨어 플랫폼, 운영체제 또는 프로그래밍 언어 제작사가 제공하는 툴이다. 키트의 요소는 제작사마다 다르다.
              SDK의 대표적인 예로, JDK 등이 있다.
              SDK를 활용하여 애플리케이션을 개발할 수 있다.

              #자바가상머신, JVM(Java Virtual Machine)이란 무엇인가?

              #JVM이란? JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다 (가상머신이란 프로그램의 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다.) JV

              [JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터. )

              JVM이란 무엇인가 Java Virtual Machine의 줄임말. 직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다. Java 는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되

              이진 거래의 장점

              지나간시간

              문재인을 직접 안까는지 모르겠네요.

              깔꺼리가 무궁무진하고 직접적인 언급으로

              기사꺼리도 나오고 보수지지자들을 결집할 수도 있는데

              꼬붕들 문제나 외교적 왕따 같은 문제로 열라 씹을 수 있는데.

              막판되면 진짜 문재인을 직접적으로 때려야합니다.

                최신글이 없습니다.

              샌디에이고 2022-03-02 09:28 IP: 106.101.*.164 역대 대통령 임기말 지지율 최고 48%로 레임덕 없는 대통령 때려봤자 중도층 반감만 사고 효과도 없을텐데 ㅋㅋㅋ
              경제 규모 이탈리아 제치고 세계 10위권 내 달성, 수출액 역대 최고 인데 깔게 있나요.

              문재인은 선거 이긴 후에 까고 괜찮음

              6363 2022-03-02 09:37 IP: 211.209.*.68 워낙 눈에 안띄는데다 가끔 나와도 써준대로 읽을 뿐인 바지사장냄새 진동한지가 너무 오래되서 이제 깔 맘도 안들져

              6363 2022-03-02 09:40 IP: 211.209.*.68 윤석열이 적폐수사하니까 이진 거래의 장점 발끈했다길래 나와서 뭐좀 하려나 했더만 눈치보며 또 스윽 빠지더만요. 방역패스 폐지 가지고도 떠들썩하니 어이쿠 하고 스윽 빼고.이 사람은 깔 값어치도 없는거 같아요. 딱 동사무소 계장급 복지부동 마인드라 크게 뭐 해먹을 위인도 못되어 보임

              안타점 2022-03-02 09:43 IP: 221.143.*.66 선거는 남의 지지층을 얼마나 가져오느냐도 중요합니다.굳이 거길 때려서 윤석열 지지한다는 문파 자극할 이유가 있나요?


0 개 댓글

답장을 남겨주세요