폼은 사용자의 의견이나 정보를 알기 위해 폼을 사용하는 경우가 많습니다.

기본형 설명
<form [속성="속성 값"]>
여러 폼 요소 </form>
정보 저장, 검색, 수정
대부분의 작업은 정보를 저장하거나 검색, 수정하는 일인데 이런 작업은 모두 데이터베이스를 기반으로 합니다.
폼에 입력한 사용자 정보를 처리하는 것은 ASP나 PHP, JSP같은 서버 프로그래밍을 이용합니다.
<label [속성="속성 값"]>  레이블 <input ...>
</label>

<label for="id이름">레이블</label>
<input id="이름" [속성="속성값"]>
폼 요소에 레이블 붙임
입력 창 옆에 아이디나 비밀번호처럼 붙여놓은 레이블을 만들 때 사용한다.
<fieldset [속성="속성 값"]> ... </fieldset> 폼 요소 묶기
사용자가 정보를 입력하기에도 편리하고 화면도 깔끔하게 정리가 가능하다. 이렇게 하나의 폼 안에서 여러 구역을 나누어 표시하려고 할 때 <fieldset>,<legend>항목을 사용한다.

 

속성 설명
method 사용자가 입력한 내용들을 서버 쪽 프로그램으로 어떻게 넘겨줄지 지정합니다.
속성 값 get - 주소 표시줄에 사용자가 입력한 내용이 그대로 드러납니다. 256byte~4096byte까지의 데이터만 서버로 넘길 수 있습니다. 웹에서 주로 이 방식을 사용한다.
post - 입력 내용의 길이에 제한을 받지 않고 사용자가 입력한 내용이 드러나지 않습니다.
name 폼의 이름을 지정합니다. 한 문서 안에 여러 개의 <form>태그가 있을 경우, 폼들을 구분하기 위해 사용합니다.
action <form>태그 안의 내용들을 처리해 줄 서버 상의 프로그램을 지정합니다.
target action 속성에서 지정한 스크립트 파일을 현재 창이 아닌 다른 위치에 열도록 지정합니다.
autocomplete 이전에 입력했던 내용이 힌트로 표시되게 한다.<form action="register.php" autocomplete="off">
...... </form> 같은 형태로 사용한다.

 

 

 

 

사용자 입력을 위한 <input> 태그

이메일 주소, 전화번호, 날짜, 시간, 이미지, 버튼 등 사용자가 입력할 부분을 넣기 위해 사용한다.

기본형 설명
<input type="유형" [속성="속성 값"]> 사용자가 입력한 내용을 서버에서 받을 때 사용한다.
<input type="hidden" name="이름" value="서버로 넘길 값"> 히든 필드는 화면상의 폼에는 보이지 않는 값을 입력받는다.
<input type="text" [속성="속성 값"]> 한 줄짜리 일반 텍스트를 입력하는 필드입니다.
<input type="password" [속성="속성 값"]> 사용자가 입력하는 내용을 *같은 문장으로 바꿔준다.
<input type="search" [속성="속성 값"]> search검색상자를 만들 때 사용되는 타입입니다.
<input type="url" [속성="속성 값"]> 웹 주소도 텍스트 필드에서 분화되어 type으로 별도로 지정됩니다.
이것으로 url입력란을 만들 수 있습니다.
<input type="email" [속성="속성 값"]> 메일주소를 입력받을 수 있다.
<input type="tel" [속성="속성 값"]> 전화번호 입력란을 만들 수 있다.
<input type="text" id=[속성="속성 값"]> 자주 사용하는 값을 지정한다.

 

type에서 사용할 수 있는 유형 값

유형 설명
hidden 사용자에게는 보이지 않지만 서버로 념겨지는 값을 가집니다.
text 한 줄짜리 텍스트를 입력할 수 있는 텍스트 상자를 넣습니다.
search 검색 상자를 넣습니다.
tel 전화번호 입력 필드를 넣습니다.
url URL 주소를 입력할 수 있는 필드를 넣습니다.
email 메일 주소를 입력할 수 있는 필드를 넣습니다.
password 비밀번호를 입력할 수 있는 필드를 넣습니다.
datetime 국제 표준시(UTC)로 설정된 날짜와 시간(연, 월, 일, 시, 분, 초, 분할 초)를 넣습니다.
datetime-local 사용자가 있는 지역을 기준으로 날짜와 시간(연, 월, 일, 시, 분, 초, 분할 초)을 넣습니다.
date 사용자가 지역을 기준으로 날짜(연, 월)를 넣습니다.
month 사용자 지역을 기준으로 날짜(연, 월)를 넣습니다.
week 사용자 지역을 기준으로 날짜(연, 주)
time 사용자 지역을 기준으로 시간(시, 분, 초, 분할, 초)을 넣습니다.
number 숫자를 조 절할 수 있는 화살표를 넣습니다.
range 숫자를 조절할 수 있는 화살표를 넣습니다.
color 색상 표를 넣습니다.
checkbox 주어진 항목에서 2개 이상 선택 가능한 체크박스를 넣습니다.
radio 주어진 항목에서 1개만 선택할 수 있는 라디오 버튼을 넣습니다.
file 파일을 첨부할 수 있는 버튼을 넣습니다.
submit 서버 전송 버튼을 넣습니다.
image submit 버튼 댓니 사용할 이미지를 넣습니다.
reset 리셋 버튼을 넣습니다.
button 버튼을 넣습니다.

 

 

input의 텍스트 필드에서 사용할 수 있는 속성

속성 설명
name 텍스트 필드를 구별할 수 있도록 이름을 붙입니다.
size 텍스트 필드의 길이를 지정합니다. 즉 화면에 몇 글자가 보이도록 할 것인지를 지정합니다.
예를 들어 최대 입력 가능한 글자 수가 10개인데 size를 5로 지정하면 텍스트 필드 크기가 5개인 크기에 맞추어져 나머지 5개 글자는 화면에 보이지 않습니다.
value 텍스트 필드 요소가 화면에 표시될 때 텍스트 필드 부분에 표시될 내용입니다. 이 속성을 사용하지 않으면 빈 텍스트 필드가 표시됩니다.
maxlength 텍스트 필드에 입력할 수 잇는 최대 문자 개수를 지정합니다.

 

 

 

날짜나 시간과 관련된 유형을 지정할 때 공통으로 사용하는 속성

속성 설명
min 날짜나 시간의 최솟값을 지정합니다.
max 날짜나 시간의 최댓값을 지정합니다.
step 스핀 박스의 화살표를 누를 때마다 날짜나 시간을 얼마나 조절할지를 지정합니다.
value 화면에 표시할 초기값을 지정합니다.

 

 

 

<input> 태그의 다양한 속성

기본값 설명
<input type="text" id="uname" autofocus required> 오토 포커스 속성을 사용하면 페이지를 불러오자마자 폼이ㅡ 원하는 요소에 마우스 커서를표시할 수 있습니다.
<input type="text" id="uid" placeholder="하이픈없이 입력"> 사용자가 텍스트를 입력할 때 도움이 되도록 입력란에는 적당한 힌트내용을 표시하고있다가 그 필드를 클릭하면사라지도록 만들 수 있는 속성
<label class="reg" for="uid">학번</label>
<input type="text" id="subj" value="오전 9:00~11:00" readonly>
입력란에 텍스트를 표시하는 것을 넘어 사용자가 입력하지 못하고 읽게만 만들 수 있는 속성
<label class="reg" for="uname">이름</label>
<intput type="text" id="uname" autofocus required>
필드에 텍스트가 없을 경우 오류 메세지를 표시하는 속성
<label class="reg" for="group">단체주문</label>
<input type="number" id="group" value="10" min="10" max="100" step="10">
min 속성과 max속성은 각각 해당 필드의 최솟값과 최댓값을 지정합니다.
<label>아이디:<input type="text" id="user_id" size="10" minlength="4" maxlength="15"></label><small style="color:red;"> size 속성은 텍스트 필드와 비밀번호 필드, 검색 필드 등 한 줄짜리 텍스트와 관련된 필드에서 화면에 몇 글자까지 보이게 할지 지정하고 maxlength 속성은 사용자가 최대 몇 글자까지 하는지 지정합니다.

 

 

이외에도 <input> 태그에서 사용할 수 있는 속성들은 다음과 같습니다.

속성 설명
formaction 실행할 프로그램을 연결한다. type="submit"이나 type="image"일 때 사용할 수 있습니다.
formentype 서버로 폼을 전송했을 때 폼 데이터를 어떤 방식으로 해석할 것인지 지정합니다. type="submit"이나 type="image"일 때 사용할 수 있습니다.
formmethod 서버로 폼을 전송하는 방식(get, post 등)을 지정합니다. 이미 <form>태그 안에서 지정한 방식이 있어도 그 방식은 무시됩니다.
formnovalidate <form> 태그 안에 novalidate 라는 속성이 있어서 서버로 전송할 때 폼 데이터가 유효(validate)한지 여부를 표시할 수 있는데 <input> 태그 안에서도 formnovalidate 속성을 이용해 유효성 여부를 표시할 수 있습니다.
formtarget 폼 데이터를 서버로 전송한 후 서버의 응답을 어디에 표시할 것인지 타깃을 지정합니다.
height, width type="image"일 때 이미지의 너비와 높이를 지정합니다.
list <datalist>에 미리 정의해 놓은 옵션 값을 <input> 안에 나열해 보여 줍니다. 
multiple type="email"이나 type="file"일 때 두 개 이상의 값을 입력합니다. <input> 태그 안에 속성 이름만 표시하면 됩니다.

 

 

여러 데이터 나열해 보여 주기

기본형 설명
<select 속성="속성 값">
    <option value="값" [속성="속성 값"]> 내용1 </option>
    <option value="값" [속성="속성 값"]> 내용2 </option>
    ...
    <optgroup label="다른 묶음">
        <option value="속성"></option>
    </optgroup>
</select>
<select>, <optgroup>, <option>
드롭다운 목록 만들기
<optgroup label>
라벨 그룹 나누기

 

