no image
[HTML] 웹 문서에 다양한 내용 입력하기
이 글은 HTML+CSS+자바스크립트 웹표준의 정석(저자 : 고경희)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다. 텍스트 작성하기 태그 제목을 나타내는 태그이다. 웹 문서에서 제목은 다른 텍스트보다 크고 진하게 표시한다. 에서 n은 1~6까지 입력할 수 있고, 숫자가 작아질수록 글씨의 크기가 작아진다. 레드향 레드향 샐러드 레시피 상품 구성 검색 엔진은 hn태그를 검색할 때 h1 태그부터 단계적으로 검색한다. 만약 h4태그를 사용하지 않고 h5, h6태그를 사용한다면 검색 엔진은 h1부터 단계적으로 태그를 검색하다가 h4태그가 없으면 h5, h6태그를 검색하지 않는다. p태그 텍스트 단락을 만드는 태그, 줄을 바꾸는 태그이다. 와 태그 사이에 텍스트를 입력하면 텍스트 앞뒤로 빈 줄이 생기면서..
2023.03.03
no image
[HTML] HTML문서의 기본 구조
이 글은 HTML+CSS+자바스크립트 웹표준의 정석(저자 : 고경희)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다. HTML의 기본 구성 요소 태그와 속성 태그 웹 페이지를 구성하는 요소는 텍스트, 이미지, 버튼 등 매우 다양하다. 태그는 이런 다양한 구성 요소를 정의하는 역할을 한다. 태그는 HTML 문법을 이루는 가장 작은 단위이다. 기본 형식은 아래와 같이 사이에 태그명을 넣는 형태이다. 속성 속성은 태그에 어떤 의미나 기능을 보충하는 역할을 한다. 쉽게 설명하자면, 옵션과 같은 느낌이다. 그래서 속성은 사용해도 되고 안 해도 된다. 또한 여러 개를 사용해도 된다. 하지만 태그 없이 단독으로 사용할 수는 없다. 속성은 아래와 같이 속성명과 속성값으로 구성된다. 일반적으로 속성을 사용할 때..
2023.03.02
no image
[컴퓨터 구조] 대략적인 컴퓨터 구조
이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 작성하였습니다. 이 글은 대략적인 컴퓨터 구조를 정리하는 글입니다. 세세한 구조는 다루지 않습니다. 컴퓨터 구조는 아래와 같이 두 가지로 나뉜다. 컴퓨터가 이해하는 정보 컴퓨터의 4가지 핵심 부품 컴퓨터가 이해하는 정보 컴퓨터가 이해하는 정보는 아래와 같이 두 가지로 나뉜다. 데이터 명령어 데이터 컴퓨터 구조에서 데이터란 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 뜻한다. 컴퓨터와 주고받는 정보 또는 내부에 저장된 정보를 데이터라고 통칭하기도 한다. 컴퓨터는 모든 데이터를 0과 1로 저장한다. 명령어 컴퓨터를 한 마디로 정의한다면, 명령어를 처리하는 기계라고 할 수 있다. 명령어는 컴퓨터를 실질적으..
2023.03.01
no image
금융용어정리 - 액면분할
본 게시글은 유튜브 : 경제 TV 너무경 : 너무 쉬운 경제 윤성종 님의 유튜브 영상을 참고하였습니다. 개인적으로 정리하는 글임을 알립니다. 금융용어정리 - 액면분할 액면분할 액면분할을 쉽게 설명하면 초코파이 10개가 들어있는 한 박스를 만 원에 판매하면 초등학생들은 구매하기가 힘들 것이다. 하지만 초코파이 낱개를 각각 1개에 천 원에 판매하면 초등학생들도 쉽게 구매할 수 있다. 이처럼 주가가 너무 높아 주식의 유통이 어려운 경우 주가를 낮추고 주식수를 늘려 유통을 자유롭게 하는 것을 액면분할이라고 한다. 액면분할은 주식의 수가 증가하지만 자본과 자본금의 변화는 없다. 왜냐하면 주식의 수가 증가하는 만큼 주가도 낮아지기 때문이다. 무상증자와 비교 무상증자에서도 액면분할과 비슷한 과정이 발생한다. 무상증자..
2023.02.16
no image
금융용어정리 - 유상증자
본 게시글은 유튜브 : 경제 TV 너무경 : 너무 쉬운 경제 윤성종 님의 유튜브 영상을 참고하였습니다. 개인적으로 정리하는 글임을 알립니다. 금융용어정리 - 유상증자 유상증자 무상증자와 달리 주식을 발행하여, 주주에게 대가를 받고 주식을 줌으로써 자본금을 늘리는 것을 말한다. 목적 돈이 없어서 돈이 필요해서 목적이 돈이 없어서와 돈이 필요해서는 다르다. 돈이 없어서 유상증자를 하는 경우는 아래와 같은 경우이다. 채무 상환을 위한 비용을 조달하기 위해 운영 자금을 조달하기 위해 이러한 경우로 유상증자를 하는 경우 대부분 악재로 작용한다. 돈이 필요해서 유상증자를 하는 경우는 아래와 같은 경우이다. 설비 증설 투자 확대 신규 사업 타기업 지분 취득, 인수 이러한 경우로 유상증자를 하는 경우 호재로 작용할 수..
2023.02.15
no image
향상된 for문
장단점 장점 간편한, 가독성 좋은 코드 배열의 인덱스 문제(정해진 인덱스를 넘어버리는 예외 등)를 해결할 수 있다. 단점 인덱스를 사용하지 못한다. 배열이나 자바의 ArrayList 값을 사용할 수 있지만 절대 수정할 수 없다. C / C++ 1차원 배열은 가능하나 다차원 배열에서 적용은 모르겠다.(알고있다면 댓글 남겨주세요) int array[] = {1,2,3,4}; for (int i : array) { cout
2023.02.13
no image
[JAVA] 하노이의 탑 (Tower of Hanoi)
Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다. 하노이의 탑 설명 1, 2, 3번 기둥 이렇게 3개의 기둥과 크기가 모두 다른 n개의 원판이 있을 때, n개의 원판 모두 1번 기둥에 크기가 큰 원판순으로 아래에 위치되어 있다. 이러한 기둥들을 3번 기둥에 모두 옮겨야 하는데, 한 번에 한 원판만 옮길 수 있고 크기가 작은 원판 위에 크기가 큰 원판을 올릴 수 없다. 이러한 원판 이동을 최소한의 횟수로 옮기는 것이 하노이의 탑의 규칙이다. 하노이의 탑 풀이 가장 위에 있는 원반을 1번원반, 그 아래의 원반을 2번 원반, 가장 아래에 있는 원반을 n번 원반이라고 하면 디테일한 과정 말고 큰 과정을 나열하면 3가지로 압축할 수 있다. 1 ~ n-1번 원반을 2번 기둥에 옮..
2023.02.03
no image
[JAVA] 꼬리 재귀(Tail Recursion)(꼬리 재귀 최적화(TCO))
일반 재귀 간단 요약 재귀 함수는 정지 조건(재귀 앵커)을 충족하기 전 까지 계속 호출하게 된다. 그러면 함수가 한 번씩 호출될 때마다 파라미터, 리턴값, 리턴 후 돌아갈 위치 등이 스택(메모리 저장공간)에 쌓이게 된다. 재귀 함수를 너무 많이 호출하게 되면 스택의 공간이 모두 차버리는 스택 오버플로가 일어날 수 있다. 꼬리 재귀 static int factorial(int n) { if(n > 0) return n * factorial(n-1); //반환(return)부에 연산이 존재 else return 1; //정지 조건 } 위 코드는 일반 재귀를 이용하여 팩토리얼을 구하는 재귀함수이다. 위 코드는 정지 조건을 충족한 재귀 함수가 1을 리턴을 해야 나머지 재귀 함수의 리턴 값이 정해진다. 아래의 첫..
2023.02.02

이 글은 HTML+CSS+자바스크립트 웹표준의 정석(저자 : 고경희)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다.


텍스트 작성하기

 

<hn> 태그

제목을 나타내는 태그이다.

웹 문서에서 제목은 다른 텍스트보다 크고 진하게 표시한다.

<hn>에서 n은 1~6까지 입력할 수 있고, 숫자가 작아질수록 글씨의 크기가 작아진다.

<h1>레드향</h1>
<h2>레드향 샐러드 레시피</h2>
<h2>상품 구성</h2>

검색 엔진은 hn태그를 검색할 때 h1 태그부터 단계적으로 검색한다.
만약 h4태그를 사용하지 않고 h5, h6태그를 사용한다면 검색 엔진은 h1부터 단계적으로 태그를 검색하다가 h4태그가 없으면 h5, h6태그를 검색하지 않는다.

 

p태그

텍스트 단락을 만드는 태그, 줄을 바꾸는 태그이다.

<p>와 </p> 태그 사이에 텍스트를 입력하면 텍스트 앞뒤로 빈 줄이 생기면서 텍스트 단락이 만들어진다.

텍스트 단락의 내용이 길어서 웹 브라우저에 한 줄로 표시할 수 없을 경우에는 자동으로 줄이 바뀐다.

제목이나 주제를 나타내는 텍스트가 아니면 대부분 본문이기 때문에 p태그를 자주 사용한다.

<h1>레드향</h1>
<p>껍질에 붉은 빛이 돌아 레드향이라 불린다.</p>
<p>레드향은 한라봉과 귤을 교배한 것으로 
일반 귤보다 2~3배 크고, 과육이 붉고 통통하다.</p>
<p>비타민 C와 비타민 P가 풍부해 혈액순환, 감기예방 등에 좋은 것으로 알려져 있다.</p>
<h2>레드향 샐러드 레시피</h2>
<h2>상품 구성</h2>

 

br 태그

텍스트 단락을 만들 때 원하는 위치에서 줄을 바꾸려면 <br> 태그를 사용하면 줄을 바꿀 수 있다.

<br> 태그는 단독으로 사용하므로 닫는 태그가 필요 없다.(인라인)

<h1>레드향</h1>
<p>껍질에 붉은 빛이 돌아 레드향이라 불린다.</p>
<p>레드향은 한라봉과 귤을 교배한 것으로 <br>일반 귤보다 2~3배 크고, 과육이 붉고 통통하다.</p>
<p>비타민 C와 비타민 P가 풍부해<br> 혈액순환, 감기예방 등에 좋은 것으로 알려져 있다.</p>
<h2>레드향 샐러드 레시피</h2>
<h2>상품 구성</h2>

<br>과 <p>의 차이점
<br> 태그를 두 번 사용하면 빈 줄이 생기면서 텍스트 단락이 나뉜 것처럼 화면에 표시할 수 있다. 하지만 실제로는 단락이 만들어진 게 아니므로 CSS를 사용해 텍스트 단락 스타일을 적용할 때 문제가 생긴다.

 

blockquote 태그

인용할 때 쓰는 태그

브라우저가 인용문을 인식할 수 있게 해 준다.

<h1>레드향</h1>
<p>껍질에 붉은 빛이 돌아 레드향이라 불린다.</p>
<p>레드향은 한라봉과 귤을 교배한 것으로 <br>일반 귤보다 2~3배 크고, 과육이 붉고 통통하다.</p>
<blockquote>비타민 C와 비타민 P가 풍부해<br> 혈액순환, 감기예방 등에 좋은 것으로 알려져 있다.</blockquote>
<h2>레드향 샐러드 레시피</h2>
<h2>상품 구성</h2>

blockquote 태그는 반드시 한 개 이상의 p태그를 포함해야 한다.
그래서 p태그 내용에 blockquote 태그는 포함될 수 없다.

 

q태그

q 태그는 문단 안에 텍스트 단위의 짧은 인용문을 작성할 때 사용하는 태그이다.

<p>차세대웹기술지원센터의 데이터에 따르면 <q cite="인용 사이트 주소">2021년 대한민국에서 가장 높은 점유율을 가지고 있는 웹 브라우저는 구글의 크롬입니다.</q></p>

 

ins와 del 태그

ins 태그는 새로 추가된 텍스트임을 나타낼 때 사용하고, del 태그는 기존에 있던 텍스트가 삭제된 텍스트임을 나타낼 때 사용한다.

ins태그를 사용한 콘텐츠에는 밑줄이, del 태그를 사용한 콘텐츠에는 취소선이 생긴다.

<p>세일 기간을 맞이하여 온라인 강의 수강권을 할인된 금액(정가<del>36,000원</del><ins>20,000원</ins>)에 판매합니다.</p>

 

sub와 sup태그

sub태그와 sup태그는 각각 아래 첨자, 위 첨자에 해당하는 텍스트를 작성할 때 사용한다.

<p>공기의 원소 기호는 H<sub>2</sub>O</p>
<p>4<sup>2</sup>은 16입니다.</p>

 

그룹 짓기

HTML 코드를 작성하다 보면 관련 있는 요소를 그룹으로 묶어야 하는 경우가 많다.

웹 페이지를 만들 때 관련 있는 요소끼리 그룹으로 묶으면 레이아웃을 구성하기가 쉬워지고 HTML 페이지의 구조를 더 깔끔하게 작성할 수 있다.

이런 그룹 짓기 작업을 div 태그와 span태그로 수행한다.

 

div태그

div 태그는 블록 요소와 인라인 요소를 그룹으로 묶을 때 사용한다.

 <div class="movie">
    <p>영화 소개</p>
    <p>영화를 소개하는 페이지입니다.</p>
  </div>
  <div class="tv">
    <p>TV 프로그램 소개</p>
    <p>TV 프로그램을 소개하는 페이지입니다.</p>
  </div>

 

span 태그

span 태그는 인라인 요소를 그룹으로 묶을 때 사용한다.

<h1>영화 소개</h1>
  <p>이번 영화의 <span>하이라이트</span> 장면은 바로 여기입니다.</p>

이렇게 그룹으로 묶어 요소의 공간을 분할하면 분할된 요소에 CSS로 스타일을 적용할 수 있다.

아직은 스타일을 적용하기 전이므로 '하이라이트'부분에 변화가 없다.

 

목록 만들기

목록은 목차와 메뉴를 구성할 때 주로 사용하지만, 그 외에도 웹 페이지의 다양한 곳에서 사용할 수 있다.

목록을 생성할 때 사용할 수 있는 태그로는 ul, ol, dl 태그가 있다.

 

ul태그

ul태그는 순서가 없는 비순서형 목록을 생성할 때 사용한다.

이때, 목록 내용은 li태그로 구성한다.

<h1>판매 중인 과일</h1>
  <ul>
    <li>바나나</li>
    <li>사과</li>
    <li>수박</li>
  </ul>

 

ol태그

ol태그는 순서형 목록을 생성할 때 사용한다.

ul태그와 마찬가지로 li태그로 목록 내용을 구성한다.

<h1>오늘 할일</h1>
  <ol>
    <li>아침 먹기</li>
    <li>점심 먹기</li>
    <li>저녁 먹기</li>
  </ol>

 

dl 태그

dl태그는 정의형 목록을 만들 때 사용한다.

정의형 목록은 용어와 용어 설명을 나열한 형태의 목록이라고 보면 된다.

dl태그로 목록을 생성할 때는 li태그 대신에 dt태그로 용어를, dd태그로 용어 설명을 작성한다.

 <dl>
    <dt>HTML</dt>
    <dd>HTML은 Hyper Text Markup Language의 약자로 웹 문서의 구조를 설계하기 위한 목적으로 개발된 언어입니다.</dd>
    <dt>CSS</dt>
    <dd>CSS는 Cascading Style Sheets의 약자로 웹 문서를 꾸미기 위한 목적으로 개발된 언어입니다.</dd>
  </dl>

 

링크와 이미지 넣기

링크는 문서와 문서 간 연결을 의미하며, 기본적으로 a 태그를 사용한다.

사진과 같은 이미지 객체를 삽입할 때는 img 태그로 작성한다.

 

a 태그

a 태그는 HTML에서 내부나 외부 링크를 생성한다.

a 태그는 대상 경로를 의미하는 href 속성을 필수로 사용해야 하고, 그 외에 target, title 속성을 선택해서 사용할 수 있다.

href 속성
링크의 대상 경로를 입력할 때 사용한다.
속성 값은 대상 경로의 주소이거나 내부 분서의 id 속성값일 수 있다.

target 속성
링크를 생성할 때 대상이 연결되는 방식을 지정한다.
속성 값으로 _blank, _parent, _self, _top을 사용할 수 있지만, 새 창으로 열리는_blank를 제외하고 거의 사용하지 않는다.
이 속성은 생략이 가능하다.

title 속성
링크를 설명할 수 있는 텍스트를 작성한다.
<a href="https://www.gilbut.co.kr" target="_blank" title="도서출판 길벗">길벗 홈페이지</a>

 

img 태그

이미지 객체를 삽입하고 싶을 때는 img 태그를 사용한다.

img 태그는 src 속성과 alt 속성으로 구성된다.

src 속성
삽입하려는 이미지 경로를 입력하는 속성이다.
HTML에서 이미지 경로는 항상 웹 브라우저에서 실행되는 HTML 파일의 위치가 기준이다.
삽입하려는 이미지 파일이 HTML 파일과 같은 폴더에 있는 images 폴더에 있고 이미지 파일의 이름과 확장자가 beach.jpg라면 현재 폴더를 의미하는 ./ 기호를 사용해서 작성한다.

alt 속성
삽입한 이미지 객체를 설명할 수 있는 텍스트를 넣는다.

웹 표준에서는 src 속성과 alt 속성을 필수로 사용하도록 권고하고 있다.
<img src="./beach.png" alt="아름다운 여름 해변">

 

 

이미지 링크

a 태그 안에는 텍스트뿐만 아니라 여러 요소가 올 수 있다.

그중 img 태그를 a 태그 안에 사용하면 이미지를 클릭했을 때 특정 링크로 이동하게 할 수 있다.

이를 HTML에서는 이미지 링크라고 한다.

<a href="https://www.google.com" target="_blank">
    <img src="./google_logo.png" alt="구글 로고">
  </a>

 

 

텍스트 강조하기

텍스트에서 특정 내용을 강조해 표현하고 싶을 때가 있다.

이럴 때는 strong 태그와 em 태그를 사용한다.

 

strong 태그

텍스트의 의미를 강조하고 싶을 때 사용한다.

strong 태그는 스타일에서 차이를 두기 위해 시각적으로 텍스트를 굵게 표시하는 것뿐만 아니라 웹 브라우저에 중요한 부분임을 알려 주는 역할을 한다.

<p>이 시설은 <strong>관계자 외 출입금지</strong>입니다.</p>

 

strong 태그는 중첩해서 사용할 수 있으며, 중첩할수록 의미를 더욱더 강조하게 된다.

따라서 strong 태그가 중첩된 텍스트는 실행 결과에서 강조 효과는 동일하지만 구조적으로 더 중요한 부분임을 의미하게 된다.

 

em 태그

em 태그 역시 텍스트의 의미를 강조하고 싶을 때 사용한다.

em 태그를 사용하면 텍스트가 기울어져 보이면서 강조 효과를 낼 수 있다.

<p>여기서부터는 위험하니까 <em>절대로</em> 지나가지 마세요.</p>

em 태그는 중첩해서 사용할 수 있으며, 중첩할수록 의미를 더욱더 강조하게 된다.

따라서 em 태그가 중첩된 텍스트는 실행 결과에서 강조 효과는 동일하지만 구조적으로 더 중요한 부분임을 의미하게 된다.

b태그와 i태그는 strong 태그와 em태그와 차이가 없을 정도로 유사하다.
하지만 HTML이 발전하면서 b태그와 i태그는 점점 사용하지 않는 추세이다.
b태그와 i태그는 구조적으로 중요함을 나타내는 것이 아닌 단순히 텍스트를 굵게 만들거나 기울이는 것뿐이기 때문이다.

 

'HTML & CSS > HTML' 카테고리의 다른 글

[HTML] 시맨틱 태그(sementic tag)  (0) 2023.10.30
[HTML] 멀티미디어(오디오, 비디오) 삽입하기  (0) 2023.10.29
[HTML] 표 만들기  (0) 2023.10.28
[HTML] 폼 태그(form tag)  (0) 2023.10.28
[HTML] HTML문서의 기본 구조  (0) 2023.03.02

이 글은 HTML+CSS+자바스크립트 웹표준의 정석(저자 : 고경희)의 책 내용과 유튜브 영상을 개인적으로 정리하는 글입니다.


HTML의 기본 구성 요소

태그와 속성

태그

웹 페이지를 구성하는 요소는 텍스트, 이미지, 버튼 등 매우 다양하다.

태그는 이런 다양한 구성 요소를 정의하는 역할을 한다.

태그는 HTML 문법을 이루는 가장 작은 단위이다.

기본 형식은 아래와 같이 <>사이에 태그명을 넣는 형태이다.

<태그명>

 

속성

속성은 태그에 어떤 의미나 기능을 보충하는 역할을 한다.

쉽게 설명하자면, 옵션과 같은 느낌이다.

그래서 속성은 사용해도 되고 안 해도 된다.

또한 여러 개를 사용해도 된다.

하지만 태그 없이 단독으로 사용할 수는 없다.

속성은 아래와 같이 속성명과 속성값으로 구성된다.

<태그명 속성명="속성값">

일반적으로 속성을 사용할 때, 속성명은 따옴표 없이 작성하고 값은 큰따옴표 안에 작성한다.

속성값이 여러 개인 경우에는 하나의 큰따옴표 안에 콤마로 구분해 값을 나열하면 된다.

<태그명 속성명1="속성값1", 속성명2="속성값2">

 

 

콘텐츠

HTML은 태그와 속성으로 문법을 구성한다.

그리고 문법은 크게 콘텐츠가 있는 문법과 콘텐츠가 없는 문법으로 나뉜다.

 

콘텐츠가 있는 문법

콘텐츠가 있는 문법에서는 위와 같이 콘텐츠 앞뒤를 태그로 감싼다.

이때 앞에 넣는 태그를 시작 태그, 뒤에 넣는 태그를 종료 태그라고 한다.

종료 태그는 태그명 앞에 /가 있다는 것만 다르고 시작 태그와 같다.

시작 태그(open tag)와 종료 태그(close tag), 콘텐츠(content)를 합쳐서 요소(element)라고 한다.

 

콘텐츠가 없는 문법

콘텐츠가 없는 문법은 앞뒤로 감싸야 할 콘텐츠가 없으므로 시작 태그만 사용한다.

그래서 내용이 비어있다는 의미로 빈 태그라고도 한다.

<br>

콘텐츠가 없는 문법은 시작 태그가 곧 요소여서 위와 같은 br태그는 br 요소라고도 할 수 있다.

 

주석

주석은 코드에 어떠한 메모나 설명을 남기고 싶을 때 사용한다.

<!-- 와 --> 사이에 내용을 작성하면 해당 내용은 주석 처리된다.

<!-- 주석 내용 -->

 

블록 요소와 인라인 요소

body 태그에서 사용하는 태그 중에서 웹 브라우저의 공간 유무와 상관없이 hn태그나 p 태그처럼 사용할 때마다 줄바꿈되는 태그가 있다.

이런 태그로 작성한 코드를 블록 요소라고 한다.

이와 반대로 a태그나 span 태그처럼 공간이 부족할 때만 줄 바꿈되는 태그가 있는데, 이런 태그로 작성한 코드를 인라인 요소라고 한다.

  • 블록 요소 : 공간 유무와 상관없이 사용할 때마다 줄바꿈되는 태그
  • 인라인 요소 : 공간이 부족할 때만 줄 바꿈되는 태그

 

부모, 자식, 형제 관계

HTML은 태그 사용 위치에 따라 부모, 자식, 형제 관계가 성립된다.

<A>
    <B></B>
    <C></C>
</A>

A태그 안에 B와 C 태그가 사용되면 A태그는 B와 C 태그의 부모가 되고, B와 C태그는 A태그의 자식이 된다.

부모가 같은 B와 C 태그는 형제 관계가 된다.

 

HTML문서의 기본 구조

VS Code에서 html 확장자 명을 입력하고 파일을 만들었다면 아래와 같이 !를 입력하고 엔터를 누르면

 

아래와 같이 자동으로 기본적인 HTML 문서 구조가 완성된다.

  • <!DOCTYPE html> : 현재 문서가 HTML5 언어로 작성한 웹 문서라는 뜻이다.
  • <html> ~ </html> : 웹 문서의 시작과 끝을 나타내는 태그이다. 웹 브라우저가 <html> 태그를 만나면  </html>까지 코드를 읽어 화면에 표시한다. </html> 태그 뒤에는 아무 내용도 없어야 한다.
  • <head> ~ </head> : 웹 브라우저가 웹 문서를 해석하는 데 필요한 정보를 입력하는 부분이다. 이 영역의 내용은 대부분 화면에 보이지 않는다. 
  • <body> ~ </body> : 실제로 웹 브라우저 화면에 나타나는 내용이다.
<html lang="en">
이 태그는 영어로 작성된 문서라는 뜻이다.
한국어로 작성된 문서라고 알려주고 싶다면 en 대신 ko를 입력하면 된다.

 

<head> 태그

<head> 영역의 내용은 대부분 웹 브라우저 화면에 보이지 않는다. 웹 문서에 방문한 사람이 굳이 알아야 할 정보가 아니기 때문이다.

문서에서 사용할 스타일 시트 파일도 이곳에서 연결한다.

<head> 영역에는 <meta> 태그와 <title> 태그가 들어간다.

<meta> 태그

메타 정보라고 하면 '데이터에 관한 데이터'를 말한다. 책의 메타 정보로 가격, 쪽수, 지은이 등이 있는 것처럼 <meta> 태그도 비슷하다. <meta> 태그의 가장 중요한 역할은 화면에 글자를 표시할 때 어떤 인코딩을 사용할지 지정하는 것이다.
웹 서버는 영어가 기본이므로 화면에 한글로 된 내용을 표시할 때에는 UTF-8이라는 문자 세트를 사용한다고 웹 브라우저에게 알려줘야 한다.

<meta charset="UTF-8">​
다양한 메타 태그
<meta name="keyword" content="웹 문서의 키워드"> <!--웹 문서의 키워드-->
<meta name="description" content="웹 문서의 설명"> <!--웹 문서의 설명-->
<meta name="author" content="웹 문서의 소유자나 제작자"> <!--웹 문서의 소유자나 제작자-->​

 

<title> 태그

<title>과 </title> 사이에 웹 문서의 제목을 입력한다.
태그 사이에 입력된 문자가 웹 문서의 제목이 된다.

<title>아무이름</title>​

제목은 HTML 문서마다 중복되지 않아야 한다.
구글이나 네이버 같은 검색 엔진 사이트에서 HTML문서를 찾을 때는 title 태그에 작성된 제목으로 찾는다.
만약 한 웹사이트에서 제목이 중복된 문서가 여러 개 발견된다면 검색 엔진은 해당 웹사이트가 신뢰성이 떨어진다고 판단해서 검색 엔진 노출 시에 불이익을 준다.

 

<body> 태그

<body>와 </body> 사이에 실제 웹 브라우저에 표시할 내용을 입력한다.

<body>
    <h1>프런트엔드 웹 개발</h1> <--가장 큰 제목-->
    <hr> <--줄-->
    <p>HTML</p> <--HTML 출력후 단락만들기-->
    <p>CSS</p> <--CSS 출력후 단락만들기-->
    <p>자바스크립트</p> <--자바스크립트 출력후 단락만들기-->
</body>​

 

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 작성하였습니다.


이 글은 대략적인 컴퓨터 구조를 정리하는 글입니다. 세세한 구조는 다루지 않습니다.

컴퓨터 구조는 아래와 같이 두 가지로 나뉜다.

  • 컴퓨터가 이해하는 정보
  • 컴퓨터의 4가지 핵심 부품

 


 

컴퓨터가 이해하는 정보

컴퓨터가 이해하는 정보는 아래와 같이 두 가지로 나뉜다.

  • 데이터
  • 명령어

 

데이터

컴퓨터 구조에서 데이터란 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 뜻한다.

컴퓨터와 주고받는 정보 또는 내부에 저장된 정보를 데이터라고 통칭하기도 한다.

컴퓨터는 모든 데이터를 0과 1로 저장한다.

 

명령어

컴퓨터를 한 마디로 정의한다면, 명령어를 처리하는 기계라고 할 수 있다.

명령어는 컴퓨터를 실질적으로 움직이는 정보이다.

데이터는 명령어 처리를 위한 재료이다.

인간이 컴퓨터에게 명령어를 전달하기 위해서 프로그래밍 언어를 배운다.

명령어를 예로 들면 아래와 같다.

  • 1과 2를 더하라
  • "컴퓨터 구조"를 출력하라

 


 

컴퓨터의 4가지 핵심 부품

컴퓨터의 4가지 핵심 부품은 아래의 4개와 같다.

  • CPU
  • 메모리(RAM, ROM)
  • 보조기억장치(SSD, HDD 등등)
  • 입출력 장치(키보드, 마우스, 마이크, 스피커 등등)
메인보드(마더보드)
이러한 4가지 핵심 부품이 상호작용을 하려면 한 곳으로 모이는 장소가 필요하다.
그런 장소를 메인보드라고 한다.
버스
우리가 가까운 장소에 있더라도 벽에 가려져 있으면 만날 수 없듯이, 부품끼리도 통로가 필요하다.
부품끼리 정보를 주고, 받을 수 있도록 해주는 일종의 통로를 버스라고 한다.
버스는 여러 종류가 있으나, 핵심 부품을 연결하는 버스는 시스템 버스이다.

 

CPU(산술연산논리장치)

CPU는 메모리에 저장된 명령어를 읽고, 읽은 명령어를 해석하고, 실행하는 역할을 한다.

CPU 내부에는 ALU, 레지스터, 제어장치라는 부품들이 있다.

  • ALU : CPU 내부에서 계산기와 같은 역할을 수행
  • 레지스터 : CPU 내부에 있는 작은 저장장치 (보통 여러 개가 있다)
  • 제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 장치
제어 신호
컴퓨터 부품들을 관리하고 작동시키기 위한 전기신호
이러한 신호에는 대표적으로 메모리 읽기, 쓰기 신호가 있다.

메모리 읽기 신호 : CPU가 메모리의 특정 값을 읽기 위해 보내는 신호
메모리 쓰기 신호 : CPU가 메모리에 특장 값을 저장하기 위해 보내는 신호

 

그림으로 보는 3가지 CPU의 핵심 부품의 역할
그림 출처 : https://hongong.hanbit.co.kr/

 

메모리(RAM)(주기억장치)

  • 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다.
  • 휘발성 저장장치라는 점에서 보조기억장치와 대비된다.
  • 보조기억장치보다 속도는 더 빠르며, 가격은 더 비싸다.
  • 보조기억장치에서 CPU로 바로 데이터를 상호작용하는 것은 속도가 매우 느리고, 비효율적이어서, 중간 연결다리 역할을 메모리가 한다. 그리하여 주기억장치를 메모리라고 한다.
  • 메모리는 보조기억장치에서 필요한 정보를 가져오고 빠르게 CPU와 상호작용한다.
  • 우리가 주소를 알아야 건물을 찾아갈 수 있듯이, 메모리에도 주소라는 개념이 사용된다. 메모리 주소에 위치한 공간에는 명령어와 데이터가 저장되어 있다.

 

 휘발성 저장장치
휘발성 저장장치는 전원 공급이 중단되면 저장되어 있던 데이터가 모두 소멸되는 것을 말한다.
반대로 비휘발성 저장장치는 전원 공급이 중단되어도 데이터가 소멸되지 않는다.

 

보조기억장치(SSD, HDD 등등)

주기억장치에 모든 정보를 저장한다면 그 컴퓨터의 가격은 우리가 시중에서 구매할 수 있는 컴퓨터의 가격보다 몇 배나 더 비쌀 것이다.

또한, 주기억장치는 휘발성 기억장치이므로 데이터를 읽지 않기 위해서는 평생 동안 컴퓨터를 끌 수 없을 것이다.

이러한 주기억장치의 단점 때문에 보조기억장치가 개발되었고, 사용되고 있다.

보조기억장치는 비휘발성 기억장치이다.

 

입출력 장치(키보드, 마우스, 마이크, 스피커 등등)

입출력장치는 마이크, 스피커, 프린터, 마우스, 키보드처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치를 뜻한다.

 

메인보드와 시스템 버스

메인보드(마더보드)
CPU, 주기억장치, 보조기억장치, 입출력장치와 같은 핵심 부품이 상호작용을 하려면 한 곳으로 모이는 장소가 필요하다. 핵심 부품이 모여있는 장소를 메인보드라고 한다.

메인보드는 핵심 부품 외에 여러 컴퓨터 부품을 부착할 수 있는 슬롯과 연결 단자가 있다.

 

버스
우리가 가까운 장소에 있더라도 벽에 가려져 있으면 만날 수 없듯이, 부품끼리도 통로가 필요하다.
부품끼리 정보를 주고, 받을 수 있도록 해주는 일종의 통로를 버스라고 한다.
버스는 여러 종류가 있으나, 핵심 부품을 연결하는 가장 중요한 버스는 시스템 버스이다.

 

시스템 버스는 아래와 같이 3가지로 구성된다.

  • 주소 버스 : 주소를 주고받는 통로
  • 데이터 버스 : 명령어 및 데이터를 주고받는 통로
  • 제어 버스 : 제어 신호를 주고받는 통로

 

그림으로 보는 CPU와 메모리의 제어 신호 상호작용
-메모리 읽기 신호를 보냈을 때


-메모리 쓰기 신호를 보냈을 때
그림 출처 : https://hongong.hanbit.co.kr/

 

본 게시글은 유튜브 : 경제 TV 너무경 : 너무 쉬운 경제 윤성종 님의 유튜브 영상을 참고하였습니다. 개인적으로 정리하는  글임을 알립니다.


금융용어정리 - 액면분할

액면분할

액면분할을 쉽게 설명하면 초코파이 10개가 들어있는 한 박스를 만 원에 판매하면 초등학생들은 구매하기가 힘들 것이다. 하지만 초코파이 낱개를 각각 1개에 천 원에 판매하면 초등학생들도 쉽게 구매할 수 있다.

이처럼 주가가 너무 높아 주식의 유통이 어려운 경우 주가를 낮추고 주식수를 늘려 유통을 자유롭게 하는 것을 액면분할이라고 한다.

액면분할은 주식의 수가 증가하지만 자본과 자본금의 변화는 없다. 왜냐하면 주식의 수가 증가하는 만큼 주가도 낮아지기 때문이다.

무상증자와 비교
무상증자에서도 액면분할과 비슷한 과정이 발생한다.
무상증자는 자본의 변화는 없지만 자본금은 변화한다.

 

예를들어

자본금 : 천만 원, 액면가 : 만 원, 주식 1,000주, 주가 : 십만 원, 시가총액 : 10억 원인 기업이 있는데,

주식을 100개로 쪼개면(액면분할)

자본금 : 천만 원, 액면가 : 100원, 주식 100,000주, 주가 : 만 원, 시가총액 : 10억 원으로 변하게 된다.

자본금과 시가총액
100원 X 100,000주 = 천만 원
만 원 X 100,000주 = 10억 원
액면분할을 하여도 자본금, 자본, 시가총액은 변함이 없다.

 

 

본 게시글은 유튜브 : 경제 TV 너무경 : 너무 쉬운 경제 윤성종 님의 유튜브 영상을 참고하였습니다. 개인적으로 정리하는  글임을 알립니다.


금융용어정리 - 유상증자

유상증자

무상증자와 달리 주식을 발행하여, 주주에게 대가를 받고 주식을 줌으로써 자본금을 늘리는 것을 말한다.

 

목적

  1. 돈이 없어서
  2. 돈이 필요해서

목적이 돈이 없어서와 돈이 필요해서는 다르다.

 

돈이 없어서 유상증자를 하는 경우는 아래와 같은 경우이다.

  • 채무 상환을 위한 비용을 조달하기 위해
  • 운영 자금을 조달하기 위해

이러한 경우로 유상증자를 하는 경우 대부분 악재로 작용한다.

 

돈이 필요해서 유상증자를 하는 경우는 아래와 같은 경우이다.

  • 설비 증설
  • 투자 확대
  • 신규 사업
  • 타기업 지분 취득, 인수

이러한 경우로 유상증자를 하는 경우 호재로 작용할 수 있다.

 

방식

  1. 주주배정 : 주주를 대상으로 주식을 발행
  2. 일반공모 : 주주가 아닌 사람(불특정 다수)을 대상으로 주식을 발행
  3. 3자 배정 : 특정인이나 특정 기업을 대상으로 주식을 발행

3자 배정에 유명 투자자나 좋은 기업에게 주식을 발행하는 경우 호재가 될 수 있다.

 

유상증자는 호재인가 악재인가

유상증자는 일반적으로 악재이다.

  1. 주식수가 많이지면 지분율이 희석되기 때문
  2. 주식수가 많아져 주당 수익률이 낮아지기 때문(회사의 수익은 같은데, 주식이 많아져서)

 

유상증자가 호재로 작용하는 경우는 아래와 같다.

  1. 재무구조가 확연하게 개선되는 경우(유상증자로 인해 자본 중에 하나인 자본금이 증가함으로 인해 자기자본이 증가하는 경우)
  2. 저명한 투자자 등이 3자배정 방식으로 투자하는 경우
  3. 목적이 사업영역을 확장하는 경우

 

실권주

주주배정 방식에서 주주가 정해진 날까지 청약을 하지 않거나, 청약을 하더라도 돈을 내지 않을 경우 남는 주식을 뜻한다.

주주배정 방식은 먼저 기존 주주에게 지분에 비례하여 새 주식을 살 수 있도록 해준다(신주인수권)

이때 새 주식이 안 팔리고 남을 수 있는데, 이를 실권주라고 하고 실권주는 주주가 아닌 다른 사람에게도 살 수 있게 한다.(일반 공모)

이러한 과정 때문에 주주배정방식을 주주배정 후 실권주 일반공모라고 하기도 한다.

예를 들어
증자 전 발행주식 총수 : 1000주
발행할 신주의 수 : 100주
1주당 신주배정주식수 : 0.1주
현재 주가 : 5000원
신주 가격 : 4000원(신주 가격은 보통 현재 주가보다 싸다)
위와 같은 경우
A씨가 800주, B씨가 200주를 가지고 있다고 가정하면
A씨는 80주의 신주를 살 수 있어서 80주를 모두 샀고, B씨는 20주의 신주를 살 수 있는데 10주만 샀다고 하면
총 신주의 수 100주 중에 90주만 팔렸기 때문에, 남은 10주는 실권주가 되고, 실권주는 주주가 아닌 일반인에게 공모를 하게 된다.

유상증자에서 신주인수권 개념이 등장하는 것은 주주배정방식뿐이다.

신주인수권
증자를 위하여 신주가 발행되는 경우 우선적으로 인수를 청구할 수 있는 권리.
=신주를 배정받을 권리

신주인수권이 있기 때문이 권리락이 발생하고, 신주인수권이 있기 때문에 안 팔리고 남는 주식을 실권주라고 부르는 것이다.

따라서 일반공모와 3자 배정에서는 신주인수권, 권리락, 실권주 개념은 등장하지 않는다.

 

유상증자 절차

  1. 예정 발행가 결정(1차 발행가 결정)
  2. 권리락
  3. 신주배정기준일
  4. 신주인수권 거래(5일) (신주인수권도 거래가 가능하다. 단, 보통 5일 정도 기간에만 가능하다)
  5. 2차 발행가 결정, 최종 발행가 확정 (1차 발행가와 2차 발행가중에 더 싼 발행가가 최종 발행가가 된다.)
  6. 주주 청약
  7. 실권주 공모(신주가 모두 팔리지 않으면)
  8. 신주상장

 

유상증자 이후 자본의 변화

자산은 자본과 부채의 합인데, 이해를 위해 부채는 없다고 가정하겠다.

 

기업 초창기

자본 : 천만 원,자본금 : 천만 원, 액면가 : 1,000원, 주식수 : 10,000주

시가총액 : 천 만원, 주가 : 1,000원

 

기업이 어느 정도 성장 했을 때

자본 : 2,000만 원,자본금 : 천만 원, 액면가 : 1,000원, 주식수 : 10,000주, 이익 잉여금 : 천 만원

시가총액 : 2천만 원, 주가 : 2,000원

 

유상증자 후 (신주 가격 1,500원, 신주 1만 주)

자본 : 3,500만 원, 자본금 : 2천만 원, 액면가 : 1,000원, 주식수 : 20,000주, 이익 잉여금 : 천만 원, 자본 잉여금 : 500만 원

시가총액 : 3천500만 원, 주가 : 1,750원

설명
신주 가격 1,500원 중에 1,000원은 자본금의 증가에 사용되고, 나머지 500원인 주식발행초과금은 자본 잉여금 증가에 사용된다.
따라서 1,500원 X 1만 주 = 1,500만 원 중에서 1,000만 원은 자본금 사용되고, 500만 원은 자본 잉여금이 된다.
유상증자 후 주가는 기존 주가 2,000원에 신주 주가 1,500원을 더한 값을 2로 나눈 값인 1,750원이다.

향상된 for문

ReBugs
|2023. 2. 13. 00:01

장단점

장점

  • 간편한, 가독성 좋은 코드
  • 배열의 인덱스 문제(정해진 인덱스를 넘어버리는 예외 등)를 해결할 수 있다.

단점

  • 인덱스를 사용하지 못한다.
  • 배열이나 자바의 ArrayList 값을 사용할 수 있지만 절대 수정할 수 없다.

 

C / C++

1차원 배열은 가능하나 다차원 배열에서 적용은 모르겠다.(알고있다면 댓글 남겨주세요)

int array[] = {1,2,3,4};
for (int i : array)
{
    cout << i << endl;
}

 

JAVA

1차원 배열

String[] arr = {"0-0","0-1","0-2"};
for(String i : arr) System.out.println(i);
/*
0-0
0-1
0-2
*/

 

다차원 배열

String [][]arr = {
        {"0-0","0-1","0-2"},
        {"1-0","1-1","1-2"},
    };
for(String[] i : arr)
{
    for(String j : i) System.out.println(j);
}
/*
0-0
0-1
0-2
1-0
1-1
1-2
*/

 

Python

1차원 리스트

arr = ["0-0","0-1","0-2"]
for i in arr:
	print(i)
#0-0
#0-1
#0-2

 

다차원 리스트

arr = [["0-0","0-1","0-2"], ["1-0","1-1","1-2"]]
for i in arr:
	for j in i:
		print(j)
#0-0
#0-1
#0-2
#1-0
#1-1
#1-2

'기타' 카테고리의 다른 글

카멜 케이스, 파스칼 케이스, 스네이크 케이스  (0) 2023.07.03
순서도(Flowchart)  (0) 2023.01.16
BCD 코드와 3초과 코드  (1) 2022.12.24
진수, 진법 변환, 보수  (0) 2022.11.29
벤포드의 법칙(with 파이썬)  (1) 2022.11.23

Do it! 자료구조와 함께 배우는 알고리즘 입문[자바편] 연습문제와 실습문제입니다.


하노이의 탑 설명

1, 2, 3번 기둥 이렇게 3개의 기둥과 크기가 모두 다른 n개의 원판이 있을 때, n개의 원판 모두 1번 기둥에 크기가 큰 원판순으로 아래에 위치되어 있다. 이러한 기둥들을 3번 기둥에 모두 옮겨야 하는데, 한 번에 한 원판만 옮길 수 있고 크기가 작은 원판 위에 크기가 큰 원판을 올릴 수 없다.

이러한 원판 이동을 최소한의 횟수로 옮기는 것이 하노이의 탑의 규칙이다.

https://brunch.co.kr/@younggiseo/139

 

하노이의 탑 풀이

가장 위에 있는 원반을 1번원반, 그 아래의 원반을 2번 원반, 가장 아래에 있는 원반을 n번 원반이라고 하면

디테일한 과정 말고 큰 과정을 나열하면 3가지로 압축할 수 있다.

  • 1 ~ n-1번 원반을 2번 기둥에 옮긴다.
  • n번 원반을 3번 기둥에 옮긴다.
  • 1 ~ n-1번 원반을 3번 기둥에 옮긴다.

https://m.blog.naver.com/PostView.nhn?blogId=puri8467&logNo=221440092130&proxyReferer=https:%2F%2Fwww.google.com%2F

 

구현

재귀 알고리즘으로 하노이의 탑 문제를 구현하는 것은 간단하다.

다만 이해하는 것은 개인적으로 조금 힘들었다.

import java.util.Scanner;

class Hanoi {
    //--- no개의 원반을 x번 기둥에서 y번 기둥으로 옮김 ---//
    static void move(int no, int x, int y) {
        if (no > 1)
            move(no - 1, x, 6 - x - y);

        System.out.printf("원반[%d]를 %d번 기둥에서 %d번 기둥으로 옮김\n", no, x, y);

        if (no > 1)
            move(no - 1, 6 - x - y, y);
    }

    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);

        System.out.println("하노이의 탑");
        System.out.print("원반의 개수 : ");
        int n = stdIn.nextInt();

        move(n, 1, 3);    // 제 1 기둥에 쌓인 n개를 제 3 기둥으로 옮김
    }
}
/*
원반 개수:3
원반[1]을 1번 기둥에서 3기둥으로 옮김
원반[2]을 1번 기둥에서 2기둥으로 옮김
원반[1]을 3번 기둥에서 2기둥으로 옮김
원반[3]을 1번 기둥에서 3기둥으로 옮김
원반[1]을 2번 기둥에서 1기둥으로 옮김
원반[2]을 2번 기둥에서 3기둥으로 옮김
원반[1]을 1번 기둥에서 3기둥으로 옮김
*/

