HTML [ Hypertext Markup Language ]

 

  • 웹 문서를 만들기 위하여 사용하는 기본적인 웹 언어의 한 종류이다. 하이퍼텍스트를 작성하기 위해 개발되었다.
  • 인터넷에서 웹을 통해 접근되는 대부분의 웹 페이지들은 HTML로 작성된다.
  • HTML에서 사용하는 명령어는 태그(tag)라고 하는데 꺽쇠괄호"<>"를 사용하여 나타낸다.
  • HTML은 전자 문서의 서식을 정의하기 위해 만들어졌으며, 국제표준 SGML의 부분 집합으로 정의되었다.
  • 이 언어는 별도 컴파일러가 필요치 않으며, 웹 브라우저에서 해석이 가능한 사용하기 쉬운 언어로 각광을 받고 있다.

 

Basic HTML Tag

 

Tag Description

<!DOCTYPE>  Defines the document type
<html> Defines an HTML document
<head> Contains metadata/information for the document
<title> Defines a title for the document
<body> Defines the document's body
<h1> to <h6> Defines HTML headings
<p> Defines a paragraph
<br> Inserts a single line break
<hr> Defines a thematic change in the content
<!--...--> Defines a comment

 

 

출처 : [네이버 지식백과] HTML [Hypertext Markup Language] (두산백과 두피디아, 두산백과)

1) CSS 를 HTML에 적용시키는 방법

 

※ 각 방법은 장단점이 있으니 상황에 맞게 적절한 방법 택하기!

 

Inline Style Sheet : HTML 태그의 style 속성에 CSS 코드를 넣는 방법

 <p style="color: blue">Lorem ipsum dolor.</p>

해당 태그(위 코드에서는 p)가 선택자(selector)가 되고, CSS 코드에는 속성(property)과 값(value)만 들어감. 따라서 꾸미는 데 한계가 있으며, 재사용이 불가능하다는 단점이 있다.

 

Internal Style Sheet : HTML 문서 안의안에 CSS 코드를 넣는 방법

<style>
  h1 {
    color: blue;
  }
</style>

<style> 태그는 보통 <head>와 </head> 사이에 넣으나, HTML 문서의 어디에 넣어도 잘 적용된다. 이 방법은 HTML 문서 안의 여러 요소를 한번에 꾸밀 수 있다는 장점이 있으나, 또 다른 HTML 문서에는 적용할 수 없다는 단점이 있다.

 

Linking Style Sheet : 별도의 CSS 파일을 만들고 HTML 문서와 연결하는 방법

적용을 원하는 HTML 문서에 다음의 코드를 추가

<link rel="stylesheet" href="style.css">

위 코드는 HTML 파일과 CSS 파일이 같은 폴더에 있다고 가정했을 때의 코드로, 경로는 적절히 수정해야 한다. 예를 들어 HTML 문서가 있는 폴더에 css 폴더가 있고, 그 안에 style.css 파일이 있다면 다음과 같이 해준다.

<link rel="stylesheet" href="css/style.css">

이 방법의 장점은 여러 HTML 문서에 사용할 수 있다는 것. style.css를 적용시키고 싶은 문서에 <link> 태그로 연결만 해주면 된다.

 

 

2) CSS Basic Grammer

h1 {
  color: red;
  /*font-size: 20px;*/
}

 

① 선택자(selector) : 무엇을 꾸밀지 정한다. h1은 h1 요소를 꾸미겠다는 뜻

② 속성(property) : 어떤 모양을 꾸밀지 정한다. color는 색을 꾸미겠다는 뜻

③ 값(value) : 어떻게 꾸밀지 정한다. red는 빨간색으로 만들겠다는 뜻

④ 주석(Comment)은 /*과 */ 사이에 쓴다. 

※ 세미콜론(;)으로 구분하여 선언을 여러 개 넣을 수 있다.

 

 

4) CSS Selectors

 

① 전체 선택자(Universal Selector) : 모든 HTML 요소를 선택합니다. 별표(*)로 나타냄

② 아이디 선택자(ID Selector) : 특정 값을 id 속성(attribute)의 값으로 갖는 요소(element)를 선택. 속성값 앞에 #을 붙여 아이디임을 나타냄