<select> 태그의 속성

속성 설명
size 화면에 표시될 드롭다운 메뉴의 항목 개수를 지정한비다.
-크롬은 +1개 표시됨
multiple 브라우저 화면에 여러 개의 옵션이 함께 표시되면서 ctrl키를 누를 상태로 드롭다운 메뉴에 있는 여러 항목을 선택할 수 있습니다.

 

<option> 태그의 속성

속성 설명
value 옵션을 선택했을 때 서버로 넘겨질 값을 지정합니다.
selected 화면에 표시될 때 기본으로 선택되어 있는 옵션을 지정합니다.

 

 

기타 다양한 폼 요소들

기본형 설명
<button [ type="submit | reset | button"]> 내용 </button> <button>
버튼 넣기
속성 값 설명
submit 폼을 서버로 전송합니다. <button type="submit">전송하기</button>과 같이 사용합니다.
reset 폼에 입력한 모든 내용을 초기화시킵니다. <button type="reset">다시 쓰기</button>과 같이 사용합니다.
button 버튼 형태만 만들 뿐 자체 기능은 없습니다. <button type="button">주소 입력</button>과 같이 사용합니다.

 

기본형 설명
<output [속성="속성 값"]> 내용 </output> <output>
입력하는 값이 계산 결과라는 것을 브라우저에서 알려 줍니다.
<progress value="값" [max="값"]></progress> <progress>
작업 진행 상태를 나타낼 때 사용하는 태그입니다.
작업진행(value값)은 부동소수점으로 표현
작업이 완료되려면 얼마나 많은 작업을 해야하는지 부동 소숫점으로 표현(max), 0보다 커야함(다운로드%)
<meter value="값" [속성="속성 값"]></meter> <meter>
progress와 거의 같으나 전체 크기 중에서 얼마나 차지하는지를 표현할 때 사용한다. (하드디스크용량)

 

 

meter관련 태그

속성 설명
mint, max 범위의 최솟값과 최댓값을 나타냅니다. 값을 정하지 않으면 0과 1로간주
value 범위 내에서 차지하는 값을 나타냅니다.
low 대략 낮다고 할 정도의 값을 지정합니다.
high 대략 높다고 할 정도의 값을 지정합니다.
optimum 적당하다고 할 정도의 값을 지정합니다.

 

'HTML > 폼 관련 태그들' 카테고리의 다른 글

폼 관련 예제  (0) 2021.08.12

글이나 이미지를 클릭하면 다른 문서(page)나 사이트로 넘어가도록 링크를 거는 것을 하이퍼링크라고 한다.

 

 

이미지

웹에서 사용할 수 있는 이미지 파일 형식

파일 형식 설명
GIF(Graphic Interchange Form) 표시할 수 있는 색상 수가 최대 256가지뿐이지만 다른 이미지 파일 형식에 비해 파일 크기가 작기 때문에 아이콘이나 불릿 등 작은 이미지에 주로 사용합니다.
투명한 배경을 만들 수 있고, frame기록이 가능하기 때문에 움직이는 이미지를 만들 수 있다는 장점이 있습니다.
JPG/JPEG(Joint Photographic Experts Group) 사진을 위해 개발된 형식으로 GIF보다 다양한 색상과 명암을 표현할 수 있습니다. 저장을 반복하다보면 화질이 떨어질 수 도 있습니다.(디지털 풍화 발생가능)
PNG(Portable Network Graphics) 투명 배경을 만들어서 다양한 색상도 표현할 수 있으며 네트워크용으로 개발되었기 때문에 최근 많이 사용한다.

 

 

 

웹문서에 이미지나 설명을 넣는 태그

기본형 기능 설명
<img src="경로" [속성="값"] 이미지 삽입 웹 문서에 이미지를 삽입할때 사용하는 태그
웹 상의 링크를 복사해 이미지 경로 지정도 가능하며
alt로 이미지 속성을 설명해주는 대체 텍스트를 적을 수 있고
width, height로 이미지의 폭과 높이를 조절할 수 있다.
<figure> 요소 </figure> 설명붙일 대상 지정 설명해야 할 대상을 지정하거나 웹 문서에서 오디오나 비디오같은 멀티미디어 파일을 비롯해 사진이나 표, 소스코드 등 웹 문서안에서 한 단위가 되는 요소를 묶을 때 사용한다.
<figcaption> 설명 글 </figcaption> 설명 글 붙이기 설명글을 붙일 수 있는 대상은 이미지, 오디오, 비디오, 텍스트 단락, 표가될 수 있으며 여러 개의 이미지나 미디어파일에 하나의 설명글을 붙일 수 있다.

 

 

 

링크 만들기

텍스트를 클릭해 해당 페이지로 넘어가거나 이미지에 링크를 걸 수 있으며 열려있는 브라우저내에서 새창을 띄울 수도 있다.

기본형 설명
<a href="링크할 주소" [속성="속성 값"]> 텍스트 </a>
<a href="링크할 주소" [속성="속성 값"]><img src="이미지 경로"></a>
텍스트나 이미지에 링크를 건다.
<태그 id="앵커 이름"> 텍스트 또는 이미지 </태그>
<a href="#앵커 이름"> 텍스트 또는 이미지 </a>
한 페이지 안에서 점프한다. 
우선 이동하고 싶은 위치마다 id속성을 이용해 앵커를 만들고 각각 다름을 지정한 뒤 <a>와
herf속성을 사용해 이동한다.
    <map name="맵이름">
        <area>
        <area>
        ......
    </map>

<img src="이미지 파일" usemap="#맵 이름">

하나의 이미지에 여러 링크를 건다.
map태그를 이용해서 이미지맵을 만들고 <img> 태그에서 usemap속성으로 이미지 맵을 지정합니다.

 

<a> 태그 안에 사용할 수 있는 주요 속성

속성 설명
href 링크한 문서나 사이트의 주소를 입력한다.
target 링크한 내용이 표시될 위치(현재 창 또는 새 창)를 지정한다.
download 링크한 대상을 다운로드한다.
rel 현재 문서와 링크한 문서의 관계를 알려준다.
hreflang 링크한 문서의 언어를 지정한다
type 링크한 문서의 파일 유형을 알려준다.

 

 

target의 속성 - 새탭에서 링크 열기

속성 값 설명
_blank 링크 내용이 새 창이나 새 탭에서 열립니다.
_self target 속성의 기본 값으로 링크가 있는 화면에서 열립니다.
_parent 프레임을 사용했을 때 링크 내용을 부모 프레임에 표시합니다.
_top 프레임을 사용했을 때 프레임에서 벗어나 링크 내용을 전체 화면에 표시합니다.

 

사용할 수 있는 속성

속성 설명
alt 대체 텍스트를 지정합니다
coords 링크로 사용될 영역을 시작 좌표와 끝 좌표를 이용해 지정한다.
download 링크를 클릭했을 때 링크 문서를 다운로드합니다.
href 링크 문서(사이트) 경로를 지정합니다.
media 링크 문서(사이트)를 어떤 미디어에 최적화시킬지 지정합니다.
rel 현재 문서와 링크 문서 사이의 관계를 지정합니다. 속성 값 lternate, bookmark, help, license, next, notfollow, noreferer, prefetch, prev, search, tag
shape 링크로 사용할 영역의 형태를 지정합니다. 속성 값 default, rect, circle, poly
media 링크를 표시할 대상을 지정합니다. 속성 값 _blank, _parent, _self, _top, 프레임 이름
target 링크 문서의 미디어 유형을 지정합니다.

 

 

SVG 이미지

브라우저에서 svg파일을 지원하게 되면서 아이콘이나 로고 이미지에 SVG 이미지 파일 형식이 많이 사용되고 있습니다.

SVG 파일 형식은 같은 이미지를 작게 표시하거나 크게 표현해야 할 때 이미지를 아무리 확대하거나 축소해도 원래의 깨끗한 상태 그대로 유지되는 이미지를 벡터 이미지라고 하는데, 그런 이미지를 SVG라고 합니다.

SVG이미지는 어도비(Adobe)일러스트레이터(Illustrator) 프로그램에서 벡터 이미지를 만든 후 svg파일로 저장해 만듭니다.

'HTML > 이미지와 하이퍼링크' 카테고리의 다른 글

이미지와 하이퍼링크예제  (0) 2021.08.11

css zen garden

css zen garden은 CSS 기반 디자인을 통해 시각적으로 표현하기 위한 전 세계 웹 개발 자원입니다. 전 세계 그래픽 디자이너가 만든 스타일 시트는 수백가지의 HTML 파일의 시각 자료를 만드는데사용됩니다. HTML 마크업은 변하지 않으며 모든 시각 자료는 CSS를 외부파일로 참조해서 나타나는 것입니다. 2003년 5월 출시 당시에는 5가지 디자인만 있었습니다.

웹 개발자 Chris Casciano의 "Daily CSS Fun"라는 CSS 관련 디자인을 웹 표준으로 만들려는 활동인   웹 표준 프로젝트을 통해 알려졌습니다.[2] "웹 표준 프로젝트는 가장 잘 알려져 있고 가장 영감을 주는 프로젝트 중 하나"로 간주되는 [3] 이 사이트는 "웹에서 미적 표준을 높이고 웹 디자인을 다양하게"하는 데 성공했습니다. [4] 저명한 웹 표준 옹호자 Jeffrey Zeldman"수백 명의 디자이너가 Zen Garden 레이아웃을 만들어 명성을 얻었고 때로는 명성을 얻었고 전 세계 수만 명의 디자이너가 그것으로 인해 CSS를 사랑하는 법을 배웠습니다." [5]

CSS Zen Garden은 여러 언어로 번역되었으며 다른 언어로 유사한 사이트에 영감을 주었습니다.

2005년 2월, CSS 디자인의 Zen ( Peachpit Press )은 CSS Zen Garden 제작자 Dave Shea 와 웹 디자이너 Molly Holzschlag에 의해 출판되었습니다 . 이 책은 Zen Garden 사이트에 소개된 36개의 디자인을 기반으로 합니다.