이 알고리즘은 기둥 번호를 정수 1, 2, 3으로 나타낸다.

기둥 번호의 합이 6이므로 시작 기둥, 목표 기둥이 어느 기둥이더라도 중간 기둥은 6 - x - y로 구할 수 있다.

move 메서드는 no개의 원반을 아래와 같이 3단계를 거쳐 옮긴다.

  1. 바닥의 원반을 제외한 그룹(원반[1] ~ 원반[no - 1])을 시작 기둥에서 중간 기둥으로 옮긴다.
  2. 바닥 원반 no를 시작 기둥에서 목표 기둥으로 옮겼음을 출력
  3. 바닥의 원반을 제외한 그룹 (원반[1] ~ 원반[no - 1])을 중간 기둥에서 목표 기둥으로 옮긴다.

 

 

아래의 코드는 개인적으로 이 메소드의 실행 과정을 이해하기 위해 덧붙인 코드이다.

static void hanoi(int TopNum, int x, int y) {
    if (TopNum > 1) //첫 번째 조건문
    {
        System.out.println("------------------------------");
        System.out.println("TopNum = " + TopNum);
        System.out.println("첫 번째 조건문 실행");
        System.out.print(TopNum - 1 +" ");
        System.out.print(x + " ");
        System.out.println(6-x-y);
        System.out.println("------------------------------");
        hanoi(TopNum - 1, x, 6 - x - y);
    }
    System.out.println("원반[" + TopNum + "]을 " + x + "기둥에서 " + y + "기둥으로 옮김, TopNum = " + TopNum );

    if (TopNum > 1) //두 번째 조건문
    {
        System.out.println("------------------------------");
        System.out.println("TopNum = " + TopNum);
        System.out.println("두 번째 조건문 실행");
        System.out.print(TopNum - 1 +" ");
        System.out.print(6 - x - y + " ");
        System.out.println(y);
        System.out.println("------------------------------");
        hanoi(TopNum - 1, 6 - x - y, y);
    }
}

 