③ 클래스 선택자(Class Selector) : 특정 값을 class 속성(attribute)의 값으로 갖는 요소(element)를 선택. 속성값 앞에 .을 붙여 클래스임을 나타냄.

④ 타입 선택자(Type Selector) :  h1, p, div, span 등 HTML 요소(Element)를 선택하는 선택자

 

<속성에 따른 우선순위 정리>

  1. 속성 값 뒤에 !important 를 붙인 속성 ex. .mytitle { color : black !important ; }
  2. HTML에서 style을 직접 지정한 속성 ex. <h1 style = “color : white”>(head에 있는 style이 아니라 body에 있는 특정 코드에 style을 직접 적용)
  3. #id 로 지정한 속성
  4. 클래스,추상클래스로 지정한 속성 ex. .mytitle : hover {___}
  5. 태그이름 으로 지정한 속성 ex. .h1 { color : red ; }
  6. 상위 객체에 의해 상속된 속성 (부모-자식 구조)

그렇기 때문에 CSS에선 선택자(selector)와 선언부(declaration)를 적절하게 잘 사용할 수 있어야 한다.

 

 

5) Box Model

 

색이 있는 모든 영역이 h1 요소. 각 색이 나타내는 영역은 다음과 같다.

  • ① : 바깥 여백 영역(Margin Area)
  • ② : 테두리 영역(Border Area)
  • ③ : 안쪽 여백 영역(Padding Area)
  • ④ : 내용 영역(Content Area)

각 영역을 꾸밀 때 사용하는 속성은 다음과 같다.

  • 바깥 여백 : margin 속성
  • 테두리 : border 속성
  • 안쪽 여백 : padding 속성
  • 박스의 가로 크기 : width 속성
  • 박스의 세로 크기 : height 속성
  • 박스의 크기 기준 : box-sizing 속성
  • 박스의 배경 : background 속성

 

6) Grid

 

  • CSS Grid Layout excels at dividing a page into major regions or defining the relationship in terms of size, position, and layer, between parts of a control built from HTML primitives.
  • Like tables, grid layout enables an author to align elements into columns and rows.
  • However, many more layouts are either possible or easier with CSS grid than they were with tables.
  • For example, a grid container's child elements could position themselves
  • so they actually overlap and layer, similar to CSS positioned elements.

 

7) Media Queries

 

Media queries can be used to check many things, such as:

  • width and height of the viewport
  • width and height of the device
  • orientation (is the tablet/phone in landscape or portrait mode?)
  • resolution

Using media queries are a popular technique for delivering a tailored style sheet to desktops, laptops, tablets, and mobile phones (such as iPhone and Android phones).

 

 

 

 

출처 :

https://www.codingfactory.net/

 

CODING FACTORY

코딩 공부 블로그

www.codingfactory.net

 

 

https://www.youtube.com/c/%EC%83%9D%ED%99%9C%EC%BD%94%EB%94%A91

 

생활코딩

일반인에게 프로그래밍을 알려주는 온라인/오프라인 활동 입니다. 채널 공개키 : MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDbU/jgeYLWbmUB5pk/wlqMs+2qsOOPgN2ydxOsrWe8JJUXzj5ovsUmjfBSwLjajT6SyO00ulne3zja2PzEZC2wnJCgvZ6lr/ZLvA9yUqmrKRNa

www.youtube.com

 

 

 

해시 테이블

  • 해시 테이블은 ‘연결 리스트의 배열’
  • 여러 값들을 몇 개의 바구니에 나눠 담는 상황을 생각해 보자.
  • 각 값들은 ‘해시 함수’라는 맞춤형 함수를 통해서 어떤 바구니에 담기는 지가 결정된다.
  • 각 바구니에 담기는 값들은 그 바구니에서 새롭게 정의되는 연결 리스트로 이어진다.
  • 이와 같이 연결 리스트가 담긴 바구니가 여러개 있는 것이 ‘연결 리스트의 배열’, 즉 ‘해시 테이블’

쉬운 예로 아래 그림과 같이 사람의 이름이 해시 테이블에 저장되며, 해시 함수는 ‘이름의 가장 첫 글자’인 경우를 생각해 보자.