사이트의 활발한 개발은 2008년 4월에 중단되었습니다. 그러나 2013년 5월 7일 사이트의 10주년을 위해 Shea는 HTML5 , CSS3 및 현재 디자인 원칙 에 초점을 맞춰 제출물을 다시 공개했습니다 . [6] 현재 Zen Garden에는 218개의 디자인이 나열되어 있습니다.

 

minify

CSS는 네트워크를 통해서 전송됩니다. CSS의 크기가 커지면 클라이언트와 고객에게 손해입니다. 따라서 코드를 줄일 필요성이 있는데 코드의 크기를 줄이는 것을 통해서 이런 문제를 완화해주는 도구가 minify 도구입니다. 단적으로 구글에서 minify해서 로딩시간 0.1초 줄였더니 사용량20%가 증가했다는 실험이 있었고 그 효용성을 알리게 되었습니다.

소스코드의 컴파일언어 또는 마크업 언어의 기능을 유지하면서 가독성만을 위한 문자들을 줄여서 네트워크전송을 보다 효율적으로 만듭니다. 프로그래머 문화에서 극도로 축소된 소스 코드를 목표로 하는 것은 레크리에이션 코드 골프 대회의 목적입니다.

축소의 목표는 암호화의 목표와는 다르지만 코드의 압축을 위해 암호화에 사용되는 기술이 사용되기도 합니다. 예를 들면 변수이름을 줄이거나 소스코드를 리팩토링하는 것들이 그에 포함됩니다.

 

 

 

W3C

W3C(영어: World Wide Web Consortium, 축약형은 영어: WWW 또는 W3)는 월드 와이드 웹을 위한 표준을 개발하고 장려하는 조직으로 팀 버너스 리를 중심으로 1994년 10월에 설립되었다. W3C는 회원기구, 정직원, 공공기관이 협력하여 웹 표준을 개발하는 국제 컨소시엄이다. W3C의 설립취지는 웹의 지속적인 성장을 도모하는 프로토콜 가이드라인을 개발하여 월드 와이드 웹의 모든 잠재력을 이끌어 내는 것이다.

 

 

cmyk

CMYK 색 모형(Cyan Magenta Yellow Key(Black))은 감산 혼합의 색 모형이다. 마젠타, 시안, 노랑, 검정을 원색으로 한다.

예를 들면, 마젠타와 시안을 혼합하면 명도가 낮은 파랑이 된다. 이 방법으로는 하양을 제외한 모든 색을 표현할 수 있으며, 수채화, 컬러 사진 등에서 많이 사용된다. 필름을 소부(현상)해서 인쇄하는 오프셋 인쇄에 사용되기 때문에, 쿼크익스프레스, 일러스트레이터, 포토샵에서는 CMYK 모드를 지원한다. RGB나 HSB(HSV)보다 표현 가능한 색이 적다. 이를테면 보라색을 들 수 있다.

북 디자이너들은 원하는 색을 CMYK로 표현하기 위해 색들이 나열된 표(컬러차트)를 사용한다. 주로 인쇄에서 사용된다.

 

 

 

HTML5 Shiv

인터넷 익스플로러 9 이하에서 시맨틱 태그를 지원하도록 한다.

 

 

h264

블록 단위 움직임 보상 기반의 영상 압축 표준인 H.264 또는 MPEG-4 파트 10, Advanced Video Coding (MPEG-4 AVC)는 동영상 녹화, 압축, 배포를 위한 방식들 중 현재 가장 보편적으로 사용되고 있는 포맷이다.

 

 

 

https://html5test.com/

웹브라우저가 잘 돌아가나 테스트하는 사이트이다.

 

 

bps

보통 bps라고 쓰며 통신기기의 속도를 나타낼때 주로 쓰이며 소문자로 사용한다.

 

 

가변비트레이트

가변 비트레이트(variable bitrate, VBR)는 오디오나 비디오 인코딩 형식 중 하나이다. 고정 비트레이트(CBR)에 비해 단위 시간당 출력하는 데이터의 양이 계속 변한다. 또한, 비트레이트의 효율적 할당이 가능하다. 그래서 CBR에 비해 더욱 복잡한 연산을 한다.

 

고정 비트레이트 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

 

Jquery

jQuery(제이쿼리)는 HTML 클라이언트 사이드 조작을 단순화 하도록 설계된 크로스 플랫폼 자바스크립트 라이브러리다. 존 레식 2006년 뉴욕 시 바캠프(Barcamp NYC)에서 공식적으로 소개하였다.

Query 1.x와 2.x는 모두 최신 안정화 버전 및 그 이후 버전의 파이어폭스, 구글 크롬, 사파리, 그리고 오페라를 지원한다. 1.x 버전은 인터넷 익스플로러 6 및 그 이후 버전을 지원한다. 그러나 2.x 버전에서는 인터넷 익스플로러 6-8 버전이 지원되지 않으며 인터넷 익스플로러 9 또는 그 이후 버전을 지원한다.[6]

 

cubic-bezier

베지에 곡선을 쉽게 사용할 수 있게 해 주는 사이트.

transition의 타이밍펑션에 직접적으로 사용 가능

 

 

HTML Canvas Graphics

비트 맵 이미지, 비트맵을 업데이트 하는 낮은 수준의 절차적 모델이며, 2D게임 제작등에 이용됩니다.

 

Canvas3D (webgl)

WebGL ( 웹 그래픽 라이브러리의 줄임말 )은 플러그인을 사용하지 않고 호환되는 모든 웹 브라우저 내에서 대화형 2D 및 3D 그래픽을 렌더링 하기 위한 JavaScript API 입니다 . [2] WebGL은 다른 웹 표준 과 완전히 통합되어 웹 페이지 캔버스의 일부로 물리학 및 이미지 처리 및 효과의 GPU 가속 사용을 허용합니다. WebGL 요소는 다른 HTML 요소와 혼합될 수 있으며 페이지 또는 페이지 배경의 다른 부분과 합성 될 수 있습니다 . [삼]

WebGL 프로그램은 JavaScript로 작성된 제어 코드  C 또는 C++ 과 유사한 언어인 GLSL ES( OpenGL ES Shading Language )로 작성된 셰이더 코드 로 구성되며 컴퓨터의 GPU( 그래픽 처리 장치 )에서 실행됩니다. WebGL은 비영리 Khronos Group 에서 설계 및 유지 관리합니다 . [4]

 

WebGL - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search JavaScript bindings for OpenGL in web browsers WebGL (Short for Web Graphics Library) is a JavaScript API for rendering interactive 2D and 3D graphics within any compatible web browser

en.wikipedia.org

 

콘텐츠 신디케이션

콘텐츠 신디케이션은 콘텐츠 공급자와 수요자 사이를 연결해주는 사이버 콘텐츠 중개사업을 말한다. 신디케이터는 콘텐츠를 직접 생산하지는 않지만 우수한 콘텐츠를 수집, 가공해 인터넷 사이트 운영업체에 제공한다. 웹 2.0으로 향하는 처음의 가장 중요한 발전 중의 하나가 바로 웹사이트 콘텐츠에 대한 신디케이션이다. 신디케이션은 최종 사용자가 사이트의 자료를 다른 장소, 즉 다른 웹사이트, 브라우저 플러그인, 독립된 데스크톱 응용 등에서 이용할 수 있도록 표준화된 프로토콜을 이용한다. 신디케이션을 위한 프로토콜들은 모두 XML을 기반으로 하는데 RSS, Atom등이 있다. (사회적 네트워크의 목적으로 사용되는) FOAF XFN과 같은 특수한 프로토콜들은 사이트의 기능을 확장시켜 주거나, 중앙에서 관리하는 웹사이트 없이도 최종 사용자들의 상호 작용을 가능케 해 준다. 마이크로포맷 사이트에 가면 좀 더 특수한 데이터 포맷들을 볼 수 있다.

최근의 이 같은 개발 경향 때문에, 이런 프로토콜들이 공식 표준으로 지정된 것은 아니지만 사실상의 표준처럼 여겨지는 경우가 많다고 할 수 있다.

 

리치 인터넷 애플리케이션

리치 인터넷 애플리케이션(Rich Internet Application; RIA)은 웹 애플리케이션의 장점은 유지하면서 기존 웹 브라우저 기반 인터페이스의 단점인 늦은 응답 속도, 데스크톱 애플리케이션에 비해 떨어지는 조작성 등을 개선하기 위한 기술의 통칭이다. 즉, 별도의 설치가 필요 없는 웹 브라우저 기반의 애플리케이션 배포 장점과 서버 측 웹 서비스와의 연동, 마크업 언어 기반의 선언적 애플리케이션 구성 등은 유지하면 서 데스크톱 애플리케이션과 대등한 사용자 경험을 주는 것을 목표로 하는 기술이다.

흔히 어도비 플래시 기반 플렉스 마이크로소프트 실버라이트, 자바FX 등 별도의 런타임 시스템을 가진 기술을 지칭하는 용어로 사용되나 웹 브라우저에서 실행되는 애플리케이션의 사용자 인터페이스를 향상하는 기법인 Ajax, 사용자 인터페이스 관점에서 많은 발전을 가져올 HTML의 다음 버전인 HTML5 등에 기반한 애플리케이션을 지칭하기도 한다. 별도의 런타임 시스템을 가진 기술의 경우 애플리케이션은 브라우저 내에서 플러그인으로 실행되기도 하고 단독으로 실행되는 경우도 있다. 이 같이 "리치 인터넷 애플리케이션"이라는 개념은 정확한 정의가 있다기 보다는 다소 모호하고 넓은 의미로 사용되고 있다.

 

 

 

출처 : 위키백과

'HTML > 용어' 카테고리의 다른 글

HTML용어  (0) 2021.08.02

예제 7-1

public class CaptionTvTest {
	public static void main(String[] args) {
		CaptionTv ctv = new CaptionTv();
		ctv.power();
		ctv.channel = 10;
		ctv.channelUp();
		System.out.println(ctv.channel);
		ctv.display("Hello World");
		ctv.caption = true;
		ctv.display("Hello World2");
	}

}