최소 움직임 수

하노이의 탑 문제를 해결하기 위한 최소 움직임 수는 2ⁿ-1이다.

즉 원반이 3개이면 최소 움직임 수는 8-1 = 7이다. 위 메소드에서 hanoi(3)의 결과와 같다.

원반이 4개라면 16 -1 = 15이다.

 

추가적으로 원반이 4개라면, 1~3번의 원반을 2번 기둥에 옮기고, 4번 원반을 3번 기둥에 옮기고 다시 1~3번의 원반을 3번 기둥에 옮기면 된다.

즉, 제일 아래의 원반 번호 n을 제외한 n-1개의 원반을 2번 기둥에 옮기고,  원반 번호 n을 3번 기둥으로 옮기고, n-1개의 원반을 다시 3번 기둥에 옮기는 것과 같다.

hanoi(3) + 1 + hanoi(3)과의 움직임 수가 같다.

이를 일반화하면 아래와 같다.

  • hanoi(n) = 2 * hanoi(n-1)

 

일반 재귀 간단 요약
재귀 함수는 정지 조건(재귀 앵커)을 충족하기 전 까지 계속 호출하게 된다. 그러면 함수가 한 번씩 호출될 때마다 파라미터, 리턴값, 리턴 후 돌아갈 위치 등이 스택(메모리 저장공간)에 쌓이게 된다.
재귀 함수를 너무 많이 호출하게 되면 스택의 공간이 모두 차버리는 스택 오버플로가 일어날 수 있다.

 