그 경우 알파벳 개수에 해당하는 총 26개의 포인터들이 있을 수 있으며, 각 포인터는 그 알파벳을 시작으로 하는 이름들을 저장하는 연결 리스트를 가리키게 된다.

 

  • 만약 해시 함수가 이상적이라면, 각 바구니에는 단 하나의 값들만 담기게 될 것
  • 따라서 검색 시간은 O(1)
  • 하지만 최악의 상황에는 단 하나의 바구니에 모든 값들이 담겨서 O(n)이 될 수도 있다.
  • 일반적으로는 최대한 많은 바구니를 만드는 해시 함수를 사용하기 때문에 거의 O(1)에 가깝다고 볼 수 있다.

 

트라이

  • 트라이’는 기본적으로 ‘트리’ 형태의 자료 구조
  • 특이한 점은 각 노드가 ‘배열’로 이루어져있다는 것입니다.
  • 예를 들어 영어 알파벳으로 이루어진 문자열 값을 저장한다고 한다면 이 노드는 a부터 z까지의 값을 가지는 배열
  • 그리고 배열의 각 요소, 즉 알파벳은 다음 층의 노드(a-z 배열)를 가리킨다. 

 

아래 그림과 같이 Hermione, Harry, Hagrid 세 문자열을 트라이에 저장해보면,

루트 노드를 시작으로 각 화살표가 가리키는 알파벳을 따라가면서 노드를 이어주면 된다.

 

 

  • 위와 같은 트라이에서 값을 검색하는데 걸리는 시간은  ‘문자열의 길이’에 의해 한정
  • 단순히 문자열의 각 문자를 보며 트리를 탐색해나가기만 하면 되기 때문
  • 일반적인 영어 이름의 길이를 n이라고 했을 때, 검색 시간은 O(n)이 되지만, 대부분의 이름은 그리 크지 않은 상수값(예, 20자 이내)이기 때문에 O(1)이나 마찬가지라고 볼 수 있다.

 

그 외 자료구조

① 큐

  • 큐는 메모리 구조에서 살펴봤듯이 값이 아래로 쌓이는 구조
  • 값을 넣고 뺄 때 ‘선입 선출’ 또는 ‘FIFO’라는 방식을 따르게 된다. 가장 먼저 들어온 값이 가장 먼저 나가는 것
  • 은행에서 줄을 설 때 가장 먼저 줄을 선 사람이 가장 먼저 업무를 처리하게 되는 것과 동일
  • 배열이나 연결 리스트를 통해 구현 가능

 

② 스택

  • 반면 스택은 역시 메모리 구조에서 살펴봤듯이 값이 위로 쌓이는 구조
  • 따라서 값을 넣고 뺄 때 ‘후입 선출’ 또는 ‘LIFO’라는 방식을 따르게 된다. 가장 나중에 들어온 값이 가장 먼저 나가는 것
  • 뷔페에서 접시를 쌓아 뒀을 때 사람들이 가장 위에 있는(즉, 가장 나중에 쌓인) 접시를 가장 먼저 들고 가는 것과 동일
  • 역시 배열이나 연결 리스트를 통해 구현 가능

 

③ 딕셔너리

  • 딕셔너리는 ‘키’와 ‘값’이라는 요소로 이루어져 있다.
  • ‘키’에 해당하는 ‘값’을 저장하고 읽어오는 것. 마치 대학교에서 ‘학번’에 따라서 ‘학생’이 결정되는 것과 동일
  • 일반적인 의미에서 ‘해시 테이블’과 동일한 개념이라고도 볼 수 있다.
  • ‘키’를 어떻게 정의할 것인지가 중요

 

배열의 크기 조정 - realloc  함수

  • 일정한 크기의 배열이 주어졌을 때, 그 크기를 키우려면 어떻게 해야 할까?
  • 단순하게 현재 배열이 저장되어 있는 메모리 위치의 바로 옆에 일정 크기의 메모리를 더 덧붙이면 되겠지만, 실제로는 다른 데이터가 저장되어 있을 확률이 높다.
  • 따라서 안전하게 새로운 공간에 큰 크기의 메모리를 다시 할당하고 기존 배열의 값들을 하나씩 옮겨줘야 한다.
  • 따라서 이런 작업은 O(n), 즉 배열의 크기 n만큼의 실행 시간이 소요될 것

 

 