class Tv {
	boolean power;
	int channel;
	
	void power() {power = !power;}
	void channelUp() {channel++;}
	void channelDown() {channel--;}
}
class CaptionTv extends Tv {
	boolean caption;
	void display(String text) {
		if(caption) {
			System.out.println(text);
		}
	}
}
11
Hello World2

 

 

 

예제 7-2

public class DrawShape {
	public static void main(String[] args) {
		Point[] p = {	
				new Point(100, 100),
				new Point(140, 50),
				new Point(200, 100)
		};
		Triangle t = new Triangle(p);
		Circle c = new Circle(new Point(150, 150), 50);
		
		t.draw();
		c.draw();
	}

}

class Shape {
	String color = "black";
	void draw() {
		System.out.printf("[color=%s]%n", color);
	}
}

class Point {
	int x;
	int y;

	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	Point() {
		this(0, 0);
	}

	String getXY() {
		return "(" + x + "," + y + ")"; // x와 y의 값을 문자열로 반환
	}
}

class Circle extends Shape {
	Point center;
	int r;

	Circle() {
		this(new Point(0, 0), 100);
}
	Circle(Point center, int r) {
		this.center = center;
		this.r = r;
	}
	
	void draw() {
		System.out.printf("[center=(%d, %d), r=%d, color=%s]%n", center.x, center.y, r, color);
	}
}

class Triangle extends Shape {
	Point[] p = new Point[3];
	
	Triangle(Point[] p) {
		this.p = p;
	}
	
	void draw() {
		System.out.printf("[p1=%s, p2=%s, p3=%s, color=%s]%n",
				p[0].getXY(),p[1].getXY(), p[2].getXY(), color);
	}
}
[p1=(100,100), p2=(140,50), p3=(200,100), color=black]
[center=(150, 150), r=50, color=black]

 

 

예제 7-3

public class DeckTest {
	public static void main(String[] args) {
		Deck d = new Deck();
		Card c = d.pick();
		System.out.println(c);

		d.shuffle();
		c = d.pick(0);
		System.out.println(c);

	}
}

class Deck {
	final int CARD_NUM = 52;
	Card cardArr[] = new Card[CARD_NUM];

	Deck() {
		int i = 0;
		for (int k = Card.KIND_MAX; k > 0; k--) {	// 4
			for (int n = 0; n < Card.NUM_MAX; n++) {	//13
				cardArr[i++] = new Card(k, n + 1);
			}
		}
		
		for(i =0 ; i < CARD_NUM ; i++) {
			cardArr[i++] = new Card(Card.KIND_MAX-i/Card.NUM_MAX, i%Card.NUM_MAX+1);
		}
	}
		// cardArr[10] ?? 무늬, 숫자
		// diamond J 23
		// heart J 36
		//Clover J 49 50 51

	Card pick(int index) {
		return cardArr[index];
	}

	Card pick() {
		return pick((int) (Math.random() * CARD_NUM));
	}

	void shuffle() {
		for (int i = 0; i < cardArr.length; i++) {
			int r = (int) (Math.random() * CARD_NUM);

			Card temp = cardArr[i];
			cardArr[i] = cardArr[r];
			cardArr[r] = temp;

		}
	}
}

class Card {
	static final int KIND_MAX = 4;
	static final int NUM_MAX = 13;

	static final int SPADE = 4;
	static final int DIAMOND = 3;
	static final int HEART = 2;
	static final int CLOVER = 1;

	int kind;
	int number;

	Card() {
		this(SPADE, 1);
	}

	Card(int kind, int number) {
		this.kind = kind;
		this.number = number;
	}

	public String toString() {
		String[] kinds = { "", "CLOVER", "HEART", "DIAMOND", "SPADE" };
		String numbers = "0123456789XJQK"; // 숫자 10은 X로 표현
		return "kind : " + kinds[this.kind] + ", number : " + numbers.charAt(this.number);
	} // toString()의 끝
} // Card클래스의 끝
kind : DIAMOND, number : 5
kind : SPADE, number : Q

 

 

 

예제 7-4

class Tv {
	boolean power;
	int channel;
	
	void power()	{ power = !power; }
	void channelUP() { ++channel; }
	void channelDown() { --channel; }
}

class VCR {
	boolean power;
	int counter = 0;
	void power() {	power = !power; }
		void play() { }
		void stop() { }
		void rew() { }
		void ff() { }
	}

class TVCR extends Tv {
	VCR vcr = new VCR();
	
	void play() {
		vcr.play();
	}
	
	void stop() {
		vcr.stop();
	}
	void rew() {
		vcr.rew();
	}
	void ff() {
		vcr.ff();
	}

}

 

 

 

 

예제 7-5

public class SuperTest {
	public static void main(String[] args) {
		Child c = new Child();
		c.method();
	}
}

class Parent {
	int x=10;
}

class Child extends Parent {
	void method() {
		System.out.println("x=" + x);
		System.out.println("this.x=" + this.x);
		System.out.println("super.x="+ super.x);
	}
}
x=10
this.x=10
super.x=10

 

 

 

 

예제 7-6

public class SuperTest2 {
	public static void main(String[] args) {
		Child c = new Child();
		c.method();
	}
}

class Parent {
	int x=10;
}

class Child extends Parent {
	int x=20;
	void method() {
		System.out.println("x=" + x);
		System.out.println("this.x=" + this.x);
		System.out.println("super.x="+ super.x);
	}
}
x=20
this.x=20
super.x=10

 

 

 

예제 7-7

public class PointTest {
	public static void main(String[] args) {
		Point3D p3 = new Point3D(1,2,3);
	}
}

class Point {
	int x, y;
	
	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	String getLocation() {
		return "x :" + x + ", y :"+ y;
	}
}

class Point3D extends Point {
	int z;
	
	Point3D(int x, int y, int z) {
		
		this.x = x;
		this.y = y;
		this.z = z;
	}
	
	String getLocation() {
		return "x :" + x + ", y :" + y + ", z :" + z;
	}
}

 

 

 

예제 7-8

class PointTest2 {
	public static void main(String[] args) {
		Point3D p3 = new Point3D();
		System.out.println("p3.x="+ p3.x);
		System.out.println("p3.y="+ p3.y);
		System.out.println("p3.z="+ p3.z);

	}

}

class Point {
	int x = 10;
	int y = 20;

	Point(int x, int y) {

		this.x = x;
		this.y = y;
	}
}

class Point3D extends Point {
	int z = 30;

	Point3D() {
		this(100, 200, 300);
	}

	Point3D(int x, int y, int z) {
		super(x, y);
		this.z = z;
	}
}
p3.x=100
p3.y=200
p3.z=300

 

 

 

예제 7-9

package com.codechobo.book;

public class PackageTest {
	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
}

 

 

 

예제 7-10

import java.text.SimpleDateFormat;
import java.util.Date;

public class ImportTest {
	public static void main(String[] args) {
		Date today = new Date();
		
		SimpleDateFormat date = new SimpleDateFormat("yyyy/mm/dd");
		SimpleDateFormat time = new SimpleDateFormat("hh:mm:ss a");
		
		System.out.println("오늘 날짜는 " + date.format(today));
		System.out.println("현재 시간은 " + time.format(today));
	}
}

 

 

 

예제 7-11

import static java.lang.System.out;
import static java.lang.Math.*;

public class StaticImportEx1 {
	public static void main(String[] args) {
//		System.out.println(Math.random());
		out.println(random());
		
//		System.out.println("Math.PI :"+Math.PI);
		out.println("Math.PI :" + PI);
	}
}
0.25032972960374855
Math.PI :3.141592653589793

 

 

 

예제 7-12 

class Card {
	final int NUMBER;
	final String KIND;
	static int width = 100;
	static int height = 250;

	Card(String kind, int num) {
		KIND = kind;
		NUMBER = num;

	}

	Card() {
		this("HEART", 1);
	}

	public String toString() {
		return KIND + " " + NUMBER;
	}
}

class FinalCardTest {
	public static void main(String[] args) {
		Card c = new Card("HEART", 10);
//	c.NUMBER = 5;
		System.out.println(c.KIND);
		System.out.println(c.NUMBER);
		System.out.println(c);
	}
}
HEART
10
HEART 10

 

 

 

예제 7-13

public class TimeTest {
	public static void main(String[] args) {
		Time t = new Time(12, 35, 30);
		System.out.println(t);
//		t.hour = 13;
		t.setHour(t.getHour() + 1); // 13을들고오고싶으면 getHour 바꾸고싶으면 setHour
		System.out.println(t);
	}
}

// VO, Component
class Time {
	private int hour, minute, second;
	boolean power;

	public Time(int hour, int minute, int second) {
		super();
		this.hour = hour;
		this.minute = minute;
		this.second = second;
	}
	public boolean isPower() {
		return power;
	}
	public void setPower(boolean power) {
		this.power = power;
	}
	public int getHour() {	return hour; }
	public void setHour(int hour) {
		
		if(hour < 0 || hour > 23) return;
		this.hour = hour;
	}
	
	public int getMinute() {	return minute; }
	public void setMinute(int minute) {
		
		if(minute < 0 || minute > 59) return;
		this.minute = minute;
	}
	public int getSecond() {	return second;}
	public void setSecond(int second) {
		if (second < 0 || second > 59) return;
		this.second = second;
	}
	public String toString() {
		return hour + ":" + minute + ":" + second;
	}

}
12:35:30
13:35:30

 

 

 

 

예제 7-14

public class CastingTest1_1 {
	public static void main(String[] args) {
		Car car = null;
		FireEngine fe = new FireEngine();
		FireEngine fe2 = null;

		fe.water();
		car = (Car)fe;	//Car타입의 참조형변수라고 명시하지 않아도 된다.
//		car.water();
		fe2 = (FireEngine) car;
		fe2.water();
	}
}

class Car {
	String color;
	int door;

	void drive() {
		System.out.println("drive, brrrr~");
	}