꼬리 재귀

static int factorial(int n)
{
    if(n > 0) return n * factorial(n-1); //반환(return)부에 연산이 존재
    else return 1; //정지 조건
}

위 코드는 일반 재귀를 이용하여 팩토리얼을 구하는 재귀함수이다.

위 코드는 정지 조건을 충족한 재귀 함수가 1을 리턴을 해야 나머지 재귀 함수의 리턴 값이 정해진다.

아래의 첫 번째 그림은 팩토리얼 메소드에 파라미터 3을 전달했을 때 스택의 모습이고

이를 스택에 쌓여 있는 메소드들을 의인화한 그림은 두 번째 그림이다.

출처 : https://joooing.tistory.com/
출처 : https://joooing.tistory.com/

 

꼬리 재귀는 재귀 함수의 단점을 보완하는 방법 중 하나이다.

꼬리 재귀는 정지 조건을 만난 후 현재 함수에서 추가 연산을 요구하지 않도록 구현하는 재귀의 형태이다.

꼬리 재귀의 핵심은 반환(return)부에 연산이 없어야 한다는 점이다.

즉, 정지 조건을 충족한 재귀 함수가 특정 값을 리턴을 해야 나머지 재귀 함수의 리턴 값이 정해져서 결과가 도출되는 것이 아닌, 정지 조건을 충족한 재귀 함수에서 즉시 결과가 도출된다.