연결 리스트: 도입

  • 데이터 구조는 우리가 컴퓨터 메모리를 더 효율적으로 관리하기 위해 새로 정의하는 구조체 (일종의 메모리 레이아웃, 또는 지도)
  • 배열에서는 각 인덱스의 값이 메모리상에서 연이어 저장되어 있다.
  • 하지만 꼭 그럴 필요가 있을까? 각 값이 메모리상의 여러 군데 나뉘어져 있다고 하더라도 바로 다음 값의 메모리 주소만 기억하고 있다면 여전히 값을 연이어서 읽어들일 수 있다. 이를 ‘연결 리스트’라고 한다

 

 

  • 그림과 같이 크기가 3인 연결 리스트는 각 인덱스의 메모리 주소에서 자신의 값과 함께 바로 다음 값의 주소(포인터)를 저장한다.
  • 연결 리스트의 가장 첫 번째 값인 1은 2의 메모리 주소를, 2는 3의 메모리 주소를 함께 저장
  • 3은 다음 값이 없기 때문에 NULL (\0, 즉 0으로 채워진 값을 의미합니다)을 다음 값의 주소로 저장

 

연결 리스트는 아래 코드와 같이 간단한 구조체로 정의할 수 있다. 

  • node 라는 이름의 구조체는 number 와 *next  두 개의 필드가 함께 정의되어 있다.
  • number는 각 node가 가지는 값, *next 는 다음 node를 가리키는 포인터
  • 여기서 typedef struct 대신에 typedef struct node 라고 ‘node’를 함께 명시해 주는 것은, 구조체 안에서 node를 사용하기 위함

 

연결 리스트: 코딩

앞서 정의한 구조체를 활용해서 실제로 연결 리스트를 구현해보기

 

 

연결 리스트: 시연

  • 배열과 비교해서 연결 리스트는 새로운 값을 추가할 때 다시 메모리를 할당하지 않아도 된다는 장점이 있다.
  • 하지만 이런 유동적인 구조는 그 대가가 따릅니다. 구조가 정적인 배열과 달리 연결 리스트에서는 임의 접근이 불가능
  • 연결 리스트에 값을 추가하거나 검색하는 경우를 생각해 보면,
  • 이를 위해서는 해당하는 위치까지 연결 리스트의 각 node들을 따라 이동해야 한다.
  • 따라서 연결 리스트의 크기가 n 일때 그 실행 시간은 O(n)이 된다.
  • 배열의 경우 임의 접근이 가능하기 때문에 (정렬 되어 있는 경우) 이진 검색을 이용하면 O(log n)의 실행 시간이 소요 되는 것에 비해서 다소 불리한 것  
  • 이처럼 여러 데이터 구조는 각각 장단점이 존재한다.
  • 프로그래밍을 할 때 목적에 부합하는 가장 효율적인 데이터 구조를 고민해서 사용하는 것이 중요!

 

연결 리스트: 트리

  • 트리는 연결리스트를 기반으로 한 새로운 데이터 구조
  • 연결리스트에서의 각 노드 (연결 리스트 내의 한 요소를 지칭)들의 연결이 1차원적으로 구성되어 있다면, 트리에서의 노드들의 연결은 2차원적으로 구성되어 있다
  • 각 노드는 일정한 층에 속하고, 다음 층의 노드들을 가리키는 포인터를 가지게 된다.
  • 가장 높은 층에서 트리가 시작되는 노드를 루트라고 한다. 루트 노드는 다음 층의 노드들을 가리키고 있고, 이를 자식 노드라고 한다.

※ 아래 그림은 트리의 예시. 나무가 거꾸로 뒤집혀 있는 형태를 생각하면 된다.

  • 위 그림에 묘사된 트리는 구체적으로 ‘이진 검색 트리’
  • 각 노드가 구성되어 있는 구조를 살펴보면 일정한 규칙을 알 수 있다.
  • 먼저 하나의 노드는 두 개의 자식 노드를 가진다.
  • 또 왼쪽 자식 노드는 자신의 값 보다 작고, 오른쪽 자식 노드는 자신의 값보다 크다.
  • 따라서 이런 트리 구조는 이진 검색을 수행하는데 유리

 

아래 코드에서는 이진 검색 트리의 노드 구조체와 “50”을 재귀적으로 검색하는 이진 검색 함수를 구현하였다. (차근히 읽어보기)

 