	void stop() {
		System.out.println("stop!!!");
	}
}

class FireEngine extends Car {
	void water() {
		System.out.println("water!!!");
	}
}
water!!!
water!!!

 

 

 

 

예제 7-15

class CastingTest2 {
	public static void main(String[] args) {
		Car car = new Car();
		Car car2 = null;
		FireEngine fe = null;
		
		car.drive();
		fe = (FireEngine)car;
		fe.drive();
		car2 = fe;
		car2.drive();
	}
}
fe = (FireEngine)car; // 에러발생

 

 

 

 

예제 7-16

class CastingTest2 {
	public static void main(String[] args) {
		Car car = new Car();
		Car car2 = null;
		FireEngine fe = null;
		
		car.drive();
		fe = (FireEngine)car;
		fe.drive();
		car2 = fe;
		car2.drive();
	}
}
drive, brrrr~Exception in thread "main" java.lang.ClassCastException: a210719.Car cannot be cast to a210719.FireEngine

	at a210719.CastingTest2.main(CastingTest2.java:10)

 

 

 

예제 7-17

public class InstanceofTest {
	public static void main(String[] args) {
		FireEngine fe = new FireEngine();
		Car car = fe;
		Object obj = fe;

		FireEngine fe2 = (FireEngine)obj;
		if (fe instanceof FireEngine) {
			System.out.println("This is a FireEngine instance.");
		}
		if (fe instanceof Car) {
			System.out.println("This is a Car instance.");
		}
		if (fe instanceof Object) {
			System.out.println("This is a Object instance.");
		}
		System.out.println(fe.getClass().getName());
		System.out.println(fe.getClass().getSimpleName());
	}
}
This is a FireEngine instance.
This is a Car instance.
This is a Object instance.
a210719.FireEngine
FireEngine

 

 

 

 

예제 7-18

public class BindingTest {
	public static void main(String[] args) {
		Parent p = new Child();
		Child c = new Child();
		
		System.out.println("p.x = " + p.x);
		p.method();
		
		System.out.println("c.x = " + c.x);
		c.method();
	}

}

class Parent {
	int x = 100;
	
	void method() {
		System.out.println("Parent Method");
	}
}

class Child extends Parent {
	int x = 200;
	
	void method() {
		System.out.println("Child Method");
	}
}
p.x = 100
Child Method
c.x = 200
Child Method

 

 

 

예제 7-19

public class BindingTest2 {
	public static void main(String[] args) {
		Parent p = new Child();
		Child c = new Child();

		System.out.println("p.x = " + p.x);
		p.method();

		System.out.println("c.x = " + c.x);
		c.method();
	}

}

class Parent {
	int x = 100;

	void method() {
		System.out.println("Parent Method");
	}
}
class Child extends Parent {
}
p.x = 100
Parent Method
c.x = 100
Parent Method

 

 

 

예제 7-20

class BindingTest3 {
	public static void main(String[] args) {
		Parent p = new Child();
		Child c = new Child();

		System.out.println("p.x = " + p.x);
		p.method();
		System.out.println();
		System.out.println("c.x = " + c.x);
		c.method();
	}
}

class Parent {
	int x = 100;

	void method() {
		System.out.println("Parent Method");
	}
}

class Child extends Parent {
	int x = 200;

	void metohd() {
		System.out.println("x=" + x);
		System.out.println("super.x=" + super.x);
		System.out.println("this.x=" + this.x);
	}
}
p.x = 100
Parent Method

c.x = 200
Parent Method

 

 

 

 

 

 

 

예제 7-21

class Product{
	int price;
	int bonusPoint;
	
	Product(int price) {
		this.price = price;
		bonusPoint = (int)(price/10.0);
	}
}
class Tv extends Product {
	Tv() {
		super(100);
	}
	public String toString() { return "Tv"; }
}
class Computer extends Product {
	Computer() { super(200); }
	
	public String toString() { return "Computer"; }
}

class Buyer {
	int money = 1000;
	int bonusPoint = 0;
	
	void buy(Product p) {
		if(money < p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}
		
		money -= p.price;
		bonusPoint += p.bonusPoint;
		System.out.println(p + "을/를 구입하셨습니다.");
	}
}
class PolyArgumentTest {
	public static void main(String[] args) {
		Buyer b = new Buyer();
		
		b.buy(new Tv());
		b.buy(new Computer());
		
		System.out.println("현재 남은 돈은 " + b.money + "만원입니다.");
		System.out.println("현재 보너스 점수는" + b.bonusPoint + "점입니다.");
		
	}
}
Tv을/를 구입하셨습니다.
computer을/를 구입하셨습니다.
현재 남은 돈은 700만원입니다.
현재 보너스 점수는30점입니다.

 

 

 

예제 7-22

class Product {
	int price;
	int bonusPoint;

	Product(int price) {
		this.price = price;
		bonusPoint = (int) (price / 10.0);
	}

	Product() {
	}
}

class Tv extends Product {
	Tv() {
		super(100);
	}

	public String toString() {
		return "Tv";
	}
}

class Computer extends Product {
	Computer() {
		super(200);
	}

	public String toString() {
		return "Computer";
	}
}

class Audio extends Product {
	Audio() {
		super(50);
	}

	public String toString() {
		return "Audio";
	}
}

class Buyer {
	int money = 1000;
	int bonusPoint = 0;
	Product[] item = new Product[10];
	int i = 0;

	void buy(Product p) {
		if (money < p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}

		money -= p.price;
		bonusPoint += p.bonusPoint;
		item[i++] = p;
		System.out.println(p + "을/를 구입하셨습니다.");
	}

	void summary() {
		int sum = 0;
		String itemList = "";

		for (int i = 0; i < item.length; i++) {
			if (item[i] == null)
				break;
			sum += item[i].price;
			itemList += item[i] + ", ";
		}

		System.out.println("구입하신 물품의 총금액은 " + sum + "만원입니다.");
		System.out.println("구입하신 제품은 " + itemList + "입니다.");
	}
}

class PolyArgumentTest2 {
	public static void main(String args[]) {
		Buyer b = new Buyer();

		b.buy(new Tv());
		b.buy(new Computer());
		b.buy(new Audio());
		b.summary();
	}
}
Tv을/를 구입하셨습니다.
Computer을/를 구입하셨습니다.
Audio을/를 구입하셨습니다.
구입하신 물품의 총금액은 350만원입니다.
구입하신 제품은 Tv, Computer, Audio, 입니다.

 

 

 

 

예제 7-23

import java.util.*;
	class Product {
		int price;
		int bonusPoint;
		
		Product(int price) {
			this.price = price;
			bonusPoint = (int)(price/10.0);
		}
		
		Product() {
			price = 0;
			bonusPoint = 0;
		}
	}



class Tv extends Product {
	Tv() { super(100); }
	public String toString() { return "Tv"; }
}

class Computer extends Product {
	Computer() { super(200); }
	public String toString() { return "computer";	}
}

class Audio extends Product {
	Audio() {	super(50);	}
	public String toString() {	return "Audio";	}
}

class Buyer {
	int money = 1000;
	int bonusPoint = 0;
	Vector<Product> item = new Vector<Product>();
	
	void buy(Product p) {
		if(money < p.price) {
			System.out.println("잔액이 부족하여 물건을 살 수 없습니다.");
			return;
		}
		money -= p.price;
		bonusPoint += p.bonusPoint;
		item.add(p);
		System.out.println(p + "을/를 구입하셨습니다.");
	}
	
	void refund(Product p) {
		if(item.remove(p)) {
			bonusPoint -= p.bonusPoint;
			System.out.println(p + "을/를 반품하셨습니다.");
		} else { System.out.println("구입하신 제품 중 해당 제품이 없습니다.");
	}
}
	
void summary() {
	int sum = 0;
	String itemList ="";
	
	if(item.isEmpty()) {
		System.out.println("구입하신 제품이 없습니다.");
		return;
	}
	
	for(int i = 0; i < item.size();i++) {
		Product p = (Product)item.get(i);
		sum += p.price;
		itemList += (i==0) ? "" + p : ", " + p;
	}
	System.out.println("구입하신 물품의 총금액은 " + sum + "만원입니다.");
	System.out.println("구입하신 제품은 "+ itemList + "입니다.");
}
}

public class PolyArgumentTest3 {
	public static void main(String[] args) {
		Buyer b = new Buyer();
		Tv tv = new Tv();
		Computer com = new Computer();
		Audio audio = new Audio();

		b.buy(tv);
		b.buy(com);
		b.buy(audio);
		b.summary();
		System.out.println();
		b.refund(com);
		b.summary();
	}
}

 

 

 

 

예제 7-24

public class FighterTest {
	public static void main(String[] args) {
		Fighter f = new Fighter();
		Fightable fightable = new Fighter();
				
		if(f instanceof Unit) {
			System.out.println("f는 Unit의 자손입니다");
		}
		if(f instanceof Fightable) {
			System.out.println("f는 Fightable인터페이스를 구현했습니다");
		}
		if(f instanceof Attackable) {
			System.out.println("f는 Attackable인터페이스를 구현했습니다");
		}
		if(f instanceof Movable) {
			System.out.println("f는 Movable인터페이스를 구현했습니다");
		}
		if(f instanceof Object) {
			System.out.println("f는 Object클래스의 자손입니다");
		}
		
	}
}

class Fighter extends Unit implements Fightable {
	public void attack(Unit u) {
		// 내용생략
	}
	public void move(int x, int y) {
		// 내용생략
	}
}
class Unit {
	int currentHP;
	int x;
	int y;
	
}
interface Fightable extends Movable, Attackable{}
interface Movable { void move(int x, int y); }
interface Attackable { void attack(Unit u); }
f는 Unit의 자손입니다
f는 Fightable인터페이스를 구현했습니다
f는 Attackable인터페이스를 구현했습니다
f는 Movable인터페이스를 구현했습니다
f는 Object클래스의 자손입니다

 

 

 

 

예제 7-25

interface Parseable {
	public abstract void parse(String fileName);
}