static int factorial(int n, int total){
    if(n == 1) return total; //정지 조건 -> 바로 팩토리얼의 값을 리턴
    return factorial(n - 1, n * total);
}

 

위 메소드에 파라미터로 3과 1을 넘기면 메소드들은 아래와 같은 행동을 취한다.

 

출처 : https://joooing.tistory.com/

 

일반 재귀는 스택에 쌓였다가 빠져 나올 때 원래 자기 자리로 돌아가서 앞쪽의 n과 곱해져야 한다(반환(return)부에 연산이 존재). 즉, 리턴 후 돌아갈 위치를 저장하고 있어야 한다는 뜻이다. 위에서 재귀에 대해 설명할 때 스택에 파라미터, 리턴값, 리턴 후 돌아갈 위치 등이 저장된다 말했었는데, 꼬리 재귀는 리턴 후 돌아갈 위치를 저장할 필요가 없다.

위의 설명을 보고 아래 코드를 보면 일반 재귀와 꼬리 재귀의 차이점을 이해할 수 있다.

static int factorial(int n) //일반 재귀
{
    if(n > 0) return n * factorial(n-1); //반환(return)부에 연산이 존재
    else return 1; //정지 조건
}

static int factorial(int n, int total){ //꼬리 재귀
    if(n == 1) return total; //정지 조건 -> 바로 팩토리얼의 값을 리턴
    return factorial(n - 1, n * total);
}

 

꼬리 재귀를 위한 조건은 아래의 두 가지가 있다.

  • 재귀 함수를 꼬리 재귀 방식으로 구현
  • 컴파일러가 꼬리 재귀 최적화를 지원

재귀 함수의 스택오버플로우 문제를 해결할 수 있고, 반복문과 성능 차이도 발생시키지 않는다.

꼬리 재귀로 구현된 재귀 함수는 컴파일 시 컴파일러가 꼬리 재귀를 인식하고 최적화하면서 반복문으로 바꿔주기 때문이다.


reference : https://joooing.tistory.com/, https://wildeveloperetrain.tistory.com/116