이진 검색 트리를 활용하였을 때 검색 실행 시간과 노드 삽입 시간은 모두 O(log n)

 

 

 

 열정적이고 배려심 많은 사전스터디 팀원분들을 만난 것은 정말 복인 것 같다 :)

 저번주를 끝으로 다들 웹개발 종합반 강의를 2회차씩 돌렸기 때문에, 이번주 부터는 토이프로젝트에 관한 회의를 매일 진행하기로 했다.

 

 오늘 대략적으로 토이프로젝트의 주제와, 틀, 그리고 구현할 기능들에 대해 이야기를 나누었다.

 

 오늘 회의 내용을 대략적으로 정리해 보자면,

 

토이프로젝트 주제  코딩 관련된 유용한 소스(사이트 링크)를 모아 놓은 웹 페이지
  글쓴이가 유튜브 링크를 가져와 추천하는 이유와 난이도 및 카테고리 등을 설정해서 등록
1차 구현 난이도  웹개발 종합반 강의와 비슷한 수준  + 크롤링 (가능하다면)
2차로 구현할 것  로그인과 회원가입에 난이도 있는 기술 넣기 + like(좋아요) 기능 (모아보기)
전체적인
플로우 구상
 1. 메인페이지 (에서 로그인 박스를 만들어 놓고 클릭하기)
 2. 로그인 페이지 (로그인 하면 (DB조회) -> 카테고리 페이지 이동 or 회원가입) 
 3. 회원가입 페이지 - DB 등록 (로그인 페이지와 회원가입 페이지는 두명이상 같이 맡아서 하기)
 4. 카테고리페이지 (카톡 선물하기 페이지같은 느낌)
 5. 카테고리에 맞는 list페이지 [GET]요청 /DB 조회
        (스파르타피디아와 비슷한 느낌으로 - 썸네일, 제목, 난이도 별, 카테고리)
         + 기록 [POST]요청 /DB등록 -> 세부페이지는 같은 양식의 페이지를 html/css로 만들어 놓고 사용
  6. list페이지 클릭하면 세부페이지 나오기 [GET]요청 /DB 조회
   1. 메인페이지를 없앤다면 로그인페이지로 시작하고, 세부페이지를 좀 더 만들어보기
 2. 세부페이지를 list페이지와 묶는다면 메인페이지로 시작하기.
다음 회의 전까지
해야할 일 
  로그인과 회원가입 구현방식 알아보기 + 유튜브링크 크롤링 방법 알아보기

 

이정도인 것 같다.

 


 

지난번 미팅 스몰토크 때 토이프로젝트와 관련하여 등록한 사람별로 sorting 해서 페이지를 만들어보자는 의견이 있었는데 

내 생각엔 카테고리 별로( 예를 들면, 자바스크립트/리액트, 자바/스프링, html/css) 페이지를 만드는 게  더 좋을 것 같아서 의견을 냈고, 모두 동의해 주셨다. 

그리고 소영님이 코딩과 관련된 웹페이지 제작 아이디어와 회원가입 관련 jwt 아이디어를 주셨고,

현빈님은 큰 플로우흐름을 한 번 정리해주시고 와이어프레임을 내일까지 만들어 주시기로 하셨다.

미경님은 아직 일을 하고 계셔서 바쁘신데도 불구하고 게더와 사전스터디 노션 페이지를 제작해 주셔서 덕분에 너무 잘 이용하고 있다.

민승님은 팀원들이 제안하는 의견을 조용하지만 묵직하게 뒤에서 열심히 공부해주는 분인 것 같다. 그리고 좋은 사이트 (알고리즘 테스트) 같은 것도 공유해 주신다. 

 

팀원분들에 비해 너무 부족한 실력이라 따라가기에 급급하지만, 그래도 팀원분들을 보면서 많이 배우는 중이다. 특히 지난주엔 게더를 켜놓고 공부를 했는데, 혼자 하는 기분이 아니라 괜히 자극도 되고 위안도 되서 앞으로도 게더를 잘 활용해야 겠다고 생각했다. 아직 부트캠프가 시작도 하지 않았지만, 혼자였으면 준비하지 못했을 것들을 팀을 통해 부족하지만 그나마 차근히 준비할 수 있는 것 같아서 좋다.

 

그럼 내일도 화잇팅 ! ! ! 

 

+ Recent posts