class ParserManager {
	public static Parseable getParser(String type) {
		if (type.equals("XML")) {
			return new XMLParser();
		} else {
			Parseable p = new HTMLParser();
			return p;
		}

	}
}

class XMLParser implements Parseable {
	@Override
	public void parse(String fileName) {
		System.out.println(fileName + "- XML parsing completed.");
	}
}

class HTMLParser implements Parseable {
	@Override
	public void parse(String fileName) {
		System.out.println(fileName + "-HTML parsing completed.");

	}
}

class parserTest {
	public static void main(String args[]) {
		Parseable parser = ParserManager.getParser("XML");
		parser.parse("document.xmml");
		parser = ParserManager.getParser("HTML");
		parser.parse("document2.html");
	}
}

 

 

 

 

예제 7-26

public class RepairableTest {
	public static void main(String[] args) {
		Tank tank = new Tank();
		Dropship dropship = new Dropship();
		
		Marine marine = new Marine();
		SCV scv = new SCV();
		scv.repair(tank);
		scv.repair(dropship);
//		scv.repair(marine);
	}
}

interface Repairable{}

class Unit {
	int hitPoint;
	final int MAX_HP;
	Unit(int hp) {
		MAX_HP = hp;
	}
	//...
}

class GroundUnit extends Unit {
	GroundUnit(int hp) {
		super(hp);
	}
}

class AirUnit extends Unit {
	AirUnit(int hp) {
		super(hp);
	}
}


class Tank extends GroundUnit implements Repairable {
	Tank() {
		super(150);
		hitPoint = MAX_HP;
	}
	
	public String toString() {
		return "Tank";
	}
	//...
}

class Dropship extends AirUnit implements Repairable {
	Dropship() {
		super(125);
		hitPoint = MAX_HP;
	}
	
	public String toString() {
		return "Dropship";
	}
	//...
}

class Marine extends GroundUnit {
	Marine() {
		super(40);
		hitPoint = MAX_HP;
	}
	//...
}

class SCV extends GroundUnit implements Repairable{
	SCV() {
		super(60);
		hitPoint = MAX_HP;
	}
	
	void repair(Repairable r) {
		if (r instanceof Unit) {
			Unit u = (Unit)r;
			while(u.hitPoint!=u.MAX_HP) {
				u.hitPoint++;
			}
			System.out.println( u.toString() + "의 수리가 끝났습니다.");
		}
		//...
	}
}
Tank의 수리가 끝났습니다.
Dropship의 수리가 끝났습니다.

 

 

 

 

예제 7-27

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import javax.print.attribute.HashAttributeSet;

public class InterfaceTest {
	public static void main(String[] args) {
		// List 순번을 통해 자료관리
		// Map Key(이름)을 통해 자료관리

		Map<String, String> map = new HashMap<String, String>();
		map.put("이름", "홍길동");
		map.put("나이", "40");
		map.put("주소", "서울시 영등포구");

		System.out.println(map);
		System.out.println(map.get("이름"));
		System.out.println(map.get("나이"));
		System.out.println(map.get("주소"));

		for (Map.Entry<String, String> m : map.entrySet()) {

		}
	}
}

class A {
	public void methodA(I i) {
		i.methodB();
	}
}

class B implements I {
	public void methodB() {
		System.out.println("methodB()");
	}
}

interface I {
	default void methodB(int i) {
	}

	void methodB();

	static interface I2 {
	}
}

class C {
	private static int i;

	class D {
		class E {
			class F {
			}
		}
	}

	void m() {
	}

}

 

 

 

 

예제 7-28

class A {
	void autoPlay(I i) {
		i.play();
	}
}

interface I {
	public abstract void play();
}

class B implements I {
	public void play() {
		System.out.println("play in B class");
	}
}

class C implements I {
	public void play() {
		System.out.println("play in C class");
	}
}

class InterfaceTest2 {
	public static void main(String[] args) {
		A a = new A();
		a.autoPlay(new B());
		a.autoPlay(new C());
	}
}
play in B class
play in C class

 

 

 

 

예제 7-29

public class InterfaceTest3 {
	public static void main(String[] args) {
		A a = new A();
		a.methodA();
	}
}

class A {
	void methodA() {
		I i = InstanceManager.getInstance();
		i.methodB();
		System.out.println(i.toString());
	}
}

interface I {
	public abstract void methodB();
}

class B implements I {
	public void methodB() {
		System.out.println("methodB in B class");
	}

	public String toString() {
		return "class B";
	}
}

class InstanceManager {
	public static I getInstance() {
		return new B();
	}
}
methodB in B class
class B

 

 

 

 

예제 7-30

public class DefaultMethodTest {
	public static void main(String[] args) {
		Child c = new Child();
		c.method1();
		c.method2();
		MyInterface.staticMethod();
		MyInterface2.staticMethod();
	}
}

class Child extends Parent implements MyInterface, MyInterface2 {
	public void method1() {
		System.out.println("method1() in Child"); // 오버라이딩
	}
}

class Parent {
	public void method2() {
		System.out.println("method2() in Parent");
	}
}

interface MyInterface {
	default void method1() {
		System.out.println("method1() in MyInterface");
	}

	default void method2() {
		System.out.println("method2() in MyInterface");
	}

	static void staticMethod() {
		System.out.println("staticMethod() in MyInterface");
	}
}

interface MyInterface2 {
	default void method1() {
		System.out.println("method1() in MyInterface2");
	}

	static void staticMethod() {
		System.out.println("staticMethod() in MyInterface2");
	}
}
method1() in Child
method2() in Parent
staticMethod() in MyInterface
staticMethod() in MyInterface2

 

 

 

 

예제 7-31

class InnerEx1 {
	class InstanceInner {
		int iv = 100;
//		static int cv = 100;
		final static int CONST = 100;
	}

	static class StaticIneer {
		int iv = 200;
		static int cv = 200;
	}

	void myMethod() {
		class LocalInner {
			int iv = 300;
//			static int cv = 300;
			final static int CONST = 300;
		}
	}

	public static void main(String[] args) {
		System.out.println(InstanceInner.CONST);
		System.out.println(StaticIneer.cv);
	}
}
100
200

 

 

 

예제 7-32

class InnerEx1 {
	class InstanceInner {
		int iv = 100;
//		static int cv = 100;
		final static int CONST = 100;
	}

	static class StaticIneer {
		int iv = 200;
		static int cv = 200;
	}

	void myMethod() {
		class LocalInner {
			int iv = 300;
//			static int cv = 300;
			final static int CONST = 300;
		}
	}

	public static void main(String[] args) {
		System.out.println(InstanceInner.CONST);
		System.out.println(StaticIneer.cv);
	}
}

 

 

 

예제 7-32

class InnerEx2 {
	class InstanceInner {
	}

	static class StaticInner {
	}

	InstanceInner iv = new InstanceInner();
	static StaticInner cv = new StaticInner();

	static void staticMethod() {
//		InstanceInner obj1 = new InstanceInner();
		StaticInner obj2 = new StaticInner();

		InnerEx2 outer = new InnerEx2();
		InstanceInner obj1 = outer.new InstanceInner();
	}

	void instanceMethod() {
		InstanceInner obj1 = new InstanceInner();
		StaticInner obj2 = new StaticInner();
//		LocalInner lv = new LocalInner();
	}

	void myMethod() {
		class LocalInner {
		}
		LocalInner lv = new LocalInner();
	}
}

 

 

 

 

예제 7-33

class InnerEx3 {
	private int outerIv = 0;
	static int outerCv = 0;
	
	class InstanceInner {
		int iiv = outerIv;
		int iiv2 = outerCv;
	}
	
	static class StaticInner {
//		int siv = outerIv;
		static int scv = outerCv;
	}
	
	void myMethod() {
		int lv = 0;
		final int LV = 0;
		
		class LocalInner {
			int liv = outerIv;
			int liv2 = outerCv;
			int liv3 = lv;
			int liv4 = LV;
		}
	}

}

 

 

 

 

 

 

예제 7-34

class Outer {
	class InstanceInner {
		int iv = 100;
	}
	
	static class StaticInner{
		int iv = 200;
		static int cv = 300;
	}
	
	void myMethod() {
		class LocalInner {
			int iv = 400;
		}
	}

}

class InnerEx4 {
	public static void main(String[] args) {
		Outer oc = new Outer();
		Outer.InstanceInner ii = oc.new InstanceInner();
		
		System.out.println("ii.iv : "+ ii.iv);
		System.out.println("Outer.StaticInner.cv : "+ Outer.StaticInner.cv);
		
		Outer.StaticInner si = new Outer.StaticInner();
		System.out.println("si.iv : "+ si.iv);
	}
}

 

 

 

 

예제 7-35

class Outer {
	int value = 10;

	class Inner {
		int value = 20;

		void method1() {
			int value = 30;
			System.out.println("value :" + value);
			System.out.println("this.value :" + this.value);
			System.out.println("Outer.this.value :" + Outer.this.value);
		}
	}

}

class InnerEx5 {
	public static void main(String[] args) {
		Outer outer = new Outer();
		Outer.Inner inner = outer.new Inner();
		inner.method1();
	}
}

 

 

 

 

예제 7-36

public class InnerEx6 {
	Object iv = new Object () { void method() {} };
	static Object cv = new Object() { void method() {} };
	
	void myMethod() {
		Object lv = new Object() { void method() {} };
	}

}

 

 

 

 

예제 7-37

import java.awt.*;
import java.awt.event.*;

class InnerEx7 {
	public static void main(String[] args) {
		Button b = new Button("Start");
		b.addActionListener(new EventHandler());
	}
}
class EventHandler implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		System.out.println("ActionEvent occurred!!!");
	}
}

 

 

 

 

예제 7-38

import java.awt.*;
import java.awt.event.*;

class InnerEx8 {
	public static void main(String[] args) {
		Button b = new Button("Start");
		b.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.out.println("ActionEvent occurred!!!");
			}
		});
	}
}

 

HTML 기본 문서 구조

HTML에서 태그는 <와 >를 이용해서 구분한다.

 

HTML은 대문자와 소문자를 구분하지 않지만, HTML5 표준 명세에서는 태그와 태그안에 사용하는 속성들은 모두 소문자로 사용할 것을 권장한다.

 

또한 HTML은 여는태그와 닫는태그가 있으며, 여는(시작)태그가 <h1>이면 </h1>으로 끝나야한다.

닫는게 필수적인 태그들은 대부분 자동완성을 지원하기 때문에 여러 코드를 짜면서 배우면 좋다.

 

비주얼 스튜디오 코드의 상단 메뉴에서 파일-새파일을 선택하면 빈문서 창이 열리는데 이걸 이용해서 저장하고 저장 단축키는 ctrl+s이다.

<!doctype html><!-- DTD : Document type declaration -->
<html lang="ko">
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible' content='IE=edge'>
    <title>내가 처음 만드는 HTML 문서</title>
    <!-- <meta name='viewport' content='width=device-width, initial-scale=1'> -->
</head>
<body>
    <h1>시간이란...</h1>
    <p>내일 죽을 것처럼 오늘을 살고<br>영원히 살 것처럼
        &lt; 내일을 꿈꾸어라</p>

        <!-- &lt;는 왼쪽꺽쇠 &gt;는 오른쪽꺽쇠 -->
    <img src="images/first.jpg" alt="민들레 홀씨">
</body>
</html>

코드를 짜고 alt+b를 누르면 아래와 같은 화면이 뜬다 이미지는 따로 넣은 것이다.

코드를 보면 맨 위에<!doctype>이 있는데 이것은 문서 유형을 지정하는 선언문이다.

<html lang="ko">는 웹 문서 시작을 알리는 태그이다.

코드 de en fr ja ko zh
언어 독일어 영어 프랑스어 일본어 한국어 중국어

ko위치에 이런 코드를 넣으면 해당 언어표기가 되는 것이다. 물론, 저 표시된 국가의 언어만 사용할 수 있는것은 아니나, 검색범위를 저 언어로 좁혀서 검색할때 좀 더 잘나온다.

문서의 대강의 틀을 결정하는 <head>태그안의 가장 중요한 태그중의 하나는 <title>이다.

<title> 문서제목 </title>로 쓰인다.

 

<meta> 태그 - 문자 세트를 비롯한 문서 정보

HTML교재는 HTML5+CSS3 웹표준의 정석 개정2판으로 하였다.

 

웹 브라우저의 종류는 크롬, 파이어폭스, 인터넷 익스플로러, 엣지, 사파리, 오페라등이 있다.

또한 자신이 사용하고 있는 웹 브라우저가 HTML5를 얼마나 지원하는지 알고 싶다면 웹브라우저에서 http://HTML5test.com/에 에 접속해 보면 555점 만점에 몇접이 뜨는지 알 수 있다.

 

 

 

웹편집기의 종류

편집기 종류 특징
텍스트 편집기 메모장
웹 편집기 노트패드++, 에디트 플러스, 텍스트 메이트, 코다, 드림위버, 비주얼 스튜디오 코드
통합개발환경(IDE) 비주얼 스튜디오, 웹스톰, 서브라임텍스트
웹 기반 코드 편집기 Codepen, JSFddle, LiveWeave, Plunker

이 중에서 비주얼 스튜디오 코드를 이용해서 공부할 것이다.

비주얼 스튜디오 코드의 장점은 대부분의 주요 플랫폼에서 모두 사용할 수 있으며, 태그와 CSS속성의 설명이 잘 되있고 확장이쉽다. 

https://visualstudio.microsoft.com/ko/downloads/

 

Windows 및 Mac용 Visual Studio 2019 다운로드

Visual Studio Community, Professional 및 Enterprise를 다운로드하세요. 지금 Visual Studio IDE, 코드 또는 Mac을 무료로 사용해 하세요.

visualstudio.microsoft.com

여기서 다운받으면 된다.

그리고 비주얼 스튜디오 코드 왼쪽 메뉴의 아이콘 중 확장 아이콘

를 찾아서 누르거나 ctrl+shift+x를 누른 후 

마켓플레이스에서 open int browser을 찾아서 다운받아주면 된다.

 

이것을 받으면 Alt+B로 브라우저에서 어떻게 보일지 미리 확인할 수 있다.

또한 기본적으로 브라우저는 F12를 통해 콘솔화면을 불러올 수 있다.

이걸 배우면게 되면 접속하는 기기에 따라 자동으로 레이아웃이 바뀌는 사이트를 만들 수 있다.

이것을 반응형 웹 디자인이라고 한다.

 

여기까지 했으면 기본적인 준비는 끝났다.

텍스트를 덩어리로 묶어주는 태그

텍스트를 블록(block)으로 묶어 처리하는 태그

기본형 역할 설명
<hn> 제목 </hn> 제목 표시하기 제목 테스트는 보통 상단에 위치하며, n은1~6까지 들어갈 수 있고 숫자가 높을수록 크기가 커진다.
<p> 텍스트 </p> 단락 만들기 앞뒤에 줄바꿈이 있는 텍스트 덩어리이다.
많이 사용하는 텍스트이다.
<br> 줄 바꾸기 웹 브라우저 창에서 줄 바꾸기 위한 태그이다
<hr> 수평줄 수평줄을 삽입할 때 사용한다.
<blockquote> 인용 내용 </blockquote> 인용문 인용문을 넣기 위한 텍스트
<pre>텍스트</pre> 입력하는대로 화면에 표시
<preformat>
소스의 공백이 그대로 화면에 표시된다.
<code>, <samp>, <kbd>같은 태그를 사용해 프로그램 소스를 표시할때도 사용한다.

 

 

텍스트를 한 줄로 표시하는 태그

줄바꿈 없이 텍스트를 표시하는 '인라인 레벨'태그이며, 이 태그들은 닫는 태그를 생략할 수 없음.

기본형 역할 설명
<strong> 텍스트 <strong> 굵게+강조표시 낭독기에서 강조됨, 경고나 주의사항에 사용
<b> 텍스트 </b> 굵게표시 문서의 키워드 표시
<i> 텍스트 </i> 이탤릭체로 표시
<italic>
텍스트를 비스듬히 이탤릭체로 표시
<em> 텍스트 </em> 이탤릭체로 강조
<emphasis>
비스듬히 강조표시
<q> 내용 </q> 인용 내용 표시
<quot>
줄바꿈 없이 한줄로 표시됨
<mark> 텍스트 </mark> 형광펜 효과 배경이 노란색으로됨HTML5부터 적용
<span> 내용 </span> 줄바꿈 없이 영역 묶기 텍스트 단락 안에서 줄바꿈 없이 일부 텍스트만 묶어서 스타일을 적용할 때 표시
<ruby> 내용 <rt> 주석 </rt> </ruby> 동아시아 글자 표시하기 글자에 주석을 표시하기 위한 용도(한문을 위에 히라가나로 표시하는 등)

 

기타 텍스트 관련 태그

기본형 역할 설명
<abbr title=""> 텍스트 </abbr> 약자 표시 title을 함께 사용가능
<cite> 텍스트 </cite> 참고내용 표시 웹문서나 포스트에 사용
<code>텍스트 </code> 소스 코드 컴퓨터 인식을 위한 소스 코드
<kbd> 텍스트 </kbd> 사용자 입력 내용 키보드 입력이나 음성 명령 같은 사용자 입력 내용
<small> 텍스트 </small> 작게 표시 부가 정보처럼 작게 표시해도 되는 텍스트에 사용
<sub> 텍스트 </small> 아래첨자 아래첨자
<sup> 텍스트 </sup> 위첨자 위첨자
<s> 텍스트 </s> 취소선 글 가운데 가로줄 표시
<u> 텍스트 </u> 밑줄 글 아래 가로줄 표시

 

 

목록을 만드는 태그

기본형 역할 설명
<ul> 내용 </ul> 목록 순서가 필요하지 않은 목록(unordered list)만들때 사용
<li> 텍스트 </li> 각 목록의 내용 표시 목록 안에서 원이나 사각형같은 불릿(bullet)이 붙는다.
<ol> 내용 </ol> 순서가 필요한 목록 순서가 필요한 목록을 만들 때 사용, type, start, reversed같은 태그 속성 사용가능
<dl>
     <dt> 제목 </dt>
     <dd> 설명 </dd>
     ....
</dl>
설명 목록 만들기 <dl>태그는 사전 구성처럼 '제목'과 '설명'이 한 쌍인 설명 목록(description list)을 만듭니다.
<dt> 태그는 제목을 만듭니다
<dd> 태그는 설명을 표시합니다.

 

 

표를 만드는 태그

기본형 역할 설명
<table>
    <tr>
        <td> 내용 </td>
        <td> 내용 </td>
        ...
   <tr>
    ...
</table>
표 만드는 용도 <table>은 표를 만드는 태그이다.
<tr>은 열을 나타내는 태그이다.
<td>는 행의 1칸을 나타낸다.
colspan, rowspan 속성 - 행 또는 열 합치기
<caption> 표 제목 </caption>
<figcaption> 표 제목 </figcaption>
표에 제목 붙이기 <caption>태그는 <table> 태그 바로 다음에 사용한다. 표의 위쪽 중앙에 표시되며 안에 다른 태그를 사용해 여러줄로 표시하거나 텍스트를 꾸밀 수 있다.
<figcaption> 태그는 설명글을 붙이고 싶은대상을 <figure> 태그로 감싸고 <figcaption>태그를 이용해 제목이나 설명글을 입력한다.
<thead>
    <tr> ... </tr>
</thead>
<tbody>
    <tr> ... </tr>
</tbody>
<tfoot>
    <tr> ... </tr>
</tfoot>
표 구조 정의 일부 표에서는 제목이 표시된 세로가 자료가 표시된 셀 외에도 표 아래쪽에 합계나 요약을 표시하기도 하는데, 이런 표의 각 셀은 제목이 있는 부분과 실제 내용이 있는 본문 그리고 요약 부분이 있는 부분으로 표의 구조를 나눠놓는 것이좋다.
본문이랑 요약부분은 위치가 바뀌어도 된다.
<col> 여러 열 묶어 스타일 지정 한 열에 있는 모든 셀에 같은 스타일을 적용,
<span>과 함께 사용 가능
<colgroup>
    <col>
    ...
<colgroup>
여러 열 묶어 스타일을 지정 <colgroup>태그 안에 묶는 열의 개수만큼 <col>태그를 넣어주면 된다.
<caption>태그 뒤와 <tr>,<td>전에 사용해야한다.
태그안의<col>개수와 단독으로 사용한<col>의 갯수가 같아야 한다.

 

 

 

 

'HTML > 텍스트 관련 태그들' 카테고리의 다른 글

텍스트관련태그 예제  (0) 2021.08.08

기존의 정의된 예외 클래스 외에 필요에 따라 프로그래머가 새로운 예외 클래스를 정의하여 사용할 수 있다. 보통 Exception클래스 또는 RuntimeException클래스로부터 상속받아 클래스를 만들지만, 필요에 따라서 알맞은 예외 클래스를 선택할 수 있다.

가능하면 새로운 예외 클래스를 만들기보다 기존의 예외클래스를 활용하자.

class MyException extends Exception {
	MyException(String msg) {	//문자열을 매개변수로 받는 생성자.
		super(msg);				// 조상인 Exception클래스의 생성자를 호출한다.
	}
}

Exception클래스로부터 상속받아서 My클래스를 만들었다. 필요하다면, 멤버변수나 메서드를 추가할 수 있다.

Exception클래스는 생성 시에 String값을 받아서 메세지로 저장할 수 있다. 

class MyException extends Exception {
	//에러 코드 값을 저장하기 위한 필드를 추가한다
    private final int ERR_CODE;	// 생성자를 통해 초기화 한다.
    
    MyException(String msg, int errCode) {	//생성자
    	super(msg);
    	Err_CODE = errCode;
    }
    
    MyException(String msg) {	// 생성자
    	this.(msg, 100);
    }
    
    public int getErrCode() {	// 에러 코드를 얻을 수 있는 메서드도 함께 추가했다.
    	return Err_CODE;		// 이 메서드는 주로 getMessage()와 함께 사용될 것이다.
    }
}

이전의 코드를 좀더 개선하여 메세지 뿐만 아니라 에러코드 값도 저장할 수 있도록 ERR_CODE와 getErrCode()를 MyException클래스의 멤버로 추가했다.

이렇게 함으로써 MyException이 발생했을 때, catch블럭에서 getMessage()와 getErrCode()를 사용해서 에러코드와 메세지를 모두 얻을 수 있을 것이다.

기존의 예외 클래스는 주로 Exception을 상속받아서 'checked예외'로 작성하는 경우가 많았지만, 요즘은 예외처리를 선택적으로 할 수 있도록 RuntimeException을 상속받아서 작성하는 쪽으로 바뀌어가고 있다. 'checked예외'는 반드시 예외처리를 해주어야 하기 때문에 예외처리가 불필요한 경우에도 try-catch문을 넣어서 코드가 복잡해지기 때문이다.

 

예외처리를 강제하도록 한 이유는 프로그래밍 경험이 적은 사람들도 보다 견고한 프로그램을 작성할 수 있게 유도하기 위한 것이었는데, 필수적이었던 예외들이 선택적으로 처리해도 되게 되었다. 그래서 필요에 따라 'unchecked예외'의 필요성이 증가했다.

class NewExceptionTest {
	public static void main(String[] args) {
		try {
			startInstall();
			copyFiles();
		} catch (SpaceException e) {
			System.out.println("에러 메세지 : " + e.getMessage());
			e.printStackTrace();
			System.out.println("공간을 확보한 후에 다시 설치하시기 바랍니다.");
		} catch (MemoryException me) {
			System.out.println("에러 메세지 : " + me.getMessage());
			me.printStackTrace();
			System.gc();
			System.out.println("다시 설치를 시도하세요.");
		} finally {
			deleteTempFiles();
		}
	}

	static void startInstall() throws SpaceException, MemoryException {
		if (!enoughSpace())
			throw new SpaceException("설치할 공간이 부족합니다.");
		if (!enoughMemory())
			throw new MemoryException("메모리가 부족합니다.");
	}

	static void copyFiles() {
		/* 파일을 복사하는 코드를 적는다 */}

	static void deleteTempFiles() {
		/* 임시파일을 삭제하는 코드를 적는다 */}

	static boolean enoughSpace() {
		// 설치하는데 필요한 공간이 있는지 확인하는 코드를 적는다.
		return false;
	}

	static boolean enoughMemory() {
		// 설치하는데 필요한 메모리공간이 있는지 확인하는 코드를 적는다.
		return true;
	}
}

class SpaceException extends Exception {
	SpaceException(String msg) {
		super(msg);
	}
}

class MemoryException extends Exception {
	MemoryException(String msg) {
		super(msg);
	}
}
에러 메세지 : 설치할 공간이 부족합니다.
a210721.SpaceException: 설치할 공간이 부족합니다.
공간을 확보한 후에 다시 설치하시기 바랍니다.
	at a210721.NewExceptionTest.startInstall(NewExceptionTest.java:24)
	at a210721.NewExceptionTest.main(NewExceptionTest.java:6)

에러문은 돌릴때마다 순서가 달라진다.

 이 두 예외는 startInstall()을 수행하는 동안에 발생할 수 있으며, enoughSpace()와 enoughMemory()의 실행결과에 따라서 발생하는 예외의 종류가 달라지도록 했다.

 

 

 

예외 되던지기(exception re-throwing)

한 메서드에서 발생할 수 있는 예외가 여럿인 경우, 몇 개는 try-catch문을 통해서 메서드 내에서 자체적으로 처리하고, 그 나머지는 선언부에 지정하여 호출한 메서드에서 처리하도록 함으로써, 양쪽에서 나눠서 처리되도록 할 수 있다.

 그리고 심지어는 단 하나의 예외에 대해서도 예외가 발생한 메서드와 호출한 메서드, 양쪽에서 처리하도록 할 수 있다.이것은 예외를 처리한 후에 인위적으로 다시 발생시키는 방법을 통해서 가능한데, 이것을 '예외 되던지기(exception re-throwing)'라고 한다.

 먼저 예외가 발생할 가능성이 있는 메서드에 try-catch문을 사용해서 예외를 다시 처리해주고 catch문에서 필요한 작업을 행한 후에 throw문을 사용해서 예외를 다시 발생시킨다. 다시 발생한 예외는 이 메서드를 호출한 메서드에게 전달되고 호출한 메서드의 try-catch문에서 예외를 또다시 처리한다.

 이 방법은 하나의 예외에 대해서 예외가 발생한 메서드와 이를 호춣나 메서드 양쪽 모두에서 처리해줘야 할 작업이 있을 때 사용된다. 이 때 주의할 점은 예외가 발생할 메서드에서는 try-catch문을 사용해서 예외처리를 해줌과 동시에 메서드의 선언부에 발생할 예외를 throws에 지정해줘야 한다는 것이다.

public class ExceptionEx17 {
	public static void main(String[] args) {
		try {
			method1();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("main메서드에서 예외가 처리되었습니다.");
		}
	}

	static void method1() throws Exception {
		try {
			throw new Exception();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("method1메서드에서 예외가 처리되었습니다.");
			throw e;
		}
	}
}

결과에서 알 수 있듯이 metod1()과 main메서드 양쪽의 catch블럭이 모두 수행되었음을 알 수 있다. method1()의 catch블럭에서 예외를 처리하고도 throw문을 통해 다시 예외를 발생 시켰다. 그리고 이 예외를 main메서드 한 번 더 처리하였다.

반환값이 있는 return문의 경우, catch블럭에도 return문이 있어야 한다. 예외가 발생했을 경우에도 값을 반환해야하기 때문이다.

static int method1() {
	try{
		System.out.println("method1()이 호출되었습니다.");
		return 0;
	} catch (Exception e)	{
		e.printStackTrace();
		return 1;
	} finally {
		System.out.println("method1()의 finally블럭이 실행되었습니다.");
	}
}

catch블럭에서 예외 되던지기를 해서 호출한 메서드로 예외를 전달하면, return문이 없어도 된다. 그래서 검증에서도 assert문 대신 AssertError를 생성해서 던진다.

assert문은 검증(assertion)을 수행하기 위한 문장이다.

static int metod1() throws Exception {
	try {
		System.out.println("method1()이 호출되었습니다.");
		return 0;
	} catch (Exception e) {
		e.printStackTrace();
		return 1;
		throw new Exception();
	} finally {
		System.out.println("method1()의 finally블럭이 실행되었습니다.");
	}
}

finally 블럭내에도 return문을 사용할 수 있으며, try블럭이나 catch블럭의 return문 다음에 수행된다. 최종적으로 finally블럭 내의 return문 값이 반환된다.

 

 

 

 

연결된 예외(chained exception)

한 예외가 다른 예외를 발생시킬 수도 있다. 예를 들어 예외 A가 예외 B를 발생시켰다면, A를 B의 '원인 예외(cause exception)라고 한다. 

try {
	startInstall();
	copyFiles();
} catch (SpaceException e) {
	InstallException ie = new InstallException("설치중 예외발생");
	ie.initCause(e);
	throw ie;
} catch(MemoryException me)	{
...

먼저 InstallException을 생성한 후에, initCause()로 SpaceException을 InstallException의 원인 예외로 등록한다. 그러고'throw'로 이 예외를 던진다.

 

initCause()는 Exception클래스의 조상인 Throwable클래스에 정의되어 있기 때문에 모든 예외에서 사용가능하다.

Throwable initCause (Throwable cause) 지정한 예외를 원인 예외로 등록
Throwable getCause()				  원인 예외를 반환

발생한 예외를 원인 예외로 등록해서 다시 예외를 발생시키는 이유는 여러 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위해서이다.

 

+ Recent posts