달력

12025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'Legend 개발자/T아카데미'에 해당되는 글 8건

  1. 2017.09.07 Spring Framework
  2. 2017.09.05 모바일 GUI 디자인
  3. 2017.09.04 UX/UI 기획
  4. 2017.09.02 jQuery (JavaScript)
  5. 2017.08.31 컴퓨터 알고리즘 중급
  6. 2017.08.30 JavaScript
  7. 2017.08.28 HTML&CSS
  8. 2017.08.10 컴퓨터 알고리즘 초급

1강 Framework 개념


1. SW 재사용 방안들

복사(Copy) & 붙이기(Paste)

- 초보적인 재사용 방식으로 비슷한 예제를 다른 Source에서 복사해서 사용함.

GregorianCalendar date = (GregorianCalender)Calendar.getInstance();

SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");

String date = df format(date);

- 예를 들어, A라는 클래스에서 Date타입을 String 타입으로 변환하는 코딩을 하고, 클래스 B에서 동일한 로직이 필요하여 복사했다고 가정한 경우

- JDK 버전이 바뀌어 동일한 기능을 제공하는 향상된 인터페이스가 나오면 위의 코드를 사용한 A, B 클래스를 모두 변경해야 한다.


메서드 호출

- 자주 사용되고, 유사한 기능들을 모아 메서드로 정의하여 재사용함.

public class DateUtility{

public static String toStringToday(String format){

GregorianCalendar date = (GregorianCalender)Calendar.getInstance();

SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");

String date = df format(date);

}

}

String sdate = DateUtility.toStringToday("yyyyMMdd");

- JDK 버전이 바뀌거나 메서드의 내용이 수정되더라도 해당 클래스를 모두 수정할 필요 없이 toStringToday() 메서드의 내용만 수정하면 된다.

- toStringToday() 메서드의 Signature를 변경하면 이 메서드를 사용하는 모든 클래스에 영향을 준다.

- 메서드 재사용 방법은 '복사 & 붙이기'보다는 진보된 방식이지만, 작업 영역간의 결합도(Coupling) 문제는 여전히 존재한다.


클래스 재사용 (상속)

- 자주 사용되고, 유사한 기능들을 모아 메서드로 정의하여 재사용함.

public class Person{

public String printBirthDate(String format){

DateUtility.toStringToday(birthDate, format);

}

}

- Person을 상속받은 모든 클래스들은 자동적으로 변경된 printBirthDate() 메서드를 사용하게 된다.

- DateUtility 클래스의 메서드가 변경되더라도 printBirthDate()메서드의 인터페이스가 변하지 않으면 나머지 클래스들은 영향을 받지 않는다.


AOP(Aspect Oriented Programming)

- 관심의 분리(Seperatrion of Concerns)

- AOP가 핵심관심모듈의 코드를 직접 건드리지 않고 필요한 기능이 동작하도록 하는 데는 위빙(Weaving)이라고 하는 특수한 작업이 필요하다. 즉, AOP에서 위빙 작업을 통해 핵심모듈 사이사이에 필요한 횡단 관심 코드가 동작하도록 엮어지게 만든다.

- AOP는 OOP를 더욱 OOP 답게 만들어 줄 수 있다.

- AOP는 OOP 뿐만 아니라 기존의 절차적 프로그래밍에도 적용될 수 있다.


2. 디자인 패턴과 프레임워크의 관련성

디자인패턴의 정의

- 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 소프트웨어 개발과정에서 발견된 Know-How를 축적하여 이름을 붙여 이후에 재사용하기 좋은 형태로 특정 규약을 묶어서 정리한 것

- 이 용어를 소프트웨어 개발 영역에서 구체적으로 처음 제시한 곳은, GoF(Gang of Four)라 불리는 네 명의 컴퓨터 과학 연구자들이 쓴 서적 'Design Patterns: Elements of Reusable Object-Oriented Software'(재사용 가능한 객체지향 소프트웨어의 요소 - 디자인 패턴)이다.

- 디자인 패턴을 사용하는 이유

요구사항은 수시로 변경 → 요구사항 변경에 대한 Source Code 변경을 최소화

여러 사람이 같이하는 팀 프로젝트 진행 → 범용적인 코딩 스타일을 적용

상황에 따라 인수 인계하는 경우도 발생 → 직관적인 코드를 사용


프레임워크의 정의

- 비기능적(Non-Funtional) 요구사항(성능, 보안, 확장성, 안정성 등)을 만족하는 구조와 구현된 기능을 안정적으로 실행하도록 제어해주는 잘 만들어진 구조의 라이브러리의 덩어리

- 프레임워크는 애플리케이션들의 최소한의 공통점을 찾아 하부 구조를 제공함으로써 개발자들로 하여금 시스템의 하부 구조를 구현하는데 들어가는 노력을 절감하게 해줌

- 프레임워크를 사용하는 이유

비기능적인 요소들을 초기 개발 단계마다 구현해야 하는 불합리함을 극복해준다.

기능적인(Functional) 요구사항에 집중할 수 있도록 해준다.

디자인 패턴과 마찬가지로 반복적으로 발견되는 문제를 해결하기 위한 특화된 Solution을 제공한다.


디자인패턴과 프레임워크의 관련성

- 디자인 패턴은 프레임워크의 핵심적인 특징이고, 프레임워크를 사용하는 애플리케이션에 그 패턴이 적용된다는 특징을 가지고 있다. 하지만 프레임워크는 디자인 패턴이 아니다.

- 디자인 패턴은 애플리케이션을 설계할 때 필요한 구조적인 가이드라인이 되어 줄 수는 있지만 구체적으로 구현된 기반코드를 제공하지 않는다.

- 프레임워크는 디자인 패턴과 함께 패턴이 적용 된 기반 클래스 라이브러리를 제공해서 프레임워크를 사용하는 구조적인 틀과 구현코드를 함께 제공한다.

- 개발자는 프레임워크의 기반코드를 확장하여 사용하면서 자연스럽게 그 프레임워크에서 사용된 패턴을 적용할 수 있게 된다.


3. 프레임워크의 구성요소와 종류

IoC(Inversion of Control)

- IoC란 "제어의 역전" 즉, 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해준다는 뜻임. 즉, 컨테이너 역할을 해주는 프레임워크에게 제어하는 권한을 넘겨서 개발자의 코드가 신경 써야 할 것을 줄이는 전략이다.

- 프레임워크의 동작원리를 제어흐름이 일반적인 프로그램 흐름과 반대로 동작하므로 IoC라고 설명함.

- Spring 컨테이너는 IoC를 지원하며, 메타데이터(XML 설정)를 통해 beans를 관리하고 어플리케이션의 중요부분을 형성함.

- Spring 컨테이너는 관리되는 bean들을 의존성주입(Dependency Injection)을 통해 IoC를 지원함.


클래스 라이브러리(Class Library)

- 프레임워크는 특정 부분의 기술적인 구현을 라이브러리 형태로 제공한다.

- Class Library라는 구성요소는 프레임워크의 정의 중 하나인 "Semi Complete(반제품)" 이다. 라고 해석하게 만들었다.

특징

프레임워크 

라이브러리 

유저코드의 작성 

프레임워크 클래스를 서브클래싱 해서 작성 

독립적으로 작성 

호출흐름 

프레임워크코드가 유저코드를 호출 

유저코드가 라이브러리를 호출 

실행흐름 

프레임워크가 제어 

유저코드가 제어 

객체의 연동 

구조프레임워크가 정의 

독자적으로 정의 

- 라이브러리와 프레임워크의 차이점

프레임워크와 라이브러리를 구분하는 방법은 실행제어가 어디서 일어나는 가에 달려있다.

라이브러리는 개발자가 만든 클래스에서 직접 호출하여 사용하므로 실행의 흐름에 대한 제어를 개발자의 코드가 관장하고 있다.

프레임워크는 반대로 프레임워크에서 개발자가 만든 클래스를 호출하여 실행의 흐름에 대한 제어를 담당한다.


디자인 패턴

- 디자인 패턴 + 라이브러리 = 프레임워크

- 프레임워크는 디자인 패턴과 그것이 적용된 기반 라이브러리의 결합으로 이해할 수 있다.

- 프레임워크의 라이브러리를 살펴볼 때도 적용된 패턴을 주목해서 살펴 본다면 그 구성을 이해하기 쉽다.

- 특히 프레임워크를 확장하거나 커스터마이징 할 때는 프레임워크에 적용된 패턴에 대한 이해가 꼭 필요하다.


프레임워크 종류

- 아키텍쳐 결정 = 사용하는 프레임워크의 종류 + 사용전략

기능

프레임워크 종류 

웹(MVC) 

Spring MVC, Struts2, Webwork, PlayFramework

OR(Object-Relational) 매핑 

MyBatis, Hibernate, JPA, Spring JDBC

AOP(Aspect Oriented Programming) 

Spring AOP, AspectJ, JBoss AOP 

DI(Dependency Injection) 

Spring DI, Google Guicd

Build와 Library관리 

Ant+lvy, Maven, Gradle

단위 테스트 

jUnit, TestNG, Cactus 

JavaScript 

jQuery, AngularJS, Node.js 


학습정리

SW 재사용 방안들 : Copy&Paste, Method, Inheritance, AOP

디자인 패턴과 프레임워크 관련성 : 개발자는 프레임워크의 기반코드를 확장하여 사용하면서 자연스럽게 프레임워크에서 사용된 패턴들을 적용할 수 있게 된다.

프레임워크의 구성요소와 종류 : IoC(Inversion of Control), Design Pattern, Class Library 


2강 환경설정

1. JDK(Java Development Kit) 8 설치 및 API 문서

Java SE Development Kit 8 downloads

- URL http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html


Java SE Development Kit 8 API

- URL https://docs.oracle.com/javase/8/docs/api/


2. STS(Spring Tool Suite) 3.7.3 설치 및 Spring API 문서

STS downloads

- URL https://spring.io/tools/sts


SpringSource Site

- URL http://spring.io/


SpringFramwork 3.2.17 release API 문서

- URL https://docs.spring.io/spring/docs/3.2.17.RELEASE/javadoc-api/


3. Tomcat 8 설치

Tomcat8.0 downloads

- URL https://tomcat.apache.org/download-80.cgi


4. Oracle 11g XE(eXpress Edition) 설치

- URL http://www.oracle.com/technetwork/database/database-technologies/express-edition/downloads/index.html


학습정리

JDK 8 설치 및 API문서

 - JDK(Java Development Kit) 1.8 다운로드 및 설치

 - Java SE API 문서 찾기

STS 3.7.3 설치 및 Spring API 문서

 - STS(Spring Tool Suit) 3.7.3 다운로드 및 설치

 - SpringFramework 3.2.17 Release API 문서 찾기

Tomcat 8 설치

 - Tomcat 8.0 다운로드 및 설치

Oracle 11g XE 설치

 - Oracle 11g XE 버전 다운로드 및 설치 


3강 Spring Framework 개요


1. Spring Framework 개요

Spring Framework란?

- Java 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크이다.

- 애플리케이션 프레임워크

특정 계층이나 기술, 업무 분야에 국한되지 않고 애플리케이션의 전 영역을 포괄하는 범용적인 프레임워크를 말한다.

- 경략급 프레임워크

단순한 웹컨테이너에서도 엔터프라이즈 개발의 고급기술을 대부분 사용할 수 있다.

- 엔터프라이즈 개발 용이

개발자가 복잡하고 실수하기 쉬운 Low Level에 많이 신경쓰지 않으면서 Business Logic 개발에 전념할 수 있도록 해준다. 여기서 Low Level이란 보안, 인증 Transaction처리이다. 이 Low Level를 프레임워크가 해결해준다.

- 오픈소스

Spring은 OpenSource의 장점을 충분히 취하면서 동시에 OpenSource 제품의 단점과 한계를 잘 극복한다.


Spring Framework 전략

- Spring 삼각형

엔터프라이즈 개발의 복잡함을 상대하는 Spring 의 전략

→ Portable Service Abstraction, Dependency Injection, AOP, POJO + BLUEPRINTS

Portable Service Abstraction(서비스 추상화)

- 트랜잭션 추상화, OXM 추상화, 데이터 액세스의 Exception 변환기능 등 기술적인 복잡함은 추상화를 통해 Low Level의 기술구현 부분과 기술을 사용하는 인터페이스로 분리한다. 

(OXM : Object XML Mapping)

객체지향과 DI (Dependency Injection, DI는 의존관계주입의 약자)

- Spring은 객체지향에 충실한 설계가 가능하도록 단순한 객체 형태로 개발할 수 있고, DI는 유연하게 확장 가능한 객체를 만들어 두고 그 관계는 외부에서 다이나믹하게 설정해준다.

AOP(Aspect Oriented Programming 관점지향프로그래밍)

- AOP는 애플리케이션 로직을 담당하는 코드에 남아 있는 기술관련 코드를 분리해서 별도의 모듈로 관리하게 해주는 강력한 기술이다.

POJO(Plain Old Java Object 일반적인 JAVA Object 프로그램)

- POJO는 객체지향 원리에 충실하면서, 특정 환경이나 규약에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 객체이다. JVM만 있으면 돌아가는 프로그램


2. Spring Framework 특징

- 컨테이너 역할

Spring 컨테이너는 Java 객체의 LifeCycle을 관리하며, Spring 컨테이너로 부터 필요한 객체를 가져와 사용할 수 있다.

- DI(Dependency Injection) 지원

Spring은 설정 파일이나(XML)이나 어노테이션(@comment)을 통해서 객체 간의 의존관계를 설정할 수 있도록 하고 있다.

- AOP(Aspect Oriented Programming) 지원 [관점지향프로그래밍]

Spring은 트랜잭션이나 로깅, 보안과 같이 공통적으로 필요로 하는 모듈들을 실제 핵심 모듈에서 분리해서 적용할 수 있다.

- POJO(Plain Old Java Object) 지원

Spring 컨테이너에 저장되는 Java객체는 특정한 인터페이스를 구현하거나, 특정 클래스를 상속받지 않아도 된다.

- 트랜잭션 처리를 위한 일관된 방법을 지원

JDBC, JTA 등 어떤 트랜잭션을 사용하던 설정을 통해 정보를 관리하므로 트랜잭션 구현에 상관없이 동일한 코드 사용가능

- 영속성(Persistence)과 관련된 다양한 API 지원

Spring은 MyBatis, Hibernate 등 데이터베이스 처리를 위한 ORM(Object Relational Mapping) 프레임워크들과의 연동 지원


3. Spring Framework 기능요소

- Spring 프레임워크를 구성하는 기능 요소

Spring AOP

Spring ORM 

Spring Web 

Spring Web MVC 

Spring DAO 

Spring Context 

Spring Core

Spring Core (Core 컨테이너)

- Spring 프레임워크의 기본기능을 제공한다.

- 이 모듈에 있는 BeanFactory는 Spring의 기본 컨테이너이면서 스프링 DI의 기반이다.

Spring AOP (AOP)

- AOP 모듈을 통해 Aspect 지향 프로그래밍을 지원한다.

- AOP 모듈은 스프링 애플리케이션에서 Aspect를 개발할 수 있는 기반을 지원한다.

Spring ORM (ORM)

- MyBatis, Hibernate, JPA 등 널리 사용되는 ORM 프레임워크와의 연결고리를 제공한다.

- ORM 제품들을 Spring의 기능과 조합해서 사용할 수 있도록 해준다.

Spring DAO (DAO)

- JDBC에 대한 추상화 계층으로 JDBC 코딩이나 예외처리 하는 부분을 간편화 시켰으며, AOP 모듈을 이용해 트랜잭션 관리 서비스도 제공한다.

Spring Web (Web)

- 일반적인 웹애플리케이션 개발에 필요한 기본기능을 제공한다.

- Webwork나 Struts와 같은 다른 웹애플리케이션 프레임워크와의 통합을 지원한다.

Spring Context (Context)

- Context 모듈은 BeanFactory의 개념을 확장한 것으로 국제화(|18N) 메시지, 애플리케이션 생명주기 이벤트, 유효성 검증 등을 지원한다.

Spring Web MVC (WebMVC(Model/View/Controller)

- 사용자 인터페이스가 애플리케이션 로직과 분리되는 웹 어플리케이션을 만드는 경우에 일반적으로 사용되는 패러다임이다.


학습정리

Spring Framework 정의 : Java 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크이다.

Spring Framework 전략 : Portable Service Abstraction, DI, AOP, POJO

Spring Framework 특징 : 컨테이너, DI와 AOP, POJO 지원, 일관된 트랜잭션 처리방법 다양한 ORM과의 연동

Spring Framework 기능요소 : Core 컨테이너, Context, DAO, ORM, AOP, Web, WebMVC


4강 Spring Project 시작하기


1. STS 소개 및 제공하는 기능

STS(SpringSource Tool Suite) 소개

- Spring 개발업체인 SpringSource가 직접 만들어 제공하는 이클립스의 확장판으로 최신 이클립스를 기반으로 주요한 Spring 지원 플러그인과 관련된 도구를 모아서 Spring 개발에 최적화되도록 만들어진 IDE이다.

STS가 제공하는 기능

- Bean 클래스 이름 자동완성 : 현재 프로젝트의 모든 Source와 라이브러리, JDK안의 모든 클래스 중에서 첫 글자가 SDD로 시작하는 클래스를 자동으로 보여줌

- 설정파일 생성 위저드 : Bean 설정파일 생성 위저드 중 사용할 Namespace와 Schema 버전을 선택하는 화면 (설정파일은 XML에서 하는 작업이다.)

- Bean 의존관계 그래프 : Spring IDE는 XML 설정파일을 읽어서 자동으로 그래프 그려줌, 각 Bean이 어떻게 참조되고, 어떤 Property를 갖는지 알 수 있음

- AOP 적용 대상 표시 : Spring IDE의 XML 설정파일 편집기를 이용하면 AOP의 적용 대상을 손쉽게 확인할 수 있다.


2. Maven과 Library 관리

Maven이란?

- URL http://maven.apache.org 

- 라이브러리 관리 + 빌드 툴

Maven을 사용하는 이유

- 편리한 Dependent Library 관리 - Dependency Management

- 여러 프로젝트에서 프로젝트 정보나 jar 파일들을 공유하기 쉬움

- 모든 프로젝트의 빌드 프로세스를 일관되게 가져갈 수 있음.

Maven이전의 Library 관리 방법

- 과거의 의존성 라이브러리 관리 

라이브러리 사이트 접속 → 라이브러리 다운로드 → 압축 해제 → 프로젝트에 라이브러리 복사 → 플래스 패스에 추가 → 라이브러리 사이트 접속 ...

- Maven에서 의존성 라이브러리 관리

Pom.xml 파일 수정 → 빌드 → Pom.xml 파일 수정 ...


pom.xml

- Maven 프로젝트를 생성하면 pom.xml 파일이 생성된다.

- pom.xml 파일은 Project Object Model 정보를 담고 있다.

pom.xml 의존관계(dependency) 추가

- Spring 프레임워크 설치

http://mvnrepository.com 접근한다.

org.springframework로 검색한다.

spring-jdbc 모듈과 spring-web 모듈을 추가한다.

- Eclipse 제공 : Maven Repositories View

Window → Show View → Other → Maven → Maven Repositories


3. Spring Project 작성하기

STS시작하기

다운받은 Spring-toll-suite-3.7.3.RELEASE의 압축을 풀어서 STS.exe를 실행한다.

Spring Project 생성 및 Spring Module 설치

Java Project → Convert to Maven Project → Add Spring Project Nature

pom.xml 파일에 dependency 추가 : https://mvnrepository.com에서 spring context module 검색


학습정리

STS 소개 및 제공하는 기능 : Spring 개발에 최적화된 IDE, 클래스 자동완성기능, 설정파일 생성 위저드

Maven과 Library 관리 : 라이브러리 관리 + 빌드 툴, pom.xml, 편리한 Dependent Library 관리 기능

Spring Project 시작하기 : Java Project → Convert to Maven Project → Add Spring Project Nature


5강 IoC와 DI


1. IoC(Inversion of Control)

IoC의 개념

- IoC(제어권의 역전)이란, 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미한다.

- 컴포넌트 의존관계 결정(component dependency resolution), 설정(configuration) 및 생명주기(lifecycle)를 해결하기 위한 디자인 패턴(Design Pattern)


IoC 컨테이너

- 스프링 프레임워크도 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능을 제공하고 있음. 즉, IoC 컨테이너 기능을 제공한다.

- IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다.

- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다.

- 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다.


IoC의 분류

- IoC (Inversion of Control) 안에 DL과 DI가 있음

- DL (Dependency Lookup) : EJB, SPring

- DI (Dependency Injection) : Spring PicoContainer

- Setter Injetion

- Constructor Injection

- Method Injection


DL(Dependency Lookup) 과 DI(Dependency Injection)

DL(Dependency Lookup) 의존성 검색 : 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup 하는 것

DI(Dependency Injection) 의존성 주입 : 각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것

DL 사용시 컨테이너 종속성이 증가하여, 주로 DI를 사용함 

Setter Injetion

Constructor Injection

Method Injection


2. DI(Dependency Injection)

DI의 개념

각 클래스간의 의존관계를 빈 설정 (Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것을 말함

- 개발자들은 단지 빈 설정파일에서 의존관계가 필요하다는 정보를 추가하면 된다.

- 객체 레퍼런스를 컨테이너로부터 주입 받아서, 실행 시에 동적으로 의존관계가 생성된다.

- 컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해 주는 것이다.

- DI의 장점

코드가 단순해진다.

컴포넌트 간의 결합도가 제거된다.

DI의 유형

- Setter Injetion : Setter 메서드를 이용한 의존성 삽입

의존성을 입력 받는 setter 메서드를 만들고 이를 통해 의존성을 주입한다.

- Constructor Injection : 생성자를 이용한 의존성 삽입

필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입힌다.

- Method Injection : 일반 메서드를 이용한 의존성 삽입

의존성을 입력 받는 일반 메서드를 만들고 이를 통해 의존성을 주입한다.

DI를 이용한 클래스 호출방식

클래스 

사용 

인터페이스 

 

의존성삽입 

구현 

조립기 

생성 

구현클래스 

클래스가 구현클래스를 사용한다고 했을 때, DI를 이용하면 반드시 구현클래스를 상위 인터페이스를 하나 만들고 클래스가 구현클래스를 바로 의존하는 것이 아니라, 클래스는 인터페이스만 사용하게 된다. 그리고 구현클래스에 대한 정보는 XML(설정파일)에 개발자가 기술을 해놓는다. 그러면 프레임워크 측 컨테이너가 설정파일 정보를 읽어서 구현객체(클래스)를 생성해주고, 클래스와 구현클래스 사이에 의존성 관계가 있다고, 의존성 삽입은 컨테이너가 해주는 방식이 DI를 이용한 클래스 호출방식이다.

- Setter Injection

Hello 

 → 

<interface>

printer

 

 

beans.xml

String

Printer

 

Console

Printer


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package bean;
import java. util.List;
public class Hello {
    String name;
    Printer printer;
    
    public Hello( ){ 
    }
    
    public void setName(String name) {
        this.name = name;
    }    
 
    public void setPrinter(Printer printer) {
        this.printer = printer;
    }
}
cs


1
2
3
4
5
6
<bean id="hello" class="bean.Hello">
    <property name="name" value="Spring" />
    <property name="name" value="Spring" />
</bean>
<bean id="printer" class="bean.StringPrinter" />
<bean id="consolePrinter" class="bean.ConsolePrinter" />
cs


Setter Injection방법을 사용하면

Hello가 String Printer를 의존하게 된다.

그리고 소스코드에는 new String Printer라는 객체생성코드는 없이 상위 인터페이스의 멤버변수를 하나 호출을 한 후, setter 메소드를 선언을 한다. 

Hello와 String Printer가 의존관계가 있다는 것을 설정파일에 작성하면 된다.

여기서 bean이라는 것은 spring이 관리해주는 관리 객체라는 의미로, container에게 관리를 부탁하는 객체는 bean이 된다.

bean 안에 있는 프로퍼티와 Java에 맵핑되는 setter의 이름이 같게 정의를 해주면 spring이 의존관계가 있다는 것을 알 수 있다.

Setter Injection은 한 번에 한 개씩만 의존관계를 주입받을 수 있다.

한 번에 한개씩 의존관계 주입방법을 개선한것이 Constructor Injection이다.

- Constructor Injection

Hello 

 → 

<interface>

printer

 

 

beans.xml

String

Printer

 

Console

Printer


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package bean;
import java. util.List;
public class Hello {
    String name;
    Printer printer;
    
    public Hello( ){ 
    }
    
    public Hello(String name, Printer printer){
        this.name = name;
        this.printer = printer;
    }
}
cs


1
2
3
4
5
6
<bean id="hello" class="bean.Hello">
    <constructor-arg index="0" value="Spring" />
    <constructor-arg index="1" ref="printer" />
</bean>
<bean id="printer" class="bean.StringPrinter" />
<bean id="consolePrinter" class="bean.ConsolePrinter" />
cs


Constructor Injection방법을 사용하면 인자를 두개를 받는 생성자를 만든 후

설정파일에 construntor-arg라는 태그에 index, value로 작성하여 의존관계가 있다고 설정한다.


3. Spring DI 컨테이너

Spring DI 컨테이너의 개념

- Spring DI 컨테이너가 관리하는 객체를 빈(bean)이라고 하고, 이 빈(bean)들을 관리한다는 의미로 컨테이너를 빈 팩토리(BeanFactory)라고 부른다.

- 객체의 생성과 객체 사이의 런타임(run-time) 관계를 DI 관점에서 볼 때는 컨테이너를 BeanFactory라고 한다.

- Bean Factory에 여러 가지 컨테이너 기능을 추가하여 애플리케이션 컨텍스(Application Context)라고 부른다.

<interface>

BeanFactory 

 ←

<interface>

ApplicationContext 

BeanFactory와 Application Context

- BeanFactory

Bean을 등록, 생성, 조회, 반환 관리함

보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용함

getBean() 메서드가 정의되어 있음

- Application Context

Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같음

Spring의 각종 부가 서비스를 추가로 제공함

Spring이 제공하는 ApplicationContext 구현 클래스가 여러 가지 종류가 있음



학습정리

IoC(Inversion of Control) : 제어의 역전, IoC 컨테이너, DL, DI

DI(Dependency Injection) : 클래스 간의 의존관계를 컨테이너가 주입, Setter Injection, Constructor Injection

Spring DI 컨테이너 : BeanFactory, ApplicationContext


6강 DI 애플리케이션 작성(1)


1. POJO 클래스 작성

POJO 클래스 다이어그램

Hello 

 → 

<interface>

printer

 

 

beans.xml

String

Printer

 

Console

Printer


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>spring</groupId>
    <artifactId>spring</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.2.17.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.17.RELEASE</version>
        </dependency>
    </dependencies>
</project>
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package myspring.di.xml;
 
public class Hello {
    private String name;
    private Printer printer;
    
    public Hello() {}
    public void setName(String name) {
        this.name = name;
    }
    
    public void setPrinter(Printer printer) {
        this.printer = printer;
    }
    
    public String sayHello() {
        return "Hello " + name;
    }
    
    public void print() {
        this.printer.print(sayHello());
    }
    
}
 
cs


1
2
3
4
5
6
package myspring.di.xml;
 
public interface Printer {
    public void print(String message);
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package myspring.di.xml;
 
public class StringPrinter implements Printer {
    private StringBuffer buffer = new StringBuffer();
 
    @Override
    public void print(String message) {
        // TODO Auto-generated method stub
        buffer.append(message);
    }
 
    public String toString() {
        return buffer.toString();
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
package myspring.di.xml;
 
public class ConsolePrinter implements Printer{
 
    @Override
    public void print(String message) {
        System.out.println(message);
    }
    
}
 
cs


2. 설정 메타정보 XML 작성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean id="hello" class="myspring.di.xml.Hello">
        <!-- setName(name) -->
        <property name="name" value="Spirng"/>
        <!-- setPrinter(Printer) -->
        <property name="printer" ref="printer"/>
    </bean>
 
    <bean id="printer" class="myspring.di.xml.StringPrinter" />
    <bean id="consolePrinter" class="myspring.di.xml.ConsolePrinter" />
</beans>
 
cs


3. DI 테스트 클래스 작성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package myspring.di.xml.test;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
import myspring.di.xml.Hello;
import myspring.di.xml.Printer;
 
public class HelloBeanTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 1.IoC 컨테이너 생성
        ApplicationContext context = new GenericXmlApplicationContext("config/beans.xml");
        // 2.Hello Bean 가져오기
        Hello hello = (Hello) context.getBean("hello");
        System.out.println(hello.sayHello());
        hello.print();
        // 3.StringPrinter Bean 가져오기
        Printer printer = context.getBean("printer", Printer.class);
        System.out.println(printer.toString());
 
        Hello hello2 = context.getBean("hello", Hello.class);
        System.out.println(hello == hello2);
    }
 
}
 
cs


학습정리

Spinrg DI 용어 : 빈(Bean), 빈 팩토리(BeanFactory), 어플리케이션 컨텍스트(ApplicationContext), 설정 메타정보(Configuration Metadata)

POJO 클래스 작성 : 의존관계가 있는 Java 클래스 작성 : Hello.java, Printer.java, StringPrinter.java, ConsolePrinter.java

설정 메타정보 XML 작성 : 빈 설정(Bean Configuration) XML 파일작성 - beans.xml

DI테스트 클래스 작성 : DI컨테이너(ApplicationContext)를 사용한 테스트 클래스 작성 


7강 DI 애플리케이션 작성(2)


1. jUnit의 개요와 특징

jUnit의 특징

- TDD의 창시자인 Kent Beck과 디자인 패턴 책의 저자인 Erich Gamma가 작성했다.

- 단정(assert) 메서드로 테스트 케이스의 수행 결과를 판별한다. 예) assertEquals(예상 값, 실제 값)

- jUnit4부터는 테스트를 지원하는 어노테이션을 제공한다. @Test @Before @After

- 각 @Test 메서드가 호출할 때 마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어지도록 한다.


2. jUnit을 사용한 DI 테스트 클래스

jUnit 라이브러리 설치

- http://mvnrepository.com에 접근한다.

- jUnit으로 검색한다.

- jUnit 4.12버전을 pom.xml에 추가한다.


jUnit에서 테스트를 지원하는 어노테이션(Annotation)

- @Test

@Test가 선언된 메서드는 테스트를 수행하는 메소드가 된다.

jUnit은 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 원칙으로 하므로 @Test마다 객체를 생성한다.

- @Ignore

@Ignore가 선언된 메서드는 테스트를 실행하지 않게 한다.

- @Before

@Before가 선언된 메서드는 @Test 메소드가 실행되기 전에 반드시 실행되어 진다.

@Test 메소드에서 공통으로 사용하는 코드를 @Before 메소드에 선언하여 사용하면 된다.

- @After

@After가 선언된 메서드는 @Test 메소드가 실행된 후 실행된다.

- @BeforeClass

@BeforeClass 어노테이션은 @Test 메소드 보다 먼저 한번만 수행되어야 할 경우에 사용하면 된다.

- @AfterClass

@AfterClass 어노테이션은 @Test 메소드 보다 나중에 한번만 수행되어야 할 경우에 사용하면 된다.


테스트 결과를 확인하는 단정(assert) 메서드

- org.junit.Assert

+assertEquals(expected[A], actual[B])

객체 A와 B가 일치함을 확인한다.

+assertArrayEquals(expected[A], actual[B])

배열 A와 B가 일치함을 확인한다.

+asserSame(expected[A], actual[B])

객체 A와 B가 같은 객체임을 확인한다.

assertEquals 메서드는 두 객체의 값이 같은지 확인하고, assertSame 메서드는 두 객체의 레퍼런스가 동일한가를 확인한다.(==연산자)

+assertTrue(object[A])

조건 A가 참인가를 확인한다.

+assertNotNull(object[A])

객체 A가 null이 아님을 확인한다.

- 이외에도 다양한 assert 메서드가 존재함.

http://junit.sourceforge.net/javadoc/org/junit/Assert.html


jUnit을 사용한 DI 테스트 클래스(HelloBeanJunitTest.java) 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package myspring.di.xml.test;
 
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
 
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
import myspring.di.xml.Hello;
import myspring.di.xml.Printer;
 
public class HelloBeanJUnitTest {
    private ApplicationContext context;
 
    @Before
    public void init() {
        context = new GenericXmlApplicationContext("config/beans.xml");
    }
 
    @Test
    public void bean1() {
        Hello hello = (Hello) context.getBean("hello");
        assertEquals("Hello Spring", hello.sayHello());
        hello.print();
 
        Printer printer = (Printer) context.getBean("printer");
        assertEquals("Hello Spring", printer.toString());
    }
 
    @Test
    public void bean2() {
        Printer printer = (Printer) context.getBean("printer");
        Printer printer2 = context.getBean("printer", Printer.class);
 
        assertSame(printer, printer2);
    }
}
 
cs


3. Sprint-Test를 사용한 DI테스트 클래스

Spring-Test 라이브러리 설치

- http://mvnrepository.com에 접근한다.

- spring-test로 검색한다.

- Spring-test 3.2.17 버전을 pom.xml에 추가한다.


Spring-Test에서 테스트를 지원하는 어노테이션

- @RunWith(SpringJUnit4CLassRunner.class)

@RunWith는 jUnit 프레임워크의 테스트 실행방법을 확장할 때 사용하는 어노테이션이다.

SpringjUnit4ClassRunner라는 클래스를 지정해주면 jUnit이 테스트를 진행하는 중에 ApplicationContext를 만들고 관리하는 작업을 진행해 준다.

@RunWith 어노테이션은 각각의 테스트 별로 객체가 생성되더라도 싱글톤(Singleton)의 ApplicationContext를 보장한다.

- @ContextConfiguration

스프링 빈(Bean) 설정 파일의 위치를 지정할 때 사용되는 어노테이션이다.

- @Autowired

스프링DI에서 사용되는 특별한 어노테이션이다.

해당 변수에 자동으로 빈(Bean)을 매핑 해준다.

스프링 빈(Bean) 설정 파일을 읽기 위해 굳이 GenericXmlApplicationContext를 사용할 필요가 없다.


Spring-Test를 사용한 DI 테스트 클래스(HelloBeanSpringTest.java) 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package myspring.di.xml.test;
 
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import myspring.di.xml.Hello;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:config/beans.xml")
public class HelloBeanSpringTest {
    @Autowired
    private ApplicationContext context;
 
    @Test
    public void bean1() {
        Hello hello = (Hello) context.getBean("hello");
        assertEquals("Hello Spring", hello.sayHello());
        hello.print();
        assertEquals(context.getBean("printer").toString(), "Hello Spring");
 
        Hello hello2 = context.getBean("hello", Hello.class);
        hello2.print();
        assertSame(hello, hello2);
    }
}
 
cs


학습정리

jUnit의 개요와 특징

- 단위테스트를 지원하는 프레임워크, assert 메서드를 사용하여 테스트 결과 확인

jUnit을 사용한 DI 테스트 클래스

- jUnit 설치, asset 메서드를 사용하여 테스트 결과 확인

- @Test, @Before 어노테이션 사용

Spring-Test를 사용한 DI 테스트 클래스

- Spring-Test 설치

- @RunWith(SpringJUnit4ClassRunner.class), @ContextConfiguration, @Autowired 어노테이션 사용 


8강 DI 애플리케이션 작성(3)


1. Bean 의존관계 설정 방법

Setter Injection : <property> 태그

- Setter 메서드를 통해 의존관계가 있는 Bean을 주입하려면 <property> 태그를 사용할 수 있다.

- ref 속성은 사용하면 Bean 이름을 이용해 주입할 Bean을 찾는다.

- value 속성은 단순 값 또는 Bean이 아닌 객체를 주입할 때 사용한다.


Constructor Injection : <constructor-arg> 태그

- Constructor를 통해 의존관계가 있는 Bean을 주입하려면 <constructor-arg> 태그를 사용할 수 있다.

- Constructor 주입방식은 생성자의 파라미터를 이용하기 때문에 한번에 여러 개의 객체를 주입할 수 있다.

- 생성자 주입을 위한 설정 : ①index 지정, ②파라미터 이름 지정


POJO 클래스 수정 및 Bean 설정 파일 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package myspring.di.xml;
 
public class Hello {
    private String name;
    private Printer printer;
 
    public Hello() {
    }
 
    public Hello(String name, Printer printer) {
        super();
        this.name = name;
        this.printer = printer;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setPrinter(Printer printer) {
        this.printer = printer;
    }
 
    public String sayHello() {
        return "Hello " + name;
    }
 
    public void print() {
        this.printer.print(sayHello());
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean id="hello2" class="myspring.di.xml.Hello">
        <constructor-arg index="0" value="Spring"/>
        <constructor-arg index="1" ref="printer"/>
    </bean>
 
    <bean id="hello" class="myspring.di.xml.Hello">
        <!-- setName(name) -->
        <property name="name" value="Spring"/>
        <!-- setPrinter(Printer) -->
        <property name="printer" ref="printer"/>
    </bean>
 
    <bean id="printer" class="myspring.di.xml.StringPrinter" />
    <bean id="consolePrinter" class="myspring.di.xml.ConsolePrinter" />
</beans>
 
cs


2. 프로퍼티(Property) 값 설정 방법

- 단순 값(문자열이나 숫자)의 주입(Injection)

- Setter 메서드를 통해 Bean의 레퍼런스가 아니라 단순 값을 주입하려고 할 때는 <property> 태그의 value 속성을 사용한다.

- Spring은 List, Set, Map, Properties 와 같은 컬렉션 타입을 XML로 작성해서 프로퍼티에 주입하는 방법을 제공한다.

- List와 Set 타입 : <list>와 <value> 태그를 이용

- 프로퍼티가 Set 타입이면 <list> 대신에 <set>을 사용하면된다.

- 프로퍼티가 Map 타입이면 <map>과 <entry>태그를 이용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package myspring.di.xml;
 
import java.util.List;
 
public class Hello {
    private String name;
    private Printer printer;
    private List<String> names;
 
    public Hello() {
    }
 
    public Hello(String name, Printer printer) {
        super();
        this.name = name;
        this.printer = printer;
    }
 
    public List<String> getNames() {
        return names;
    }
 
    public void setNames(List<String> names) {
        this.names = names;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public void setPrinter(Printer printer) {
        this.printer = printer;
    }
 
    public String sayHello() {
        return "Hello " + name;
    }
 
    public void print() {
        this.printer.print(sayHello());
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
    <bean id="hello2" class="myspring.di.xml.Hello">
        <constructor-arg index="0" value="Spring"/>
        <constructor-arg index="1" ref="printer"/>
        <property name="names">
            <list>
                <value>AOP</value>
                <value>Spring</value>
                <value>DI</value>
            </list>
        </property>
    </bean>
 
    <bean id="hello" class="myspring.di.xml.Hello">
        <!-- setName(name) -->
        <property name="name" value="Spring"/>
        <!-- setPrinter(Printer) -->
        <property name="printer" ref="printer"/>
    </bean>
 
    <bean id="printer" class="myspring.di.xml.StringPrinter" />
    <bean id="consolePrinter" class="myspring.di.xml.ConsolePrinter" />
</beans>
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package myspring.di.xml.test;
 
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
 
import java.util.List;
 
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
 
import jdk.management.resource.internal.inst.SocketOutputStreamRMHooks;
import myspring.di.xml.Hello;
import myspring.di.xml.Printer;
 
public class HelloBeanJUnitTest {
    private ApplicationContext context;
 
    @Before
    public void init() {
        //IoC 컨테이너를 생성
        //1.ApplicationContext 객체 생성
        context = new GenericXmlApplicationContext("config/beans.xml");
    }
 
    @Test 
    public void bean1() {
        //2. getBean() 호출
        Hello hello = (Hello) context.getBean("hello2");
        //3.Hello의 sayHello() 호출
        assertEquals("Hello Spring", hello.sayHello());
        //3.Hello의 printer() 호출
        hello.print();
 
        assertEquals(3, hello.getNames().size());
        List<String> list = hello.getNames();
        for (String value : list) {
            System.out.println(value);
        }
        
        //StringPrinter getBean()
        Printer printer = (Printer) context.getBean("printer");
        assertEquals("Hello Spring", printer.toString());
    }
 
    @Test @Ignore
    public void bean2() {
        Printer printer = (Printer) context.getBean("printer");
        Printer printer2 = context.getBean("printer", Printer.class);
 
        assertSame(printer, printer2);
    }
}
 
cs


3. 프로퍼티(Property) 파일을 이용한 설정 방법

환경에 따라 자주 변경되는 내용의 분리

- XML의 Bean 설정 메타정보는 애플리케이션 구조가 바뀌지 않으면 자주 변경되지 않는다.

- 반면에 프로퍼티 값으로 제공되는 일부 설정정보 (예-DataSource Bean이 사용하는 DB 연결정보)는 애플리케이션이 동작하는 환경(개발, 테스트, 스테이징, 운영)에 따라서 자주 바뀔 수 있다.

- 변경되는 이유와 시점이 다르다면 분리하는 것이 객체지향 설계의 기본 원칙이다. 설정에도 동일한 원칙을 적용할 수 있다. 

- 환경에 따라 자주 변경될 수 있는 내용은 properties 파일로 분리하는 것이 가장 깔끔하다 XML 처럼 복잡한 구성이 필요 없고 키와 값의 쌍(key=value)으로 구성하면 된다.


환경에 따라 자주 변경되는 내용의 분리의 예시(1)

- value 속성에 설정된 값들은 환경에 따라 변경될 수 있는 내용이다.

- 자주 변경되는 값들은 properties 파일에 넣어 분리하는 것이 좋다.

1
2
3
4
5
6
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="com.sql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/testdb" />
        <property name="username" value="spring" />
        <property name="password" value="book" />        
    </bean>
cs

- 프로퍼티 파일ㄹ로 분리한 정보는 ${}(프로퍼티 치환자)을 이용하여 설정한다.

- ${} 값을 치환해주는 기능은 <context:property-placeholder> 태그에 의해 자동으로 등록되는 PropertyPlaceHolderConfigurer Bean이 담당한다.

1
2
3
4
5
6
7
    <context:property-placeholder location="classpath:config/database.properties" />
    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${db.driverCLass}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />        
    </bean>
cs


Bean 설정 파일 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
 
    <context:property-placeholder location="classpath:config/value.properties" />
 
    <bean id="hello2" class="myspring.di.xml.Hello">
        <constructor-arg index="0" value="${myname}" />
        <constructor-arg index="1" ref="${myprinter}" />
        <property name="names">
            <list>
                <value>${value1}</value>
                <value>${value2}</value>
                <value>${value3}</value>
            </list>
        </property>
    </bean>
 
<!-- 
    <context:property-placeholder location="classpath:config/database.properties" />
    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${db.driverCLass}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />        
    </bean>
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="com.sql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/testdb" />
        <property name="username" value="spring" />
        <property name="password" value="book" />        
    </bean>
 -->
 
    <bean id="hello" class="myspring.di.xml.Hello">
        <!-- setName(name) -->
        <property name="name" value="Spring" />
        <!-- setPrinter(Printer) -->
        <property name="printer" ref="printer" />
    </bean>
 
    <bean id="printer" class="myspring.di.xml.StringPrinter" />
    <bean id="consolePrinter" class="myspring.di.xml.ConsolePrinter" />
</beans>
 
cs


학습정리

Bean 의존관계 설정 방법

- <property>, <constructor-arg> 태그

프로퍼티(property) 값 설정 방법

- <property> 태그의 value 속성

- <list>, <set>, <map>

프로퍼티(property) 파일을 이용한 값 설정방법

- Properties 파일 작성, ${} 치환자 사용, <context:property-placeholder>


9강 DI 애플리케이션 작성(4)


1. Bean 등록 메타정보 구성 전략

전략(1) XML 단독 사용

- 모든 Bean을 명시적으로 XML에 등록하는 방법이다.

- 생성되는 모든 Bean을 XML에서 확인할 수 있다는 장점이 있으나 Bean의 개수가 많아지면 XML 파일을 관리하기 번거로울 수 있다.

- 여러 개발자가 같은 설정파일을 공유해서 개발하다 보면 설정파일을 동시에 수정하다가 충돌이 일어나는 경우도 적지 않다.

- DI에 필요한 적절한 setter 메서드 또는 constructor가 코드 내에 반드시 존재해야 한다.

- 개발 중에는 어노테이션 설정방법을 사용했지만, 운영 중에는 관리의 편의성을 위해 XML설정으로 변경하는 전략을 쓸 수도 있다.


전략(2) XML과 빈 스캐닝(Bean Scanning)의 혼용

- Bean으로 사용될 클래스에 특별한 어노테이션(Annotation)을 부여해주면 이런 클래스를 자동으로 찾아서 Bean으로 등록한다.

- 특정 어노테이션이 붙은 클래스를 자동으로 찾아서 Bean으로 등록해주는 방식을 빈 스캐닝(Bean Scanning)을 통한 자동인식 Bean 등록기능이라고 한다.

-  어노테이션을 부여하고 자동 스캔으로 빈을 등록하면 XML문서 생성과 관리에 따른 수고를 덜어주고 개발 속도를 향상시킬 수 있다.

-  애플리케이션에 등록될 Bean이 어떤 것들이 있고, Bean들 간의 의존관계가 어떻게 되는지를 한눈에 파악할 수 없다는 단점이 있다.


2. Bean 등록 및 의존관계 설정 Annotation

Bean 등록 Annotation

- @Component

컴포넌트를 나타내는 일반적인 스테레오 타입으로 <bean>태그와 동일한 역할을 함

- @Repository

퍼시스턴스(persistence) 레이어, 영속성을 가지는 속성(파일, 데이터베이스)을 가진 클래스

- @Service

서비스 레이어, 비즈니스 로직을 가진 클래스

- @Controller

프리젠테이션 레이어, 웹 어플리케이션에서 웹 요청과 응답을 처리하는 클래스

- @Repository, @Service, @Controller는 더 특정한 유즈케이스에 대한 @Component의 구체화된 형태이다.


Bean 의존관계 주입 Annotation

- @Autowired

정밀한 의존관계 주입(Dependency Injection)이 필요한 경우에 유용하다.

@Autowired는 프로퍼티, setter 메서드, 생성자, 일반메서드에 적용 가능하다.

의존하는 객체를 주입할 때 주로 Type을 이용하게 된다.

@Autowired는 <property>,<constructor-arg> 태그와 동일한 역할을 한다.

- @Resource

어플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용된다.

@Resource는 프로퍼티, setter 메서드에 적용 가능하다.

의존하는 객체를 주입할 때 주로 Name을 이용하게 된다.

- @Autowired는 타입으로, @Resource는 이름으로 연결한다는 점이 다르다.

- @Value

단순한 값을 주입할 때 사용되는 어노테이션이다.

@Value("Spring")은 <property ... value="Spring" /> 와 동일한 역할을 한다.

- @Qualifier

@Qualifier는 @Autowired 어노테이션과 같이 사용되어 진다.

@Autowired는 타입으로 찾아서 주입하므로, 동일한 타입의 Bean 객체가 여러 개 존재할 때 특정 Bean을 찾기 위해서는 @Qualifier를 같이 사용해야 한다.


Component Scan을 지원하는 태그

- <context:component-scan> 태그

@Component를 통해 자동으로 Bean을 등록하고, @Autowired로 의존관계를 주입받는 어노테이션을 클래스에서 선언하여 사용했을 경우에는 해당 클래스가 위치한 특정 패키지를 Scan하기 위한 설정을 XML에 해주어야 한다.

<context:component-scan base-package="myspring.di.annot" />

<context:include-filter> 태그와 <context:exclude-filter> 태그를 같이 사용하면 자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스를 구체적으로 명시할 수 있다.


어노테이션을 사용한 POJO 클래스 작성

Hello 

 → 

<interface>

printer

 

 

annot.xml

String

Printer

 

Console

Printer



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package myspring.di.annot;
 
import org.springframework.stereotype.Component;
 
@Component("stringPrinter")
public class StringPrinter implements Printer {
    private StringBuffer buffer = new StringBuffer();
 
    @Override
    public void print(String message) {
        // TODO Auto-generated method stub
        buffer.append(message);
    }
 
    public String toString() {
        return buffer.toString();
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package myspring.di.annot;
 
import org.springframework.stereotype.Component;
 
@Component("consolePrinter")
public class ConsolePrinter implements Printer{
 
    @Override
    public void print(String message) {
        System.out.println(message);
    }
    
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package myspring.di.annot;
 
import java.util.List;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
@Component
public class Hello {
    @Value("Spring")
    private String name;
    
    @Autowired
    @Qualifier("stringPrinter")
    private Printer printer;
    private List<String> names;
 
    public Hello() {
    }
 
    public Hello(String name, Printer printer) {
        super();
        this.name = name;
        this.printer = printer;
    }
 
    public List<String> getNames() {
        return names;
    }
 
    public void setNames(List<String> names) {
        this.names = names;
    }
 
//    public void setName(String name) {
//        this.name = name;
//    }
//
//    public void setPrinter(Printer printer) {
//        this.printer = printer;
//    }
 
    public String sayHello() {
        return "Hello " + name;
    }
 
    public void print() {
        this.printer.print(sayHello());
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
 
    <context:component-scan base-package="myspring.di.annot" />
</beans>
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package myspring.di.annot.test;
 
import static org.junit.Assert.assertEquals;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import myspring.di.annot.Hello;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:config/annot.xml")
public class HelloBeanAnnotTest {
    @Autowired
    ApplicationContext context;
    
    @Test
    public void test() {
        Hello hello = context.getBean("hello",Hello.class);
        assertEquals("Hello Spring",hello.sayHello());
        
    }
}
 
cs


3. 프로퍼티(Property) 파일을 이용한 설정 방법

Properties 파일 및 Bean 설정파일 작성

1
2
3
4
5
6
7
myname=Spring
myprinter=printer
value1=AOP
value2=Spring
value3=DI
printer1=stringPrinter
printer2=consolePrinter
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package myspring.di.annot;
 
import java.util.List;
 
import javax.annotation.Resource;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
@Component
public class Hello {
    @Value("${myname}")
    private String name;
 
    // @Autowired
    // @Qualifier("stringPrinter")
    @Resource(name = "${printer1}")
    private Printer printer;
    private List<String> names;
 
    public Hello() {
    }
 
    public Hello(String name, Printer printer) {
        super();
        this.name = name;
        this.printer = printer;
    }
 
    public List<String> getNames() {
        return names;
    }
 
    public void setNames(List<String> names) {
        this.names = names;
    }
 
    // public void setName(String name) {
    // this.name = name;
    // }
    //
    // public void setPrinter(Printer printer) {
    // this.printer = printer;
    // }
 
    public String sayHello() {
        return "Hello " + name;
    }
 
    public void print() {
        this.printer.print(sayHello());
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
 
    <context:component-scan base-package="myspring.di.annot" />
    
    <context:property-placeholder location="classpath:config/value.properties"/>
</beans>
 
cs


학습정리

Bean 등록 메타정보 구성 전략

- XML 단독사용, XMl과 빈 스캐닝의 혼용

Bean 등록 및 의존관계 설정 Annotation

- @Component, @Repository, @Service, @Controller

- @Autowired, @Qualifier, @Value, @Resource

프로퍼티(property) 파일을 이용한 값 설정방법

- Properties 파일 작성, ${} 치환자 사용, <context:property-placeholder>


10강 사용자 관리 프로젝트


1. 사용자 관리 프로젝트 아키텍처

아키텍처 개요

- 대부분의 중, 대규모 웹 애플리케이션은 효율적인 개발 및 유지보수를 위하여 계층화(Layering)하여 개발하는 것이 일반적이다.

- 사용자관리 프로젝트 아키텍쳐에서 기본적으로 가지는 계층은 프리젠테이션 계층(Presentation Layer), 서비스 계층(Service Layer), 데이터액세스 계층(Data Access Layer) 3계층과 모든 계층에서 사용되는 도메인 모델 클래스로 구성되어 있다.

- 각각의 계층은 계층마다 독립적으로 분리하여 구현하는 것이 가능해야 하며, 각 계층에서 담당해야 할 기능들이 있다.

프리젠테이션 계층


서비스 계층

데이터액세스 계층

← 도메인 모델 클래스 →

- 위의 세 가지 계층은 독립적으로 분리할 수 있도록 구현해야 하며, 일반적으로 각 계층 사이에서는 인터페이스(Interface)를 이용하여 통신하는 것이 일반적이다.

- 프리젠테이션 계층

브라우저상의 웹크라이언트의 요청 및 응답을 처리

상위계층(서비스계층, 데이터 액세스계층)에서 발생하는 Exception에 대한 처리

최종 UI에서 표현해야 할 도메인 모델을 사용

최종 UI에서 입력한 데이터에 대한 유효성 검증(Validation) 기능을 제공

비즈니스 로직과 최종 UI를 분리하기 위한 컨트롤러 기능을 제공

@Controller 어노테이션을 사용하여 작성된 Controller 클래스가 이 계층에 속함

- 서비스 계층

애플리케이션 비즈니스 로직 처리와 비즈니스와 관련된 도메인 모델의 적합성 검증

트랜잭션(Transaction) 처리

프리젠테이션 계층과 데이터 액세스 계층 사이를 연결하는 역할로서 두 계층이 직접적으로 통신하지 않게 하여 애플리케이션의 유연성을 증가

다른 계층들과 통신하기 위한 인터페이스를 제공

Service 인터페이스와 @Service 어노테이션을 사용하여 작성된 Service구현 클래스가 이 계층에 속함

- 데이터 액세스 계층

영구 저장소(관계형 데이터베이스)의 데이터를 조작하는 데이터 액세스 로직을 객체화

영구 저장소의 데이터를 조회, 등록, 수정, 삭제 함

ORM(Object Relational Mapping) 프레임워크(MyBatis, Hibernate) 를 주로 사용하는 계층

DAO 인터페이스와 @Repository 어노테이션을 사용하여 작성된 DAO 구현 클래스가 이 계층에 속함

- 도메인 모델 클래스

관계형 데이터 베이스의 엔티티와 비슷한 개념을 가지는 것으로 실제 VO(Value Object) 혹은 DTO(Data Transfer Object) 객체에 해당

도메인 모델 클래스는 3개의 계층 전체에 걸쳐 사용

private으로 선언된 멤버변수가 있고, 그 변수에 대한 getter와 setter 메서드를 가진 클래스를 말함


2. 사용자 관리 프로젝트 클래스 설계

클래스의 역할

- 프리젠테이션 계층

UserController 클래스

UI계층과 서비스 게층을 연결하는 역할을 하는 클래스

JSP에서 UserController를 통해서 서비스 계층의 UserService를 사용하게 된다.

서비스 계층의 UserService 인터페이스를 구현하나 객체를 IoC 컨테이너가 주입해준다.

- 서비스 계층

UserService 인터페이스

서비스 계층에 속한 상위 인터페이스

UserServiceImpl 클래스

UserService 인터페이스를 구현한 클래스

복잡한 업무 로직이 있을 경우에는 이 클래스에서 업무 로직을 구현하면 된다.

데이터 액세스 계층의 UserDao 인터페이스를 구현한 객체를 IoC 컨테이너가 주입해준다.

- 데이터 액세스 계층

UserDao 인터페이스

데이터 액세스 계층에 속한 상위 인터페이스

UserDaoImplJDBC클래스

UserDao 인터페이스를 구현한 클래스로 이 클래스에서는 데이터 액세스 로직을 구현하면 된다.

SpringJDBC를 사용하는 경우에는 DataSource를 IoC 컨테이너가 주입해준다.

MyBatis를 사용하는 경우에는 SqlSession을 IoC 컨테이너가 주입해준다.


3. 사용자 관리 프로젝트 클래스 Code


학습정리

사용자 관리 프로젝트 아키텍쳐

- 프리젠테이션 계층, 서비스 계층, 데이터액세스 계층, 도메인 클래스

사용자 관리 프로젝트 클래스 설계

- 클래스 다이어그램, 각 클래스들의 역할

사용자 관리 프로젝트 클래스 Code

- 각 클래스들의 Code 살펴보기


11강 Spring JDBC 개요


1. 데이터 액세스 공통 개념

DAO(Data Access Object) 패턴

- 데이터 액세스 계층은 DAO 패턴을 적용하여 비즈니스 로직과 데이터 액세스 로직을 분리하는 것이 원칙이다.

- 비즈니스 로직이 없거나 단순하면 DAO와 서비스 계층을 통합 할 수도 있지만 의미 있는 비즈니스 로직을 가진 엔터프라이즈 애플리케이션이라면 데이터 액세스 계층을 DAO 패턴으로 분리해야 한다.

- DAO 패턴은 서비스계층에 영향을 주지 않고 데이터 액세스 기술을 변경할 수 있는 장점을 가지고 있다.


컨넥션 풀링을 지원하는 DataSource

- 컨넥션 풀링은 미리 정해진 개수만큼의 DB 컨넥션을 풀(Pool)에 준비해두고, 애플리케이션이 요청할 때마다 Pool에서 꺼내서 하나씩 할당해주고 다시 돌려받아서 Pool에 넣는 식의 기법이다.

- 다중 사용자를 갖는 엔터프라이즈 시스템에서라면 반드시 DB컨넥션 풀링 기능을 지원하는 DataSource를 사용해야 한다.

- Spring에서는 DataSource를 공유 가능한 Spring Bean으로 등록해 주어 사용할 수 있도록 해준다.


DataSource 구현 클래스 종류

- 테스트 환경을 위한 DataSource

SimpleDriverDataSource

- Spring이 제공하는 가장 단순한 DataSource 구현 클래스이다.

- getConnection()을 호출할 때마다 매번 DB 컨넥션을 새로 만들고 따로 풀(pool)을 관리하지 않으므로 단순한 테스트용으로만 사용해야 한다.

SingleConnectionDriverDataSource

- 순차적으로 진행되는 통합 테스트에서는 사용 가능하다.

- 매번 DB 커넥션을 생성하지 않기 때문에 SimpleDriverDataSource 보다 빠르게 동작한다.


DataSOurce 종류

- 오픈소스 DataSource

Apache Commons DBCP

- 가장 유명한 오픈소스 DB커넥션 풀(pool) 라이브러리이다.

- Apache의 Commons 프로젝트(http://commons.apache.org/dbcp/

c3p0 JDBC/DataSource Resource Pool

- c3p0는 JDBC 3.0스펙을 준수하는 Connection과 Statement 풀(pool)을 제공하는 라이브러리이다.

- c3p0 웹 사이트 (http://www.mchange.com/projects/c3p0/)

두 가지 모두 수정자(setter) 메서드를 제공하므로 Spring Bean으로 등록해서 사용하기 편리하다.


2. Spring JDBC 설치 및 DataSource 설정

- JDBC란?

JDBC는 모든 자바의 데이터 액세스 기술의 근간이 된다.

엔티티 클래스와 애노테이션을 이용하는 최신 ORM 기술도 내부적으로는 DB와의 연동을 위해 JDBC를 이용한다.

안정적이고 유연한 기술이지만, 로우 레벨 기술로 인식되고 있다.

간단한 SQL을 실행하는 데도 중복된 코드가 반복적으로 사용되며, DB에 따라 일관성 없는 정보를 가진 채로 Checked Exception으로 처리한다.

장점 : 대부분의 개발자가 잘 알고 있는 친숙한 데이터 액세스 기술로 별도의 학습 없이 개발이 가능하다

단점 : Connection과 같은 공유 리소스를 제대로 릴리즈 해주지 않으면 시스템의 자원이 바닥나는 버그를 발생시킨다.

- Spring JDBC란?

JDBC의 장점과 단순성을 그대로 유지하면서도 기존 JDBC의 단점을 극복할 수 있게 해주고, 간결한 형태의 API 사용법을 제공하며, JDBC API에서 지원되지 않는 편리한 기능을 제공한다.

Spring JDBC는 반복적으로 해야 하는 많은 작업들을 대신 해준다.

Spring JDBC를 사용할 때는 실행할 SQL과 바인딩 할 파라미터를 넘겨 주거나, 쿼리의 실행 결과를 어떤 객체에 넘겨 받을지를 지정하는 것만 하면 된다.

Spring JDBC를 사용하려면 먼저, DB 컨넥션을 가져오는 DataSource를 Bean으로 등록해야 한다.

- Spring JDBC가 해주는 작업

Connection 열기와 닫기

- Connection과 관련된 모든 작업을 Spring JDBC가 필요한 시점에서 알아서 진행한다.

- 진행 중에 예외가 발생했을 때도 열린 모든 Connection 객체를 닫아준다.

Statement 준비와 닫기

- SQL 정보가 담긴 Statement 또는 PreparedStatement를 생성하고 필요한 준비 작업을 해주는 것도 Spring JDBC가 한다.

- Statement도 Connection과 마찬가지로 사용이 끝나고 나면 Spring JDBC가 알아서 객체를 닫아준다.

Statement 실행

- SQL 담긴 Statement를 실행하는 것도 Spring JDBC가 해준다.

- Statement의 실행결과는 다양한 형태로 가져올 수 있다.

ResultSet Loop 처리

- ResultSet에 담긴 쿼리 실행 결과가 한 건 이상이면 ResultSet 루프를 만들어서 반복해주는 것도 Spring JDBC가 해주는 작업이다.

Exception 처리와 반환

- JDBC 작업 중 발생하는 모든 예외는 Spring JDBC 예외 변환기가 처리한다.

- 체크 예외(Checked Exception)인 SQLException을 런타임 예외(Runtime Exception)인 DataAccessException 타입으로 변환한다.

Transaction 처리

- Spring JDBC를 사용하면 transaction과 관련된 모든 작업에 대해서는 신경 쓰지 않아도 된다.


3. Spring JDBC의 JdbcTemplate 클래스

- JdbcTemplate 클래스

Spring JDBC가 제공하는 클래스 중 JdbcTemplate은 JDBC의 모든 기능을 최대한 활용할 수 있는 유연성을 제공하는 클래스이다.

JdbcTemplate이 제공하는 기능은 실행, 조회, 배치의 세 가지 작업이다.

- 실행 : Insert나 Update같이 DB의 데이터에 변경이 일어나는 쿼리를 수행하는 작업

- 조회 : Select를 이용해 데이터를 조회하는 작업

- 배치 : 여러 개의 쿼리를 한 번에 수행해야 하는 작업

- JdbcTemplate 클래스 생성

JdbcTemplate은 DataSource를 파라미터로 받아서 아래와 같이 생성할 수 있다.

JdbcTemplate template =new JdbcTemplate(dataSource);

DataSource는 보통 Bean으로 등록해서 사용하므로 JdbcTemplate이 필요한 DAO 클래스에서 DataSource Bean을 DI(의존관계 주입) 받아서 JdbcTemplate을 생성할 때 인자로 넘겨주면 된다.

JdbcTemplate은 멀티스레드 환경에서도 안전하게 공유해서 쓸 수 있기 때문에 DAO 클래스의 인스턴스 변수에 저장해 두고 사용할 수 있다.

- JdbcTemplate 클래스 생성 Code

아래의 코드는 일반적으로 사용되는 DAO 클래스의 기본구조이다.

DataSource에 대한 수정자 메서드에서 직접 JdbcTemplate객체를 생성해준다.

1
2
3
4
5
6
7
8
9
public class UserDAOJdbc {
    JdbcTemplate jdbcTemplate;
    
    @Autowired
    public void setDataSource(DataSource dataSource) {
        jdbTemplate = new JdbcTemplate(dataSource);
    }
...
}
cs

- JdbcTemplate 클래스의 update() 메서드

INSERT, UPDATE, DELETE와 같은 SQL을 실행할 때는 JdbcTemplate의 update() 메서드를 사용한다.

int update(String sql, [SQL 파라미터])

update() 메서드를 호출할 때는 SQL과 함께 바인딩 할 파라미터는 Object 타입 가변인자 (Object ... args)를 사용할 수 있다.

update() 메소드의 리턴되는 값은 SQL 실행으로 영향을 받은 레코드의 개수를 리턴한다.

- JdbcTemplate 클래스의 update() 메서드 Code

1
2
3
4
5
6
7
8
9
10
public int update(User user) {
    StringBuffer updateQuery = new StringBuffer();
    updateQuery.append("UPDATE USERS SET ");
    updateQuery.append("password=?, name=? ");
    updateQuery.append("WHERE id=?");
    
    int result = this.jdbcTemplate.update(updateQuery.toString(), user.getName(), user.getPassword(), user.getId() );
 
    return result;
}
cs

- JdbcTemplate 클래스의 queryForObject() 메서드

SELECT SQL을 실행하여 하나의 Row를 가져올 때는 JdbcTemplate의 queryForObject() 메서드를 사용ㅎ나다.

<T> T queryForObject(String sql, pSQL 파라미터], RowMapper<T> rm)

SQL 실행 결과는 여러 개의 칼럼(Column)을 가진 하나의 로우(Row)

T는 VO 객체의 타입에 해당된다.

SQL 실행 결과로 돌아온 여러 개의 column을 가진 한 개의 Row를 RowMapper 콜백을 이용해 VO객체로 매핑 해준다.

- JdbcTemplate 클래스의 queryForObject() 메서드 Code

1
2
3
4
5
6
7
8
9
10
11
12
13
public User findUser (String id) {
    return this.jdbcTemplate.queryForObject(
        "select * from users where id=?"new Object[] {id}, new RowMapper<User>() {
            public User mapRow(ResultSet rs, int rowNum) throws SQLException{
                User user = new User();
                user.setId(rs.getString("id"));
                user.setName(rs.getString("name"));
                user.setPassword(rs.getString("password"));
                return user;
            }
        }//RowMapper    
    );//queryForObject
}//findUser
cs

- JdbcTemplate 클래스의 query() 메서드

SELECT SQL을 실행하여 여러 개의 Row를 가져올 떄는 JdbcTemplate의 query() 메서드를 사용한다.

<T> List<T> query(String sql, [SQL 파라미터], RowMapper<T> rm)

SQL 실행 결과로 돌아온 여러 개의 column을 가진 여러 개의 Row를 RowMapper 콜백을 이용해 VO 객체로 매핑 해준다.

결과 값은 매핑 한 VO 객체를 포함하고 있는 List 형태로 받는다. List의 각 요소가 하나의 Row에 해당된다.


학습정리

데이터 액세스 공통개념

- DAO 패턴, 컨넥션 풀링, DataSource

Spring JDBC 개요

- JDBC 개요 및 장단점

- Spring JDBC 개요 및 역할

Spring JDBC의 JdbcTemplate 클래스

- JdbcTemplate 클래스의 update(), queryForObject(), query() 메서드


12강 Spring JDBC 


1. DB 설정 및 JDBC Driver 설치

DBA 권한으로 접속

- SQL Command 실행

- DBA권한으로 접속

conn sys as sysdba;   입력

password는 설치할 때 지정한 oracle11

- scott 계정 생성

create user scott identified by tiger default tablespace users temporary tablespace temp;

- scott 계정에 권한 주기

grant connect, resource to scott;

DB users 테이블 생성

- scott 계정으로 접속 후 users 테이블 생성

conn scott/tiger

start c:\springframework\user.sql;

Oracle Jdbc Driver 라이브러리 검색 및 설치

- http://mvnrepository.com에 접근한다.

- oracle ojdbc6로 검색한다.

- oracle jdbc 12.1.0.1 버전을 pom.xml에 추가한다.


2. Spring JDBC 설치 및 DataSource 설정

Spring JDBC 설치

- http://mvnrepository.com에 접근한다.

- spring jdbc로 검색한다.

- oracle jdbc 3.2.17 버전을 pom.xml에 추가한다.


DataSource를 Spring Bean으로 등록하여 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
myname=Spring
myprinter=printer
value1=AOP
value2=Spring
value3=DI
printer1=stringPrinter
printer2=consolePrinter
db.driverClass=oracle.jdbc.OracleDriver
db.url=jdbc:oracle:thin:@127.0.0.1:1521:xe
db.username=scott
db.password=tiger
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
 
    <context:property-placeholder location="classpath:config/value.properties" />
 
    <!-- DataSource 설정 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${db.driverClass}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean>
 
    <bean id="hello2" class="myspring.di.xml.Hello">
        <constructor-arg index="0" value="${myname}" />
        <constructor-arg index="1" ref="${myprinter}" />
        <property name="names">
            <list>
                <value>${value1}</value>
                <value>${value2}</value>
                <value>${value3}</value>
            </list>
        </property>
    </bean>
 
    <!-- <context:property-placeholder location="classpath:config/database.properties" 
        /> <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
        <property name="driverClass" value="${db.driverCLass}" /> <property name="url" 
        value="${db.url}" /> <property name="username" value="${db.username}" /> 
        <property name="password" value="${db.password}" /> </bean> <bean id="dataSource" 
        class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <property 
        name="driverClass" value="com.sql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/testdb" 
        /> <property name="username" value="spring" /> <property name="password" 
        value="book" /> </bean> -->
 
    <bean id="hello" class="myspring.di.xml.Hello">
        <!-- setName(name) -->
        <property name="name" value="Spring" />
        <!-- setPrinter(Printer) -->
        <property name="printer" ref="printer" />
    </bean>
 
    <bean id="printer" class="myspring.di.xml.StringPrinter" />
    <bean id="consolePrinter" class="myspring.di.xml.ConsolePrinter" />
</beans>
 
cs


3. 사용자관리 프로젝트 실행

사용자관리 프로젝트의 Bean 등록 및 의존관계 설정

- <context:component-scan> 태그 사용

- @Service, @Repository 어노테이션을 선언한 클래스들과 @Autowired 어노테이션을 선언하여 의존관계를 설정한 클래스들이 위치한 패키지를 Scan 하기 위한 설정을 XML에 해주어야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
 
    <context:property-placeholder location="classpath:config/value.properties" />
    <!-- component scan 설정 -->
    <context:component-scan base-package="myspring.user" />
 
    <!-- DataSource 설정 -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${db.driverClass}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean>
 
    <bean id="hello2" class="myspring.di.xml.Hello">
        <constructor-arg index="0" value="${myname}" />
        <constructor-arg index="1" ref="${myprinter}" />
        <property name="names">
            <list>
                <value>${value1}</value>
                <value>${value2}</value>
                <value>${value3}</value>
            </list>
        </property>
    </bean>
 
    <!-- <context:property-placeholder location="classpath:config/database.properties" 
        /> <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
        <property name="driverClass" value="${db.driverCLass}" /> <property name="url" 
        value="${db.url}" /> <property name="username" value="${db.username}" /> 
        <property name="password" value="${db.password}" /> </bean> <bean id="dataSource" 
        class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <property 
        name="driverClass" value="com.sql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost/testdb" 
        /> <property name="username" value="spring" /> <property name="password" 
        value="book" /> </bean> -->
 
    <bean id="hello" class="myspring.di.xml.Hello">
        <!-- setName(name) -->
        <property name="name" value="Spring" />
        <!-- setPrinter(Printer) -->
        <property name="printer" ref="printer" />
    </bean>
 
    <bean id="printer" class="myspring.di.xml.StringPrinter" />
    <bean id="consolePrinter" class="myspring.di.xml.ConsolePrinter" />
</beans>
 
cs


DataSource 설정 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package myspring.user.test;
 
import static org.junit.Assert.assertEquals;
 
import java.sql.SQLException;
 
import javax.sql.DataSource;
 
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import myspring.user.service.UserService;
import myspring.user.vo.UserVO;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:config/beans.xml")
public class UserClient {
    @Autowired
    ApplicationContext context;
    @Autowired
    UserService service;
 
    @Test
    @Ignore
    public void updateUserTest() {
        service.updateUser(new UserVO("gildong""홍길동2""남2""서울2"));
 
        UserVO user = service.getUser("gildong");
        System.out.println(user);
    }
 
    @Test
    @Ignore
    public void insertUserTest() {
        service.insertUser(new UserVO("dooly""둘리""남""경기"));
 
        for (UserVO user : service.getUserList()) {
            System.out.println(user);
        }
    }
 
    @Test
    @Ignore
    public void getUserTest() {
        UserVO user = service.getUser("gildong");
        System.out.println(user);
        assertEquals("홍길동", user.getName());
    }
 
    @Test
    @Ignore
    public void dataSourceTest() {
        DataSource ds = (DataSource) context.getBean("dataSource");
        try {
            System.out.println(ds.getConnection());
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
 
    @Test
    @Ignore
    public void deleteUserTest() {
        service.deleteUser("dooly");
 
        for (UserVO user : service.getUserList()) {
            System.out.println(user);
        }
    }
 
}
 
cs


학습정리

DB 설정 및 JDBC Driver 설치

- DB 접속 계정 생성 및 테이블 생성

- Oracle JDBC Driver 설치

Spring JDBC 설치 및 DataSource 설정

- Spring JDBC 라이브러리 설치

- DataSource 설정

사용자관리 프로젝트 테스트

- 사용자 관리 프로젝트 실행

- 사용자 조회, 등록, 목록조회, 수정, 삭제 테스트



'Legend 개발자 > T아카데미' 카테고리의 다른 글

모바일 GUI 디자인  (0) 2017.09.05
UX/UI 기획  (0) 2017.09.04
jQuery (JavaScript)  (0) 2017.09.02
컴퓨터 알고리즘 중급  (0) 2017.08.31
JavaScript  (0) 2017.08.30
Posted by 전설의아이
|

1강 모바일과 UX/UI/GUI의 이해(1)


1. 모바일 서비스의 이해

- 모바일 서비스의 의미와 특성

스마트폰에서 매일 사용하는 서비스의 종류는 몇 가지일까요?

스마트폰에서 매일 사용하는 서비스의 구분

- 어플리케이션 = '프로그램'을 의미하며, 줄여서 '앱'이라고도 함

- 웹 브라우저 = 인터넷 서핑 전용 앱

기술 구현 방식에 차이가 있지만, 사용자에게 어떤 접근 경로로 다가갈 것인지를 우선으로 판단하여 형태를 결정하는 것을 권장한다. 이에 따라 실제 디자인 방법은 확연하게 달라지게 된다.

모바일 앱과 모바일 웹의 장단점 비교

모바일 앱과 모바일 웹은 장단점이 있으므로 장단점을 이해할 수 있어야 한다.

모바일 앱(네이티브 앱)의 특성

- 사용자 스마트폰 스크린에 노출되며, 앱 아이콘을 누르면 바로 연결되는 장점이 있다.

- 모바일 운영체제별 별도 제작 : 타 운영체제에 사용 불가

애플iOS : 오블젝티브-C / 스위프트, Xcode, 애플 앱스토어

구글 안드로이드 OS : 자바, 안드로이드 스튜디오, 구글 플레이 및 안드로이드 마켓

- 디바이스의 다양한 센서, 기능, 프레임워크를 사용 가능

- 앱 마켓을 통한 구매 필수

모바일 웹의 특성

- 사용자가 사용하는 웹 브라우저 앱을 통해 접속하며 별도의 주소를 입력해야 실행된다.

- 다양한 해상도 대응 방식으로 제작 : 원소스 멀티 유즈 가능

- HTML, CSS, JavaScript 등의 언어로 제작

- 디바이스의 다양한 센서, 기능들 사용 불가(일부 기능은 가능)

보안상의 이유로 하드웨어 및 시스템 접근 제한됨

- 앱 마켓에 노출되지 않음

하이브리드 모바일 앱

- 앱의 장점과 웹의 장점을 합친 방식으로써, 폰갭, 센차터치 등의 별도 기술을 활용하여 웹 결과물을 앱으로 패키징한다.

- 매번 웹에서 콘텐츠 등을 불러오므로 퍼포먼스는 떨어지는 편

- 앱 마켓 등록 가능

- 주로 콘텐츠가 인터넷 중심일 경우 주로 사용하며, 최근엔 완성도가 높아져 네이티브 앱과 거의 구분이 안되는 편

모바일 앱, 모바일 웹, 하이브리드 모바일 앱 비교

- 장단점이 있으므로 구체적인 차이점을 이해하기 위해서는 추후 개발자와 협의를 권장한다.

실제 프로젝트 진행시, 네이티브 앱, 모바일 웹, 하이브리드 모바일 앱의 선택(기술 구현 방식)에 따라, 디자인 및 이미지 작업이 달라지므로, 프로젝트 시작 전에 구체적으로 파악해야 할 필요가 있다.

게임 엔진을 활용한 앱 개발

- 유니티, 언리얼 등의 게임 개발 앱은, 개발 후 다양한 플랫폼으로 변환해주는 기능을 제공해주고 있다.

- 게임 장르에 주로 한정(주로 이미지, 사운드 등을 집중적으로 다루는 데 능함)

- 텍스트 및 많은 양의 정보를 다루는 경우의 앱일 경우 권장하지 않음

- 개발 후, 다양한 플랫폼에 맞추어 export 가능

- http://unity3d.com

- http://unrealengine.com

- 게임 엔진을 활용한 앱 개발로 크로스플랫폼 네이티브 앱을 개발하는 내용도 있다.


2. 모바일 운영체제의 이해와 관련 사이트

- 한국의 모바일 운영체제 점윤율

구글 안드로이드 OS 약 75%, 애플 iOS 약 23% 점유율을 보이고 있다.(2016년 1월 기준)

- 모바일 운영체제별 특징

구글 안드로이드 OS, 애플 iOS는 각 회사의 관점에 따라 스마트폰의 UX/UI/GUI 및 기능 등을 다르게 구성하고 있으므로, 디자인 및 기획을 위해서는 공통점 및 차이점을 정확히 이해하는 것이 중요하다.

공통점 

- 손으로 쥐고 사용하는 디바이스, 터치 및 제스처에 최적화

- 콘텐츠, 콤포넌트가 터치 및 핸드 헬드 디바이스에맞게 구성

- 상/하단에 운영체제 특유의 바 및 주요 요소 배치

- 각 운영체제별 마켓 존재

- 마켓 앱 구매 → 아이콘 터치 → 실행 과정

차이점 

- 디자인 스타일

- 인터랙션

- 타이포그래피

애플 iOS 디폴트 영문 폰트 San Francisco

구글 머티리얼 디자인 디폴트 영문 폰트 Roboto

- 하드웨어

애플 아이폰 6S

구글 넥서스 5X 안드로이드 폰

- 기능, 이미지 구현 방법 등

- 구글 안드로이드 OS 공식 사이트

http://design.google.com/resources  →  Naterial Design Gudelines

디자인, 기획을 위해서는 구글 디자인 가이드 사이트를 참조해야 한다.

- 애플 iOS 공식 사이트

http://developer.apple.com/ios

애플의 개발자 사이트 내의 iOS → 라이브러리를 통해서 관련 정보를 습득할 수 있다.


학습정리

모바일 서비스의 이해

 - 모바일 서비스의 구분 : 모바일 디바이스에 있는 서비스는 크게 모바일 운영체제에 특화된 네이티브 앱과 웹 브라우저를 통한 콘텐츠로 나눌 수 있다.

 - 모바일 앱 (네이티브 앱), 모바일 웹, 하이브리드 모바일 앱, 게임 엔진 : 각 방식 별로 장단점이 존재하며, 그에 따라 디자인 방식이 바뀌므로 프로젝트 진행시에는 항상 개발팀과 상의하며 진행한다.

 - 구현 방식에 따른 디자인 및 후작업의 차이점 : 어떠한 형태, 기능, 기술 등을 사용하느냐에 따라 구현, 기획, 디자인 방식들도 달라지게 되므로, 실제 디자인시에 어떠한 기술로 개발 구현되는지도 항상 체크해야 한다.

모바일 운영체제의 이해와 관련 사이트

 - 한국 모바일 운영체제 점유율 : 모바일 서비스를 기획하고 디자인하게 될 경우, 실질적인 모바일 운영체제 점유율을 근거로 하여 높은 점유율을 보이고 있는 운영체제를 우선 대상으로 하는 것을 추천한다.

 - 운영체제의 공통점, 차이점 : 모바일 운영체제의 공통점과 차이점을 구체적으로 학습하여, 이를 기반으로 기획/디자인을 효과적으로 할 수 있도록 한다.

 - 구글 안드로이드 머티리얼 디자인, 애플 iOS 디자인 : 각 운영체제별로 사이트를 운영하고 있다. 이를 통해 디자인을 위한 필요 정보들을 얻을 수 있다.



2강 모바일과 UX/UI/GUI의 이해(2)


1. 모바일 구성 요소와 디자인 프로세스

- 모바일 구성 요소의 이해

모바일 디자인 및 기획시 고려해야 하는 사항

- 프로젝트의 목표 : 매출 목표 외에도 달성하고자 하는 목표 (다운로드 수, 긍정적 리뷰 수 등), KPI(Key Performance Indicator) 등

- UX/UI/GUI : 구체적인 사용자에게 어떠한 경험, 콘텐츠, 기능, 디자인을 제공할 것인지 고민하고 적용하는 영역

- 운영체제 지원 : 1개 운영체제를 지원할 것인지, 다수 지원할 것인지

- 디바이스(해상도) 대응 : 디바이스 종류에 따른 해상도 대응의 범위

- 마켓(경쟁 관계) 리서치 : 마켓의 동향 및 경쟁 관계 분석 등

디자인 프로세스의 이해

- 일반적으로 기획 → 개발 → GUI 디자인 → 마케팅 순으로 진행한다. UX, UI를 특히 고려한다면 어느 위치에 들어가는지 고민해볼 필요가 있다.

- 에자일 개발, 린 UX, 디자인 씽킹 등은 디자인 프로세스의 하나로써 개발/디자인/기획 등에 필요한 구체적인 진행 단계 및 업무를 의미한다.

- 개발자, 디자이너, 기획자, 마케터 등 다양한 영역의 사람들이 모여서 진행

개발자 : 서비스의 기능 구현을 책임진다.

디자이너 : 일반적으로 GUI 디자이너만을 칭하는 경우가 잦다. 경우에 따라 UX/UI 디자이너가 별도로 존재하기도 한다.

기획자 : 일반적으로 콘텐츠, 기능을 통합하는 역할을 맡으며, UI 시나리오 작성 및 프로젝트 기획을 진행하는 경우가 잦다.

마케터 : 수익과 관련된 부분을 책임진다. 마켓 분석, 홍보, 트렌드 분석 등을 주로 한다.


2. 모바일 UX/UI/GUI의 이해

- UX/UI/GUI 이해의 필요성

- 디지털 제품을 디자인할 때는 누가 쓰는지를 잊고 만들게 된다. 

- 만드는 사람들은 다 각자 생각하는 제품의 완성형 모델이 다르다.

- 모바일은 보이지 않는 디지털 제품/서비스를 만드는 것이므로 작업 과정을 구체화하는 필요성이 대두되었고, 그에 따라 더욱 UX/UI/GUI가 구체화 되었다.

- UX, 사용자 경험의 이해 

- 사용자 경험은 사용자가 제품을 사용하는 모든 상황에 있어 만족하는 가치를 전달하는 것이 주 목표이나, 단순하게 사용자의 니즈/가치만을 도출하는 것이 목표가 아니라, 이를 내부의 목표와 기술적 가능성과도 균형을 맞추는 것이 주된 목표라 할 수 있다.

- UX = Union( Technology, User Needs, Business Goals ) 

- 따라서 UX 디자인에서는 사용자 및 관련 분야의 리서치를 주업무로 진행한다. 인터뷰, 설문, 관찰 등의 질적/양적 리서치를 진행하며, 이를 통해 페르소나, 요구 사항 리스트 등을 도출한다. 이를 기반으로 UI/GUI 업무가 진행된다.

- 구체화 되지 않은 내용들을 구체화/가시화 하는 업무이므로 대부분은 스케치, 포스트잇 등을 통해 업무가 진행되게 된다.

- UI, 유저 인터페이스의 이해

- UI는 유저 인터페이스, 즉 사용자가 제품과 맞닿는 지점을 의미하며 다양한 UI가 존재한다. PUI, AUI, GUI등의 요소가 있으며, 이를 포괄하여 UI로 총칭한다.

- 조작 방식과 디바이스(시스템)의 피드백 반응에 대한 인터랙션 디자인을 포괄하는 것으로 설명하기도 한다. 모바일은 터치 및 제스처로 조작되며, 이에 따른 모바일 디바이스의 반응을 인터랙션이라 한다.

- 모바일의 PUI는 대부분 표준화되어 있으며, 조작 방식 또한 표준화 됨에 따라 실제 기획/디자인할 때에는 화면의 레이아웃과 네비게이션을 기획하는 UI 디자인 단계 → 시각으로 구체화 표현되는 GUI 디자인 순으로 진행한다.

- GUI, 그래픽 유저 인터페이스의 이해

- GUI는 그래픽 유저 인터페이스로써, UI 기획 문서를 기준 근거로 하여 구체적인 시각 디자인을 의미한다. 컬러 타이포그래피, 레이아웃, 아이콘 등이 주요 작업 요소이다.


학습정리

모바일 구성 요소와 디자인 프로세스

 - 모바일 구성 요소 : 모바일 디자인 및 기획을 하기 위해서는 다양한 구성 요소에 대해서 알아야 한다. 이러한 각 요소들을 빠짐 없이 체크하며 자신의 역할을 충분히 해낼 수 있어야 하겠다.

 - 디자인 프로세스 : 여러 파트의 사람들이 모여서 모바일 서비스를 개발 하는 것이 일반적이므로, 어떠한 프로세스로 개발을 진행하고 디자인을 진행하는지를 구체적으로 파악해야 한다.

모바일 UX/UI/GUI의 이해

 - UX/UI/GUI 이해의 필요성 : 모바일 서비스는 디지털 제품이며, 아날로그 제품과 달리 제품의 사용자, 조작 방식 등이 보이지 않는 제품 서비스이므로, 이를 구체화하기 위해 그 작업 영역인 UX/UI/GUI를 구체적으로 이해할 필요가 있다.

 - UX, 사용자 경험의 이해 : UX는 사용자가 제품/서비스를 사용하는 부분에 있어 만족할 수 있는 가치를 연구/기획/구성하는 단계이며, 사용자뿐만 아니라 비즈니스 및 기술적인 부분도 조화를 이룰 수 있도록 구성한다.

 - UI, 유저 인터페이스의 이해 : 사용자가 맞닿는 모든 부분을 유저 인터페이스라 할 수 있다. PUI, AUI, GUI, 영역이 포함되며, 인터랙션 디자인 영역도 포함하여 설명하는 경우가 잦다.

 - GUI, 그래픽 유저 인터페이스의 이해 : GUI는 그래픽 유저 인터페이스로써 UI 기획 문서를기준으로 하여 유저 인터페이스를 시각적으로 표현하는 작업 단계를 의미한다. 모바일 디바이스를 대상으로 한 컬러, 타이포그래피, 레이아웃, 아이콘 등을 구체적으로 작업한다.


3강 모바일과 GUI 디자인(1)


1. 서비스 목적과 사용자의 이해

- 모바일 서비스의 구체적인 목적과 사용자의 이해

모바일 서비스 목적의 이해

①서비스의 목적

- 브랜드 서비스, 유틸리티 앱, 콘텐츠 서비스, 게임 등의 속성을 명확히 정해야 한다.

- 서비스의 목적을 명확히 함으로써 기능, 구조 등을 명확히 할 수 있다.

- 구체적인 상황에 대한 효과적인 솔루션을 제공해줄 수 있다.

- 내부 팀원들의 커뮤니케이션에도 도움을 줄 수 있다.

②세부 사항 파악

- 카테고리적 특성 : 쇼핑, SNS, 교육, 아동, 유틸리티 등, 속한 카테고리에 따라 사람들이 일반적으로 생각할 수 있는 구조, 레이아웃, 컬러 등의 특성을 포함한다.

- 모바일 특성 반영 : 손으로 들고 다니는 폰, 커뮤니케이션 툴, 다양한 상황 속에서의 사용, 작은 화면, 카메라 촬영 가능 등 ( 예제 : 김기사 앱 vs 아이나비 빌트인 네비게이션 )

③경쟁 차별화 포인트

- 브랜드적인 측면으로써, 다른 서비스와 구별될 수 있는 구체적인 측면, 개발, 기획, 디자인 등 각 팀별로 차별화 포인트를 도출해야 한다.

④기능 & 콘텐츠 리스트 업

- 구체적으로 어떠한 기능과 콘텐츠를 제공할 것인지 리스트업 및 전략을 세우도록 한다. 경쟁 서비스도 반드시 비교하여 체크한다.

모바일 앱의 대상(사용자, 오디언스) 이해의 필요성

- 참조

- 먼저 개발에 따른 기획적 특성인 내부의 '목적'을 구체화하고 난후, 직접 서비스를 사용하는 사용자/오디언스에 '누구에게') 맞추어 디자인하는 것을 권장한다.

- 서비스를 기획한 사람이 절대적 사용자가 되는 경우가 많지 않기 때문에, 실제 그 서비스를 사용하는 사람을 대상으로 생각하는 것이 중요하다.

- 디자인 파트에서 또한 이러한 기획적 측면을 이해하고, 구체적 사용자/오디언스에 맞추어 UI/GUI 디자인을 진행하여야 한다.

사용자와 오디언스의 개념 이해

- 사용자 : 좁은 의미, 구체적 단일 특성을 가진 특수 대상 고객

- 오디언스 : 넓은 의미, 일반적이고 보편적 특성을 가진 일반 대상의 고개

- 앱 디자인시, 사용자가 선호하는 디자인적인 특성을 고려하여 기획, 디자인, 콘텐츠 등을 구성해야 한다.

- 사용자의 적용 : UX 디자인 등을 통해 구체적인 사용자가 지정될 경우 이러한 내용을 근거로 하여 구체적인 디자인 이슈를 도출할 수 있다.

- 오디언스의 적용 : UX 디자인 등의 업무를 통해 구체적인 사용자가 지정되지 않을 경우 (혹은 지시사항 등이 없을 경우), 개략적인 사용자 집단인 오디언스를 구성하여 그에 맞는 디자인을 진행하는 것을 권장한다.


2. 모바일 컬러, 타이포그래피, 레이아웃

- 컬러, 타이포그래피, 레이아웃의 중요성

컬러, 타이포그래피, 레이아웃 = 통합 디자인

모바일의 컬러, 타이포그래피, 레이아웃은 시각디자인의 요소로써 개별적으로 나누어 볼 수 있으나, 최종적으로는 모든 요소가 조화롭게 디자인 되는 것을 목표로 하고 있으므로 통합 디자인 관점의 이해를 할 필요가 있다.

컬러, 타이포그래피, 레이아웃의 세부 작업

다만 실제 디자인 작업 시에는, 각 요소들을 개별적으로 분석하고 이해하고 적용할 필요가 있으므로 유의한다. 아울러 이러한 요소들은 관계 앱들의 리서치를 통해 일반적인 의미의 사용 및 차별화 포인트를 도출할 수도 있다.

- 서비스의 목적과 오디언스에 따른 컬러, 타이포그래피, 레이아웃

사용자와 오디언스의 개념 이해

- 사용자, 오디언스에 따른 UI/GUI 디자인 적용

사용자, 오디언스에 따라 서비스의 구체적인 기능, 테스크, 콘텐츠, 인포메이션 디자인을 진행 → 본격적인 UI/GUI 디자인 작업 이전에 관련 내용으로 리서치할 필요가 있다. 이러한 리서치를 통해 객관성을 확보할 수 있으며, 디자이너 개인 취향에만 따르는 디자인을 방지할 수 있다.

- 대상, 목적, 디바이스 → UI/GUI 디자인

- 모바일 디자인시에는 반드시, 서비스의 목적과 오디언스(혹은 사용자)에 맞추어 디자인을 진행하여야 한다.

사용자, 오디언스에 따른 UI/GUI 디자인 사례

- Sago Mini Friends

- the Lonely Beast ABC (글자수 적음 단순)

- Clash of Clans (요소가 다양함)

- Galaxy on Fire

- amazon (컬러가 많이 사라지고 제품 위주)

- coupang (목적우선 앱)

대상, 목적, 디바이스의 특성에 맞는 UI/GUI 디자인

- 이처럼 대상과 목적 그리고 디바이스의 특성에 맞추어 UI/GUI 디자인을 전개하는 것을 권장한다.


학습정리

서비스의 목적과 사용자의 이해

 - 모바일 서비스의 목적 이해 : 서비스의 구체적인 목적을 명확히 하고 카테고리 범주, 구체적인 기능과 콘텐츠리스트 등을 작성하여 내부 프로젝트 팀의 진행 방향을 명확하게 하는데 도움을 줄 수 있다.

 - 사용자 : 오디언스보다 구체적으로 사용자에 대한 리서치 및 UX 디자인이 이루어질 경우에는 사용자에 대해 좀 더 명확한 정보와 방향성을 얻을 수 있다. 이 경우 사용자에게 구체적으로 필요한 항목들을 도출하여 디자인에 반영할 수 있도록 한다.

 - 오디언스 : 별도의 리서치 없이 내부적으로 추정에 의해 사용자 집단을 규정하는 것을 뜻한다. 대략적인 개념의 사용자 집단인 오디언스로 규정하여 필요 항목들을 도출하여 디자인에 반영하는 것을 권장한다. 

모바일 컬러, 타이포그래피, 레이아웃

 - 컬러 타이포그래피, 레이아웃 = 통합 디자인/세부 디자인 : 실제 디자인시에는 컬러, 타이포그래피, 레이아웃을 전체적으로도, 세부적으로도 조화롭게 될 수 있도록 노력해야 한다.

 - 서비스의 목적과 오디언스에 따른 컬러, 타이포그래피, 레이아웃 : 구체적인 UI/GUI 디자인을 위해서는 컬러, 타이포그래피, 레이아웃을 디자인할 시, 서비스의 목적과 대상, 그리고 디바이스의 특성에 맞추어 디자인을 진행해야 한다.


4강 모바일과 GUI 디자인(2)


1. 모바일 운영체제에 따른 GUI 디자인

- 운영체제와 GUI 디자인

 운영체제와 GUI 디자인 FAQ

Q - 모바일 서비스를 개발하기로 하였다면, 그 다음 단계는 무엇인가?

A - 일반적으로 구체적인 UI 기획안을 작업하게 되며, 그리고 안드로이드와 아이폰 중 일부만 개발할 것인지, 아니면 둘 다 개발할 것인지를 결정하게 된다.

Q - 아이폰과 안드로이드폰, 어느 쪽을 먼저 개발하는지에 대해 어떻게 결정하는가?

A - 한국에서는 안드로이드폰 점유율이 높은 관계로, 일반적으로는 안드로이드를 먼저 개발한다.

Q - 디자인 및 디자인 스타일은 어떻게 결정하는가?

A - 어느 쪽의 운영체제를 우선 개발하느냐로 보통 결정되며, 해당 운영체제의 디자인 스타일을 따라가게 되는 편이다.

Q - 안드로이드에 맞추어 디자인을 다하고 나서, 아이폰을 지원하는데 어려움을 겪지는 않는가?

A - 안드로이드일 경우, 머티리얼 디자인 스타일을 따라가게 되는데 실제 아이폰의 디자인 스타일과 차이가 많이 나며, 머티리얼 디자인을 아이폰에 그대로 적용할 경우네는 많은 부분에서 문제가 될 수 있다.

Q - GUI 디자인에 대한 부분은 어떻게 진행되는가?

A - GUI 디자이너를 제외한 다른 파트에 있는 사람들은 비 디자이너이므로, GUI 디자인에 대한 부분은 전적으로 GUI 디자이너가 진행해야 한다. 즉, 컬러, 타이포그래피, 레이아웃, 아이콘 등의 부분은 GUI 디자이너가 작업해야 하며, 모바일 운영체제에 대한 사전 지식과 경험이 필요하며 경우에 따라서는 추가적인 리서치를 진행해야 하는 경우도 잦다.

운영체제와 GUI 디자인 스타일 결정

- 각 운영체제별로 디자인 스타일의 특징과 차이점을 명확히 이해해야 한다.

진행시 2가지 방식으로 디자인 스타일을 결정할 수 있다.

- 운영체제 최적화 디자인 방식 : 각 운영체제별 디자인 스타일에 맞추는 방식

- 운영체제 중립화 디자인 방식 : 공통 요소는 같이 쓰고, 최소한의 요소만 대응하는 방식

- 운영체제 최적화/중립화 GUI디자인

운영체제 최적화 디자인 방식

운영체제 중립화 디자인 방식

- 운영체제 디자인 스타일 결정

최적화 선택시

장점 : 사용자가 자신의 스마트폰에 최적화된 경험을 할 수 있다.

단점 : 비용(시간, 인력 등)이 많이 든다

중립화 선택시

장점 : 디자인 작업이 최적화보다 덜 들어간다

단점 : 대응 운영체제에 대한 지식/경험이 필요하다.

운영체제별 디자인 스타일을 대응하기 위해서는

- 운영체제별 스마트폰을 다 사용해본다

- 경쟁 서비스의 운영체제별 대응을 확인한다.

- 아이폰, 안드로이드폰 서비스를 비교하여 사용해본다

- 운영체제별 디자인 사이트의 디자인 관련 내용을 숙지한다

- 인터넷 정보만으로는 세부적인 내용을 확인할 수 없으므로, 스마트폰을 구해서 앱을 다운 받아서 확인해보는 방법을 권장한다.


학습정리

모바일 운영체제에 따른 GUI 디자인

 - 운영체제와 GUI 디자인 : 운영체제별로 GUI 디자인 스타일이 다르므로, 실제 GUI 디자인 진행시에는 운영체제에 적합한 디자인 스타일로 디자인하는 것이 필요하다

 - 운영체제 최적화/중립화 GUI 디자인 : 운영체제에 디자인 스타일을 적용하는 방식은 크게 최적화/중립화 방식으로 나눌 수 있으며, 이를 위해서는 운영체제별 스마트폰을 통해 서비스를 사용해보고 운영체제별 디자인 스타일 가이드를 명확하게 이해하는 것이 필요하다


5강 모바일 UI/GUI 디자인 컴포넌트 (1)


1.구조 구성 컴포넌트

- 모바일 컴포넌트의 이해

아래와 같은 모바일 디바이스의 특성에 따라 컴포넌트들은 표준화 되었으며, 이러한 차이가 웹 디자인과 비교하였을 때 가장 큰 차이점이라 할 수 있다.

작은 디스플레이, 손으로 들고 사용하는 방식, 손가락으로 조작

모바일은 웹 디자인과 달리 다양한 컴포넌트들이 표준화 되어 있다. 크게 범위를 나눈다면, 아래의 4가지 범주로 나누어 볼 수 있다.

구조 구성 컴포넌트, 콘트롤 컴포넌트, 콘텐츠 디자인, 아이콘 디자인

- 아이폰 : 

스테이터스 바

- 아이폰의 스테이터스 바는 투명하게 적용되며, 네비게이션 바와 합쳐서 보여진다. 디폴트는 검정 글자이며 횐색으로 적용할 수도 있다. 

네비게이션 바

- 아이폰의 네비게이션 바 또한 투명하게 적용되며, 스테이터스 바와 합쳐서 보여진다. 네비게이션 바를 통해 중앙에 현재 위치, 좌측에 이전 위치, 우측에 추가 기능(툴바)을 배치한다.

- 텍스트만으로 표현이 되므로, 글자 간의 충분한 간경이 나오는지 항상 확인한다.

- 네비게이션 바의 디자인 스타일은 모든 페이지에서 동일하게 표현되도록 한다.

- 앱 구조상의 최상단에 위치할 경우, 혹은 적은 페이지의 경우는 현재 위치를 별도로 표현하지 않기도 한다.

- 필요에 따라서는, 프롬프트 창을 띄워서 기존의 페이지를 덮고 특정 행동을 취하게 할 수 있다. 그럴 경우 프롬프트 입력 창이 네비게이션 바에 나타난다.

- 사용자가 콘텐츠에 집중하고자 할 때에는 네비게이션 바를 사라지게 할 수도 있다. 지도 앱의 경우 전체 화면을 제공하기 위해, 화면을 탭하면 네비게이션 바와 툴바가 사라진다.

툴 바

- 네비게이션 바 우측, 혹은 화면 최하단에 액션을 수행하는 아이콘의 형태로 툴 바가 위치한다. 하단에 배치된 툴 바의 경우 키보드가 나타날 때 화면에서 키보드에 가려지는 형태가 되기도 한다.

- 아이패드의 경우 네비게이션 바가 길기 때문에 우측에 다양한 아이콘을 배치하기도 한다.

탭 바

- 하단의 탭 바를 통해서 다른 페이지 뷰로 이동하거나, 모드 혹은 별도의 액션을 실행하기도 한다.

- 5개 이상의 아이콘은 배치하면 안되고, 5개 이상일 경우는 More 아이콘에 관련 내용을 넣는다.

- 가로모드/세로모드 모두 동일한 갯수의 탭 바 아이콘을 제공해야 한다.

서치 바

- 서치 바를 통해서 사용자들은 서치와 관련된 텍스트를 입력할 수 있다.

- 필요에 따라 입력한 텍스트에 대한 Clear 버튼을 배치할 수도 있다.

- 별도의 텍스트 정보를 제공하고자 할 경우, 프롬프트(텍스트 정보 제공)를 제공한다.

스코프 바

- 스코프 바는 일반적으로 서치바와 함께 사용되며, 서치의 범주를 설정하는 데 사용된다.

- 안드로이드폰

툴 바

- 툴 바는 굉장히 다양하게 사용이 된다. 디폴트 사이즈 혹은 확장된 사이즈로 사용 가능하다.

- 컬럼 너비로 사용할 수도 있고, 카드 보드 형식으로 툴 바를 사용할 수도 있다.

- 콘텐츠 위에 플로팅 툴 바로 사용할 수도 있고, 분리형 툴 바로도 사용 가능하다

바텀 툴 바

- 바텀 툴 바는 화면의 하단에 배치되며, 키보드가 나타날 경우에는 키보드 위에 배치할 수 있다.

- 책장(쉘프)형 바텀 툴 바 형태도 가능하다. 이 경우 아래에서 위로 필요 정보가 올라온다.

앱 바

- 과거에 액션 바'로 불리우던 것이 이제는 '앱 바'로 명칭이 바뀌었다.

- 툴 바의 한 종류로 분류되며 브랜딩, 네비게이션, 서치 그리고 액션과 관련된 요소가 배치되는 곳이다.

- 다양한 테마를 적용할 수 있다 : 라이트 / 다크 / 컬러 / 투명

스테이터스 바

- 스테이터스 바는 최상단에 위치하며, 좌측에는 노티피케이션 아이콘이 보여지며, 우측에는 시스템 아이콘 및 시간이 보여지는 곳이다.

- 일반적인 경우(디폴트)에 스테이터스 바는 앱 바에 쓰인 컬러보다 어두운 톤으로 적용되나, 희망할 경우 다른 결러를 적용하거나 투명하게 할 수도 있다.

- 밝은 컬러의 스테이터스 바를 선택한 경우라면 아이콘은 어두운 색으로 적용한다.

사이드 네비

- 사이드 네비는 임시로 나타나거나, 화면 사이즈에 따라서 고정형으로 나타나기도 한다.

- 좌측에 나타나는 경우도 있지만, 우측에 나타나는 경우도 있다. 이 경우 좌측 사이드 네비에서는 네비게이션 / 아이덴티티 중심의 내용이 배치되어야 하며, 우측 사이드 네비에서는 해당 페이지에서 필요로 하는 부가적인 정보를 배치하여야 한다.

탭 바

- 콘텐츠의 카테고리에 따라 구분되어지는 고정 탭 바에는 간결한 명칭을 기입하여야 하며, 다양한 디자인 형태로 구성할 수 있다.

- 디폴드 앱 바 + 고정 탭 바

- 확장형 앱 바 + 고정 탭 바

- 다양한 스타일의 고정 탭 바

화면이 스크롤 될 경우, 상단에 남아있는 고정 탭 바

앱 바의 서치가 활성화 될 경우 + 고정 탭 바

- 고정 탭 바에 컬러를 적용할 경우

디폴트 앱 바 + 고정 탭 바에 아이콘이 배치된 경우

고정 탭 바의 텍스트 걸러는 액션 아이콘과 동일하게 적용

고정 탭 바의 아이콘 컬러도 액션 아이콘과 동일하게 적용

- 고정 탭 바 외에도 '스크롤러블 탭 바'가 있다. 탭이 여러 개가 있을 경우 스크롤로 메뉴를 선택할 수 있도록 하는 방식의 탭 바이다. 고정 탭 바와 달리, 시작 지점이 화면 좌측으로부터 일정 거리 이상부터 시작된다.


학습정리

구조 구성 컴포넌트

 - 모바일 컴포넌트의 이해 : 모바일 디바이스가 가지고 있는 특징인 (1) 작은 디스플레이 사이즈, (2) 손으로 들고 사용하는 방식, (3) 손가락으로 조작하는 제스처로 인해, 모바일 앱은 표준화된 구조와 사용 방식을 권장하고 있으며, 그에 따라 운영체제별로 다양한 컴포넌트를 통해 스마트폰을 조작하게 되므로, 각 컴포넌트를 정확히 이해하고 사용할 수 있어야 하겠다.

 - iOS (스테이터스 바, 네비게이션 바, 툴 바, 탭 바, 서치 바, 스코프 바) : iOS 아이폰의 구조 구성 컴포넌트인 바 컴포넌트들의 각 역할과 위치, 그리고 형태에 대해 정확히 이해할 수 있도록 한다.

 - 안드로이드 OS (툴 바, 바텀 툴 바, 앱 바, 스테이터스 바, 사이드 네비, 탭 바) : 안드로이드 OS, 안드로이드 폰의 구조 구성 컴포넌트인 바 컴포넌트들의 각 역할과 위치, 그리고 형태에 대해 정확히 이해할 수 있도록 한다.


6강 모바일 UI/GUI 디자인 컴포넌트 (2)


1. 컨트롤 컴포넌트

- 아이폰

시스템 버튼

- 앱 내에서 특정 액션을 실행하는 버튼. 디폴트는 외곽선 없는 글자 만으로 이루어진 버튼이다. 경우에 따라 아이콘을 포함하기도 한다. 경우에 따라서는 외곽에 선을 넣어서 버튼임을 명확히 하기도 한다.

스위치

- 스위치는 상태를 on/off 하는 경우에 일반적으로 사용된다. 컬러가 있는 좌측 이미지가 on, 컬러가 없는 우측의 이미지가 off이다. 

- 스위치는 테이블 뷰에서만 사용한다.

스태퍼

- 특정 양을 특정 단위로 늘리거나 줄이고자 할 때 사용한다. 일반적으로 +/-를 사용하며, 큰 숫자의 변화가 아닌 경우에 사용한다. 스태퍼를 선택할 경우, 구체적인 수치의 변화를 숫자 등으로 보여주지 않으므로, 사용자가 조작한 결과를 보여줄 수 있을 정도로 다른 변화를 보여주어야 한다.

슬라이더

- 슬라이더를 통해 사용자는 정해진 범위 내에서의 수치 값 변화를 손쉽게 진행할 수 있다. 일반적으로 좌측이 적은 방향이고 우측이 많은 방향이다.

피커

- 피커는 사용자가 하나의 값을 선택해야 할 경우, 손쉽게 선택할 수 있도록 제공해주는 컨트롤 컴포넌트이다. 일반 피커와 데이트(Date) 피커가 있다.

페이지 콘트롤

- 페이지 콘트롤을 통해 사용자는 총 몇 페이지가 존재하며, 현재 몇 번째 페이지에 있는지를 시각적으로 확인할 수 있다. 이 경우 사용자는 단계적으로 하나씩 이동할 수 있으며, 페이지가 너무 많을 경우에는 사용하는 것을 권장하지 않는다. 10개 미만을 권장하며, 20개 이상의 페이지가 필요한 경우 다른 방식을 선택할 것을 권장한다.

버튼

- 버튼은 특정 위치에 한정적으로 액션을 실행하는 역할을 진행한다.

- 추가 버튼 : 특정 아이템 혹은 항목을 추가하는 기능을 한다.

- 인포 버튼 : 해당 아이템의 추가 정보를 제공해주는 역할을 한다.

인디케이터 종류

- 네트워크 액티비티 인디케이터 : 통신 상태 등을 알려주는 시각적 컴포넌트

- 리프레시 콘트롤 : 해당 페이지 새로고침을 알려주는 역할을 한다.

텍스트 필드

- 텍스트 필드는 각 영역을 손으로 탭하게 되면 글자를 입력할 수 있다. 글자 입력시 화면에 키보드가 올라온다.

- 글자 입력시 'Clear'아이콘이 배치되기도 하며, 힌트 텍스트 등을 미리 넣을 수도 있다.

- 필요에 따라서 별도의 버튼 아이콘 등을 배치할 수 있다.

- 안드로이드

버튼 

- 버튼은 텍스트, 이미지, 혹은 둘 다 사용된 형태로 배치되며, 앱의 메인 컬러를 주로 사용하게 된다. - 플랫 버튼 / 레이즈드 버튼 / 플로팅 액션 버튼의 세 가지 형태가 있다.

플로팅 액션 버튼

- 사이즈 : 디폴트 사이즈와 미니 사이즈가 있다. 대부분은 디폴트 사이즈를 사용하며, 미니 사이즈는 비주얼의 통일성을 위해 다른 컴포넌트들과 사용할 때 적용한다.

- 일반버튼의 형태로써 남용해서는 안된다.

- 플로팅 액션 버튼은 Create / Favorite / Share / Navigate 등과 같이 긍정적인 행동을 넣는 것을 권장한다.

- 보관 / 삭제/ 얼럿/ 에러 등과 같이 부정적인 액션을 플로팅 액션 버튼에 놓는 것은 권장하지 않는다. 또한 사소한 역할을 하는 경우도 사용하지 않는 것을 권장한다.

- 플로팅 액션 버튼은 원형의 플랫하며 깊이감을 주는 형태를 하는 것을 권장한다. 다른 형태나 스큐어몰피즘의 형태는 권장하지 않는다.

칩 

- 칩은 해시 태그와 유사한 역할을 하며, 다양한 형태로 구성될 수 있다. 자유 입력 폼 / 사전 정의된 형태 / 아이콘을 포함한 형태 등이 가능하다.

- 콘택트 칩은 이메일 등에서 주로 사용되는 형태로써, 해당 인물의 프로필 이미지와 이름이 보여지며 선택할 경우 주로 뷰가 생성된다.

리스트 콘트롤

- 정의 : 리스트 콘트롤은 리스트 뷰 안의 콘트롤을 의미하며, 리스트 텍스트의 좌, 우에 배치된다. 리스트 아이템의 상태를 나타내거나 추가 정보 혹은 특정 액션을 수행할 수 있는 아이콘의 형태로 배치가 된다.

- 체크 박스 : 체크 박스는 1차 (주요) 액션 또는 2차 (서브) 액션을 할 수 있다.

- 스위치 : 스위치는 2차 (서브) 액션의 역할을 할 수 있다. 온/오프의 역할로 주로 사용된다.

- 리오더 (재정렬) : 리오더는 2차 (서브) 액션의 역할을 할 수 있다. 리스트 에디팅 모드에서 해당 리스트 항목의 위치를 이동하고자 할 때 주로 쓰인다.

- 확장/축소 : 확장/축소 아이콘은 2차 (서브) 액션의 역할을 할 수 있다. 리스트 아이템의 디테일 정보를 확장해서 보고자 할 경우에 사용된다.

피커

- 데이트 피커 : 데이트 피커는 다이얼로그 윈도우로 보여지며, 날짜를 선택할 경우에 쓰여진다.

- 타임 피커 : 타임 피커는 시간을 설정하고 할 경우에 쓰여지며, 다이얼로그 창에 사용된다.

셀렉션 콘트롤

- 체크 박스 : 체크 박스는 제공되는 여러 가지의 항목 중에서 원하는 옵션을 선택하는 데 사용된다. 온/오프로 선택이 되며, 한 하나의 선택지를 제공할 경우는 온/오프 스위치 사용을 권장한다. 어떤 동작을 취하느냐에 따라서 다양한 형태의 표현이 가능하다.

- 라디오 버튼 : 라디오 버튼은 세트 선택지 중에서 하나를 선택해야할 경우에 사용된다. 선택지를 나란히 늘어 놓고 하나를 선택할 경우에 사용되며, 항목들이 많을 겨웅에는 드롭다운 방식의 메뉴를 사용하는 것을 권장한다. 사용자가 어떤 동작을 취하느냐에 따라 다양한 인터랙션을 제공한다.

- 스위치 : 온/오프 스위치는 하나의 셋팅 옵션의 상태를 온/오프 하는데 사용된다. 텍스트로 '온/오프'를 표현하는 것은 권장하지 않고, 아래의 이미지만을 사용하는 것을 권장한다. 사용자가 어떤 동작을 취하느냐에 따라 다양한 인터랙션을 제공한다.

슬라이더

- 정의 : 슬라이더는 사용자가 손쉽게 슬라이더를 손가락으로 선택해서 이동시키며 수치를 조절할 수 있는 기능을 제공한다. 좌측으로 이동할 경우는 수치가 적어지며, 우측으로 이동하면 수치가 커지는 방식이며, 불륨, 밝기, 컬러 값 등을 정할 때 주로 사용된다.

- 연속형 슬라이더 : 가장 일반적인 슬라이더의 형태이며, 선택 상황에 따라 다양한 인터랙션이 제공되므로 참조한다. 경우에 따라서는 구체적인 수치값을 표현하는 경우도 있다.

- 분리형 슬라이더 : 구체적인 수치를 슬라이더에 별도의 아이콘의 형태로 표현하는 형태가 분리형 슬라이더이다.

텍스트 필드

- 정의 : 텍스트 필드에는 숫자, 텍스트, 이메일 주소 등을 입력하는 컴포넌트이다.

- 라벨 : 사용자가 텍스트 입력 필드를 터치하게 되면 해당 필드가 위로 올라오는 듯한 표현이 이루어진다. Floating Inline Label이라 부른다. 라벨에 적용되는 컬러는 앱의 컬러 팔레트 내에서 정해지며, 인터랙션 부분은 아래를 참조한다.

- 싱글 라인 텍스트 필드 : 1줄을 입력할 수 있는 텍스트 필드이다. 싱글 라인 텍스트 필드에 아이콘이 붙을 수도 있다.

- 멀티 라인 텍스트 필드 : 하나의 라인 텍스트 필드이나, 그 안에 여러 줄의 텍스트를 넣을 수 있는 컴포넌트를 '멀티 라인 텍스트 필드'라 한다.

- Full-width 텍스트 필드 : 이메일의 내용을 적는 란과 같은 역할을 하는 것이 'Full-width 라인 텍스트 필드'이다. 싱글 라인 텍스트 필드와 멀티 라인 텍스트 필드가 같이 적용되는 경우가 잦다.

- 캐릭터 카운터 : 구체적으로 입력할 수 있는 글자 수에 제한이 있을 경우, 캐릭터 카운터를 사용한다. 싱글/멀티/Full-width 텍스트 필드에 모두 적용 가능하다.

- 오토 컴플리트 텍스트 필드 : 서치 필드에 글자를 입력할 경우, 추천 항목을 보여주거나 자동 텍스트 완성 등의 기능을 한다. 텍스트를 입력하였을 경우, 해당 텍스트가 삽입된 자동 완성 텍스트를 추천해서 보여주는 기능을 한다. 일부 텍스트를 입력하였을 경우, 완료 형태의 항목을 보여주는 방식으로 자동 완성이 가능하다.

- 서치 필터 : 앱 바에 서치 기능을 활성화하여, 싱글 라인 텍스트 필드로 텍스트를 입력하는 경우이다. 글자를 입력함에 따라 아래에 관련 콘텐츠를 필터링/정렬하여 보여주는 기능을 한다.

- 필수 입력 필드 : 필수 입력 필드는 일반적으로 항목명 옆에 * 별표 표시를 하며, 해당 항목을 입력하지 않았을 경우 붉은 색으로 표기를 할 수 있다.


학습정리

컨트롤 컴포넌트

 - 아이폰 (시스템 버튼, 스위치, 스태퍼, 슬라이더, 피커, 페이지 콘트롤, 버튼 등) : 아이폰의 컨트롤 컴포넌트에 대해 학습하였다. 다양한 컨트롤러들이 있으므로 숙지하여 아이폰 UI/GUI 디자인시 적용할 수 있도록 한다.

 - 안드로이드폰 ( 버튼, 플로팅 액션 버튼, 칩, 리스트 콘트롤, 피커, 셀렉션 콘트롤 등) : 안드로이드폰의 컨트롤 컴포넌트는 아이폰보다 훨씬 많고 다양하므로 충분히 숙지하여 UI/GUI 디자인시 적용할 수 있도록 한다. 필요할 경우, 공식 머티리얼 디자인 웹사이트를 방문하여 추가 정보를 확인하도록 한다.


7강 모바일 UI/GUI 디자인 컴포넌트 (3)


1. 아이콘 디자인

- 아이폰

정의: 아이폰에서는 일반 아이콘을 '템플릿 아이콘'이라 부른다. 그리고 앱 아이콘을 동일한 명칭인 '앱 아이콘'으로 부른다

템플릿 아이콘

- 정의 : 템플릿 아이콘은 아이폰의 화면에서 손쉽게 볼 수 있는 일반 아이콘을 의미하며, 바에 위치하거나 홈스크린 퀵 액션 뷰 등에서도 사용된다.

- 디자인 스타일 : 템플릿 아이콘은 심플한 선으로 디자인하며, 일관성 있게 디자인 요소를 통일할 것을 권장한다. 아울러 최대한 표준 아이콘에 맞추어 디자인을 진행함으로써 사용자가 쉽게 이해할 수 있는 형태를 차용하는 것을 권장한다.

- 템플릿 아이콘의 형태 : 템플릿 아이콘 선택시에는 앱의 고유 컬러로 색을 적용하되, 

(1) 아이콘의 안을 채워 넣거나 반전 형태를 적용하도록 한다. 

(2)의 경우에 따라서는 별도의 원형을 외부에 두어 형태 인식을 좀더 명확히 할 수도 있다. 

(3) 단순히 컬러만을 반전할 경우에 시인성이 떨어진다면 외부의 선을 두껍게 만들어 시인성을 높일 수도 있다.

(4) 아이콘에 디테일을 높ㅇ힌 경우이다. 이 경우에는 외부의 선을 두껍게 한다면 디테일이 떨어지게 되므로, 단순히 컬러만 적용하도록 한다.

표준 템플릿 아이콘 리스트

- 툴 바, 네비게이션 바 적용 템플릿 아이콘

- 탭, 탭 바 적용 템플릿 아이콘

앱 아이콘의 의미와 역할

- 주요 역할 : 앱 아이콘은 앱 스토어에서 사람들에게 보여지는 대표 이미지와도 같은 역할을 하며, 사용자의 스마트폰 홈스크린에 배치되어 앱을 대표하는 대표 이미지이자 입구로써의 역할을 한다.

- 다양한 용도의 앱 아이콘 : 앱 아이콘은 이 외에도 다양한 용도에서 노출이 된다. 사용자의 아이폰 내에서의 검색 결과(스포트라이트), 셋팅 페이지 등에도 보여지며, 웹 사이트의 검색 결과 등에서도 쓰여진다.

앱 아이콘의 디자인

- 디자인 가이드

사람들이 쉽게 그 의미를 알 수 있게 디자인할 것

iOS 7 스타일로 앱 아이콘을 심플하게 디자인할 것

앱의 메인 콘셉트/기능 등을 직관적으로 알 수 있도록 디자인할 것

투명 요소를 포함하지 말 것

정사각형으로 이미지를 제출하면 외곽은 자동으로 잘려짐

- 앱 아이콘 이미지 용도

앱 아이콘은 크게 앱 스토어 등록용과 아이폰 앱 탑재용으로 나눌 수 있다.

앱 스토어용은 1개 사이즈로 제출하면 자동으로 리사이징 되어 외부에 쓰여지나, 앱 탑재용 이미지는 다양한 아이폰의 해상도에 맞는 이미지를 별도로 리사이징해서 탑재해주어야 한다.


- 안드로이드 (Material icon)

정의 : 안드로이드 OS에서는 일반 아이콘을 '시스템 아이콘'이라 부른다. 그리고 앱 아이콘을 '프로덕트 아이콘'으로 부른다. 이 둘의 역할은 아이폰에서의 아이콘들의 역할과 동일하다. 이렇게 명칭이 부여가 된 이유는, 단순히 모바일에서 쓰는 것을 넘어서, 다양한 제품/서비스에 앱이 쓰여지는 것을 가정하여 명칭이 쓰여지는 것으로 이해하면 된다.

시스템 아이콘

- 디자인 스타일 : 안드로이드폰의 모든 아이콘들은 머터리얼 디자인 테마를 적용하고 있으므로, 해당 스타일에 따라 모든 디자인 요소들을 맞출 필요가 있다. 전체적으로 아이폰과 비교하였을 때, 볼드한 스타일이며 플랫하다. 선과 면의 요소로 표현이 이루어지는 특징이 있다.

- 시스템 아이콘의 형태 : 모든 UI가 그렇지만, 안드로이드 시스템 아이콘 또한 일관성 있는 시스템 아이콘을 특히 강조하고 있다. 아이콘의 두께, 모서리 반경, +/- 스페이스의 너비 등의 디테일한 부분들을 모두 따라 줄 것을 권장하고 있다.

시스템 아이콘의 의미와 종류

- 공식 아이콘 라이브러리 참조 : 시스템 아이콘은 그 양이 방대하므로, 공식 아이콘 라이브러리를 참조하여 관련 내용을 학습하도록 한다. 필요시 해당 아이콘을 다운로드 받을 수도 있다.

- design.google.com/icons/

프로덕트 아이콘의 의미와 형태

- 정의 : 프로덕트 아이콘은 앱의 브랜드를 적절히 표현할 수 있는 시각적 대표 이미지의 역할을 하는 것을 권장한다. 친근하면서도 심플하게, 대담한 디자인 스타일을 적용하기를 권장하며, 다른 앱들과 시각적으로도 차별화가 이루어지는 것을 추천하고 있다.

- 프로덕트 아이콘의 머티리얼 디자인 개발 : 머티리얼 디자인의 특징을 잘 살려 심플, 머티리얼 (디지털 페이퍼), 그리자, 밸런스의 요소를 잘 적용하여 프로덕트 아이콘의 시각 디자인 요소를 명확히 하였다.

프로덕트 아이콘의 디자인 

- 프로덕트 아이콘의 그리드 시스템 : 프로덕트 아이콘의 시각적 통일성, 일관성을 위하여, 머티리얼 디자인 테마에서부터는 그리드 시스템을 적용하기 시작하였다. 따라서 안드로이드폰의 프로덕트 아이콘을 디자인 할 경우에는 이러한 형태적 특징을 그리드 시스템에서 시작하는 것을 권장한다.

- 프로덕트 아이콘의 용도 : 아이폰 앱 아이콘과 마찬가지로, 프로덕트 아이콘을 디자인 한 후에는 앱 탑재용 이미지와 앱 마켓 등록용 이미지로 저장하여 사용한다.

- 다양한 스타일의 안드로이드 앱 프로덕트 아이콘 : 머티리얼 디자인으로 앱 아이콘을 디자인하는 것을 권장하고 있으나, 가이드라인과 별개의 디자인 스타일로 만들어진 프로덕트 아이콘들도 많으니, 필요에 따라 추가 리서치를 통해서 아이콘을 기획하는 것을 권장한다.


2. 콘텐츠 디자인 - 아이폰

아이폰 : 액티비티 뷰 콘트롤러, 콜렉션 뷰, 맵 뷰, 팝오버, 테이블 뷰, 템포러리 뷰

- 모달 콘텍스트의 이해

양식/형식을 의미하는 모달리티 modality는 이전부터 존재해왔고 경험한 것을 의미한다. 사용자들은 아이폰 앱을 사용하면서 UI/GUI 디자인을 접하게 되는데, 기존에 경험했던 형태의 UI/GUI를 통해서는 불편함 없이 서비스를 이용할 수 있을 것이므로, 이러한 모달리티를 따르는 것을 권장한다.

- 액티비티 뷰 콘트롤러

내/외로 특정 태스크를 달성하기 위해 액티비티를 선택해야 하는 경우가 있다. 이러한 하나의 활동(북마크 추가, 복사 등)을 '액티비티'라 부른다. 서비스를 사용하던 중 특정 활동을 하게 되면, 이처럼 액티비티 뷰 콘트롤러가 화면에 나타나게 된다. 액션 시트 혹은 팝 오버 뷰에 나타나게 된다. 시스템 제공 기능과 개별적으로 구성한 기능을 배치하여 보여줄 수 있다.

- 콜렉션 뷰

콜렉션 뷰를 통해서는 정렬된 콘텐츠를 커스터마이제이션 할 수 있는 레이아웃에 보여줄 수 있다.

-  맵 뷰

빌트인 맵 앱의 기능을 활용한 맵 뷰를 통해 지역적 데이터 정보를 보여줄 수 있다.

- 팝오버

화면에서 콘트롤 아이콘을 탭하였을 때, 팝오버 뷰가 나타난다. 팝오버가 나타날 경우, 뒤의 화면은 어둡게 변하거나 블럭 효과를 주는 것을 권장한다. 팝오버에는 테이블, 이미지, 지도, 웹, 네비게이션 바, 툴 바 등을 배치할 수 있다. 팝오버에는 별도의 닫기 X 아이콘은 배치하지 않아도 된다.

(1) 팜오버 외부의 영역을 선택할 경우, 팝오버 안의 조작 내용은 저장해야 한다.

(2) 팝오버가 어느 위치를 눌러서 나오게 되었는지를 표시해주어야 한다. 화살표를 보여주게 하는 것도 좋은 방식이다.

(3) 팝오버 안의 내용만으로도 충분히 조작을 할 수 있어야 한다. 팝오버 뒤의 콘텐츠를 보아야 이해하고 사용할 수 있도록 하면 안된다.

(4) 팝오버는 한 번에 하나만 보여지도록 해야 한다.

(5) 팝오버 위에 또 다른 모달 뷰를 놓는 건 안된다.

(6) 팝오버 뷰가 너무 커서 화면 전체를 가리지 못하게 해야 한다.

- 테이블 뷰

정의 : 아이폰에서 가장 자주 쓰이는 뷰이기도 한 테이블 뷰이다. 테이블 뷰는 스크롤이 가능한 싱글 컬럼의 리스트 형태로 쓰여진다. 플레인과 그룹 테이블 뷰의 두 가지 스타일이 있다.

(1) 플레인 스타일 테이블 뷰 : 플레인 스타일 테이블 뷰의 한 열은 라벨이 표기된 섹션을 표기할 수 있으며, 테이블 뷰의 우측에는 추가 인덱스를 표시할 수 있다. 필요에 따라 헤더와 푸터를 붙일 수 있으며, 이 경우 첫 열 이전에 헤더를 배치할 수 있으며 마지막 열 이후에 푸터를 배치할 수 있다.

(2) 그룹 스타일 테이블 뷰 : 그룹 스타일 테이블 뷰에서는 열은 그룹 단위로 보여지게 된다. 이 경우 헤더와 푸터가 배치되며, 그룹에는 최소 1개 이상의 열이 포함되어야 한다.

(3) 4가지 테이블 셀 스타일

a. 디폴트 : 열의 좌측에 이미지가 들어가고, 좌측 정렬로 텍스트가 배치된다.

b. 서브타이틀 : 디볼트와 같으나, 텍스트 아래에 서브타이틀이 배치된다.

c. 벨류 1 : 디폴트와 같으나, 우측에 우측 정렬로 옅은 컬러의 텍스트가 배치된다.

d. 벨류 2 : 이미지는 들어가지 않으며, 우측정렬의 파란색 폰트를 좌측에 배치하고, 좌측 정렬로 검은색 폰트를 우측에 배치하는스타일

- 템포러리 뷰

(1) 얼럿 뷰 : 얼럿 뷰는 사용자가 앱 혹은 디바이스를 사용하는 데 큰 영향을 미치는 중요한 정보를 제공하는 역할을 한다. 충분히 이해할 수 있는 내용 정보를 최대한 짧게 보여주어야 하며, 하나 이상의 선택 버튼을 제공하여야 한다. 얼럿 뷰는 시스템에서 노출 되는 것이므로, 별도의 디자인을 적용할 수는 없다. 얼럿 뷰 안의 타이틀은 최대한 짧게 넣는다. 메세지가 길면 쉽게 파악하기 힘들 수 있으므로 최대한 짧게 넣는 것을 권장한다. 또한 필요에 따라서 작은 글자로 추가 부연 설명 메세지를 넣을 수도 있다. 부연 설명 메세지가 길어질 경우, 스크롤 방식으로 보여질 수 있으나 그렇게 하는 것은 권장하지 않는다. 일반적으로 선택 버튼은 두 개를 제공한다. 두 개 중 하나를 고르는 것이 쉽기 때문에, 일반적으로 두 개의 옵션을 제공한다. 단순히 하나의 옵션만 제공할 경우는 사용자에게 선택의 여지를 주지 않기 때문에 권장하지 않는다. 필요에 따라서 세 개 이상의 버튼을 제공할 수도 있으나, 복잡해지기 때문에 권장하지는 않는다.

(2) 액션 시트 : 액션 시트는 사용자가 선택할 수 있는 몇 가지의 선택지를 제공하는 뷰이다. 사용자가 어떤 행동을 취했을 때, 필요 선택지로 나타나는 방식이다. 두 개 이상의 버튼을 제공한다. 너무 많이 제공하여 스크롤이 되도록 만드는 것은 권장하지 않는다. 아이폰이 세로 모드일 경우, 액션 시트는 화면의 아래에서 나타난다. 아이폰이 가로 모드일 경우, 액션 시트는 팝 오버 뷰로 나타난다. 액션 시트는 테스크를 완수하기 위한 방법이 다양할 경우에 선택지를 보여주는 방식이며, 사용자에게 위험한 결과를 초래할 경우에도 경고성 및 확인차 보여주는 방식으로도 사용된다. 어떠한 상황이든지, 사용자에게 치명적인 결과를 초래하는 경우에는 붉은색 텍스트를 사용하여 경고의 의미를 전달한다.

(3) 모달 뷰 : 모달 뷰는 기존의 뷰 위에 임시적으로 나타나는 뷰이며, 특정 임무를 수행하는 것을 목표로 하는 뷰이다. 현재 있는 위치에서 필요한 기능 혹은 테스크를 완수하기 위해 임시로 나타난다. 해당 기능을 수행한 후에는 사라지는 것이 일반적이다.


학습정리

아이콘 디자인

 - 아이폰 (템플릿 아이콘, 앱 아이콘) : 아이폰에서 템플릿 아이콘과 앱 아이콘의 구체적인 역할과 디자인 스타일에 대해 충분히 이해하고 디자인 할 수 있도록 한다. 필요할 경우 공식 애플 개발자 사이트를 통해 추가 정보를 학습하도록 한다.

 - 안드로이드폰 (시스템 아이콘, 프로덕트 아이콘) : 안드로이드폰의 디자인 테마인 머티리얼 디자인의 시스템 아이콘과 프로덕트 아이콘의 형태와 디자인에 대해 이해하고 디자인 할 수 있도록 한다. 필요한 경우 구글 디자인 사이트를 방문하여 관련 정보 및 자료를 습득할 수 있도록 한다.

콘텐츠 디자인 - 아이폰

 - 아이폰 (액티비티 뷰 콘트롤러, 콜렉션 뷰, 맵 뷰, 팝오버, 테이블 뷰, 템포러리 뷰) : 아이폰의 콘텐츠 디자인에 필수적인 다양한 뷰에 대해 학습하였다. 본 내용을 잘 숙지하여아이폰 앱 UI/GUI 디자인시 적용할 수 있도록 한다. 필요시 공식 애플 개발자 사이트를 통해 필요 정보를 추가적으로 확인하도록 한다.


8강 모바일 UI/GUI 디자인 컴포넌트 (4)


1. 콘텐츠 디자인 - 안드로이드 폰

안드로이드 폰 : 카드, 다이얼로그, 그리드 리스트, 디바이더, 리스트, 메뉴, 바텀 시트

카드

- 정의 : 카드는 다양한 콘텐츠와 컴포넌트로 구성할 수 있는 하나의 콘텐츠 카드라 할 수 있다. 다양한 형태와 구성, 그리고 콘텐츠에 따른 길이의 변형으로 편리하게 콘텐츠를 보여줄 수 있는 방식이다.

- 카들 콜렉션 : 동일 수준 및 개념의 카드 형태의 콘텐츠를 모아서 볼 수 있으며, 이러한 모음을 카드 콜렉션이라 한다.

- 카드 형태 디자인 Do : 반드시 각 모서리에 라운드/ 그림자 효과가 있어야 한다. 삭제 / 재배열 가능할 수 있다.

- 카드 형태 디자인 Don't 각진 모서리에 그림자 효과가 없으면 '타일tile'이다. 2개 미만의 액션이 배치되어 있다.

- 카드 콜렉션 Do : 장식적 요소가 적어 정보 이해 및 스켄이 빠르다

  그리드 타일을 통해 콘텐츠 갤러리 이미지 정보 전달이 용이하다

- 카드 콜렉션 Don't : 카드 형식을 선택함으로써 정보 스캔이 어렵다. 재배열 / 삭제 불가

갤러리는 일반적으로 카드 형식은 사용하지 않는다.

- 콘텐츠 : 카드 콜렉션을 통해서 다양한 정보와 콘텐츠를 제공할 수 있으며 그에 따라 다양한 스타일의 카드 디자인이 이루어질 수 있다. 따라서 카드에 콘텐츠를 디자인할 경우에는 이미지 위에 텍스트 배치할 경우 가독성이 보장되어야 하고, 콘텐츠의 위계가 명확해야 한다. 카드 안에는 체크 박스, 이미지, 다양한 텍스트 사이즈, 액션 등이 배치될 수 있다. 사이즈 또한 다양하게 변형될 수 있다.

- 스크롤링 : 카드 콜렉션에서 스크롤은 상하 방향으로만 가능하다.

- 액션 : 카드 자체가 터치할 수 있는 콤포넌트의 성격을 가지고 있지만, 기본적으로 몇 가지 레이아웃을 기본적으로 제공해주고 있으므로 추가적인 액션, 아이콘, 콘텐츠 등을 배치할 수 있다. 콘텐츠의 종류와 기획 의도에 따라 이는 굉장히 다양하게 적용될 수 있다.

- 카드 보조 액션 배치 및 레이아웃 : 

a. 액션 가능 영역 / 미디어, 보조 텍스트 

b. 액션 가능 영역 1,2 / 옵션 헤더, 미디어, 보조 텍스트, 보조 액션

c. 액션 가능 영역 1,2,3,4 / 옵션 헤더, 미디어, 보조 액션

d. 액션 가능 영역 1,2,3 / 옵션 헤더, 보조 텍스트, 보조 액션

- UI 콘트롤러를 포함한 카드 사례 : 

별점 UI와 이미지 터치 영역을 포함한 카드 디자인

선택할 수 있는 버튼을 포함한 카드 디자인

슬라이더 UI를 포함한 카드 디자인

고정 탭 바를 포함한 카드 디자인

다이얼로그

- 정의 : 다이얼로그는 특정 테스크를 수행하게 하는 역할로써, 텍스트와 UI 콘트롤러 등을 포함하여 사용된다. 앱의 중요 정보, 결정 사항, 다양한 테스크를 수행할 수 있도록 뷰를 제공한다. 일반 형태의 다이얼로그가 있고, 풀 스크린 다이얼로그는 전체 화면에서 정보 등을 입력하게 한다.

- 얼럿 : 얼럿은 중요한 결정을 해야 하는 경우에 주로 사용된다. 일반적인 경우에는 특정 행동을 유도하는 질문을 한다. '지우시겠습니까?' '연결하시겠습니까' > 결정 사항은 얼럿 내의 액션 버튼을 통해 진행할 수 있다. 액션 버튼에는 구체적인 행동에 대한 결과를 예측하는 용어를 사용한다.

- 얼럿 + 타이틀 바 : 얼럿에 타이틀 바를 사용할 경우는, 무척 중요한 상황에서만 사용할 것을 권장한다. 이 경우는 타이틀에 가장 중요한 내용을 간략히 적고, 콘텐츠 부분에 세부 사항을 자세히 적기를 권장한다.

- 심플 메뉴 : 심플 메뉴는 리스트 아이템에 대한 옵션을 보여주는 역할을 한다. 해당 옵션에서 선택을 하게 하면 선택의 결과가 즉시 반영된다.

- 심플 다이얼로그 : 심플 다이얼로그는 리스트 아이템에 대한 옵션을 보여주는 역할을 한다. 해당 옵션에서 선택을 하게 되면 선택의 결과가 즉시 반영되고, 창이 닫힌다.

- 심플 다이얼로그 Don't 다이럴로그의 바깥 영역을 터치하거나 스마트폰의 back 버튼을 누르면 창이 닫히는데, 별도의 Cancel 혹은 Close 버튼을 두는 것은 옳지 않다.

- 컨펌 다이얼로그 : 컨펌 다이얼로그는 옵션이 반영되기 전에 최종 컨펌을 받는 것을 목적으로 사용하는 경우이다. 최종 'OK'를 눌러야만 결과가 반영된다. 컴펌 다이얼로그 컨펌 다이얼로그는 이전의 리스트 형태 외의 다른 경우에도 사용이 가능하다. 데이트 피커의 경우에도 OK를 눌러야 최종 결정 사항이 반영된다.

- 풀스크린 다이얼로그 : 풀스크린 다이얼로그는 여러 가지의 테스크를 수행해야 하는 경우에 사용한다. 최종적으로 컨펌해야만 최종 작업이 결과에 반영된다. X 혹은 Cancel 할 경우에는, 수행 결과는 반영되지 않는다. 풀스크린 다이얼로그에서는 필요에 따라 추가 다이얼로그를 생성할 수 있다. 풀스크린 다이얼로그에서 일부 항목이라도 변경을 하였을 경우에, 취소를 하게 되면 변경 사항을 저장할 지를 묻는 얼럿을 보여주도록 한다. 만약 수정 사항이 없는 경우는 얼럿을 보여줄 필요 없이, 즉시 이전 화면으로 돌아가도 무방하다.

- 풀스크린 다이얼로그의 네비게이션

자동 저장 구조 : Up Arrow (화살표 아이콘)만 있을 경우에는 화면에서 변경하는 모든 항목들이 즉시 저장되는 방식이다.

수동 저장 구조 : X 아이콘을 누를 경우, 변경 사항을 모두 삭제하게 되며, Save를 누르게 될 경우에는 모든 사항이 저장되게 된다.

그리드 리스트 

- 정의 : 그리드 리스트는 기본 리스트 뷰의 또 다른 대안으로 사용되며, 일반적으로 동질 성격의 콘텐츠를 배열하여 보여주는 방식으로 정렬된다. 일반적으로 이미지와 관계된 경우에 주로 쓰인다. 타일을 사용하며, 특정 간격으로 수평 / 수직 그리드 리스트에 반복적으로 배열된다.

- 타일과 콘텐츠 : 타일 콘텐츠는 주요 콘텐츠와 2차 콘텐츠로 구성된다. 주요 콘텐츠는 일반적으로 이미지이며, 2차 콘텐츠는 액션 혹은 텍스트가 된다. 2차 콘텐츠의 구성 요소인 액션과 텍스트는 배치 위치가 정해져 있으므로 참조한다.

- 스크롤 Do : 일부 이미지가 잘려보이는 형태로 레이아웃을 구성하는 것을 권장한다.

- 스크롤 Don't : 이미지처럼 배치할 경우, 사용자는 화면의 아래에 추가 정보가 있을 거라 예측하지 못할 수 있기 때문이다.

- 이미지 그리드 리스트 : 이미지만으로 그리드 리스트를 구성하는 경우이다. 이 경우 이미지 사이즈를 적절히 구성하는 것이 중요하다. 이미지가 너무 클 경우에는, 빈 공간이 너무 커보일 수 있다.

- 싱글 라인 그리드 리스트 : 1줄의 텍스트를 넣는 그리드 리스트이다. 이 경우 텍스트를 타일의 상단 혹은 하단에 넣을 수 있다. 싱글 라인 텍스트에 아이콘을 추가할 수 있다. 이 경우도 아이콘을 텍스트의 앞 혹은 뒤에 배치하여 사용한다.

- 2 라인 그리드 리스트 : 텍스트가 2줄로 배열되는 구성이다. 이전과 마찬가지로 상단과 하단에 배치할 수 있다. 2라인 그리드 리스트의 텍스트 앞/뒤 위치에도 아이콘을 배치할 수 있다.

디바이더

- 정의 : 디바이더를 통해 리스트, 페이지 레이아웃의 콘텐츠와 그룹을 구분할 수 있다. 디바이더는 옅고 얇은 선으로 표현되지만, 사용자가 충분히 시각적으로 구별할 수 있으며 이를 통해 정보의 구분을 명확하게 할 수 있다.

- 풀 브리드 디바이더 : 풀 브리드 Full-bleed 디바이더는 별개의 콘텐츠 섹션을 나누는 것을 목적으로 쓰여진다. 또한 머티리얼 타일이 확장되어 콘텐츠가 추가적으로 필요할 때도 쓰여진다. 아바타 혹은 아이콘 같은 시각적으로 포인트를 주는 요소가 없을 경우에는 단순한 간격을 주는 것만으로는 구분이 되지 않으므로, 풀브리드 디바이더를 사용하는 것이 각 콘텐츠 타일을 명확히 구분지어 줄 수 있다.

- 인섹트 디바이더 : 'insect삽입'을 의미하는 인섹트 디바이더는 관계 있는 콘텐츠들을 나누는 것을 목적으로 쓰여진다. 연락처 리스트나, 대화 내의 이메일 리스트 등을 섹셕으로 나누는 역할을 한다. 인섹션 디바이더는 아바타 혹은 타이틀 시작 지점 등을 기준으로 시작점을 정한다.

- 디바이더 Don't : 풀 브리드 디바이더를 너무 많이 사용함으로써, 오히려 시각적 노이즈를 만드렁 내고 있다. 이로써 디바이더의 의미가 없어진다. 인섹트 디바이더는 비주얼 노이즈를 주링는 목적에서 주로 쓰여지나, 남용하면 의미가 없어진다.

- 서브 헤더 & 디바이더 : 서브 헤더와 디바이더를 같이 쓸 경우에는, 콘텐츠와 서브 헤더의 의미를 강조하기 위해 디바이더를 서브 헤더에 맞추어 배치한다.

리스트

- 정의 : 리스트는 싱글 컬럼으로 구성되어 있으며, 이 하나의 컬럼은 '타일'의 성경으로 구성되어 있다. 타일에는 콘텐츠를 배치하며, 리스트 내에서 필요에 따라 그 높이 값을 달리한다.

- 콘텐츠 구성 : 1개의 타일이 모여서 리스트를 이루며, 리스트 콘텐츠를 디자인할 때에는 콘텐츠의 위계를 잘 구성하는 것이 중요하다. 이를 통해 사용자가 중요한 정보를 좀 더 쉽게 찾을 수 있게 한다. 예를 들어, 이메일 리스트에 있어 아바타 > 제목 등의 순으로 배열하는 것이 더욱 중요 정보를 먼저 배치하는 것이다. 만약 3줄 이상의 텍스트와 더 많은 정보를 포함하고자 한다면 리스트가 아닌 카드 방식을 추천한다. 주요 액션은 좌측 배치 / 2차 액션은 우측 배치

- 싱글 라인 리스트 : 싱글 라인 리스트에서는 각 타일은 한 줄의 텍스트만을 배치한다. 아이콘과 함께 배치될 수 있으며, 텍스트의 길이는 다양하게 적용될 수 있다.

- 싱글 라인 리스트의 응용 : 싱글 라인 리스트에는 텍스트만 넣거나, 아이콘과 텍스트를 넣거나, 아바타, 텍스트, 아이콘을 전부 넣는 것이 가능하다. 

- 2 라인 리스트 : 2 라인 리스트에는 2줄의 텍스트가 들어간다. 이 또한 싱글 라인 리스트와 마찬가지로 아이콘, 아바타 등과 같이 배치가 가능하다.

- 2 라인 리스트의 응용 : 텍스트만 들어간 형태의 2 라인 리스트, 아이콘과 텍스트를 같이 사용한 경우가 가능하다. 또한 아바타와 텍스트, 그리고 아바타, 텍스트, 아이콘을 사용한 2 라인 리스트가 가능하다.

- 3 라인 리스트 : 3 라인 리스트도 리스트의 형태로 구성이 가능하다. 3 라인 이상의 내용이 들어갈 경우에는, 리스트가 아닌 카드 형태의 구성을 고민해보아야 한다. 3 라인 리스트 또한 다양한 콘텐츠로 구성이 가능하다.

- 3 라인 텍스트의 응용 : 텍스트 만을 사용하거나, 아이콘과 텍스트를 사용한 3 라인 리스트가 있다. 아바타와 텍스트, 또는 아바타, 텍스트, 아이콘의 조합으로도 3 라인 리스트의 타일을 구성할 수 있다.

메뉴

- 정의 : 메뉴는 임시 팝업 형태로 나타나며, 버튼, 액션 등으로 구성된다. 각 메뉴의 항목들은 옵션 액션의 역할을 하며 화면 내에 선택한 항목들에 어떠한 액션을 수행하거나 앱 내에서 어떠한 역할을 하는 것을 선택할 수 있다. 메뉴의 각 항목은 싱글 라인 텍스트로만 구성되어야 하며, 선택시 즉시 수행되어야 한다.

바텀 시트

- 정의 : 바텀 시트는 화면의 하단에서 올라오는 머티리얼 시트이다. 바텀 시트는 사용자가 행동한 액션에 대한 결과로 나타나게 되며, 위로 스와이프 할 경우에는 필요한 추가 정보를 더 볼 수 있게 한다. 바텀 시트는 임시적 모달 시트의 역할을 하기도 하며, 퍼시스턴트 바텀 시트는 앱 구조의 일부로써의 역할을 하기도 한다. 구글 지도 앱의 경우, 바텀 시트는 앱 구조의 일부 역할을 한다.

- 퍼시스턴트 바텀 시트 : 퍼시트턴트 바텀 시트는 앱 구조의 일부로써, 평상시에도 메인 뷰 하단에 남아 있다가 필요에 의해 추가 정보를 보여주는 역할을 한다. 새로운 정보를 보여주거나, 주요 콘텐츠에 대한 콘텐츠를 보여준다. 퍼시스턴트 바텀 시트는 하단에 위치하고 있다가 필요에 따라 화면에서 선택한 지역의 세부 정보를 보여준다. 현재 메인 페이지에서 다른 정보를 살펴보고 있다 하더라도 퍼시스턴트 바텀 시트는 플레이 되고 있는 음악에 대한 정보를 표시하고 있다.

- 모달 바텀 시트 : 모달 바텀 시트는 '메뉴', '심플 다이얼로그' UI의 대안으로 종종 쓰여진다. 다른 앱과 연계 기능이나 콘텐츠를 보여주는 역할을 한다. 다른 뷰 위에 배치 되므로 모달 뷰의 역할을 하며, 뒤 화면을 활성화 시키기 위해서는 모달 바텀 시트를 닫은 후에 사용할 수 있다. 모달 바텀 시트는 리스트 혹은 그리드의 형태로 액션 혹은 선택 옵션 항목을 보여준다. 항목을 보여줄 때에는 중요 정보를 잘 구성하여 사용자가 쉽게 이해할 수 있도록 한다.

- 모달 바텀 시트 Do : 모달 바텀 시트의 높이는 콘텐츠의 높이만큼만 올라오면 된다.

모달 바텀 시트 내에서 많은 수의 선택지가 주어지더라도 최상단의 앱 바를 침범하지는 않는다.

- 모달 바텀 시트 Don't : 포함하고 있는 리스트 항목보다 훨씬 높은 위치까지 리스트가 보여지는 것은 

   권장하지 않는다.

   모달 바텀 시트가 최상단의 앱바를 침범하여 올라와 있으므로, 사용자가 모달 바텀 시트의 외부 영역을 터치하여 모달 바텀 시트를 닫기 어렵다.

- 모달 바텀 시트 조작 : 모달 바텀 시트는 모달 바텀 시트 영역을 스와이프 다운하거나, 외부 영역을 터치하게 됨으로써 모달 바텀 시트를 닫을 수 있다.


학습정리

콘텐츠 디자인 - 안드로이드 폰

 - 안드로이드 폰 (카드, 다이얼로그, 그리드 리스트, 디바이더, 리스트, 메뉴, 바텀 시트) : 안드로이드폰의 콘텐츠 디자인 부분에는 다양한 형태의 요소들이 많이 있으므로 충분히 숙지하여 UI/GUI 디자인시 적절히 적용할 수 있도록 한다. 필요할 경우 ,공식 머티리얼 디자인 웹사이트를 방문하여 추가 정보를 확인하도록 한다.


9강 컬러 (1)


1. 컬러의 기본 이론

- 기본 개념 학습

컬러의 기본 개념

- 정의 : 컬러는 단순하게 색으로 존재하는 것이 아니라 이미지 감정 등의 다양한 요소를 포함하고 있는 요소이다. 그리고 UI에 사용되는 컬러는 일반 생활에서 컬러를 접하는 것보다 사용성이란 측면에서 구체적인 역할을 하게 되는 경우도 있다.

' 색이란 우리가 무엇인가를 처음 대면했을 때 가장 먼저 인지하는 요소일 것이다. 문화적 / 관습적 인식 때문에 특정 색을 접했을 때 자연스레 어떠한 이미지나 감정을 떠올리게 마련이며, 이에 따라 그 사물이나 디자인에 반응하게 된다. 색은 의미를 지니며 이에 대한 우리의 반응은 문화적 환경, 트렌드, 연령, 개인적 기호 등 다양한 요소에 영향을 받는다. ' - '컬러' 앱브로즈-해리스 지음

가산 혼합, 감산 혼합

- 빛의 색, RGB : 빛의 색을 표현하는 3원색인 RGB는 가산 혼합 방식의 컬러이다. 빛의 속성이기에 겹쳐짐에 따라 밝아지는 방식으로 주로 디지털 미디어인 모니터, 스마트폰 등의 스크린에 적용되는 컬러 방식이다.

- 물체의 색, CMYK : 구체적으로는 인쇄 컬러라고도 불리우는 CMYK는 감산 혼합 방식의 컬러이다. 물감을 덧칠하면 색이 어두워지는 것으로 연결지어 생각하면 된다 .주로 현실의 인쇄물, 페인팅 등이 적용될 때의 컬러이다.

색의 표시

- 색의 3속성 : 하나의 컬러는 색의 3속성을 통해 표현될 수 있다. RGB는 가산 혼합 방식에서의 구성 단위로써는 설명하기 좋으나, 실제 사람의 언어로 컬러를 이해하고 표현하기는 어렵다. 이에 색의 3속성인, 색 (hue/color) / 채도(saturation) / 명도 (brightness) 를 사용해서 컬러를 표현한다.

- 색 hue / color : 색이란 각 색의 고유한 특성을 의미하는 것이며, 시각적으로 구분할 수 있다.

- 채도 saturation : 채도는 색의 선명한 정도를 의미한다. 가장 높은 채도의 색은 선명하게 밝은 빛을 내며, 채도가 낮을 수록 가라 앉는 느낌을 준다.

- 명도 brightness : 명도란 색의 밝고 어두운 정도를 의미한다. 어두워질 수록 검정에 가까워지고 밝을 수록 색의 원색에 가까워진다. 명도와 채도는 별개의 개념이므로 혼동하지 않도록 한다.

- 색상환 the color whell : 배색을 색의 관계를 통해 진행하기 위해서 일반적으로 색상환을 사용한다. 색상환이란 색체 스펙트럼을 둥글게 나열한 형태이며, 색채 이론에서 중요한 역할을 한다. 색상환을 통해 색의 경향(난색/한색 구분)을 파악하거나 관계에 따른 배색 원리를 적용할 수 있다.

- 색상환과 색의 3속성 활용 색상황에 이전에 학습한 3속성을 대입하여 명도와 채도를 포함한 형태의 색상환을 통해 실제 컬러를 선택하고 적용한다.

색 상환을 활용한 배색

- 단색 Monochrome : 색 상환 중 한 가지 색을 의미한다.

- 단색 계열 Monochromatic : 단색 선정 후 명도를 달리하여 사용하는 배색을 의미한다.

- 유사색 Analogous : 선정한 하나의 주색과 그 옆에 바로 인접한 두 색을 의미한다. 유사색을 사용한 디자인은 자연스럽고 조화로운 느낌을 준다.

- 보색 Complementary : 마주보는 위치의 색을 의미하는 보색은, 강렬한 대비 효과로 활기있는 배색이 가능하다.

- 분리 보색 Split Complements : 마주보는 보색 중 한 쪽의 보색에 인접한 두 가지 색을 포함하여, 세 컬러의 배색을 의미한다.

- 삼색 프라이어드 Triad : 색상환에서 같은 간격으로 놓인 세 색의 조합으로, 세 가지 색 모두가 대비되므로 긴장감이 느껴진다.

- 색의 범위 / 색역 gamut

색역의 이해

- 정의 : 색역이란 색 체계와 디바이스에 따라 실제 재현할 수 있는 색의 범위를 의미한다. 따라서, 색역에 대한 개념 없이 컬러 작업을 하게 되면 의도치 않게 다른 컬러가 보여지기도 한다.

 ' 색역이란 특정 색 체계, 장비나 공정에서 재현할 수 있는 색의 범위를 가리킨다. 모니터, 스캐너, 그래픽 프로그램, 인쇄소의 출력기 등은 각각 재현할 수 있는 색의 범위, 즉 색 공간이 다르다. 색 공간이란 디자이너가 활용할 수 있는 색의 범위인 셈이다. 이 때문에 색재현 범위의 가장자리에 있는 색을 써서 작업한 후 다른 기기로 옮겨 재현하면 원본 디자인의 색과 다르게 나올 수도 있다.

'컬러' 앰브로즈-해리스 지음

- 색역의 비교 : RGB 색역과 CMYK를 비교해보면, 겹쳐지는 부분도 있지만 겹치지 않는 부분도 존재한다.따라서, 컬러모드가 달라질 경우 다른 컬러모드에서 표현하지 못하는 색일 있을 수 있다.

- 디바이스와 색역의 비교 : 색역도 별도로 존재하지만, 이러한 색역 또한 어떠한 디바이스냐에 따라서 표현 / 채집할 수 있는 색의 범위가 다르다는 점도 숙지해야 한다.


2. 컬러의 의미와 역할

- 컬러의 의미와 역할의 이해

제품 / 서비스 / 모바일 앱에서 컬러는 실제적으로 굉장히 중요한 역할을 하고 있으며, 단순한 취향을 넘어서 컬러의 의미도 포함하고 있다. 그럼에도 불구하고, 실제 프로젝트 진행시 임의로 선정하는 경우가 잦다. 또한, 컬러는 감정적인 부분도 포함하고 있으며 브랜드 아이덴티티를 나타내는데 중요한 역할을 한다. 더불어 모바일 앱에서는 컬러가 UI에도 적극적으로 사용되므로, UI유저 인터페이스에서의 컬러의 의미를 이해해야 한다.

- 컬러에 따른 감정

컬러별 의미

- 정의 : 컬러는 감정적인 의미로 해석할 수가 있다. 붉은 색은 열정, 사랑, 분노, 위험, 공격 등의 의미를 지닐 수 있다. 파란색은 지식, 차가움, 안정, 평온함 등의 의미를 지닐 수 있다. 이처럼 컬러는 긍정 / 부정의 의미를 동시에 지니며, 한 가지 색뿐만 아니라 여러 색을 조합해서 다양한 의미를 만들어 내기도 한다.

- 국가 / 문화별 컬러의 의미 차이 : 컬러는 또한 나라별로 그 의미를 다르게 가지기도 하며, 특정 컬러는 공통된 의미를 가지고 있기도 한다. 의미가 없거나, 사람들이 각기 다른 의미를 부여하는 경우도 있다. 이 경우는 해당 컬러가 보편적으로 받아들여지지 않는다고 해석하면 된다.

- 대상, 주제에 적합한 컬러 : 누군가를 대상으로 하느냐, 무엇을 주제로 하느냐에 따라 어울리는 컬러인지 아닌지에 대한 일반적인 의견도 존재한다. 변호사를 대상으로 한 앱인데, 핑크색이라면? 어린아이를 대상으로 한 앱인데, 검정색이라면? 희망 / 행복을 주제로 하는데, 회색이라면? 평온함을 주제로 하는데, 붉은색이라면?

브랜드와 컬러

- 기존 브랜드가 선점한 컬러 : 기존 브랜드가 컬러와 의미를 선점하고 있는 경우도 있으므로, 해당 분야에 진출하고자 할 때 주의해서 컬러를 정해야 한다.

- 컬러와 인지 심리 : 컬러를 통해서 감정, 의미를 가지느냐가 중요한 의미를 지니므로 컬러에 대한 심리학 학문도 존재하며, 제품/서비스/앱을 통해서 전달하고자 하는 가치와 브랜드, 그리고 컬러는 일관성이 있어야 한다. 삼성 전자의 블루 컬러를 통해서는 '신뢰'를, LG 전자의 레드 컬러를 통해서는 '열정, 도전'을 SK의 레드, 오랜지 컬러를 통해서는 열정, 도전 그리고'새로움, 이노베이션'을 떠올린다. 따라서 이와 같은 요소를 모바일 앱을 통해 전달하고자 한다면, 컬러에 따른 감정 요소를 구체적으로 이해하고 컬러 선정에 활용할 수 있어야 한다.

UI와 컬러

- 긍정 / 부정의 의미 : 브랜드 아이덴티티를 대표하는 컬러도 있지만, 브랜드 컬러와 별개의 역할로 UI에도 쓰여지며, 구체적으로는 GUI 작업 단계에서 명확히 표현된다. 가장 대표적으로는 YES / NO를 의미하는 초록색과 붉은색이 있으며, 사용자가 버튼 UI를 통해 행동을 선택해야 할 경우에 쓰인다. 사용자가 컬러의 사용 의미를 알고 있다면, 화면에서 정보를 파악하는데 시간을 적게 사용하고도 안심하고 쉽게 행동을 취하게 할 수 있다. 

- 위계 표시 : 모바일 앱의 화면에 텍스트가 표현될 때, 폰트의 굵기와 사이즈로도 중요 정보를 표현할 수 있으나, 컬러도 위계를 나타내는 데 큰 역할을 한다. 컬러의 배색을 통해 무엇이 중요하고 중요하지 않은지를 쉽게 파악할 수 있다. 실제로 사용자는 컬러를 통해 중요도를 파악하고 있다고 인지하지 못하지만, 이를 통해 자연스럽게 사용자의 행동을 유도할 수 있으며, 배색이 엉망일 경우에는 사용자가 불편하다고 여기거나 정보가 (부정적 의미에서) 많다고 여기게 되고 결과적으로 안 쓰게 된다. 중요한 것과 중요하지 않은 것을 디자이너가 의도적으로 이끄는 것은 위계를 디자인하는 것이다.

- 창의력 UI 컬러 적용 : 일반적으로 구매 버튼은 붉은 색이나, 경우에 따라 다른 컬러를 적용해서 그 의미를 전달할 수 있다.


3. 포토샵과 컬러

- 포토샵 Adobe Color CC와 배색

어도비 컬러 CC

- 소개 : 어도비에서는 컬러 배색을 손쉽게 할 수 있도록 도와주는, '어도비 컬러 CC'를 제공하고 있다. 어도비 컬러 CC는 대표 명칭이며, 총 3가지 경로를 통해 배색을 진행할 수 있다.

- Adoble ID를 통한 Creative Cloud 서비스 : 어도비 ID로 로그인해서 작업할 경우 각 서비스 간 작업 결과 공유 및 저장이 가능하다.

어도비 컬러 웹사이트

- 소개 : 이전에는 kuler 라는 명칭으로 제공되던 서비스가 이제는 color.adobe.com 웹 사이트를 통해서 제공하고 있다.

- 주요 기능 : 중앙 색상환을 통해서 배색 구성이 가능하며, 마우스로 해당 지점을 드래그하면 직관적으로 조절이 가능하다. 이러한 결과는 아래에서 바로 결과를 확인할 수 있다. 하단 컬러 부분을 선택한 후, 화살표 아이콘을 누를 경우 작업하고자 하는 컬러모드를 변경할 수 있다. (지원 컬러 모드 : CMYK, RGB, LAB, HSB, HEX)

-  색상 규칙 적용 : 화면 좌측의 '색상 규칙 Color Rules'기능을 통해 앞에서 학습한 배색 규칙을 적용하여 색 구성이 가능하다.

a. 유사

b. 단색

c. 삼각형

d. 보색

e. 혼합

- 이미지에 컬러 추출 : 기본 모드인 '만들기'에 있을 때, 우측 상단의 카메라 아이콘을 통해 이미지를 임포트 할 수 있다. 이를 통해 외부에서 가지고 온 이미지 화일에 대해 컬러 배색을 적용할 수 있으며, 컬러 추출도 가능하다. 이미지에서 자동으로 컬러를 분위기에 따라서 자동 추출해주는 기능이 있지만, 일반적으로 앱의 GUI에 대한 컬러 배색을 위해서는 '사용자 정의'로 필요 부분만을 추출하는 게 일반적이다. 컬러를 추출한 후, 좌측 위의 저장 버튼을 통해 (어도비 ID계정으로) 저장할 수 있다.

- 탐색 메뉴 : 탐색 메뉴에서는 다른 사람들이 저장해서 공개한 컬러 스와치를 볼 수 있다. 이를 통해 필요한 컬러를 별도의 작업 없이도 다른 사람들의 스와치를 사용할 수 있다. 서치 기능을 통해 이전에 공개로 저장한 스와치를 찾을 수도 있다.

- 내 테마 메뉴 : 내 테마 메뉴에는 이전에 저장한 나의 컬러 스와치들을 전부 확인할 수 있다.

모바일 앱 'Adobe Capture CC'

- 소개 : 웹 사이트 외에도 모바일 앱으로도 어도비 컬러 기능을 사용할 수 있다. 아이폰 앱과 안드로이드폰 앱으로 제공되고 있다.(무료)

- 4개의 앱을 하나로 통합 : 어도비의 다양한 모바일 앱들을 2015년 Adobe CC 업데이트시 'Adobe Capture CC'앱에 모아서 1개의 앱으로 만들어 출시 하였다. 총 4가지인 Color, Shape, Brush, Look 기능이 제공된다.

- Color 메뉴 : 여러 기능 중에서도 본 과정에서 살펴볼 기능은, 'Color'이다. 앱 실행 후 나오는 메뉴 중에서 Color를 선택하면 된다.

- 이미지 캡처 및 컬러 배색 : 모바일 앱이라 당연히 UI는 다르지만, 제공하는 기능을 동일하다. 다만 카메라 기능을 통해 원하는 이미지를 촬영한 후 컬러 캡처가 가능하며, 폰에서 캡처 이미지를 불러와서 바로 컬러 스와치 추출이 가능하다.

- 불러온이미지에 대한 색상 무드 적용 : 불러온 이미지 또한, 상단의 색상 무드 아이콘(스마일)을 눌러서 원하는무드를 적용할 수 있다. 라이브러리에 저장된 컬러 스와치를 선택한 후, 편집 기능을 통해 색상 편집'을 진행할 수 있다.

포토샵과 Adobe Color Themes 

- 소개 : 포토샵에서도 지금까지 소개한 컬러 CC의 기능을 사용할 수 있다. 포토샵 CC의 상위 메뉴 '창 Window'에서 'Extensions > Adobe Color Themes'를 선택하면 도구 창으로 열 수 있다. 

-  포토샵 내에서 Adobe Color Themes : 포토샵에서 해당 도구를 통해, 웹과 모바일 앱에서 제공한 모든 기능이 동일하게 사용할 수 있다. 상단 메뉴 : 만들기 Create / 탐색 Explore / 내 테마 My Themes

- 포토샵 내에서 Adobe Color Themes : 내 테마 메뉴에서는 이전에 Adobe ID를 사용하여 저장한 '페이스북 ~' 컬러 스와치를 볼 수 있으며, 이를 테마 옆의 아이콘을 눌러서 '스와치로 저장'을 선택하면, 포토샵의 스와치로 바로 옮길 수 있어 유용하다.


학습정리

컬러의 기본 이론

 - 컬러의 기본 개념 : 가산 혼합, 감산 혼합, 색의 3속성인 색, 명도, 채도에 대해 학습하였다. 이 중에서 색의 3속성에 대한 개념을 명확히 한다면, 실제 배색에도 큰 도움이 된다.

 - 색상환과 배색 이론 : 색상환의 구성 이론과 함께, 배색 이론을 학습하였다. 이를 통해 색의 관계를 시각적으로 확인하며 배색을 진행할 수 있는 방법을 배울 수 있다.

 - 색역의 이해 : 가산 혼합이냐 감산 혼합이냐에 따라서도 표현할 수 있는 색의 범위가 달라지지만, 어떤 디바이스냐에 따라서도 표현 / 채집할 수 있는 범위가 달라지는 점을 기억해야 한다.

컬러의 의미와 역할

 - 컬러에 따른 감정 : 컬러는 단순히 취향 이상의 의미를 지니고 있다. 컬러에 따른 감정의 의미 브랜드 아이덴티티의 의미와 역할은 물론, UI에서도 컬러는 그 고유의 중요한 역할을 하고 있으므로 이러한 컬러의 구체적인 의미와 각 역할에 대해서 충분히 의식하고 컬러를 배색하고 사용할 수 있어야 한다.

포토샵과 컬러

 - 포토샵 Adobe Color CC와 배색 : 어도비에서는 웹 사이트, 모바일 앱, 포토샵 익스텐션을 통해 컬러 배색을 손쉽게 할 수 있는 (통칭) Adobe Color CC를 제공해주고 있다. 각 프로그램마다 장단점이 있으므로 필요에 따라 적절히 사용하여 컬러 배색 작업을 진행하도록 한다.


10강 컬러 (2)


1. 아이폰과 컬러

- 아이폰의 컬러 정의

커뮤니케이션을 위한 컬러

- 개념 : 아이폰에서 컬러는 단순하게 색을 표현하는 것이 아니라, 컬러를 통해 인터랙션 정보와 시각적 일관성에 대한 정보를 얻을 수 있다.

- 참조 사항 : 

인터랙션을 지정한 컬러를 비 인터랙션 내용에 적용하지 않는다. 

iOS7부터 메인 컬러가 지정된 요소들은 인터랙션을 적용한다. 그렇지만 동일 컬러를 인터랙션이 되지 않는 요소들에 적용할 경우에는 사용자들이 혼란을 겪게 된다. 마치 버튼이 눌리지 않는 것과 같은 혼란을 줄 수 있다.

사용 상황의 컬러 대비를 항상 체크한다.

테스트 걸러와 배경 컬러의 대비가 명확하게 나오지 않을 경우, 구분이 되기 어려울 수 있다. 또한 밝은 대낮의 야외에서 사용하는 경우, 늦은 밤 어두운 곳에서 사용하는 경우가 있을 수도 있으므로 앱에 대한 컬러를 항상 주의한다.

메인 컬러의 적용

- 메인 컬러와 UI의 단순화 : 서비스의 메인 컬러는 일반적으로 1개를 선택하여, 전체 UI에 일관적으로 적용한다.

- 희색 배경 컬러 : 배경은 희색 사용을 추천하며, 흰 바탕의 검은 글자와 같이 전통적 개념의 색 배열을 통해 좀 더 쉽게 콘텐츠에 주목할 수 있도록 배색하는 것을 권장한다.

- 새로워진 컬러 팔레트 : iOS7 업데이트 후부터 새로운 컬러 팔레트를 적용하고 있다. 직접적으로 브랜드 컬러를 적용하지 않더라도, 운영체제에서 일반적 쓰이는 컬러와 얼마나 차이가 나는지는 알 수 있어야 한다.

- 빌트인 앱 (혹은 디폴트 앱) 과 비교 : 아이폰에 기본 설치된 빈트인 앱들과 비교해보아 컬러의 쓰임과 적용을 좀 더 이해할 수 있도록 한다.


2. 안드로이드와 컬러

- 구글 머티리얼 디자인과 컬러

구글 머티리얼 디자인 컬러

- 개념 : 구글의 디자인 테마인 머티리얼 디자인 테마를 안드로이드에도 채용함에 따라, 컬러 또한 머티리얼 디자인의 컬러를 당연히 적용하게 되었다.

- 컬러의 중요성 : 디지털 페이퍼, 컬러 위계, 모션 & 인터랙션을 머티리얼 디자인의 3대 특성으로 대표하며, 컬러도 중요 3요소 중 하나이다.

- 컬러 위계 : 프린트 디자인의 개념을 적극 수용하여 컬러, 이미지, 레이아웃 등의 개념을 모바일에 구현함으로써 특징적인 디자인을 구현하는 개념

- 컬러의 정의 : 머티리얼 디자인에서의 컬러는, 대담한 컬러 배색과 하이라이트 컬러의 사용, 그림자가 표현되는 다양한 상황을 주로 표현한다. 현대 건축, 도로 표지판, 마킹 테입 등에서 아이디어를 얻었으며, 컬러는 새롭고 자극적인 배색을 추천한다.

머티리얼 디자인 컬러 팔레트

- 다양한 컬러의 팔레트 : 머티리얼 디자인 컬러를 선택할 수 있돌고 컬러 팔레트를 제공해주고 있으며, 공식 사이트의 컬러 섹션을 통해서는 포토샵 스와치 컬러 팔레트 화일도 받을 수 있다.

https://www.google.com/design/spec/style/color.html

- 머티리얼 컬러 계획 : 자신의 프로젝트에 적합한 컬러를 선택하거나, 만약 선택하지 못했다면 제공되는 컬러 내에서 컬러를 선택하는 것도 추천한다. 컬러는 메인 컬러(500)로 1개 선택 후, 2개의 메인의 서브 컬러 (예에서는 (700), (800)) 선택, 2팔레트에서 1개의 엑센트 컬러를 선택하면 된다.

- 메인 컬러 선택 : 컬러는 메인 컬러(500)로 1개 선택 후, 2개의 메인의 서브 컬러를 팔레트에서 고르면 된다.

- 엑센트 컬러 선택 : 메인 컬러 계열이 아닌, 대비 되는 다른 컬러 중 하단의 'A~' 가 붙어 있는 컬러 중에 하나를 엑센트 컬러로 선택한다.

- 엑센트 컬러의 역할 : 엑센트 컬러는 플로팅 액션 버튼, 슬라이더, 스위치, 인디케이터, 링크 등의 사용자 인터랙션이 필요한 부분 및 관련 부분에 사용된다.

머티리얼 디자인 컬러 Do & Don't

- 텍스트 내의 컬러 남용 자제 : 웹 링크를 나타내는 텍스트 내의 엑센트 컬러와 달리 전체 텍스트에 엑센트 컬러를 넣는 것은 권장하지 않는다.

- 앱 바에 엑센트 컬러 사용 금지 : 미니 플로팅 액션 버튼에 엑센트 컬러가 적용된 좋은 예와 달리, 액션 바에 엑센트 컬러가 들어온 경우는 나쁜 예이다. 플로팅 액션 버튼과 동일 색이 될 경우에는 색 구별이 잘 가지 않으므로 추천하지 않는다.


3. 모바일 컬러 기획

- 마켓 리서치

관련 리서치

- 리스트업 : 디자인 프로젝트가 시작되면, 최소한 경쟁 서비스와 카테고리 등에 대한 정보를 알 수 있다. 이에 해당 서비스들의 리스트를 작성한 후 다운 받아서 주요 화면을 체크한다.

- 컬러 추출 : 컬러는 메인 컬러와 보조 컬러로 크게 이등분 할 수 있다. 주로 앱 아이콘에서 확인할 수 있는 메인 컬러와 앱 내의 UI를 구성하고 있는 컬러이다.

- 어도비 Color CC를 활용한 추출 : 메인 컬러와 보조 컬러를 어도비 Color CC 관계 서비스를 활용해서 추출한다.

- 메인 컬러 리스트 업 : 메인 컬러는 메인 컬러끼리 모아서 분석한다. 주로 어떤 컬러를 쓰는지를 중심으로 컬러를 체크한다. 이를 통해 앱의 메인 컬러 트렌드와 진행 방향을 알 수 있다.

(SNS는 파란색, 카메라는 따뜻하고 밝은, 쇼핑은 붉은색 위주로 쓴다)

- 서브 컬러 리스트 업 : UI를 구성하고 있는 컬러를 리스트 업 한다. 이를 통해 UI를 구성하고 있는 대다수의 컬러를 이해할 수 있다. 크게 구분한다면, UI 컴포넌트들의 컬러와 폰트로 나눌 수 있다.

- UI 컴포넌트의 컬러 : UI 컴포넌트의 컬러를 통해서는, 실제 UI를 구성할 때 필요한 컬러의 범위를 이해할 수 있다.

- 타이포그래피와 컬러 : 타이포그래피, 즉 폰트의 컬러 쓰임에 대한 추출을 통해서 폰트의 위계, 사용 방식에 대해 이해할 수 있다.

분석과 적용

- 리서치 분석 : 메인 컬러, 서브 컬러를 모아서 비교 분석을 통해 앱 컬러의 방향을 정한다. 필요에 따라서는 화면에 보이는 것처럼, 포지셔닝 맵을 활용하여 컬러를 선정할 수도 있다.

- 컬러의 적용 : 실제 컬러를 적용해보는 단계. 대략적인 컬러의 방향을 잡았다 하더라도 화면을 구성하면서 보게 되면 컬러를 수정하게 될 필요가 있으므로, 선정 후에도 수정의 경우가 있다는 점은 사전에 이해하고 작업을 진행한다.

- 컬러의 수정 : 서브 컬러는 대부분 UI에 적용되는 예이므로, 사전에 기획하고 디자인하게 되면 거의 수정할 경우가 없다. 하지만 메인 컬러는 앱의 전체적인 인상은 물론, 브랜딩의 개념을 포함하고 있으므로 수정하게 될 수 있다.


학습정리

아이폰과 커러

 - 아이폰의 컬러 정의 : 아이폰은 메인 컬러를 브랜딩의 요소 외에도 전반적으로 사용하고 있다. 또한 컬러를 적용함으로써, 이를 통해 UI를 네비게이션 용도로 사용하게 되어 결과적으로는 UI 형태를 단순화 하였다고 할 수 있다. 따라서, 메인 컬러를 일관되게 사용하는 것이 중요한 점이다.

구글 머티리얼 디자인 안드로이드 앱과 컬러

 - 구글 머티리얼 디자인과 컬러 : 구글 머티리얼 디자인의 컬러는 중요 3대 요소 중 하나이다. 또한, 컬러는 서비스의 전반적인 인상을 좌우하는 큰 역할을 하므로, 신중하게 선택해야 한다. 구글 머티리얼 디자인에서는 고유의 컬러 팔레트를 구성하며, 자체 컬러가 지정되지 않았을 경우 머티리얼 디자인 컬러를 사용하는 것을 권장한다. 컬러는 크게 메인 컬러와 엑센트 컬러의 2가지로 구분지어 볼 수 있으며, 컬러 선정 후 실제 적용 사례 등을 참조하며 적절히 사용하도록 한다.

모바일 컬러 기획

 - 마켓 리서치 : 모바일 디자인을 위해 경쟁 및 관계 서비스들의 컬러를 분석해볼 필요가 있다. 이를 통해 구체적인 사용 사례, 범위 등을 파악할 수 있으며, 이를 근거로 자신의 프로젝트에 적합한 컬러 배색을 할 수 있다. 범위는 메인 컬러와 UI 관련 컬러로 크게 나누어 볼 수 있다.


11강 타이포그래피


1. 모바일과 타이포그래피

- 타이포그래피의 이해

타이포그래피의 정의 ( Typography : 문자를 통한 커뮤니케이션 )

- 단순하게 폰트를 디자이너 마음대로 배열하는 것이 아니라, 구체적 대상, 매체(모바일), 콘텐츠 종류와 양, 비즈니스의 목표와 의도를 고려해서 폰트를 사용해야 한다.

- 고려사항 : 대상, 모바일(매체), 콘텐츠, 비즈니스 목표 & 의도

대상과 타이포그래피

- 유아와 성인은 지적 수준에서 큰 차이를 보인다. 각 대상의 특성에 맞추어 폰트를 적절히 사용해야 한다.

- 유아를 대상으로 할 경우, 글자를 안 씀

- 클래시 오브 클랜은 게임과 어울리는 폰트 사용

매체와 타이포그래피

- 모바일과 잡지, 포스터, 데스크톱 컴퓨터는 각기 다른 방식으로 보여지고 쓰여지고 사용된다. 매체, 여기에서는 모바일을 기준으로 하므로, 디지털 스크린, 작은 스크린 / 손가락 사용에 최적화 되어야 한다. 더불어 모바일 운영체제에 따라 폰트의 쓰임에 대한 가이드가 있으므로 이를 따라야 한다.

콘텐츠와 타이포그래피

- 텍스트, 사진, 동영상, 음악 등, 다루는 콘텐츠에 따라 폰트의 쓰임이 달라진다.

- 운영체제의 타이포그래피

운영체제 디폴트 폰트의 이해

- 앱 디자인시 폰트는 주로 디바이스 탑재 폰트를 주로 사용한다. 그리고 모바일 운영체제별로 탑재하고 있는 폰트들이 다르다. 따라서 이러한 차이가 폰트 사용 및 타이포그래피에 차이를 만든다.

- iOS 디폴트 영문 폰트 San Francisco

- 머티리얼 디자인 영문 폰트 Roboto

개발 툴과 모바일 앱 탑재 폰트

- 개발 툴과 모바일 앱 탑재 폰트를 맞추어야 한다.

- 개발 툴, 포토샵, 디바이스 탑재 폰트가 서로 맞는지 체크해야 한다.

- 빌트인 앱과 표준 타이포그래피의 이해

빌트인 앱 = 운영체제별 표준 타이포그래피의 표본

- 운영체제별로 기본적으로 탑재된 앱을 빌트인 앱 (혹은 디폴트 앱)이라 부른다. 해당 앱을 디자인 분석하고 타이포그래피의 사용을 이해한다면, 표준을 이해하는 것과 같다.


2. 아이폰과 타이포그래피

- 아이폰과 타이포그래피

아이폰 타이포그래피 활용 팁

- 폰트 훼밀리 사용 : 일반적으로는 앱 내에서 한 폰트 웨밀리 만을 사용한다. 여러 개의 폰트들을 사용하는 것은 추천하지 않는다.

- UI의 역할을 하는 타이포그래피 : 텍스트에 컬러가 적용되거나, 아이콘, 보더 등과 함께 사용되면 ui 버튼의 역할을 하게 된다. 아이폰 사용자들이 이를 식별 가능하고 조작 가능한 방식으로 디자인해야 한다.

- 효과적 컬러 사용을 통한 명확한 UI 역할 : 조작을 위한 텍스트의 컬러 적용시, 일반 텍스트와 명확히 구분되게 적용하는 것을 권장한다.

컬러 사용시 '위계'를 명심하라

- 텍스트에는 반드시 컬러의 위계를 적용하라 : 화면에서 텍스트의 중요 정도를 빠르게 파악할 수 있도록 하되, 사이즈는 물론 컬러로도 그러한 의도를 전달할 수 있어야 한다.

San Francisco, Apple SD Gothic Neo

- iOS 9 이후의 영문 시스템 폰트 San Francisco : 운영체제별로 기본적으로 탑재된 앱을 빌트인 앱(혹은 디폴트 앱)이라 부른다. 해당 앱을 디자인 분석하고 타이포그래피의 사용을 이해한다면, 표준을 이해하는 것과 같다.

https://developer.apple.com/fonts/

- iOS의 한글 시스템 폰트, 애플 산돌 고딕 네오 : 운영체제별로 기본적으로 탑재된 앱을 빌트인 앱 (혹은 디폴트 앱)이라 부른다. 해당 앱을 디자인 분석하고 타이포그래피의 사용을 이해한다면, 표준을 이해하는 것과 같다.

http://www.sandollcloud.com/portfolio...page/gothic-neo1/


3. 안드로이드와 타이포그래피

- 머티리얼 디자인과 타이포그래피

안드로이드 타이포그래피 활용 팁

- 영문 폰트와 한글 폰트의 확립 : 머티리얼 디자인이 적용되면서, 영문은 신 버전의 Roboto 폰트가 선정되었고 한글은 Noto Sans CJK KR 폰트가 개발되어 적용되었다.

- 폰트의 구분

English, English-like Scripts

Dense Scripts (Chines Japan Korean)

Tall Scripts (아랍쪽)                        이렇게 3종으로 폰트를 구분한다.

- 폰트 사이즈 표준화

English, English-like Scripts 사이즈 표준화를 정교하게 진행하였으며

Dense Scripts / Tall Scripts 에 대한 사이즈 또한 명확하게 구성하였다.

- Roboto, Noto Sans CJK KR

영문 표준 시스템 폰트

- 새로워진 Roboto 폰트가 제공되며, 머티리얼 디자인에서의 표준 폰트로 사용된다.

주목받고 있는 'Noto Sans CJK KR' 폰트

- 머티리얼 디자인의 한글 표준 시스템 폰트인 Noto Sans CJK KR 폰트는 총 7개의 폰트로 구성되어 있다.

- http://www.google.com/get/noto/

Noto Sans 폰트를 통해 해외 로컬라이제이션이 편리해졌다.

- 중국과 일본 등을 대상으로 한 폰트도 굉장히 많아 졌으며, 폰트별로 한글과도 동일한 7종의 폰트로 훼밀리를 구성해놓아 현지화시 폰트 차이로 인한 디자인 어려움을 많이 없애준다.


4. 모바일 환경에서의 타이포그래피 기획

- 디자인 가이드 참조

운영체제의 공식 개발자 사이트 내의 관계 페이지 참조한다.

- 폰트는 사례에서 정보를 얻는 것도 중요하지만, 정해진 치수가 있을 수 있으므로 정확한 정보는 각 운영체제의 개발자 사이트에서 관련 섹션의 정보를 얻는다. 또한 비정기적으로 업데이트가 되므로, 필요시 관련 내용을 의무적으로 학습해야 한다. 게임이 아닌 경우, 표준 폰트에서부터 시작하는 것을 권장한다.

가이드보다는 앱이 먼저다.

- 애플의 아이폰은 가이드 문서와 앱에 대한 설명이 유사하게 진행되는 편이나, 구글 안드로이드는 머티리얼 디자인 가이드보다 먼저 선행되어 앱 디자인이 업데이트 되는 경향이 있으므로, 최신 앱의 정보를 얻는 방식도 적절히 맞추어 진행한다.

- 템플릿의 활용

공식 리소스 및 외부 리소스를 적극 활용한다.

- GUI 디자이너들은 포토샵 psd 화일을 통해서 직접적인 정보를 얻기도 한다. 공식 리소스 혹은 비공식 리소스에서 포토샵 화일을 획득하고, 관련 정보는 직접 포토샵 psd 화일에서 얻는다. 사전에 미리 셋팅된 리소스를 활용하면 손쉽게 GUI 디자인이 가능하다.

머티리얼 디자인 리소스 페이지

- 구글 머티리얼 디자인 페이지에는 Resources 섹션이 있는데, 이 곳에서 레이아웃 템플릿, 폰트, 컬러 스와치 등 다양한 공식 리소스를 제공하고 있으므로 반드시 체크한다.

https://www.google.com/design/spec/resources/color-palettes.html

- 타이포그래피 적용

대상, 모바일, 콘텐츠, 비즈니스 목적/의도를 명확히 한다.

- 타이포그래피를 적용할 때는 언제나 프로젝트의 관련 요소들ㅇ르 참조하여 구체화하도록 한다.

일관성의 적용

- 폰트의 사용 또한 일관성 있게 적용되어야 한다. 전체에 일관성 있게 적용하도록 해야한다. 사이즈, 컬러, 두께, 위치 등과 관련하여 규정을 정하게 되면 반드시 따라야 한다. 앱에서는 이제 텍스트가 UI의 역할도 하게 됨에 따라 이러한 점을 따르는 것이 굉장히 중요하다.


학습정리

모바일과 타이포그래피

 - 타이포그래피의 이해 : 타이포그래피란 말은, 대상, 매체, 콘텐츠, 목표와 의도를 반영하여 문자를 활용한 디자인을 의미한다.

 - 운영체제의 타이포그래피 : 모바일 운영체제별로 전용 시스템 폰트가 있으며, 기획시 적극 적용하는 것을 권장한다. 개발툴 포토샵, 기획 단계에서도 해당 폰트를 사용하여 앱을 디자인하도록 한다.

 - 빌트인 앱과 표준 타이포그래피의 이해 : 빌트인 앱은 운영체제 별로 기본적으로 제공되느 앱이며, 운영체제의 표준 디자인 가이드라인을 잘 따르고 있으므로, 이를 통해 앱의 사용 방식을 충분히 이해하고 자신의 프로젝트에도 참조하여 적용하는 것을 권장한다.

아이폰과 타이포그래피

 - 아이폰과 타이포그래피 : 아이폰에서는 앱 디자인시 1개의 폰트 훼밀리를 중심으로 타이포그래피를 디자인하며, 텍스트는 UI의 역할도 겸하고 있는 경우가 있으므로 주의하여 사용한다. 또한 컬러를 적절히 사용하여 UI에 적용되는 텍스트와 일반 텍스트를 구분한다.

 - San Francisco, Apple SD Gothic Neo : 아이폰의 디폴트 영문 시스템 폰트는 샌프란시스코이며, 한글은 애플 산돌 고딕 네오 폰트를 사용한다.

안드로이드와 타이포그래피

 - 머티리얼 디자인과 타이포그래피 : 머티리얼 디자인에 타이포그래피 디자인을 위한 디자인 팁에 대해 간략히 알아보았다. 머티리얼 디자인에서부터는 한글 폰트도 확립되었으며, 총 3개의 범주로 폰트의 사용군을 나누고 있다. 추가적인 정보는 공식 사이트에서도 확인해보도록 한다.

 - Roboto, Noto Sans CJK KR : 머티리얼 디자인에서 표준 시스템 영문 폰트는 Roboto, 한글은 Noto Sans CJK KR 폰트를 사용한다.

모바일 환경에서의 타이포그래피 적용

 - 디자인 가이드 참조 : 각 운영체제별 디자인 가이드를 참조하고 실제 앱의 사용 방식과 디자인 분석도 병행한다면, 앱의 타이포그래피 디자인에 대해 충분히 이해할 수 있을 것이다.

 - 템플릿의 활용 : 타이포그래피의 경우, psd 템플릿을 적극 활용한다면 손쉽게 앱의 타이포그래피 디자인을 진행할 수 있다.

 - 타이포그래피 적용 : 앱을 사용하는 사람이 누구이며, 어떠한 카테고리의 앱을 디자인하는지, 주로 다루고 있는 콘텐츠가 무엇인지 등을 고려하여 타이포그래피를 적용한다.


12강 레이아웃


1. 레이아웃과 그리드 시스템의 이해

- 레이아웃의 이해

레이아웃의 의미

- 레이아웃과 매체 : 콘텐츠의 배치 / 배열을 뜻하는 레이아웃은 주로 한 화면의 구성을 의미한다. 과거에는 책, 신문, 광고 등의 인쇄 매체를 중심으로 다양한 디자인들을 볼 수 있었으나, 최근에는 디지털 디바이스의 레이아웃이 주요한 관심사와 매체로 집중되고 있다.

- 레이아웃의 의미 : 레이아웃은 내용을 어디에 어떠한 식으로 보이게 만드는 지에 대한 실무적인 작업이다.

 ' 레이아웃은 각 디자인 요소를 전체 미적 계획에 맞춰 한정된 공간에 적절히 배열하는 것이다. 이를 테면 형태와 공간의 경영이다. 레이아웃의 주된 목적은 독자들이 의식적인 노력을 기울이지 않고도 텍스트와 이미지를 받아들일 수 있도록 전달하는데 있다. 결과물이 인쇄물이건 전자 매체이건 간에 훌륭한 레이아웃은 독자들이 복잡한 정보들 가운데 필요한 부분을 쉽게 찾을 수 있다. ' 

'레이아웃'앱브로즈-해리스 지음

- 레이아웃의 고려 사항 : 앞서 학습한 타이포그래피와 동일하게, 대상, 매체, 콘텐츠, 목표와 의도를 고려해야 한다. 이를 통해 대상의 지적 수준, 매체의 특성, 전달하고자 하는 의도와 목적에 따라 콘텐츠를 배치하게 된다.

- 레이아웃에 있어 콘텐츠의 중요성 : 레이아웃에 절대 법칙이 반드시 존재하는 것은 아니지만, 어느 경우에서건 콘텐츠 즉 내용이 우선시 되어야 한다는 사실은 변함이 없다.

- 레이아웃의 한계 : 레이아웃은 이처럼, 디자이너가 표현하고자 하는 콘텐츠를 매체라는 정해진 공간과 방법 안에 의도를 가지고 배치하는 것을 의미한다. 하지만 콘텐츠가 많아지고, 페이지가 많아진다면 레이아웃은 이러한 많은 양을 처리하기에 어려움을 겪게 된다. 즉, 일관성 있고 체계적인 디자인을 위한 기준점이 필요하게 되는 것을 의미한다. 따라서, 이러한 상황에 대해서는, 작업에 있어 질서를 부여하는 그리드가 좋은 선택이 될 수 있다.

- 그리스 시스템의 이해

그리드 시스템의 의미

- 그리드의 정의 : 보이지 않는 가이드라인이라고 설명할 수 있는 그리드는 디자인 작업에 있어 일관성과 질서라는 개념을 더해줄 수 있다.

' 그리드란 주어진 공간에 디자인 요소들을 가장 적절하게 배치하기 위한 도구로써 디자인 결정 과정을 쉽게 해 준다. 그리드는 디자인에 더 체계적으로 접근할 수 있게 하며, 공간 비례나 차수 면에서 구성 요소 배치에 정확도를 높여준다.'                                    '레이아웃'앱브로즈-해리스 지음

- 그리드의 종류 : 그리드는 필요에 따라 단순하게도 복잡하게도 만들 수 있기 때문에 얼마든지 다양한 형태의 그리드가 나올 수 있다. 어떠한 그리드를 적용하건 간에, 디자이너가 디자인 작업을 하는데 있어 일관성과 질서라는 요소를 적용하는 데 있어 도움을 준다면 적합한 그리드라 할 수 있겠다. 크게 나눈다면, 인쇄 매체에 대한 그리드와 디지털 매체에 대한 그리드로 나누어 볼 수 있다.

레이아웃과 그리드 시스템의 이해

- 레이아웃과 그리드 시스템의 이해 : 그리드 시스템은 기준 선이자 가이드라인으로 존재한다. 이러한 그리드를 바탕으로 매체의 페이지 혹은 면에 대한 디자인이 이루어진다. 이러한 구체적 배치 작업을 레이아웃이라 한다. 따라서 그리드 시스템은 구체적인 디자인 이전에 공간에 대한 계획 / 기획과 같다고 할 수 있으며, 레이아웃 작업은 구체적인 배치 작업이라 할 수 있다.


2. 앱과 터치 제스처에 맞는 레이아웃

- 터치 제스처와 앱

모바일의 조작 방식, 터치 제스처

- 터치 제스처의 이해 : 터치 제스처, 즉 '손가락을 사용해서 특정 동작을 수행함으로써, 모바일 디바이스에서 의도한 결과를 얻어내는 조작 방식'이라 할 수 있다. 이러한 터치 제스처는 모바일 디바이스의 주요 조작 수단이며, 데스크톱에서 키보드와 마우스를 통해 조작하는 것처럼, 모바일 앱을 사용하는 방식이다.

- 터치 제스처와 레이아웃의 이해 : 모바일의 조작 방식이 터치 제스처이므로, 그에 맞는 레이아웃으로 모바일의 화면이 구성되었다. 즉, 손가락 터치에 적합한 크기의 버튼과 스위치, 콘트롤러 등으로 콤포넌트 등이 만들어졌으며, 글자의 사이즈 또한 그에 맞추어 정해지게 되었다.

- 운영체제별 터치 제스처를 위한 사이즈 : 아이폰과 안드로이드폰, 각 운영체제별로 이러한 최소 영역에 대한 값이 규정되어 있다.

아이폰 : 44x44point = 99x99px(Retina)

안드로이드폰 : 48x48 dp = 7~10mm

- 실제 디자인에 있어 터치 최소 사이즈의 적용 : 최대한 터치 영역에 권장 사이즈를 따라야 하겠지만, 디자인시 따르지 못하게 되는 경우에는 주변의 영역에 여유 공간을 둠으로써 이러한 문제를 해결할 수 있다. 또는 타업체의 디자인 사례를 통해 해결 방안을 리서치하는 것도 권장한다.

- 앱의 기본 레이아웃

모바일 앱의 기본 레이아웃 구성

- 최소 구성 그리드 : 모바일 앱은 디지털 매체이므로, 동일 디바이스 내에서 보여지는 레이아웃이 계속적으로 변화한다. 또한 가로/세로 변환도 이루어지는 특징이 있다. 그럼에도 불구하고, 기본적인 모바일 앱의 그리드로써의 단위는 다음과 같다.

권장 터치 영역 사이즈가 기준이며, 가로 컬럼(행)이 시작점이다.

- 아이폰 44pt, 안드로이드 48dp 높이의 컬럼을 기준 시작 단위로 볼 수 있다.

- 높이는 높아질 수 있지만, 줄어들게 될 경우 터치에 제약을 받을 수 있다.

- 화면 구성 그리드 : 양측 운영체제에 모두 적용되는 기본 그리드의 개념을 살펴본다.

최상단 : 위치 정보 / 최고 중요 정보

중앙부분 : 콘텐츠 좌우에 16px의 안전영역인 공간이 있다. 각 콘텐츠의 높이는 48px를 기준으로 잡는다.

최하단 : 도구 / 기능 / 네비게이션

최상단과 중앙부분 사이, 중앙부분과 최하단의 사이에는 공간을 띄워둔다.

- 의도적 화이트 스페이스 : 시각적 정보 그룹핑을 위해 의도적 화이트 스페이스는 중요하다.

- 정렬의 효과적 사용 : 화면의 좌측 정렬 영역을 우선적으로 시각의 흐름으로 정보를 파악하는 곳이므로, 위계를 정확히 제공하여 정보의 중요도에 따라 사용자가 정보를 받아들일 수 있게한다.


3. UI 디자인의 이해

- UI 디자인 프로세스

전체 디자인 프로세스 리뷰

- UX-UI-GUI, 각 업무 프로세스 내 UI 디자인의 위치를 확인한다.

↓프로젝트 구성 : 비즈니스 구성

↓UX 디자인 : 사용자 정의

↓UI 시나리오 문서 : 콘텐츠와 레이아웃, 네비게이션

↓GUI 디자인 : 콘셉트, 디자인 스타일, 컬러, 폰트, 형태

UI 디자인 프로세스의 이해

- 요구 사항, 관련 정보의 수합 : 구체적인 요구 사항, 내부 목표, 관련 담당자 미팅 등을 통해 모바일 서비스의 구체적인 목표를 확인하고, 관련 정보를 수집한다.

- 플로우 차트, 인포메이션 아키텍처 등 구성 : 서비스의 흐름, 정보 구조 구성 등의 작업을 통해 구체적으로 앱 내에 포함될 요소와 흐름을 정의한다.

- 페이퍼 와이어프레임스케치 : 제공, 수합, 필요 정보에 근거하여 모바일 화면을 스케치로 그려본다. 경우에 따라서는 페이퍼 / 디지털 프로토타입을 제작하여 테스트 (프로토타이핑) 한다.

- (가능시) 포토샵으로 디지털 와이어 프레임을 제작한다 : 손 스케치는 정교하지 못하므로, (가능시) 포토샵으로 UI 와이어프레임을 디자인한다. 일반적으로는 이 단계에 UI 시나리오 문서를 작성한다. (PPT)

- GUI 디자인 : GUI 디자인은 UI 시나리오 문서에 근거하여 GUI 디자인을 진행한다. 포토샵을 사용하며 디자인 후에는 각 이미지들을 추출하여 개발자들에게 전달한다.

- UI 시나리오 문서의 이해

시나리오 문서의 의미와 역할

- UI 시나리오 (기획 문서) : 콘텐츠와 레이아웃, 그리고 페이지 간의 네비게이션을 구체적으로 표현한 문서이며 일반적으로는 기획 문서라고 총칭하기도 한다. 이를 기반으로 GUI 디자인이 이루어지므로, 실제 GUI 디자이너는 이 문서를 충분히 이해하고 GUI 디자인으로 해석할 수 있어야 하겠다. 경우에 따라서는 본 문서에 간략하게 정의한 사용자 정의 앱의 목적 등을 넣기도 한다.

- UI 시나리오 (기획 문서) 사례 - 소개 페이지 : 서비스 소개, 비즈니스 목적, 사용자 정의 등은 이렇게 간략하게 표현하기도 한다.

- UI 시나리오 (기획 문서) 사례 - IA : 인포메이션 아키텍처를 첨부한 문서의 모습

- UI 시나리오 (기획 문서) 사례 - 페이지 레이아웃 : 페이지 레이아웃은 아래와 같이 디테일하게 설명을 포함하여 작성한다.

UI 디자인 패턴의 개념

- UI 디자인 패턴의 정의 : 디자인 패턴이라는 용어는, 이전에 누군가가 해결해놓은 사례를 참조하여 내가 진행하는 업무에 활용하여, 내가 가진 문제 / 상황을 해결하는 것을 의미한다. UI 디자인 및 GUI 디자인시 이러한 디자인 패턴의 개념이 있으면 좀 더 적절한 레이아웃을 구현할 수 있다.

- UI 레이아웃의 범주화 및 리서치 : 페이스북 타임라인 외에도 다양한 타임라인 디자인이 존재하는 것처럼, 내가 작업하는 페이지가 어느 패턴에 속하는지를 먼저 파악한 후, 그에 맞는 페이지들을 리서치하여 최종 작업물에 그러한 내용을 반영하는 것을 의미한다.


학습정리

레이아웃과 그리드 시스템의 이해

 - 레이아웃의 이해 : 레이아웃은 실제적으로 콘텐츠를 배치하는 작업이며, 이를 통해 매체를 접하는 사람들은 콘텐츠를 좀 더 편리하고 쉽게 받아들일 수 있다.

 - 그리드 시스템의 이해 : 그리드 시스템을 통해서 레이아웃 작업을 좀 더 일관성 있고 질서 있게 진행할 수 있으며, 디자인을 하는 경우에는 본 레이아웃 작업 이전에 어떠한 그리드 시스템을 적용하여 레이아웃 디자인을 진행할 것인지 고민해보아야 한다.

앱과 터치 제스처에 맞는 레이아웃

 - 터치 제스처와 앱 : 모바일 디바이스는 일반적으로 터치 제스처로 조작이 이루어지며, 모바일 앱의 화면을 통해서 조작이 이루어지기 때문에 실제 UI/GUI 디자인에도 이러한 측면이 반영되어 디자인이 이루어졌다. 따라서 터치 제스처를 위한 운영체제별 사이즈와 최소 크기에 대한 개념을 명확히 이해할 수 있어야 한다.

 - 앱과 터치 제스처에 맞는 레이아웃 : 최소 터치 사이즈부터 시작하여 모바일 앱의 레이아웃을 구성할 수 있으며, 모바일 앱의 기본 그리드와 그 형태, 역할에 대해서 충분히 이해할 수 있어야 한다.

UI 디자인의 이해

 - UI 디자인 프로세스 : 프로젝트 전체 진행 프로세스 중에서 UI 디자인의 순서 및 역할을 명확히 이해해야 한다. 또한 각 업무에서 맡은 업무의 범위와 작업의 내용을 이해한다.

 - UI 시나리오 문서의 이해 : UI 시나리오 문서를 바탕으로 GUI 디자인과 개발이 이루어지므로, 이 문서의 구성과 역할을 정확히 이해하는 것이 필요하다.

 - UI 디자인 패턴의 이해 : 레이아웃 및 GUI 디자인시 필요에 따라 UI 디자인 패턴을 파악하고, 각 부분에 대한 구체적인 표현을 참조한다면, 레이아웃 디자인을 손쉽고 편리하게 작업할 수 있을 것이다.


13강 UI 시나리오 문서의 이해와 GUI 디자인


1. UI 시나리오 문서와 GUI 디자인

- UI 시나이로 문서의 해석

UI 시나리오의 해설

- GUI 디자이너의 입장 : 실제 업무에서 GUI 디자이너가 작업하는 영역은 컬러, 타이포그래피, 이미지, 형태 정의 등과 같이 시각 디자인에 대한 부분이다. 그러나, UI 시나리오는 단순히 콘텐츠가 어떠한 레이아웃에 배치되어 있는지, 어떠한 네비게이션의 구조로 구성되어 있는지를 보여주는 문서이다. 따라서 이러한 문서를 보고 GUI 디자이너가 적절히 해석하고, 필요에 따라서는 적극적으로 UI 디자이너와 의견을 교환하는 것을 권장한다. 이에 본 챕터에서는 UI 시나리오의 해석 및 GUI 디자인의 적용에 대해 알아보도록 하겠다.

- UI 시나리오 사례 : 아래의 사례를 보고 UI 시나리오 문서를 해석하는 몇 가지 내용을 이해한다. 

- 와이어프레임 : 이미지는 네모에 X자로 선을 그은 형태를 의미, 아이콘은 동그라미, 아바타는 동그라미안에 사람 형태를 그린다. 파워포인트로 문서를 작성하는 게 일반적인 방식이다.

- 기획 중심의 레이아웃 및 구성 : 일반적인 경우, 기획 의도가 우선시되므로 폰트의 사이즈가 가독성에 맞지 않게 작거나, 아이콘이 터치 하기에 너무 좁거나 작게 배치되는 경우가 있을 수 있다.

- 시각적 일관성은 GUI 디자이너의 몫 : UI 시나리오에 있는 아이콘의 시각적 통일성과 일관성은 GUI 디자이너가 해결해야 한다. 즉, 아이콘의 두께나 모서리의 반경과 같은 부분 등은 GUI 디자이너가 맡아서 작업한다.

- GUI 디자이너도 UI 시나리오 문서에 참여한다. : UI 시나리오 문서에 대해 GUI 디자이너에게 전달 사항이 발생하거나, 공유할 경우에는 GUI 디자이너도 문서에 의견 등을 기입할 수 있어야 한다.

- GUI 레이아웃 디자인의 적용

GUI 디자인 작업의 이해

- 픽셀 단위 작업 : GUI 디자인의 레이아웃 작업은 UI 시나리오 문서를 픽셀 단위로까지 구체화하는 단계이다. 따라서, 정확한 단위로 결정해야 하며 UI 디자인을 시각적으로 굉장히 세밀하게 구현해야 한다.

- 통합적 vs 세부적 작업 : 이전에 학습한 내용과 같이, 전체의 통합적 관점에서의 굿 디자인과 세부적 관점에서의 굿 디자인이 이루어져야 한다. 즉, 컬러, 타이포그래피, 레이아웃, 이미지, 아이콘 등 여러가지 요소들이 어우러져야 하면서도 부분적으로 정확한 역할을 해야 한다.

- 모바일 운영체제의 가이드라인을 숙지해야 한다. : 모바일 운영체제에 다양한 컴포넌트와 콘텐츠 디자인 가이드가 존재한다. UI 기획 문서를 참조하여 GUI 디자인을 진행하면서도, 필요에 따라서는 UI 디자이너에게 더 나은 컴포넌트에 대한 이야기를 해줄 수도 있다.

- 운영체제별 고유의 이미지 구현 방식에 대해 숙지한다. : 안드로이드의 나인패치 방식으로 이미지를 작업하는 방법, 아이폰의 오토 레이아웃에 대한 디자인 등, 운영체제별로 이미지를 화면에 구현하는 방식이 다르다. 따라서, 운영체제별로 후반 디자인 작업이 어떻게 이루어지는지 사전에 확인하고 GUI 디자인을 진행한다.

- 결정한 GUI 일관성은 모든 페이지에 적용해야 한다. : 컬러의 쓰임, 아이콘의 형태, 레이아웃의 사용 등 GUI의 모든 시각적 작업들은 모두 동일하게 적용되어야 한다. 만약 웹, 데스크톱 프로그램까지도 디자인하게 된다면, 이러한 점들이 다른 운영체제, 다른 매체에도 적용되어야 한다.

- 스마트폰을 모니터로 사용해야 한다. : 데스크톱 모니터에서 보여지는 화면은 실제 모바일 앱과 차이가 확연히 날 수 밖에 없으므로, 기준 디바이스로 정해진 스마트폰을 통해 GUI 디자인 결과물을 확인해보도록 한다.


2. GUI 리서치 및 무드 보드 작성

- GUI 리서치

GUI 리서치의 이해

- GUI 리서치의 필요성 : 앱 디자인을 할 경우 대다수의 GUI 디자이너들은 별다른 리서치 없이, 바로 포토샵을 통해 디자인을 진행한다. 이전에 학습한 UI 시나리오 문서를 한 쪽에 띄워두고 그대로 포토샵에서 작업을 진행한다. 그렇지만 GUI 디자인은 픽셀 단위의 작업으로 여러 가지 시각 디자인의 요소들이 반영된 결과물이다. 그래서, 실제 작업시 고민되는 부분들이 많이 나오면서 작업 중에 고민을 하게 되고, 대부분은 직접 해결하려고 한다. 하지만 시간이 많이 걸리고 결과물이 좋지 않게 나오는 경우가 많다. 이러한 경우에 GUI 리서치를 진행하면 많은 도움을 받을 수 있다.

- GUI 리서치의 의미 : 리서치는 내가 알지 못하는 대상에 대해 알고자 하는 관련 정보를 습득하는 것을 의미한다. 그리고 이러한 것들을 직접하는 것보다, 주변의 실제 사례를 통해 문제 해결의 실마리를 찾을 수 있다. 단지 기획 파트 뿐만 아니라, GUI 디자인도 리서치를 통해 많은 정보를 얻을 수 있다.

- GUI 리서치가 필요한 상황 : 

Q : 내가 알지 못하는 페이지의 형태를 UI 시나리오 문서에서 발견하였는데, 어떻게 디자인해야 하는가?

Q : 모바일에서 잘 쓰이지 않는 방식의 멀티 테이블 형태인데, 다른 앱에서는 어떻게 디자인했는가?

Q : 터치 제스처에 어떤 시각 반응을 보이는가?

Q : 경쟁사의 앱들은 디자인을 어떻게 하였는가?

Q : 우리 프로젝트도 동일한 콘텐츠를 다루고 있는데, 메인 페이지를 어떻게 차별화 할 수 있는가?

Q : 메인 페이지에서 장문의 텍스트, 웹 링크를 표현할 때, 어떠한 컬러와 폰트 사이즈를 적용하고 있는가?

Q : 운영체제별 GUI 디자인을 어떻게 대응하고 있는가?

- 무드 보드 구성

무드 보드

- 무드 보드의 의미 : 무드 보드는 이미지, 텍스트, 샘플들을 조합해서 만들어 진다. 디자이너들이 일반적으로 작업하는 데 있어, 영감을 얻거나 구체적인 사례가 필요한 경우에 모아서 콜라주 하는 방식으로 진행을 한다. 직접적인 연관이 없더라도 무드 보드에 모아놓은 이미지 등을 통해 나의 디자인 작업에 반영하는 데 의의가 있다.

- 무드 보드의 구성 : 실제로 출력해서 붙여도 좋고, 파워포인트에 콜렉트 해도 좋다. 다만 한 곳에 모여져 있어야 하고 특정 주제로 묶여 있어, 필요시 바로 찾거나 참조할 수 있어야 한다.

- 무드 보드 디지털 툴 : 무드 보드를 위한 다양한 디지털 툴들이 많이 출시되어 있으니 필요에 따라 다양한 툴을 사용해보고 자신에게 맞는 방식을 적용하는 것을 권장한다.

Pinterest, Mural.ly


3. 디자인 스타일 가이드 문서 작성

- 디자인 스타일 가이드의 이해

디자인 스타일 가이드의 필요성

- 내부 스타일 가이드 문서 없이 GUI 디자인시 발생하는 문제점 : 대부분은 별다른 문서를 제작하지 않고, 포토샵에서 psd 화일 안에 실제 폰트, 컬러 등을 적용하여 작업을 진행한다. 그러나 페이지가 많아지고 디자이너가 많아지고, 기간도 길어진다면 작업하는 도중에 최초의 설정 값과 형태 등은 변하게 되며, 어느 순간 기준점을 상실하게 된다.

- 스타일 가이드의 역할 : 스타일 가이드를 디자인의 기준점으로 활용할 수 있다. 구체적인 표현을 하자면, 실제 디자이너들이 작업할 때 참조하는 작업 지시서, 또는 CI 브랜드 가이드와 유사하다고 보면 된다. 따라서 나중에 참여하는 디자이너 등도 해당 문서를 참조하면 디자인을 일관성 있게 디자인할 수 있으므로, 장기적으로 프로젝트에 큰 이익이 된다.

- 스타일 가이드의 형태와 내용 : 구체적인 스타일 가이드에 대한 표준은 없고, 필요에 따라 여러가지 방식으로 작성한다. 문서 정리 방식, psd 화일을 별도의 스타일 가이드로 구성하는 방법 등 다양한 방법이 가능하다. 이 안에는 폰트의 사이즈, 인터랙션에 대응하는 버튼의 단계, 아이콘의 종류와 응용, 앱에 사용되는 각종 컴포넌트들이 구체적으로 쓰여있다. (psd 화일일 경우는 가져다 쓸 수 있도록 정리가 되어있다.)

-  디자인 스타일 가이드 참조

psd 디자인 스타일 가이드 참조

GRID (Landing Page, Portal)

COLOR PALETTE (#000000~#FFFFFF)

TYPOGRAPHY (Headers, Body)

FORMS (Empty, Selected, Typing, Select, Error, Success)

BUTTONS

AVATARS (Big / Middle / Small Size)

ICONS (Landing Page, Portal, Artists/Albums/Activity, Rank, Voting, Social Media)

UI ELEMENTS (Calendar, Slider/Tooltips, Pag nator, Tag-Tooltip,Drop Down Menu, Read more, Move/Hide)

ALERT/ERROR MESSAGES(Info파랑, Warning노랑, Error빨강, Success녹색)

LOGIN


학습정리

UI 시나리오 문서와 GUI 디자인

 - 시나리오 문서의 해석 : 실제 UI 시나리오 문서를 해석하고 이를 GUI 디자인시 어떻게 적용해야 하는지에 대해 간략히 알아보았다.

 - GUI 디자인의 적용 : UI 시나리오 적용 및 실제 GUI 작업에 있어 참조해야 할 사항들에 대해 학습하였다. 이러한 점들을 숙지하여 GUI 디자인을 효과적으로 할 수 있도록 한다.

GUI 리서치 및 무드 보드 작성

 - GUI 리서치 : GUI 리서치를 통해 디자이너들은 구체적인 GUI 적용 사례와 디자인 해결 사례 등을 확인할 수 있으므로, 반드시 GUI 리서치를 진행하는 것을 권장한다.

 - 무드 보드 구성 : 무드 보드는 작업을 하는데 있어 필요한 이미지들의 꼴라주라고 할 수 있다. 필요에 따라 다양한 이미지들을 구성하여 참조할 수 있으며, 다양한 디지털 툴도 나와있으니 필요에 따라 선택해서 구성하면 된다.

디자인 스타일 가이드 문서 작성

 - 디자인 스타일 가이드의 이해 : 디자인 스타일 가이드는 GUI 디자인 작업에 있어 참조 할 수 있는 작업 지시서와 같다. 제대로 작성하여 적용한다면, 손쉽게 디자인 작업을 할 수 있다.

 - 디자인 스타일 가이드 참조 : 다양한 디자인 스타일 가이드가 있으니 사례를 통해 자신의 프로젝트에 적합한 스타일 가이드를 찾아본다. 아울러 포토샵 파일로 만든다면, 실제 디자인 작업시에도 활용할 수 있는 좋은 자료가 될 것이다.


14강 GUI 리서치 프로세스


1. 주요 카테고리별 마켓 리서치

- 애플 앱 스토어

아이폰의 앱 마켓, 애플 앱 스토어

- 애플 앱 스토어는 모바일 앱 마켓 중 최고 퀄리티의 앱들이 있는 곳으로써, 애플 아이폰, 아이패드, 아이팟 앱 및 다양한 콘텐츠를 판매하고 있는 마켓이다.

- apple.com/kr/itunes 를 통한 아이튠즈 다운로드 애플 앱 스토어는 아이폰, 아이패드, 아이팟이 있을 경우, 모바일 내의 앱 스토어 아이콘을 통해 방문할 수 있으며, 맥 컴퓨터에도 기본적으로 아이튠즈를 통해 iOS 앱 스토어에 방문이 가능하다. 만약 윈도우즈 컴퓨터를 사용한다면, 위의 링크로 들어가서 별도의 아이튠즈를 설치한다면, 윈도우즈에서도 애플 앱스토어에 들어갈 수 있다.

국내, 국외 마켓 탐색 

- 한국 앱 스토어 리뷰 : 아이튠즈 설치시, 디폴트로 한국 앱 스토어를 볼 수 있다. 한국 앱 스토어는 한국 내의 순위로만 집계되므로 이러한 점들을 체크한다.

- 국외 앱 스토어 리뷰 : 아이튠즈 앱 스토어 내 우측 하단에 국가 아이콘이 있다. 해당 아이콘을 누르면 나라별로 앱 스토어를 방문할 수 있다.

애픞 앱스토어 리서치 

- 목적별 리서치 진행 : 구성 카테고리, 제공 순위 리스트, 특별 이벤트, 이벤트성 리스트 등 앱스토어에서 제공하는 전반적인 구성과 앱 리스트를 체크한다. 진행 프로젝트가 있다면, 해당 앱이 어떤 카테고리에 속하는지 확인하고 관련 앱들도 리서치 진행한다.

- 키워드별 리서치 진행 : 국내/국외 리서치를 진행할 수 있으며, 진행 프로젝트에 따라 연관 키워드를 다양하게 검색을 해본다.

- 구글 플레이

구글 안드로이드 공식 앱 마켓, 구글 플레이

- play.google.com 혹은 구글 플레이 앱 : 웹사이트 play.google.com 혹은 안드로이드 폰에 설치되어 있는 구글 플레이 앱을 통해 앱 마켓에 방문이 가능하다. 아이폰과 달리 해외 마켓에는 방문할 수 없다. 구글 플레이에서도 앱 외의 다양한 콘텐츠를 판매하고 있다.

구글 플레이 리서치 

- 구성 및 키워드 리서치 : 애플 앱 스토어와 마찬가지로, 앱 마켓에서 제공하는 순위, 리스트 등을 리서치하고 키워드에 따른 리서치를 진행한다.

- 모바일 vs 데스크톱 리서치

매체별 리서치의 장단점

- 소개 : 모바일 리서치는 각 운영체제별 앱 마켓에 들어가서 관련 앱에 대한 내용을 확인하고 다운 받아서 사용해보는 것을 의미하고, 데스크톱 리서치는 앱 마켓리서치와 웹 리서치를 의미한다. 각 장단점을 간략히 확인한다.

- 모바일 리서치 : 직접 앱을 다운 받아서 확인하는 방법인 모바일 리서치는, 실제 앱을 사용해보는 측면에서 제일 권장하는리서치 방법이나, 시간이 많이 걸리는 단점이 있다. 또한, 해당 디바이스가 없을 경우에는 앱을 설치해서 사용해 볼 수가 없다. 스마트폰은 개인용 기기의 성격을 지니고 있기 때문에, 주변 사람들에게 부탁해서 사용해보기에도 애매하다.

- 데스크톱 리서치 : 실제 자료를 정리하고 작성할 수 있는 데스크톱에서 리서치를 하는 건, 우선 편리하기 때문이다. 다만 앱 마켓도 아닌, 일반 웹사이트에서 관련 정보나 스크린 샷 등을 찾는 것은 자제해야 한다. 앱의 변화 속도를 일일히 웹사이트에서 확인할 수가 없으므로, 앱 마켓 방문 위주로 리서치를 진행해야 한다.


2. 운영체제별 GUI 디자인 대응

-  요구 사항 분석

UI 시나리오의 요구 사항 분석

- 담당자 미팅 : GUI 디자인에 앞서 실제 기획한 담당과 미팅하여 GUI 디자인에 대한 의견을 묻는다. 참조 혹은 경쟁 서비스 등의 리서치와 관련된 정보를 요청하여 기록한다. UI 시나리오 중 컬러, 타이포그래피, 레이아웃과 관련된 직접적인 질문을 하여 불명확한 부분을 구체화하고 의견을 맞춘다. 운영체제별 디자인 대응과 관련하여 별도의 의견이 있는지를 확인하는 것도 중요한 부분이다.

- UI 시나리오 숙독 : UI 시나리오를 체크하며 각 페이지를 이해한다. 주요 콘텐츠를 다루고 있는 페이지 등, 각 페이지별로 어떠한 디자인 패턴에 속하는지 확인한다. (메인 페이지 = 타임라인, 서브페이지 = 프로필등) 시각 디자인과 관련하여 별도의 요구 사항이 있는지 확인하고 시나리오에서 이해가지 않는 부분이 있다면 메모하여 담당자에게 질문한다. 최종적으로 리스트를 만들거나, 해당 문서에 구체적인 질문과 진행 방향 등을 적어서 커뮤니케이션 한다.

- 리서치 구조화

리서치 항목 도출

-  결과 종합하여 수행 리스트 작성 : 구체적으로 리서치를 진행하기 위해 수행 리스트를 작성한다. 어떠한 마켓을 방문할 것이며, 어떤 키워드와 카테고리를 검색할 것인지, 디자인 패턴은 어떠한 부분에 대한 리서치가 필요한 지 등을 구체적으로 수행 리스트를 작성한다. 해당 리스트는 필요에 따라 3자와 공유하기도 하고, 본인만 참조하기도 한다.

리서치 앱 리스트 업

- 참조 희망 앱 체크 및 리서치 : 담당자의 참조 앱 리스트, 앱 마켓의 카테고리, 키워드 서치 등을 통해 앱을 리서치하며 리스트를 구체화한다. 해당 앱을 다운 받아서 리뷰하고, 필요에 따라서는 스크린샷을 캡처하여 별도 보관한다.

- 디자인 패턴 관련 앱 체크 : 디자인 패턴 관련 앱은 동일 카테고리와 연관 검색어로 보여지지 않을 수도 있다. 예를 들어, 현재 프로젝트가 커피 관련 앱이지만 그 안에 결제 쇼핑 관련 페이지에 대한 리서치 요구 사항이 있을 경우, 직접적인 커피 앱이 아니더라도 쇼핑 전문 앱을 리서치하여 해당 부분에 대한 디자인을 확인하는 것을 의미한다. 이 경우는 평상시에도 많은 관심을 가지고 앱을 많이 써보았을 경우에 더욱 유리할 수도 있다. 그렇지만 실제 프로젝트 시점에서 트랜드, 디자인의 변화가 있을 수 있으므로 반드시 새롭게 다운로드 / 업데이트하여 관련 부분을 체크한다.

- 운영체제별 비교

멀티 디바이스, 멀티 운영 체제

- 원 서비스, 멀티 플랫폼, 멀티 디바이스의 대응 : 2015-2016년에 들어서면서, 대다수의 모바일 앱 서비스는 멀티 플랫폼, 멀티 디바이스의 개념이 도입되었다. 이에 하나의 서비스라면, 어떤 채널, 매체를 통해서도 동일한 서비스를 받을 수 있는 환경이 구축되었다고 할 수 있다. 이에 디자이너 또한 흐름을 이해하고 동참할 수 있어야 한다.

- GUI 디자인과 멀티 디바이스, 멀티 운영체제 : 간략하게 말하자면, 아이폰 앱과 안드로이드폰 앱을 얼마만큼 다르게 혹은 동일하게 가져갈 것인지를 고민해야 한다는 뜻이다. GUI 디자이너는 운영체제별 디자인 가이드를 숙지하고, 그에 따른 시각 디자인 요소들을 명확히 알아야 하지만, 다른 운영체제 간의 조화를 찾기란 사실 쉬운 일은 아니다.

- 멀티 운영체제에 대한 GUI 리서치 및 분석 : 작업하는 운영체제의 앱을 직접 써보고, 스마트폰을 나란히 늘어놓고 앱을 써보며 비교 분석해보는 것이 좋다. 각 페이지별로 어떠한 디자인 패턴에 속하는지 살펴보고, 해당 페이지가 운영체제별로 어떠한 구성을 이루고 있는지에 대해 3~5개의 앱을 리서치 한다면 구체적인 방향을 알아낼 수 있다.


3. 콘텐츠별 UI/GUI 디자인 구성 원칙의 이해

- 데이터 중심

데이터 중심 앱의 구성 원칙

- 데이터 중심 앱은 제일 많이 볼 수 있는 형태이다. 이메일, 페이스북, 트위터, 채팅창 등이 데이터 중심 앱을 제일 잘 표현해주는 앱이다.

- 구성원칙 : 

스크롤 가능하게

폰트는 한정적으로 사용

손가락 터치 사이즈 반드시 고려 

OS 기본 디폴트 사이즈 고려 

가독성 필수

그래픽적 완성도 더욱 추구

콘텐츠와 조작부 간 명확히 구분

- 이미지 중심

이미지 중심 앱의 구성 원칙

- 이미지 중심 앱은, 사진과 동영상을 주로 다루는 앱을 의미한다. 카메라, 유튜브, 인스타그램 등이 해당 앱이라 할 수 있다.

- 구성원칙 : 

화면을 최대한 넓게 사용 (최대화), 

가로 모드 지원, 

핀치 인/아웃 = 줌/인 아웃 지원

화면 터치할 경우 컨트롤 부 숨김/노출

스와이프로 콘텐츠 네비게이션

콘텐츠 중심의 화면 구성

- 게임

게임 앱의 구성 원칙

- 게임 앱은 일반 앱과 완전 별개의 앱으로 구분하는데 고유의 재미 요소가 필수적이다.

- 구성원칙 :

수준 높은 그래픽 비주얼

일관성

비주얼 스타일의 통일성


학습정리

주요 카테고리별 마켓 리서치

 - 애플 앱 스토어 : 애플 앱 스토어는 iOS와 컴퓨터에설치된 아이튠즈를 통해 방문할 수 있다. 데스크톱 아이튠즈를 통해서는 해외 앱 스토어도 손쉽게 방문할 수 있다.

 - 구글 플레이 : 구글 안드로이드 앱 마켓인 구글 플레이는 웹사이트와 전용 앱을 통해 방문할 수 있다.

 - 모바일 vs 데스크톱 리서치 : 모바일 리서치 방식과 데스크톱 리서치 방식에는 장단점이 있다. 그러므로 권장사항은 두 리서치 방식을 병행하여 진행하는 것이다.

운영체제별 GUI 디자인 대응

 - 요구 사항 분석 : 실제 UI 시나리오 기획 담당자 및 관계자들과 미팅을 통해 GUI 디자인과 연관된 요구사항을 구체적으로 분석해야 한다.

 - 리서치 구조화 : GUI 디자인에 필요한 부분을 사전에 확인하기 위해 리스트업을 하고 구체적으로 항목을 도출한다. 필요에 따라서는 디자인 패턴 리서치만 진행하기도 한다.

 - 운영체제별 비교 : 멀티 디바이스, 멀티 플랫폼, 원 서비스의 트렌드에 따라 다양한 디바이스와 운영체제에 대한 대응을 해야 한다.

콘텐츠별 UI/GUI 디자인 구성 원칙의 이해

 - 데이터 중심 앱 : 모바일 앱에서 가장 많이 볼 수 있는 형태는 데이터 중심 앱이다. 페이스북, 트위터, 이메일, 지메일 등이 대표적인 앱이다.

 - 이미지 중심 앱 : 이미지와 동영상을 중심으로 다루는 경우 이미지 중심 앱이라 할 수 있다. 유튜브, 인스타그램 등이 대표적인 앱이다.

 - 게임 앱 : 게임 앱은 정말 다양하게 앱이 존재한다. 그 중에서도 디자인시에는 높은 퀄리티와 일관성, 통일성이 중요하다.


'Legend 개발자 > T아카데미' 카테고리의 다른 글

Spring Framework  (0) 2017.09.07
UX/UI 기획  (0) 2017.09.04
jQuery (JavaScript)  (0) 2017.09.02
컴퓨터 알고리즘 중급  (0) 2017.08.31
JavaScript  (0) 2017.08.30
Posted by 전설의아이
|

1강 사용자경험(UX)의 개념과 이해


1. 사용자 경험(UX)의 정의와 중요성

- 사용자 경험(UX)이란?

사용자 경험(UX)이란, 총체적(holistic)관점으로 그 경험의 작용대상과 인간의 반응으로 이해한다.

- 사전적 정의

사용자 경험(User Experience, UX)은 사용자가 어떤 시스템, 제품, 서비스를 직간접적으로 이용하면서 느끼고 생각하게 되는 지각과 반응, 행동 등의 총체적 경험을 말한다.

- UX 대상과 사용자의 지각과 반은

사용자는 경험의 대상과 지각반응을 통합적으로 인지하고, 구매와 지속적 사용행위를 하게 된다.

- 대상 : 제품, 시스템, 서비스, 회사, 브랜드 등으로 확장된 경험 대상

- 지각반응 : 감정(felling), 태도(attitude), 행동(behavior)의 총합

- UX의 이해와 관점

- 이해와 해석 : 사용자경험 요소와 현상을 어떻게 해석하고 사용자를 이해할 수 있는가?

- 관점 : 사용자에 대한 관점을 넓혀 보다 풍부한 사용자경험 가치를 창출할 것인가?

- UX란 

ICT기술과 모바일 환경에서 다양한 사용 행태를 관찰, 해석하고, 실제 사용자의 경험을 이해하여 잠재 니즈의 발견은 물론, 모바일 서비스에 접목할 수 있는 사용자 인사이트와 사용자 가치를 만들어내는 방법론으로 이해할 수 있다.

- UX 이해의 복잡성

- 주관성(subjectivity) : 인간의 경험은 그 사람의 개인적, 신체적, 인지적 특성에 따라 주관적이다.

- 맥락성(contextuality) : 사용자 경험이 일어나는 상황적 의적 환경에 영향을 받는다.

- 총체성(holistic) : 경험 시점에서 개인이 느끼는 총체적인 심리적, 감성적 결과이다.


2. UX에 대한 이해와 관점

- UX의 이해와 관점

①인지적 관점(Cognitive)

- 인간의 기억과 생각하는 구조의 이해

- 인간이 어떻게 하나의 정보를 받아들여 인지하고 처리하는가?

②사용자 맥락과 상황(Context)

- 경험 발생 상황과 외적 영향

- 사용자는 컨텍스트의 영향으로 외부 환경과 어떤 관계적 경험을 형성하게 되는가?

③감각과 감성(Emotion)

- 역동적이고 다면적인 감각능력과 경험발생 시점에서의 심리적 상태와 변화의 이해

- 어떻게 느끼는가?

④사용자 행위(Behavior)

- 제품, 서비스 경험의 물리적, 인지적, 사회문화적 현상의 해석과 상호작용

- 어떻게 행동하는가?

- 사용자 경험(UX)의 영역

- 사용자 경험(UX)은 특정 영역(domain)을 갖기보다 기존의 다양한 분야와 결합되는 새로운 틀을 제공하는 접근으로 확장되고 있다.

- 단순하게 인터페이스만이 아니라, 제품, 시스템, 서비스, 회사 등 사용자가 특정 포인트를 중심으로 경험할 수 있는 대상이 확장된다.

- 사용자경험(UX)의 중요성

- UX의 이해(사용자를 이해하고 공감하기 위한 사고방식)

UX는 특정 제품과 서비스에 내재되어 있는 개념이 아니라 사용자(User)에 귀속된 개념으로 이해해야 한다.

사용자 경험 가치의 창출은 사람(유저)을 얼마만큼 이해하고 있는가에 달려 있음

- UX디자이너의 역할 : 경험의 기회 제공

UX디자이너는 사용자로 하여금 특정한 경험을 할 수 있도록 경험의 기회를 사용자에게 제공할 수 있어야 한다.


3. 사용자 경험 요소

- 사용자(User)

- 사용자, 과연 그들은 누구인가?

사용자(user)는 어떤 목표와 의도를 가지고 특정 컴퓨터나 시스템(모바일 기기) 등을 사용하며 능동적이고 가변적인 욕구를 가지는 주체다.

- 사용자는 어떤 욕구의 소유자인가?(인간의 본질적 욕구 측면)

Ex) 개인 프라이버시에 민감하며, 사회적 소속감을 중시

- 사용자가 궁극적으로 원하는 것은 무엇인가?(기능적 측면)

Ex) 자신의 개인정보를 친한 지인에게만 안전하게 공유할 수 있는 자신만의 공개 기능

- 사용자 경험(UX)의 기본 요소

- 사용자 경험(UX)을 명확하게 규명하기 위해서는 니즈(User Needs) 이외에 사용동기(Motives), 태도(Attitudes), 사용행태(Behavior)의 기본 구성요소에 대한 구체적인 분석이 필요하다.

사용자 니즈(User Needs) : UX 대상(제품/시스템/서비스)으로부터 특정한 만족감을 얻으려는 사용자들의 기대

사용동기(User Motives) : 사용자들의 행동을 불러일으키는 직접적인 발화제

사용자 태도(User Attitude) : UX 대상에 대해 갖는 개인의 취향과 선호, 선험적인 믿음과 정보

사용자 행위(User Behavior) : UX 대상을 사용하는 과정에서 드러나는 반복적인 행동패턴


4. 모바일 환경과 UX

- 모바일 사용자의 경험의 주요 요소

- 모바일 환경의 이해

모바일 분야는 전방위 산업 분야로 확산되고 있으며, 각 분야 개별 컨텐츠와 플랫폼, 그리고 디바이스를 중심으로 유기적 연결과 통합을 지속하고 있음

- 사용자 관점에서 모바일UX의 라이프사이클

The APP LIFECYCLE

Stage1. The App Store Experience (구매경험)

Stage2. The First-Open Experience (첫인상)

Stage3. Attempting Simple Tasks (단순조작경험)

Stage4. Attempting Complex Tasks (복잡조작경험)

- 모바일 UX의 환경과 영향 요소

사회문화적 환경과 사용자, 사용자의 의도와 목표, 사용자 태스크, 인터페이스와 인터랙션, 모바일  기기(H/W) 연결 속성과 성능, 통신사와 서비스 ... etc (매우매우 미시적부터 거시적까지 다양하다)


학습정리

사용자경험(UX)의 이해와 UX 요소

 - 사용자의 인지적 특성, 외부 상황의 영향성, 심리적 요인 등의 복잡성을 갖는다.

 - 사용자 경험 영역은 모호하며, 다양한 분야와 결합된 형태의 대상으로 확장

 - 니즈(User Needs), 사용동기(Motives), 태도(Attitudes), 사용행태(Behavior)

 - UX는 특정 제품과 서비스에 내재되어 있는 개념이 아니라 사용자(User)에 귀속된 개념

사용자(User)의 이해와 관점

 - 인지적 관점

 - 감각과 감성

 - 사용자 맥락과 상황

 - 사용자 행위

모바일 사용자 경험(UX)

 - 모바일 환경과 사용자경험 요소 


2강 모바일앱 환경의 이해와 UX의 중요성


1. 모바일앱(App) 환경 특성의 이해

- 모바일앱(App)의 개념

모바일앱이란?

- 특정 모바일 OS에서 구동되는 애플리케이션(application, 응용프로그램)을 의미한다.

- 스마트 폰에서 애플리케이션(앱)은 특정 용도에 따라 설치되는 컴퓨터의 응용프로그램과 같다.

- 앱을 스마트폰으로 직접 다운로드하여 설치할 수 있는 서비스를 제공하는 곳이 앱 마켓(app market) 또는 앱 스토어(app store)다.

모바일앱 환경의 이해

개발자 

판매등록/업로드→

앱스토어 

App다운로드/설치→ 

사용자 

←수익분배 

←지불결제 

- 모바일앱(App)의 종류와 특성

- 네이티브 앱(Native App) : 네이티브앱은 모바일OS 제조사에서 제공하는 개발언어를 이용하여 각가의 고유 모바일 OS에서만 동작되는 앱(App)을말한다.

Ex. 자바(Java)로 개발하는 안드로이드앱과 Objective-C 언어로 개발 되는 아이폰앱.)

- 네이티브앱의 장단점

장점 

단점 

- 빠른 구동 속도

- 다양한 기능 구현 가능

- 인터렉티브한 사용자 환경 제공 가능

- 업데이트 및 수정이 어려움

- 동일한 앱을 다양한 플랫폼에 출시시 많은 시간이 소요됨 

- 모바일 웹(Mobile Web) : 모바일 웹(Web)은 모바일에 최적화된 웹사이트라고 할 수 있고, 디바이스 별 별도의 개발 방식이 필요하지 않으며, 인터넷에 접속이 가능하다면 어떠한 모바일 디바이스로도 접속이 가능하다.

 모바일 웹(Web)은 데스크탑 브라우저에서 실행되는 기능을 모바일 기기 환경에 맞춰서 개발한 사이트이다. (PC용 홈페이지가 모바일 화면으로 보여지는 것)

- 모바일 웹의 장단점

 장점

단점 

- 플랫폼 및 기기에 상관없이 대부분의 모바일기기 브라우저에서 볼 수 있음

- 업데이트 및 수정이 용이함. 

- 앱스토어에 등록이 되질 않습니다.

- 표현의 자유 한계.

- 인터넷이 연결이 되지 않으면 사용할 수 없음. 

- 하이브리드 앱(Hybrid App) : 하이브리드앱이란 모바일웹(Mobile web)의 홈페이지를 구현하는 웹기능과 앱(App)의 어플기능을 접목시킨 형태로, 네이티브앱과 모바일웹의 장점을 혼합한 앱이다.

 하이브리드앱은 네이티브앱의 형태를 띄고 있어 앱스토어나 마켓에서 다운받아 모바일에 설치할 수 있다.

- 하이브리드앱의 장단점

장점 

단점 

- 네이티브 앱의 빠른 속도와 모바일웹이 가지는 개발의 용이성을 둘 다 취할 수 있음

- 빠른 업데이트 적용 

- 인터넷 환경에 따라 일부 기능이 작동이 되지 않을 수 있음.

- 구동속도가 네트워크 상태에 따라 많은 영향을받아 속도가 느림 


2. 모바일 사용자경험(UX)의 속성과 특징

- 모바일 사용자행태적 속성

편재성(Ubiquity) : 어디서든 정보검색과 통신이 가능한 이동성(모빌리티)을 구현해 공간성의 제약을 해소.

즉시연결성(Instant connectivity) : 언재 어디서나 사용자가 원하는 즉시, 해당 정보검색과 통신이 가능

개인화(Personalization) : 사용자 개인의 선호와 취향 등 개인 특성에 맞춘 콘텐츠 및 보안 인증 제공.

위치기반(Localization) : 사용자의 현재 위치를 파악하여 주변의 유용한 정보를 제공이 가능

- 모바일 사용자경험의 주요 특징

단순 간결한 경험을 선호

- 사용자 목표와 의도에 연관된 직관적인 UX요소들의 중요성이 PC의 비해 상대적으로 강함.

- 정보에 대한 복잡한 선택 상황을 꺼려함.

다른 사용자와의 소통에 개방적이고 자신의 현재 주변 환경과 교감하고자 함.

- 타인과의 커뮤니케이션 매체로써 PC에 비해 다른 사용자와 교류에 적극적임.

- 정보의 선택, 공유, 평가, 저장, 편집 등에 더 적합한 경험이 형성됨.

- 모바일의 이동성과 위치기반 특성으로 내 주변 상황에 민감함.

새로운 형태의 UX에 비교적 쉽게 적응

- 이미 학습된 모바일 UX/UI 환경에서 새로운 기능과 서비스를 배우는데 쉽게 적응함.

- 스마트기기의 새로운 기능/서비스를 경험을 하고자하는 기대가 자연스럽게 형성됨

새로운 정보제공이나 추천 서비스에 개방적임

- 일상에서 모바일 기기와의 상호작용 시간이 길고, 양방향 인터랙션 경험에 익숙함.

- OS 별 지속적인 앱의 업데이트 환경에 익숙함

- 사용자가 원하고 있는 정보가 사용자의 상황에 맞게 제공되는 방식에 익숙함


3. 모바일UX 특성을 반영한 UI 설계 시 주안점

- 디자인 측면

Desirable : 매력적인 디자인

얼마나 감성적으로 쓰고 싶게끔 디자인 되어 있는지?

Credible : 디자인 신뢰성

어떤 디자인적 요소들이 사용자의 신뢰도의 영향을 미치는지?

Usable : 사용하기 쉬운 사용자 인터페이스(UI)

사용자의 목푤를 달성하기 위해 제공된 인터페이스가 얼마나 쉬운지?

- 정보설계 측면

UseFul : 유용한 기능과 콘텐츠

사용자에게 정말로 필요한, 또는 문제해결을 할 만한 기능과 컨텐츠인가?

Accessible : 접근성의 극대화

누구나 쉽게 접근할 수 있도록 디자인되었는가?

Findable : 정보 탐색 경ㄹ(Navigation)의 일반화

사용자가 필요한 정보와 기능을 쉽게 찾을 수 있게 UI가 설계되었는가?

Valuable : 사용자 만족도

사용자가치가 어떻게 전달되어 만족도를 높일 것인가?


학습정리

모바일앱(App) 환경 특성의 이해

 - 모바일앱이란, 특정 모바일 OS에서 구동되는 응용프로그램(application,)을 의미한다.

 - 모바일앱(App)의 종류:

    1)네이티브앱(Native App), 2)모바일 웹(Mobile Web), 3)하이브리드앱(Hybrid App)

모바일앱 사용자경험(UX)의 속성과 특징

 - 모바일 사용자행태적 속성 : 편재성(Ubiquity), 즉시연결성(Instant connectivity), 개인화(Personalization), 위치기반(Localization)

 - 모바일 사용자는 새로운 형태의 IX에 비교적 쉽게 적응한다.

 - 모바일 사용자는 새로운 정보제공이나 추천 서비스에 개방적이다

모바일 UX 특성을 반영한 UI 설계 시 주안점

 - 디자인 측면 : 매력적인 디자인, 디자인 신뢰성, 사용하기 쉬운 사용자 인터페이스(UI)

 - 정보설계 측면 : 유용한 기능과 콘텐츠, 접근성의 극대화, 정보 탐색 경로(Navigation)의 일반화, 사용자 만족도


3강 사용자 인터페이스의 개념과 이해


1. 사용자인터페이스(UI)의 정의와 이해

- 사용자인터페이스(UI, User Interface)란?

사용자 인터페이스(UI)는 사람들이 컴퓨터, 시스템, 기기, 도구 등 그 사이에서 일어나는 상호작용(Interaction)을 매개하는 것이다.

- 사람(사용자)과 사물 또는 시스템, 기계, 컴퓨터 등, 그 사이에서 의사소통을 할 수 있도록 일시적 또는 영구적인 접근을 목적으로 만들어진 물리적, 가상적 매개체를 뜻한다.

- 사용자인터페이스는 디스플레이 화면, 키보드, 마우스, 문자, 아이콘, 도움말 등 사용자들과 상호 작용을 하도록 설계된 모든 정보관련 고안품을 포함하여, 응용프로그램이나 웹사이트 등이 상호 작용을 초래하거나 그것에 반응하는 방법 등을 의미한다

- 사용자 인터페이스(UI)의 목적

사용성(usability)는 사용자인터페이스의 주된 목적

- 좋은 사용자 인터페이스는 심리학과 생리학에 기반하여, 사용자가 필요로 하는 요소를 쉽게 찾고 사용하며 그 요소로부터 명확하게 의도한 결과를 쉽게 얻어 낼 수 있어야 한다.

사용자 인터페이스는 상호작용 수단과 방식을 제공

- 입력(I) : 사용자가 시스템을 조작할 수 있게 한다.

- 출력(O) : 시스템이 사용자가 이용한 것에 대한 결과를 표시한다.

- 사용자 인터페이스(UI)의 구분(종류)

상호작용 수단과 방식에 따른 사용자인터페이스의 구분

- CUI(Character based UI) : 문자 방식의 명령어 입력 사용자 인터페이스

- GUI(Graphic UI) : 그래픽 환경 기반의 마우스 입력 사용자 인터페이스

- NUI(Natural UI) : 사용자의 말과 행동 기반 제스쳐 입력 인터페이스


2. 모바일 UI 디자인의 기본 설계 원칙

- 사용자인터페이스 기본 원칙

직관성(Intuitiveness)

앱의 구조를 큰 노력 업이도 쉽게 이해하고, 쉽게 사용하게 해주는지

→ Findability / Ease of use / Consistency

유효성(Efficiency)

얼마나 정확하고 완벽하게 사용자의 목표가 달성될 수 있는지

→ Feedback / Effectiveness

학습성(Learnability)

초보와 숙련자 모두가 쉽게 배우고 사용할 수 있게 해주는지

→ Easy of learning / Accessibility / Memorability

유연성(Flexibility)

사용자의 인터랙션을 얼마나 포용하고, 실수로부터 방지해주는지

→ Forgiveness / Error Prevention / Error Detectability / Error-averse

- 사용자인터페이스 설계 지침-10원칙(한국HCI연구회)

가시성의 원칙(Visibility)

앱의 주요기능(feature)을 노출시켜 최대한 조작이 쉽게 되도록 한다.

조작결과 예측의 원칙(Natural Mapping)

사용자가 앱을 조작하여 작동시킨 결과를 조작 부위만 보고도 미리 예측가능하게 설계해야 한다.

일관성의 원칙(Consistency)

앱의 조작방식에 일관성을 제공함으로써 사용자가 쉽게 기억하고 빠르게 적응할 수 있게 한다.

단순성의 원칙(Simplicity)

앱의 기능구조를 단순화 시켜 조작에 요구되는 노력을 최소화하여 인지적 부담을 줄이게 한다.

지식배분의 원칙(Knowledgein World & Head)

앱의 기능 조작에 요구되는 지식은 사용자의 지식과 기억 구조에 적합하도록하여 학습하기 쉽고 기억하기 쉽게 상호 보완적으로 배분한다.

조작오류의 원칙(Design for Error)

발생된 오류는 쉽게 발견될 수 있도록 하고, 오류의 수정 또한 최대한 쉽게 이루어져야 한다.

제한사항 선택사용의 원칙(Constraints)

앱의 조작 상의 제한사항을 이용하여 가능한 선택의 여지를 줄여 조작방법이 명확하도록 한다.

표준화의 원칙(Standardization)

앱의 기능구조와 디자인을 표준화하여 한번 학습한 이후 효과적으로 사용할 수 있도록 한다.

행동유도성의 원칙(Affordance)

사용자에게 앱의 기능을 어떻게 조작하면 될 것인가에 관한 단서(cue)를 제공함으로써 조작의 가능성을 높인다.

접근성의 원칙(Accessibility)

사용자의 성별, 연령, 인종 등에 따른 다양한 계층의 사용자를 수용할 수 있도록 고려해야 한다.


3. 좋은 UI의 특징 및 관련 원칙들

- 화면의 구성관련

조직성 + 일관성

- 조직성은 사용자에게 일관성 있는 개념적 구조를 제공

- 일관성은 사용자가 예측할 수 있는 UI를 반영하여 용이성을 향상

간결성 + 명료성

- 간결성이란 커뮤니케이션을 위해 꼭 필요한 요소만을 디자인

- 사용자에게 한 번에 너무 많은 기능을 제공하지 않음

- 디자인된 모든 요소들의 의미가 모호하지 않고 명료해야 함

- 감성, 인지적 품질 관련

가독성 + 시인성

- 너무 많은 버튼이 디스플레이 되거나 너무 복잡한 아이콘은 사용자에게 부담을 줄 수 있음

- UI를 바로 보고, 그 의미를 혼동 없이 쉽게 읽고 정확하게 이해할 수 있어야 함.

접근성 + 관용성 : 다양한 사용자 고려

- 불특정 다수의 사용자도 시스템 UI에 접근할 수 있도록 하고, 동시에 다양한 사용자의 문화적, 언어적 차별이 없이 사용자 요구를 반영해야 함

- 사용성 관련

메타포 + 피드백

- 현실세계의 대상물들(도구)을 메타포로서 인터페이스에 옮겨 놓은 아이콘들은 직관적 사용성에 효과적으로 작용한다.

- 메타포의 활용은 문화적, 언어적 장벽들을 자연스럽게 극복하게 해준다.

- 피드백은 사용 결과와 반응의 대화를 이끌어낸다.

- 작업을 수행 할 때 반응(피드백)은 가능한 한 즉각적으로 제공하여 시각적 혹은 청각적 신호로 제공해야 한다.

- 사용자에게 시스템이 무슨일이 일어나고 있는지를 피드백을 통해 계속 알려 주어야 한다.


학습정리

사용자인터페이스(UI)의 정의와 이해

 - UI 사람들이 컴퓨터, 시스템, 기기, 도구 등 그 사이에서 일어나는 상호작용을 매개하는 것이다.

 - 사용자 인터페이스의 궁극적인 목적은 사용성이다.

 - 사용자 인터페이스는 입력/출력의 상호작용 수단을 제공하고 그 방식에 따라 구분할 수 있다.

모바일 UI 다자인의 기본 설계 원칙

 - 직관성(Intuitiveness) : 처음 사용할 시에도 사용방법을 쉽게 알 수 있다.

 - 일관성(Consistency) : UI가 일관적이라면 학습하기가 용이하다

 - 효율성(Effectiveness) : 익숙해진 다음에 더 효율적으로 사용할 수 있다면 가장 좋다

 - 유연성(Flexibility) : 예상하지 못한 다양한 인터랙션을 포용할 수 있는 유연성이 중요

좋은 UI의 특징 및 관련 원칙들

 - 조직성 + 일관성

 - 간결성 + 명료성

 - 가독성 + 시인성

 - 접근성 + 관용성

 - 메타포 + 피드백


4강 사용자 인터랙션(Interaction) 디자인 이해


1. 인터랙션(Interaction)의 의미와 이해

- 인터랙션(InteractioN)이란?

인간이 제품이나 서비스를 사용하면서 상호간 작용하는 것

- 컴퓨터에 의해 작동되는 전자 제품, 시스템 환경과 사용자의 행동간의 상호작용 또는 상호 영향성을 의미

- 인간과 인간, 인간과 물질, 인간과 시스템, 시스템과 시스템 간 상호작용이 일어나는 방법 또는 양식

- 인터랙션의 목적

인터랙션 디자인 : 사람 - 기기 간 커뮤니케이션 관점 = '대화(dialogue)'

- 인간이 제품이나 서비스를 사용하면서 상호작용하는 방식 또는 양식을 보다 용이하게 디자인하는 분야

- 인터랙션 디자인은 사용자 간 커뮤니케이션뿐만 아니라 서로 간의 행위 소통 자체를 위한 디자인

- HCI(Human-Computer Interaction)

HCI는 과학과 인문학 사이의 인터페이스

- 컴퓨터 시스템과 상호작용의 연구 분야

- 시스템을 사용하는 인간(사용자)의 특성을 이해하는 분야

- 사용자와 컴퓨터 사이를 잇는 사용자 인터페이스에서 발현

HCI의 목적

- 스마트환경에서 제품과 서비스의 최적 경험

- 궁극적인 목적은 사용자의 의지를 보다 자유롭게 하고, 창의력을 증진시키고, 인간 사이의 의사소통과 협력을 증진시킴.


2. 사용자의 행동모델과 인터랙션 디자인

- 사용자 행위 단계와 좋은 인터랙션 디자인

- 사용자의 목적과 그것을 달성하기 위해 할 수 있는 행위 간의 차이가 작아야 함.

- 원래 목적과 실행 결과 간 차이가 적어야 함.

사용자는 어떻게 사고(think)하고 사용행위(behavior)를 하는가?

- 도널드 노먼의 7단계 행동 모델(Donald Norman's 7 Stage of Action model)

사용자가 달성하고자 하는 목표에 도달하기까지의 의도와 행동-기대결과-해석과 평가-피드백의 과정(행위이론

1. Forming the Goal (목표)

목표는 막연히 얻고 싶은 것으로, 매우 부정확한 형태로 나타날 수 있다.

→ 스마트 디바이스의 기능이 결정되었는가?

2. Forming the Intention (의도)

막연한 목표에 의도나 계획이 있고, 구체적으로 어떤 목표인지 분명히 진술한다.

→ 어떤 조작이 가능한가?

3. Specifying an action (행동 단계 설정)

의도에 맞는 정확한 행동 단계를 구체적으로 진술한다.

→ 의도와 행동과의 대응관계(매핑)는 정해졌는가?

4. Executing an Action (실행)

실제적인 무엇인가를 실행하는 단계로 실제 결과물을 내어 놓는다.

→ 행위의 수행이 가능한가?

5. Perceiving the state of the world(지각)

실제로일어난 일에 대해서 지각하고 이해한다.

→ 대상인 시스템이 어떤 상태에 있는지를 알 수 있는가?

6. Interpreting the State of the world (지각의 해석)

실제로 일어난 일에 대해서 지각하고, 인식한 것에 대한 감각을 해석한다.

→ 시스템의 상태와 해석의 대응(피드백)이 결정되었는가?

7. Evaluating the Outcome (결과 평가하기)

수행 결과와 원하던 목표에 대해 비교와 평가를 한다.

→ 사용자가 원했던 목표와 시스템의 결과가 잘 맞아 떨어지는가?


3. 모바일 인터랙션 디자인의 구성 요소

- 사용자 목표와 행위, 결과의 차이(gap)를 줄여주는 요소

심성 모형(Mental model)과 개념모형(Conceptual model)

- 심성 모형 : 사용자가 생각하고 행동하는 구조를 설명하는 개념

- 개념 모형 : 사람이 시스템과 제품 등의 개념을 이해하려고 머리 속에 만드는 모형

매핑(Mapping)

- 행위와 실제 조작, 결과가 대응하는 것으로 시스템 상태가 눈에 보이도록 대응관계를 확정해야 함

- 사용자가 모바일 기기를 조작해 작동시킨 결과를 조작 부위만 보고도 미리 에견, 또는 기능적 유추할 수 있도록 하는 것.

메타포(Metaphor)

- 메타포는 어떤 것을 머리에 떠올릴 때 직관적으로 반응하는 느낌과 해석을 의미한다.

- 인터랙션 디자인은 눈으로 보기만 해도 (직관적), 사용자는 기기의 상태와 가능한 여러 행위들을 파악 가능해야 한다.

어포던스(Affordance, 행동유도성)

- 어포던스(Affordance)는 어떤 행동을 유도한다는 뜻으로 행동유도성이라고도 한다.

지각된 어포던스의 4가지 원리(도날드노먼)

- 이미지들의 선택과 허용 가능한 상호작용 양쪽에서 일반적으로 익숙한 사용법을 따르라

- 사용자가 원하는 행동을 묘사하는 단어를 사용하라

- 메타포(Metaphor, 은유)를 사용하라.

- 인터페이스를 학습한 이후 이것을 다른 부분에 활용할 수 있도록 지속적으로 같은 컨셉 모델을 따르도록 하라

피드백(Feedback)

- 피드백은 어떤 작동이 실제로 이루어졌는지 어떤 결과가 달성되었는지에 대한 정보를 사용자에게 알려주는 것이다.

- 사용자의 행위 결과에 관한 충분한 피드백을 지속적으로 받을 수 있어야 한다.


학습정리

인터랙션(Interaction)의 의미와 이해

 - 인터랙션은 인간이 어떤 주어진 환경에서 사물이나 사람 혹은 환경 등과 행하는 모든 행위를 의미한다.

 - 인터랙션의 목적은 인공물과 사람 간의 커뮤니케이션이 일어나게 하는 것이다.

 - 인터랙션 디자인은 사용자 간 커뮤니케이션뿐만 아니라 서로 간 행위의 소통 자체를 위한 디자인이다.

사용자의 행도모델과 인터랙션 디자인

 - 도널드 노먼의 7단계 행동 모델(Donald Norman's 7 Stage of Action model)

 - 좋은 인터랙션 디자인은

    - 사용자의 목적과 그것을 달성하기 위해 할 수 있는 행위 간의 차이가 작아야 함

    - 원래 목적과 실행 결과 간 차이가 적어야 함

 - 인터랙션 요소 : 메타포, 어포던스, 피드백, 매핑, 심성모형


5강 사용성의 이해와 사용성 평가의 활용


1. 사용성(Usability)의 정의와 중요성

- 사용성(Usability)란?

사용자가 어떤 도구를 특정 목적을 달성하기 위해 사용할 때에 어느 정도 '사용하기 쉬운가(easy to use)'를 말한다.

사용자들이 목표를 이루기 위해 특정한 상황에서 사용하는 시스템, 제품 또는 서비스에 대한 유효성(effectiveness), 효율성(efficiency), 만족도(satisfaction)의 정도(ISO)

- 사용성의 이해

사용성은 사용자와 컴퓨터간에 일어나는 상호 작용에서 경험하는 '사용의 품질'을 의미한다.

유효성 (Effectiveness)

- 사용자가 원하는 목적을 제대로 달성하였는가?

- 사용자 요구에 적합하고 안정적이고 신뢰성이 있는 제품

효율성 (Efficiency)

- 사용자가 원하는 목적을 가능한 편리하게 수행하였는가?

- 사용 방법을 학습하기 쉽고 사용자의 실수를줄여주는 제품

만족도 (Satisfaction)

- 전반적인 사용 만족도는 어떠하였는가?

- 사용자의 감성적, 경험적인 성향에 부합하는 제품

- 야콥 닐슨(Jakob Nielsen)의 사용성 지침

①알기 쉬운 시스템 상태(Visibility of system status

- 절절한 피드백을 통해 적절한 반응시점에 사용자에게 "시스템마다 무슨 일이 일어나고 있는지"를 알 수 있게 해야 한다.

②실제 사용 환경에 적합한 시스템(Match between system and the real world)

- 사용자의 실제환경과 유사한 친숙한 단어와 문구, 개념 등을 사용하여 자연스럽고 논리적인 정보를 제공해야 한다.

③사용자에게 자유와 주도권 제공(User control and freedom)

- 사용자가 시스템의 기능 선택에서 실수를 하거나 원치 않는 상태로부터 확실한 실행 취소 및 재실행 기능을 제공해야 한다.

④일관성과 표준화(Consistency and standards)

- 동일한 상황에서 상이한 버튼, 피드백, 아이콘 등으로 UI의 일관성을 해쳐 사용자에게 혼란을 주어서는 안된다.

⑤오류 예방(Error prevention)

- 오류가 발생하기 쉬운 조건을 제거하거나 조건을 설정할 수 있는 사용자에게 작업을 취하기 전에 확인 옵션을 제공해야 한다.

⑥기억을 불러오지 않고 보는 것만으로 이해할 수 있는 디자인(Recognition rather than recall

- 시스템을 사용하기 위한 설명은 언제든지 적절할 때 볼 수 있거나 쉽게 찾을 수 있어야 한다.

⑦유연성과 효율성 (Flexibility and effciency of use)

- 사용자가 자주 실행하는 기능은 사용자가 직접 효율화를 조정할 수 있도록 한다.

⑧심플하고 아름다운 디자인(Aesthetic and minimalist design)

- 사용자의 의도와 달성목표를 수행하는 과정에 불필요하거나 상관없는 정보는 제거하고 심플한 디자인을 구현할 수 있어야 한다.

⑨사용자가 오류를 인식하고 진단하고 복구할 수 있도록 지원(Help users recognize, diagnose, and recover from errors)

- 오류 메시지는 쉽게 이해되어야 하며, 문제 상황을 정확히 알려주고, 그 해결책 또한 제공해야 한다.

⑩도움말과 설명서 준비(Help and documentation)

- 어떤 정보든 쉽게 찾을 수 있고, 사용자의 행위에 초점을 가지고, 수행할 구체적인 단계가 나열되고, 분량이 너무 많지 않아야 한다.

- 사용성(Usability)의 속성과 원칙

사용성은 사용자 경험의 구성요소 중 하나로 다양한 하위 속성을 포함하고 있다.

속성 

설명 

원칙 

효율성

Efficiency 

원하는 목적을 달성하는데 소모되는 자원의 효율 

사용자가 최소한의 단계로 해당 작업을 달성 할 수 있도록 설계되어야 한다. 

유효성

Effectiveness 

의도한 목적을 완성도 있게 달성하는가 

사용자의 오류 처리 또는 그 복구 역시 쉽고 자유롭게 할 수 있도록 지원해야 한다. 

학습 용이성

Learnability 

사용자가 응용 프로그램을 배울 수 있는 제품의 능력 

사용자가 조작할 때마다 쉽게 인식할 수 있도록 사용정보들이 잘 보이도록 설계해야 한다. 

기억 용이성

memorability 

사용자가 해당 테스크를 달성하기 위한 최소한의 정보의 양을 유지하는가 

시스템은 사용자의 인지적 부할르 최소화하기 위해 일정범위 이상의 항목을 제시하지 않는다 

이해 용이성

Understandability 

사용의 특정 테스크 및 조건을 이해할 수 있는 제품의 능력 정도

시스템은 다양한 작업을 수행하는 방식에 대해 일관성을 유지해야 한다. 

피드백

Feedback

사용자 입력 또는 인터랙션 방식에 대한 소프트웨어 제품의 반응성 

사용자에게 항상 현재 어느 위치에 있고 어떤 조작을 하고 있는지에 대한 정보를 주어야 한다

지침
Guidance 

UI가 상황에 맞는, 또는 오류가 발생할 때 의미있는 피드백을 제공하는지 여부 

사용자 설명서에 유용한 정보와 사용에 관련한 지침을 제공해야 한다. 

유연성
Flexibility 

처음 지정된 거 이외의 작업 또는 환경의 변화에 적응할 수 있는 정도 

사용자 인터페이스는 사용자의 개인 기호에 맞게 맞춤화 할 수 있어야 한다 

보편성

Universality

제품이 서로 다른 문화적 배경을 가진 사용자의 다양성을 수용할 수 있는지 여부 

시스템은 사용자의 장애, 인종, 문화적 다양성을 가진 모든 사용자를 고려해야 한다. 

안전성

Safety

정보와 데이터를 보호하기 위한 소프트웨어 제품의 능력 

인증되지 않은 정보와 다른 사용자의 접근과 정보 데이터를 보호할 수 있어야 한다. 


2. 사용성 평가 원칙과 절차

- 사용성 평가(Usability Evaluation)의 정의와 목적

사용성 평가는 제품과 시스템의 복잡하나 기능들을 사용자가 보다 쉽고 편리하게 조작할 수 있도록 사용자 인터페이스를 개발 또는 개선하기 위해 문제점을 찾아 내고 개선안을 발굴하는 과학적 조사과정이다.

- 신규 또는 기존의 특정 제품, 시스템, 서비스의 기능에 대한 사용자측명의 평가와 일련의 과정

- 제품과 시스템의 복잡한 기능에 대해 사용자가 보다 쉽고 편리하게 사용할 수 있도록 사용자 인터페이스 등에 대한 사용 측면의 평가와 개선

- 사용성 평가(Usability Evaluation)의 절차(3단계)

사용성 평가는 제품 및 시스템의 완성단계에서 시행되므로 주로 수행 데이터(performance data)분석을 통해 검증 결과를 도출해 낸다.

1단계 - 태스크 시나리오(task scenario) 수행과 측정 및 기록

실제 사용 상황을 가정해 미리 작성된 태스크 시나리오에 맞춰 기기 조작을 실행한다. 수행 시간, 수행도, 특이사항, 주요 오류 유형을 측정하고 기록한다.

2단계 - 사용자 만족도를 평가와 개선, 보완 사항 발굴

제품에 대한 사용자 인터페이스의 주요 구성 요소 별 사용자 만족도를 평가해 해당 제품의 사용성을 높이기 위해서 우선적으로 개선 보완해야 할 요소를 발굴한다.

3단계 - 문제점의 개선, 보완하기 위한 새로운 아이디어 탐색(반복)

주요 사용상 오류의 원인을 진단하고 이를 개선 및 보완하기 위한 아이데이션(ideation)을 진행하고, 향후 사용자 인터페이스 개발을 위한 새로운 아이디어를 탐색한다.

- 사용성 평가 항목과 측정지표

항목 

설명 

측정지표 

작업시간

Time behavior 

- 사용자가 태스크를 완료하는 시간

- 사용자가 태스크 또는 인터랙션 모드에 머무는 시간(지속하는)

- 특정 이벤트를 수행하는 데까지 걸린 시간

- 입력 속도와 빈도 

- 완료시간

- 로딩시간 

- 이벤트까지 걸린 시간

- 입력시간

사용 패턴

Usage patterns 

- 사용자의 행동 또는 기능 사용 빈도

- 마우스 클릭의 수, 기능 사용의 수, 마우스 활용의 양 등

- 사용자의 접근의 수와 방문 빈도, 이용정보의 양

- 최적의 해결방법과 실제 행동 사이의 비율

- 사용 빈도

-정보 접근성

-최선 해결책과의 편차 

정확성

Accurary 

- 사용자가 태스크를 완료할 때까지의 에러의 양

- 사용자 인터페이스 조작 또는 위치 컨트롤의 정확도

- 검색 정보의 총 양과 정확한 정보 사이의 비율 

- 에러율

- 공간 정확도

- 정보의 정확성 

완성도

Completeness

- 사용자의 태스크 성공 여부에 대한 숫자 혹은 백분율(%) 

- 성공/ 실패 여부와 비율 

학습 용이성
Learnability 

- 객체를 보는 즉시 사용하는 방법을 알 수 있는 정도
- 특정 목표를 달성하기 위해 필요한 기능 습득 정도
- 외부 요소가 중요한 정보와의 간섭 없이 습득하는 정도 

- 행동유도성
- 기억 용이성
- 단순성 

일관성
Constancy 

- 동일한 상황이나 유사한 태스크에 일관되고 표준화된 체계를 가지고 있는지 여부에 대한 평가

- 사용자가 이해할 수 있는 인식 요소와의 상호작용을 제공하는 지의 여부

- 시각적 일관성
- 기능적 일관성
- 가독성
- 친숙성 


3. 사용성 평가의 활용

- 사용성 평가의 장점 및 중요성

사용성 평가는 상세한 문제점 진단 및 개선 방향을 제시할 수 있다.

사용성 평가를 통해 제품, 시스템 또는 서비스를 사용하는 인간의 행동에 대해 구체적으로 정리하기 때문에 단계별로 상세한 문제점 발견을 가능하게 하고, 같은 측정 방법을 기준으로 기존 제품 또는 경쟁 제품과의 비교를 통해 개선의 가능성을 평가할 수 있다.

사용성 평가는 문제점의 진단과 발견된 이슈의 중요도 판단에 도움을 준다.

사용성 평가를 통해 제품, 시스템 또는 서비스의 문제점의 진단에서 나아가 발견된 이슈의 중요도를 판단할 수 있다고, 문제의 우선순위에 따른 문제점과 개발 이슈의 제공으로 결정권자의 빠른 판단을 가능하게 한다.

- 사용자 경험(UX)과 사용성(Usability)의 관계

사용성은 사용자경험의 품질

사용자 경험(UX)은 도구적 품질(사용성, 유용성), 비도구적 품질(심미성 측면, 상징성 측면)의 인지에 대한 감정 반응이며 상호작용 하면서 시스템 특성, 사용자 특성 및 컨텍스트는 큰 영향을 미친다. 또, 사용자 경험의 실제 결과는 이 모든 것의 종합적인 것.

- 말크(Mahlke, 2007)

제품이나 서비스의 도구적 품질의 인지 요소인 유용성과 사용성

비도구적 품질의 인지 요소인 심미성과 상징성

유용성, 사용성과 심미성, 상징성에 대한 종합적 결과인 감정반응


학습정리

사용성(Usability)의 정의와 중요성

 - 사용성은 사용자와 컴퓨터간에 일어나는 상호 작용에서 경험하는 '사용의 품질'을 말한다.

 1) 유효성(Effectiveness) : 사용자가 원하는 목적을 제대로 달성하였는가?

 2) 효율성(Efficiency) : 사용자가 원하는 목적을 가능한 편리하게 수행하였는가?

 3) 만족성(Satisfaction) : 전반적인 사용 만족도는 어떠하였는가?

사용성 평가 목적과 절차

 - 신규 또는 기존의 특정 제품 기능에 대한 사용자 측면의 평가와 일련의 과정

    1단계 : 태스크 시나리오(task scenario) 수행과 측정 및 기록

    2단계 : 사용자 만족도를 평가와 개선, 보완 사항 발굴

    3단계 : 문제점의 개선, 보완하기 위한 새로운 아이디어 탐색

사용성 평가의 장점 및 중요성

 - 사용성 평가는 상세한 문제점 진단 및 개선 방향 제시한 수 있다.

 - 사용성 평가는 문제점의 진단과 발견된 이슈의 중요도 판단에 도움을 준다. 


6강 사용자중심디자인(UCD)


1. 사용자중심디자인의 개념과 중요성

- 사용자중심디자인(UCD, User Centered Design)의 개념

디자인적 문제해결 과정

- 사용자 중심 디자인(UCD)은 사용자를 중심으로 사고하여 만들어 내는 인터페이스, 서비스, 제품 디자인의 철학적 접근 방법이자 디자인 사상이다.

- UCD의 최종적 단계에서의 결과물인 디자인은 '인간(사용자)의 편의와 가치의 실현에 초점'을 맞추게 된다.

사용자중심디자인과 사용자 인터페이스

- UCD는 사용자가 무엇을 할 수 있고', '무엇을 원하고', '무엇을 할 필요가 있는지에 따른 사용자 인터페이스(UI)의 최적화를 통해 사용자중심디자인 가치를 현실화하는 노력에 있다.

사용자의 이해가 최우선이 되는 디자인 방법론

- 개발과정에 사용자가 개입, 사용자 테스트가 중요시되는 디자인 방법론

- 사용성과 직접적으로 결부된 인간 요소(human factor)연구에 기반을 둠

- 심성모형, 행동유도성 등의 개념을 바탕으로 사용자를 이해하고 디자인에 반영

사용자중심디자인의 중요한 원칙

- 실체 제품을 사용하는 최종 사용자에 집중한다

- 요구 사항과 디자인을 사용자와 함께 검증한다

- 디자인, 프로토타입 제작, 새발을 반복적으로 수행한다.

- 전체적인 사용자 경험을 고려한다.


2. 사용자중심디자인의 구성요소

- 사용자중심디자인의 핵심가치

사용자

사람들이 진심으로 바라고 원하는 것은 무엇인가?

사용 편의성(usability)

다양하고 복잡 다기능화 되어가는 스마트기기의 사용자가 보다 사용이 편리한 제품과 서비스를 디자인해야 하는 필요성

사용자 참여 디자인(participatory-design)

디자인 단계별로 실제 사용자들을 참여시켜서 설계와 검증을 진행, 제품의 기획과 설계 등 모든 단계에서 사용자를 참여시켜서 확인하고 그들이 쉽게 사용할 수 있는 제품을 만드는 것이 사용자중심디자인의 핵심

- 사용자중심디자인의 특징

사용자의 개발 절차의 개입

- UCD는 철저하게 사용자에 초첨이 맞춰어져 있다.

- 사용자의 경험적(empirical)정보를 이용하여 그들이 원하는 디자인 요구사항을 도출한다.

반복적 디자인과 다양한 분야의 협력

- 사용자의 피드백, 테스트 등을 통해 제품과 서비스는 개발과정에서 수많은 평가 개선의 반복과정을 거친다.

- 사용자의 이해가 중요하기 때문에 심리학, 인류학, 문화, 언어 등 인문사회학적 접근과 협력이 요구된다.


3. 사용자중심디자인 프로세스의 이해

- 사용자중심디자인 프로세스의 기본 원칙

사용자의 참여와 반복적 사용자 평가

- 단계 정의보다 각각 사용자 개입이 어떻게 이루어지는가가 중요

- 사용자의 요구를 만족하는 시스템 디자인

- 사용자의 이해와 프로토타입을 통한 디자인에 대한 반복적 사용자 평가와 개선

- 사용자중심디자인 수행 단계

사용자 이해 단계

- 사용자의 행동과 태도를 파악하고, 그들이 원하고 필요로 하는 것이 무엇인지 찾아낸다.

→ FGI, 필드리서치를 통한 사용자 조사 실시

인터랙션 정의 단계

- 사용자 조사를 통해 얻은 결과를 바탕으로 사용자 프로필을 만들고 정보 구조와 작업 구조를 정의한다.

→ 사용자 요구사항을 정의하고 전반적인 인터랙션 구조를 파악

UI 디자인 단계

- 개략적 컨셉에서 구체적인 설계까지 사용자와 함께 다양한 프로토타입을 평가하면서 디자인을 완성해가는 단계이다

→ 다양한 수준의 프로토타입을 만들어 사용자를 참여시켜 평가를 반복한다 (저수준/고수준 프로토타입 제작)

사용자 검증과 평가 단계

- 프로토타입 작성이 완료된 후 개발의 진행과 완료 시 필요한 평가를 수행하는 단계다.

→ 프로토타입이 실제 개발 가능한지 검토하고, 내부의 UI가이드라인과 OS나 제조사에서 제공하는 디자인 가이드라인이 지켜졌는지 점검한다

개발 완료 단계

- 실제 개발된 제품을 대상으로 사용성 테스트를 진행한다.

- 개발이 완료되고 출시된 이후에는 사용자 반응을 파악한다.

→ 제품 출시 후에도 사용자 피드백을 지속적으로 수집하고 사용자 중심의 혁신 과정을 반복해야 제품의 경쟁력을 지속적으로 높일 수 있다.


학습정리

사용자중심디자인의 개념

 - 사용자를 중심으로 사고하는 디자인직 문제해결 방법론이자 과정이다.

 - 사용자의 이해가 최우선이 되는 디자인 방법론으로 개발과정이 사용자가 개입, 사용자 테스트가 중요시되는 디자인 방법론이다.

 - UCD방법론은 디자인, 프로토타입 제작, 개발 과정에 반복적으로 반영하게 된다.

사용자중심디자인의 핵심가치

 - 사람들이 진심으로 바라고 원하는 것은 무엇인가?

 - 사용자 참여 디자인(participatory-design) : 사용자의 개발 절차의 개인

 - 반복적 디자인과 다양한 분야의 협력

사용자중심디자인 프로세스의 이해

    사용자 이해 단계 → 인터랙션 정의 단계 → UI디자인 단계 → 사용자 검증과 평가 단계 → 개발 완료 단계


7강 UX시나리오


1. UX 시나리오의 이해

- UX 시나리오

UX 시나리오는 구체적인 미래 시점의 상황에서 사용자가 겪을 경험을 예상해보는 도구이다.

- UX 시나리오의 목적과 활용

- 미래의 사용자가 무엇을 원하고 필요로 하는지와 제품서비스가 추구하는 사용자 가치에 대한 통찰력을 반영한다.

- UX 시나리오의 목표와 범위 내에서 사용자(고객)의 환경과 현상, 그리고 그들이 처한 문제점에 대한 진단 및 해결 방향을 설정하는 과정을 통해 제품과 서비스 이면에 숨겨진 사용자 경험가치의 본질을 찾아가는 과정이다.

- 사용자 경험의 속성과 흐름을 파악할 수 있다

- 미래의 불명확한 사용 상황을 보다 구체화하기 위한 도구이다.

- 미래의 사용자가 무엇을 원하고 필요로 하는지에 대한 제품서비스 검증의 단계이다.

- UX시나리오는 구체적인 사용자와 컨텍스트를 정의하고, 사용자 행위 중심의 태스크(task)를 정의하여 상호작용 방식을 구체화하기 때문에 정보구조, 인터랙션 디자인 등의 UI 설계에 유용하게 활용된다.


2. UX 시나리오의 유형과 장단점

- 페르소나(Persona) 기법

가상의 사용자

- 페르소나는 '가상의 인물(Persona)'을 통해 그들 사용자들의 이용행태와 제품, 서비스에 대한 니즈(Needs)에 주목하여 이를 서술적으로 정의하는 기법이다.

- 목표 사용자를 보다 면밀하게 분석하기 위해, (가상)사용자들을 특정한 기준에 따라 분류한 뒤, 이들 각각의 사용자 유형들을 가공의 캐릭터 또는 프로필 등으로 표현하는 기법이다.

장점

- 사용자를 집중해서 분석하도록 해준다.

- 사용자에 대한 감성적인 이해를 도와준다.

- 효과적으로 사용자를 알게 해준다.

- 페르소나를 작성하게 되면, 사용자는 하나의 동일한 유형으로 존재하지 않고, 이용환경(Context)이나 성별/연령별/직업별 특성, 제품에 대한 기대, 니즈, 동기, 태도, 이용행태 등이 다르다는 것을 발견하게 된다.

- 유저 스토리(User story)

사용자 리서치의이해도 향상

- 리서치 결과는 가장 특징적인 이야기들만 담겨져 있기 때문에 모든 사용자의 모든 경험을 대변할 수 없다.

- UX 디자이너는 리서치 결과를 보다 풍성하게 꾸며서 다른 이해관계자들에게 효과적으로 설명할 필요가 있는데, 이 때 사용하는 방법이 사용자 스토리이다.

구성 요소

- 사용자들은 이런 사람이다.

- 사용자들은 이럴 때 제품을 이용한다.

- 사용자들은 제품을 이렇게 이용한다.

- 사용자들은 제품 이용 시에 이런 갈등을 겪는다.

- 사용자들은 제품에 대해서 이런 니즈를 가지고 있다.

- 니즈에 부합하는 디자인 아이디어가 반영되어도 된다.

- 사용자 여정맵(Journey Map)

시간의 흐름에 따른 사용자 경험의 파악

- 사용자 여정맵은 사용자들이 수행하는 제품/서비스 이용흐름을 조망하고 문제를 발견하는 데 탁월한 툴이다.

- 미리 해당 제품(서비스)을 분석하고 Journey Map을 그려봄으로써 예상되는 사용자들의 이용 경험을 모형화해 볼 수 있다.

특징

- 사용자의 긍정, 부정을 나타내어 부정을 긍정으로 끌어올리며, 효과적인 서비스 설계가 가능함

장점

- 사용자 여정의 의도적인, 의도하지 않은 측면을 이해하는데 도움을 줌

- 서비스의 실제 그리고 일상적인 터닝 포인트를 밝힐 수 있음

- 필요 없는 단계와 중복되는 수고에 대해 파악할 수 있음


3. UX 시나리오의 작성 방법론

- 페르소나 기반 UX 시나리오 작성

페르소나 기법의 장점

- 예측하기 힘든 수 많은 사용자에 대한 동기, 욕구, 패턴을 구체적으로 요약, 제시함

- 다양한 프로젝트 구성원들이 의사 결정을 할 때 그 기준으로 작용함

- '사용자는 이렇게 생각할 거에요.' 라는 주관적 예측을 줄임

- 사용자의 기술적 수준에 대한 시각차를 좁힘

- 특정한 사람을 위해 디자인한다는 느낌을 가질 수 있음

- 사용자에 대한 관점을 여러 부서 사이에서 계속 일치시킬 수 있음

페르소나 기반 UX 시나리오 작성 가이드

- 동기 : 사용자가 얻으려고(의도/목표) 하는 것

- 니즈 : 목표 달성을 위해 사용자가 필요로 하는 것


사용전 - 사용과정 - 사용 후

- 페르소나가 서비스를 어떻게 사용할 것인지에 대한 설정

- 페르소나가 서비스를 사용하기 전에 어떤 정보를 알고 있을지 정의

- UX 시나리오는 페르소나의 다음 행동이 어떤 것인지 명시해야 함

- 사용자 여정맵 작성

여정맵 기법의 장점

- 여정맵은 실제 사용자의 서비스 경험을 시각적으로 재현해보는 맵으로 사용자의 긍정적, 부정적 반응을 나타냄

- 여정을 맵핑하는 것은 서비스들을 이해하고 서비스와 사용자와의 갭, 개선과 혁신의 디자인적 기회를 알아보는데 가장 심플하고 유용한 접근임

- 사용자 여정맵은 사용자들이 경험하게 될 서비스의 인터랙션과 제스츄어, 터리 포인트들로 구성됨

여정맵 작성 가이드

- 서비스 이용전 / 이용 중 / 이용 후로 구분한다.

- 사용자의 컨텍스트를 고려해 가로축을 설계하고, 세로축은 사용자의 긍부정을 표현한다.

- 지나치게 복잡해지지 않도록 하고, 선형 그래프로 한눈에 전체 경험을 조망할 수 있돌고 한다.

- 되도록 그림 이미지를 활용한다.

- UX 시나리오의 요소

동기/계기와 의도(Motivation & intention)

- 사용자 행동이 일어나게 되는 직접적인 이유(목표)

사용자 행위(User Interactivity)

- 사용자 인터랙션/인터페이스에 대한 사용자 행동패턴

기대 결과의 평가와 해석(Evaluation & Interpretation)

- 의도 / 원했던 목표와 실행 결과의 평가와 인식/감각적 해석

기억과 태도(Memory & Attitude)

- 결과에 대한 만족/불만족 수준의 기억-다음 행동 영향을 주는 요인

- 사용자 경험의 흐름과 요소

사용자에게 형성될 UX의 구조와 요소를 파악

- 사용자에게 어떤 동기로 작용, 특정 행동을 야기하여, 기대(의도)에 대한 평가와 해석, 기억과 태도로 이어지는 경험 흐름의 구조

사용자 경험의 흐름 파악

동기/계기와 의도(Motivation & intention) → 사용자 행위(User Interactivity) → 기대 결과의 평가와 해석(Evaluation & Interpretation) → 기억과 태도(Memory & Attitude) → 동기/계기와 의도(Motivation & intention)

- UX 시나리오 작성 가이드(6단계)

User definition : 목표 사용자는 누구인지?

(User definition) 사용자(고객)은 누구인지?

- 사용자의 성격, 선호, 라이프스타일, 직업, 가치관 및 태도 등으로 사용자 정의

User needs/problem : 사용자에게 제공하고자 하는 UX는 무엇인지?

(Needs/Problem) 사용하는 가장 큰 이유는?

- 해당 제품서비스가 해결, 또는 제공하고자 하는 혁신적인 사용자니즈 정의

Context of use : 사용자는 어떤 상황에서 사용하게 되는지?

(Context of Use) 어떤 상황에서 사용하는지?

- 사용환경과 상황-시간, 장소, 또는 특정 이벤트 등 사용의 전후 맥락을 정의

Key-function : 제품서비스의 주요 기능은 무엇인지?

(Function) 어떤 기능 때문에 사용하는지?

- 사용자가 사용하게 될 제품서비스의 핵심 기능 정의

User task-flow : 사용자는 해당 기능을 어떤 방식으로 사용하게 되는지?

(User Task Flow) 그 기능을 어떻게 사용하는지?

- 사용자가 인터페이스와 인터랙션 방식 등을 실행하는데 있어서 하나의 목적을 달성해 나가는 경로나 과정

User value/benefit : 사용자가 최종적으로 얻게되는 UX 가치, 또는 편익은?

(Benefit/Value) 그래서 어떤 의미가 있는지?

- 사용자가 해당 제품의 기능과 서비스를 이용하는 가장 큰 이유(why)와 만족의 수준 정의


학습정리

UX 시나리오의 이해

 - UX 시나리오는 구체적인 미래 시점의 상황에서 사용자가 겪을 경험을 예상해보는 도구이다.

 - 제품서비스의 구체적인 콘텐츠와 기능, 무엇보다 사용자 경험의 속성과 흐름을 파악할 수 있다.

UX 시나리오의 유형과 장단점

 - 페르소나(Persona) 기법 : 페르소나는 사용자를 집중해서 분석하도록 해준다.

 - 유저 스토리(User story) : 사용자 리서치의 이해도 향상에 도움을 주는 도구이다.

 - 사용자 여정맵(Journey Map) : 시간의 흐름에 따른 사용자경험의 파악을 위한 도구이다.

UX 시나리오의 작성 방법론

 - 사용자 경험의 흐름 파악

 - UX 시나리오의 요소

 - UX 시나리오 작성 가이드(6단계)


8강 사용자분석 방법론


1. 사용자의 정의와 특성의 이해

- 사용자(User) 정의

사용자, 과연 그들은 누구인가?

- 사용자(user)는 어떤 목표와 의도를 가지고 특정 컴퓨터나 시스템(모바일 기기)등을 사용하며 능동적이고 가변적인 욕구를 가지는 주체다.

사용자는 어떤 욕구의 소유자인가? (인간의 본질적 욕구 측면)

Ex. 개인 프라이버시에 민감하며, 사회적 소속감을 중시

사용자가 궁극적으로 원하는 것은 무엇인가?(기능적 측면)

Ex. 자신의 개인정보를 친한 지인과만 안전하게 공유할 수 있는 자신만의 공개 가능

- 사용자(User)의 종류

주사용자(primary users)

- 사용자분석의 주요 대상이 되는 사용자 그룹을 말하며, 특정 목적을 달성하기 위해 시스템이나 컴퓨터를 통해 스스로 정보처리를 하거나 기능을 이용하는 사람

부사용자(secondary users)

- 실제로 시스템을 사용하는 사람은 아니지만, 주사용자가 시스템을 어떻게 사용하는가에 영향을 주거나 받는 사람들

구매자로서 사용자(users as buyer)

- 실제로 시스템이나 기기를 구입하는 과정에서 결정권을 행사하는 집단

- 비즈니스환경에서는 구매자와 사용자 간에 매우 다른 목표, 특성 그리고 행동양식이 존재한다.

관리자로서 사용자(user as manager)

- 실제 사용자와는 다른, 조직 내에서 실질적으로 조직의 일을 관리하는 사람들

- 사용자(User)의 특성

행태적 특성(behavioral attributes)

- 상호작용성과 관련된 행태 : 자주(빈도), 정기적으로, 또는 집중해서 오랫동안, 일시적인 상호작용

- 정보와 관련된 행태 : 얼마나 많이, 얼마나 복잡한가에 대한 정보를 대하는 행태

- 기능과 관련된 행태 : 검색 기능, 이미지처리, 저장, 편집, 공유 기능 등에 관한 행태

개인적인 특성(personal attributes)

- 성격적인 특성

- 신체적인 특성

- 문화적 특성

- 동기적인 특성

사용자의 숙련 정도

- 초보자

- 중급자

- 숙련가

- 전문가


2. 사용자 분석 방법론

- 사용자분석(user analysis)의 목적과 중요성

사용자 분석은 왜 해야 하는가?

- 사용자의 욕구, 인지적 특성, 행동양식 및 상황을 고려해 제품/시스템/서비스 설계에 반영한다.

- 사용자로 하여금 학습 없이도 시스템에 대한 정보를 충분히 얻을 수 있고 쉽게 제품/기능을 사용할 수 있게 하기 위함이다.

사용자 분석 대상 '사용자의 어떤 특성을 어떻게 정리할까?'

- 사람 자체에 대한 사용자(user) 분석'

→ 보편적 인간 중심 -who, when, where

- 사람 행동에 대한 '사용자 행동과 경험(UX) 분석'

→ 특정 제품서비스 사용자 행태 중심 - how, what, why

사용자 분석의 중요성

- 사람이 생각하고 행동하는 과정은 복잡하고 이해하기 어렵다.

- 어떤 사용자를 위한 제품, 시스템을 개발할 것인지를 명확하게 파악해야 그 사용자들에게 최적의 경험을 제공하는 제품, 시스템을 개발할 확률이 높아진다.

- 사용자분석은 사용자 요구와 선호도를 파악하고 그 개발 제품서비스의 시장적합성을 높이는 절차이다.

- 사용자 분석 3단계 - 역할 모형을 중심으로

1단계 : 사용자 분석의 대상이 되는 조사주세를 선정하고 참여자들을 선정하는 단계

- 실제 사용자를 대표할 수 있는 사람, 조직 내 사용자와 가장 접촉이 많은 부서 관계자로 선정팀 구성

- 성별/연령별, 교육/소득수준, 지역적/문화적/언어적 특성, 취미 등 분석 대상 사용자 리스트 작성

- 사용자 선발 질문지 작성 - 해당 시스템이 성격에 알맞은 주제에 대한 구성원 모집 목적

- 사용자 분석 절차의 확정 - 사용행태, 숙련 정도, 개인적 특성을 확인 할 수 있는 적합한 방법 선정

2단계 : 선정된 사용자들을 대표하는 소수의 사람들을 대상으로 한 역할 모형(user role model)의 구조 선정

- FGI(Focus Group Interview) 기법을 활용한 조사 주제의 확정과 역할 모형 구조 선정

- 역할 모형 - 역할은 사용자와 시스템간의 관계에 초점 (욕구, 필요, 관심사항, 기대수준, 사용 행태 등)

- 한 사람이 특정 시스템에 여러 가지 역할을 수행, 또는 여러 사람이 한 시스템에 동일한 역할을 수행

- 정리 및 보고서 작성 → 역할 지도(role map)의 작성

3단계 : 실제 역할 모형에 들어가는 상세한 사용자의 프로파일을 파악하는 단계

- 사용 가치 프로파일 : 기능적 가치, 유희적 가치, 사회적 가치, 개인적 가치

- 사용성 속성 프로파일 : 효율성, 정확성, 일관성, 유연성, 의미성

- 감성 프로파일 : 정서와 미적 인상 및 개성

- 숙련도 프로파일 : 해당 분야 지식, 시스템 지식, 기기 지식 수중

- 사용 행태 프로파일 : 상호작용과 관련하여 사용 빈도와 강도, 복잡도

- 사용자 분석의 중요성

사용자 요구사항이나 필요성이 제대로 반영되지 않은 시스템 개발은 심각한 오류를 발생할 수 있다.

- 사용자가 아니면, (개발자 자신은) 실제 시스템을 사용한 과정에서 겪게 되는 문제점이나 시스템을 이용하는 궁극적인 목적 등을 알아낼 수 없다.

사용자 분석은 개발 초기 뿐만 아니라 제품, 시스템 개발의 전체 단계에 걸쳐 점진적이고 반복적으로 이루어야 한다.

- 그 이유는 시스템이 개발되어 감에 따라 사용자가 원하는 바와 사용자가 불편을 느끼는 점이 역동적으로 바뀌기 시작하면서 점점 더 자신이 원하는 사양과 불편한 점에 대해서 구체적으로 이야기 할 수 있기 때문이다.


3. 사용자 분석의 주요 기법

- 사용자 분석 도구와 기법

성공적인 사용자 연구를 위해서는 대상이 되는 사용자와 시스템의 목적, 상황을 명확히 한 뒤, 이에 따른 각 사용자 연구방법들의 장단점을 잘 이해하고 최적의 방법론을 선택해야 한다.

- 설문조사(questionnaire) / 서베이(*survey)

- 가장 널리 사용되는 니즈 분석기법으로 대표적인 정량조사 기법

- 조사의 효율성을 위해 모집단을 대표하는 표적 집단을 추출하고 조사하는 표본조사

- 일지 연구(diary study)

- 일상생황에서 사용자에게 일정 형식의 일지를 제공하고,

- 사용자 스스로 수행하는 일이나 생각, 감정 등을 카메라 등의 매체로 기록

- 장시간 연구 가능하고, 시각적 정보를 쉽게 얻을 수 있다.

-  단, 사용자 동기에 따라 얻을 수 있는 정보가 크게 달라지는 단점(인터뷰 보완)

- 포커스 그룹 인터뷰(FGI)

- 사용자가 경험한 내용을 포커스 그룹 인터뷰를 통해 개방적 토의를 진행하고, 그 자료를 분석하는 질적 조사기법

- FGI의 장점은 저비용으로 대상으로 부터 필요한 정보를 빠르게 얻을 수 있다.

- 또한 그룹 내 시너지 효과도 얻을 수 있다.

- 다만, 대상자 수가 적어 대표성이 떨어지고 사회적 조정(moderation) 능력에 좌우되는 면이 있다.

- 라이프스타일 분석(AIO 분석)

- 시장 세분화를 위한 클러스터링(clustering)기법의 일종

- 소비자의 생활양식에 의한 시장세분화를 하기 위한 방법으로, 소비자 생활양식은 AIO(Activity, Interest, Opinion)의 척도로 측정된다.

- 사용자가 어떤 시간을 보내고(A), 어떤 일을 중시하며(I), 어떤 견해를 갖고 있는가(O)를 척도로 나타내어 수치화한다.

- 사장에 대한 풍부한 정보를 주는 반면 세분화의 경계가 모호해 측정이 어려울 수 있다는 단점이 있다.

- 시나리오 분석(scenario analysis)

- 미래에 나타날 수 있는 여러 가지 모습들을 일관성과 논리성을 갖춘 상태에서 제시하는 것 (Michael Porter, 1985)

- 이 기법은 아이디어의 발상 및 기회 포착에서부터 완제품의 사용 환경, 기술, 목적에 이르기까지 디자인 프로세스 전반에 걸쳐 적용이 가능한 미래예측기법

- 시나리오 플롯을 구성할 때 대안적인 미래들이 분기하기 시작하는 시점에서 줄거리를 결정하는 것

- 귀납적 방법과 연역적 방법으로 구성할 수 있다.

- 관찰법(observation) / 에쓰로그래피(ethnography)

- 특정한 실험체계 내의 제한된 이슈로는 사용자의 무의식에 잠재된 니즈(latent needs) 도출에 한계가 있음. ( Ex: 호순 효과 )

- 관찰을 통해 인간과 인간 행동에 영향을 미치는 주위의 환경 요소들을 고려해 객관적인 관점에서 정상적인 접근이 가능하다.

- 로그 분석(Log analysis)

- 웹사이트나 모바일앱, 디지털기기의 사용자의 사용기록에 대한 분석이다.

- 방문자수와 페이지 뷰수, 쿠기 값 분석 등으로 사용자 정보를 분석하는 방법

- 개별 사용자의 행동들은 로그를 통해 기록하고 그 로그 분석을 통해 사용자의 행동 패턴 등을 분석이 가능하다.

- 로그파일, 코드 삽입(ASP), 통계 등을 이용한 로그 분석이 가능하다.


학습정리

사용자의 정의와 특성의 이해

 - 사용자는 어떤 목표와 의도를 가지고 특정 컴퓨터나 시스템 등을 사용하며 능동적이고 가변적인 욕구를 가지는 주체다

    사용자의 종류 : 주 사용자, 부 사용자, 구매자, 관리자

    사용자 특성 : 행태적 특성, 개인적인 특성, 숙련정도에 따른 특성

사용자 분석 방법론

 - 사용자분석은 사용자 요구와 선호도를 파악하고 개발 제품서비스의 시장 적합성을 높이는 절차이다.

 - 사용자 분석은 개발 초기 뿐만 아니라 제품, 시스템 개발의 전체 단계에 걸쳐 점진적이고 반복적으로 이루어야 한다.

사용자 분석의 주요 기법

 - 성공적인 사용자 연구를 위해서는 대상이 되는 사용자와 시스템의 목적, 상황을 명확히 한 뒤, 이에 따른 각 사용자 연구방법들의 장단점을 잘 이해하고 최적의 방법론을 선택해야 한다.


9강 페르소나와 사용자모델링 방법론


1. 사용자 모델링의 이해

- 사용자 모델링(user modeling)

정의

사용자 모델링은 실제 시스템 개발에 부합하는 사용자 모형(Model)을 제작하여, 특성을 시스템의 개발 목적에 따라 '사용자의 행동을 체계적으로 파악해 나가는 과정'이다.

사용자 분석 vs 사용자 모델링의 관계

사용자 분석이 사용자의 니즈를 전반적으로 조사하는 것이라면, 사용자 모델링은 그 추려진 분석 내용을 '시스템에 구현하고 구체화시키는 과정'이다.

- 사용자 모형(model) 구분

인지적 모형(cognitive model)

사용자가 어떻게 시스템을 이해하고, 사용 과정을 어떻게 배우고, 실제로 어떻게 사용하는지와 관련된 모형이다.

역할 모형(user role model)

사용자와 시스템 간의 상호 역할관계에 초점을 둔다. ( 욕구, 필요, 기대, 관심, 행태 등의 집합)

사회기술 모형(socio-technical model)

기술적인 요소가 동시에 고려된 사회적 맥락, 또는 서비스 생태계를 이해하는 것을 목표로 한다.


2, 멘탈 모델의 정의

- UI가 사용자의 멘탈모델과 맞지 않는다!?

멘탈모델(Mental Model)이란 사람들이 자기 자신, 다른 사람, 환경, 자신이 상호작용하는 사물들에 대해 갖는 모형이다. 사람들은 경험, 훈련, 지시를 통해 멘탈모델을 형성한다.

- 멘탈 모델링 과정

사용자의 사용에 관련된 행동 패턴과 태스크 분석을 통해 UI 설계 지침으로 활용

1. 사용자 인터뷰하기 - 사용자는 어떻게 행동하는가? 에 대한 사용자 진술의 수집

2. 사용자 행동 추출하기 - 사용 목적에 다른 행동의 양상과 속성, 절차 등을 추출

3. 행동 패턴 찾기 - 개별 행동들의 패턴화된 특징 도출

- 멘탈 모델의 역할

멘탈 모델을 만든다는 것은?

- 멘탈 모델은 사람들의 행동 동기, 사고 과정뿐만 아니라 그들이 행동하는 감성적, 철학적 배경에 대해서도 깊이 이해하는 데 효과적인 방법이다.

- 멘탈 모델은 사용자가 이용하는 서비스의 목적, 기능, 방법 등 다양한 이슈들에 대해서 사용자들이 경험하거나 하게 될 많은 상황을 규명하고 분류하는데 효과적인 방법이다.


3. 사용자모델링과 페르소나 작성 방법론

- 페르소나(persona)의 정의

어원 : 그리스의 고대극에서 배우들이 쓰던 가면을 일컫는다.

사용자 모델링에서 페르소나의 정의

- 어떤 제품 혹은 서비스를 사용할 만한 목표 인구 집단 안에 있는 '다양한 사용자 유형들을 대표하는 가상의 인물을 구체화하는 것'을 말한다.

사용자 모델링에서 페르소나의 역할

- 목표 사용자 그룹들의 이해를 돕는 역할

- 제품과 시스템이 얼마나 적합할지, 만족도를 향상시키도록 유도하는 가이드 역할

- 사람의 개성을 부여함으로써 보다 인간적인 접근을 하고 동감을 느끼는 것이 가능

- 사용자 요구분석 → 페르소나(가상의 사용자) → 사용자 시나리오(기능 정의) → 구체화/개발(UI, 인터랙션)

- 페르소나의 장점

- 페르소나를 사용하면 사용자를 인간의 얼굴을 가진 한 개인적인격체로서 보다 인간적으로 가깝게 이해할 수 있다.

- 가상의 인물이지만 실제 사용자들이 필요하고 느낄만한 것에 대해보다 쉽게 이해하고 접근할 수 있게 된다.

- 페르소나는 마케팅, 디자인, 판매 등 다양한 개발 조직 간에 사용자 이해를 위한 상호소통의 도구로서 유용하게 이용할 수 있다.

- 페르소나의 활용 지침

- 페르소나는 사용자를 상세히 묘사한 것으로 사용자 유형 프로필을 보여 준다.

- 페르소나는 일반적으로 80% 정도의 사용자를 커버할 수 있는 3~5명의 대표 사용자를 대상으로 구성한다.

- 페르소나는 디자인 개발 결과물에 대한 평가척도로, 페르소나의 이물자체는 가상이지만 실제 사용자들에게서 얻어진 자료를 바탕으로 만들어져야 한다.

- 페르소나 구성요소

- 기본 사항 : 사진, 이름, 개인 설명 등의 몰입을 도와주는 요소들

- 목표 : 경험적 목표, 궁극적 목표, 인생의 목표

- 계기/동기 : 제품과 서비스를 사용하게 된 주된 이유

- 태도/관점 : 제품과 서비스를 바라보는 생각과 관점

- 행태의 흐름 : 사용 내역(얼마나 자주)

- 환경 : 라이프스타일

- 숙련도 : 기술 활용 능력

- 불만족도 : 기존 제품서비스 사용경험의 문제점

- 니즈 : 기대하고 바라는 바

- 페르소나 작성 프로세스

↓ 사용자 컨텍스트 분석(context Analysis) 및 요구사항(requirement Analysis) 분석

↓ 주요 행동 패턴으로부터 전형적인 특성들을 결정

↓ 맵핑법을 통해 인터뷰 대상자를 특성에 매치하고 패턴을 도출

↓ 주요 패턴으로부터 '페르소나'를 결정하고 '페르소나' 목적을 정의

↓ '페르소나를 정교하게 다듬고 실질적 모델을 완성

- 페르소나 작성 시 주안점

- 사용자 설문이나 사용 후기의 양식을 통해 얻은 자료로 사용자의 과거 경험을 파악, 이를 통해 니즈를 분석하고 최종적으로 가상의 사용자를 설정한다.

- 사용자 분석을 통해 얻은 정성, 정량 조사 자료를 기반으로 만들어지는 것이기 때문에 신뢰성 있는 리서치가 진행되어야 한다.

- 사실에 기반을 둔 사용자 조사 자료를 통해 얻을 신뢰할 수 있는 데이터라는 사실을 늘 인지하고 있어야 한다.

- 최대한 다양한 요구사항을 고려한 제품, 서비스에 대해 하나 이상의 페르소나가 존재한다는 사실을 충분히 인지한다.


학습정리

사용자 모델링의 이해

 - 시스템의 개발 목적에 따라 사용자의 행동을 체계적으로 파악해 나가는 과정이다.

 - 사용자 모델링은 사용자 분석 내용을 시스템에 구현하고 구체화시키는 과정이다.

 - 사용자 모형(model)구분 : 인지적 모형, 역할 모형, 사회기술 모형

멘탈 모델의 이해와 활용

 - 사람들의 행동 동기, 사고 과정뿐만 아니라 그들이 행동하는 감성적, 철학적 배경에 대해서도 깊이 이해하는 데 효과적인 방법이다.

 - 사람들이 하는 행동에 대해 그들과 이야기하고, 패턴을 찾고, 그 패턴을 모두 포괄하는 하나의 모델로 정리하는 일

페르소나의 작성

 - 목표 대상의 인구학적 연구에서 만들어진 데이터에 사람의 개성을 부여함으로써 보다 인간적인 접근을 하고 동감을 느끼는 것이 가능하도록 하여 목표 대상에 보다 집중하는데 도움이 된다.


10강 UX기획 및 컨셉메이킹 방법론


1. UX 기획 및 디자인 전략 기초

- UX 기획과 전략의 기본 지식

사용자경험(UX)디자인이란?

- UX Design은 실제 사용자의 컨텍스트와 니즈를 읽고, 그것을 제품/서비스로 만들어내는 '방법론'이다.

- UX의 핵심은 '사용자에게 어떤 가치를 제공할까'를 고민하는 '가치중심적 사고'를 기반으로 제품서비스를 디자인/설계한다.

UX 목표 : 사용자를 위한 디자인

- UX는 보기 좋은 시각물을 만드는 것이 아니라, 풍부한 사용자 경험을 제공하는게 목표이다.

- 양질의 사용자경험을 제공하기 위해서는 사용자를 깊이있게 이해하는 것이 필요하다.

- 사용자를 이해하는 것은 특정한 컨텍스트에서 사용자들이 인지적/감성적/행위적 특성을 발견하는 일이다.

- UX의 가장 중요한 것은 사용자의 니즈의 도출과 욕구충족이다.

UX 기획의 기본 요소

- 사용자 맥락(User Context)

사용자의 제품서비스의 사용상황(시간, 장소)과 사용 전후의 전반적인 맥락

- 사용자 니즈(User Needs)

UX 대상(제품/시스템/서비스)으로 부터 특정한 만족감을 얻으려는 사용자들의 기대

- 사용 동기(User Motives)

사용자들의 행동을 불러일으키는 직접적인 발화제

- 사용자 태도(User Attitude)

UX 대상에 대해 갖는 개인의 취향과 선호, 선험적인 믿음과 정보

- 사용자 행위(User Behavior)

UX 대상을 사용하는 과정에서 드러나느 반복적인 행동패턴

사용의 경험 가치

실용성, 용이성, 효율성, 느낌

사용성의 극대화

사용자 인터페이스(UI), 효과성, 효율성, 만족도


2. UX 컨셉 도출과 디자인프로세스의 이해

- 컨셉 모델(Concept Model)

- 머리속의 생각들을 가시화 시키는 기초작업 : "아이디어 + 기획"의 시각화

    "서비스와 기능이 어떤 구조로 형성되는지 그려내는 시각화의 초기 단계의 방법론이다.

- UX 기획에 있어 컨셉모델의 역할

- 사용자분석과 사용 모델을 바탕으로 실제 사용자경험의 컨셉모델을 만들어 개별 경험 요소들이 어떻게 디자인에 반영될 지에 대한 방향을 잡아 준다.

- 기획 초기에 컨셉 모델을 그려놓고 시작하면 협업자간 커뮤니케이션에 큰 도움이 된다.

- UX 기획 및 디자인프로세스의 이해

- 비즈니스 전략

비즈니스 목표와 비전의 이해, 브랜드전략, 시장/경쟁사 분석 등

- UX 리서치와 디자인전략 수립

사용자분석, 요구사항 도출, 페르소나, 사용자 인터뷰 등

- UX 디자인 컨셉

사용자 테스트, 아이데이션, 컨셉모델 등

- UX 디자인 개발 수행

스토리보드, 와이어프레임, 키스크린, UI개발, 사용자테스트 등


3. 프로토타이핑(prototyping)

- 프로토타이핑의 목적

프로토타입의 개념

- 프로토타입은 시제품이 나오기 전 제품의 원형을 의미한다.

- 제품, 또는 시스템의 미완성 버전 또는 중요한 기능들이 포함되어 있는 시스템의 초기 모델로 활용된다.

- 프로토타입은 사용자의 모든 요구사항이 정확하게 반영될 때까지 계속해서 개선/보완된다.

프로토타입의 목적 및 장점

- 프로토타입핑의 장점은 최종 사용자가 초기 모델을 사용하면서 평가할 수 있어, 시제품의 개선 보완할 부분의 파악이 용이하다는 점이다.

- 프로토타입은 개발자와 사용자의 의사소통의 채널이고, 언제든지 변경이 가능한 유연성을 갖고 있다.

- 디자인, 개발팀 간 시제품 디자인 검토 및 협업을 도와 주고 UI 설계 시 발생되는 여러 개발이슈에 대한 의사결정에 도움을 준다.

- 개발 주기의 단축과 사용자의 요구사항을 정확히 파악해 사용성의 만족도를 향상시킬 수 있다.

- 프로토타이핑 방법론

저수준 프로토타이핑(Low-fidelity prototyping)

- 저수준 프로토타이핑은 빠른 시간 안에 프로토타입 제작이 필요한 경우에 사용되는 방법

- 주로 페이퍼 프로토타이핑(paper prototyping) 기법을 사용

- 초기 아이디어 구현 단계에서, 사용자의 반응을 확인하고 사용자로 부터 요구사항을 빠르게 파악하기 위한 목적

고수준 프로토타이핑(High-fidelity prototyping)

- 디자인의 시제품, 애플리케이션의 베타 버전 등의 최종 완성물과 동일한 프로토타입을 제작

- 제품, 시스템 전체 기능과 서비스, 디자인 평가 보다는 발견하지 못한 작은 문제점을 수정하기 위한 목적

수평적 프로토타이핑(Horizontal prototyping)

- 다양한 기능을 반영하여 최종 제품서비스를 전반적으로 예상해 볼 수 있음.

- 세부적인 상세한 기능 정보 설계가 아닌 인터페이스의 표층만을 사용하기 때문에, 프로토타입의 크기가 작고 메뉴의 하위에 대한 작업은 진행되지 않은 상태의 프로토타이핑

수직적 프로토타이핑(Vertical prototyping)

- 제품과 시스템의 많은 기능 중, 주요 기능만을 선별해 세부 기능까지 상세하게 구현하는 방법

- 인터페이스의 몇 가지 경로만 완전히 실행되게 만들고 나머지 경로는 포함되지 않음

- 주요 기능 메뉴의 모든 하위 동작이 실행되기 때문에 사용자가 실제로 사용할 수 있도록 제작함.

- 프로토타이핑의 과정(5단계)

1단계 : 사용자 요구사항 분석

2단계 : 프로토타입 설계/스케치

3단계 : 프로토타입 개발

4단계 : 사용자 평가(수정/보완 반복)

5단계 : 프로토타입 정제


학습정리

UX 기획 및 디자인 전략 기초

 - UX 목표 : 사용자를 위한 디자인

 - UX Design은 사용자를 이해하는 '방법론'이다.

 - UX의 핵심은 '사용자에게 어떤 가치를 제공할까'를 고민하는 '가치중심적 사고'를 기반으로 제품서비스를 디자인/설계한다.

UX 컨셉 도출과 디자인프로세스의 이해

 - 컨셉 모델(Concept Model) : 아이디어와 기획을 시각화하는 작업

 - UX기획 및 디자인프로세스의 이해

 - 비즈니스 전략 → UX 리서치와 디자인전략 수립 → UX디자인 컨셉 → UX 디자인 수행

프로토타이핑

 - 개발 주기의 단축 과 사용자의 요구사항을 정확히 파악해 사용성의 만족도를 향상시킬 수 있다.

 - 프로토타이핑 유형 : 고/저수준 프로토타이핑, 수평/수직적 프로토타이핑


11강 UI 스토리보드 작성과 UI 상세설계 가이드


1. UI 스토리보드의 정의와 목적

- 스토리보드(Storyboard)의 이해

Storyboard란, UX구현에 수반되는 사용자와 태스크, 인터페이스 간 상호작용을 시각화하여, 개발자/디자이너와의 의사소통을 돕는 도구이자, 완성해야 할 앱서비스와 예상되는 사용자경험을 미리 보기 위한 방법론이다.

- UI 스토리보드의 목적

모바일앱에 필요한 기능 조각들 간 관계의 설계

- 앱 설계에 필요한 조각들을 모아서 순서대로 놓고, 배치해보고, 쌓아서 조립하는 과정

- 실제 개발 단계에서 발생할 수 있는 문제점을 미리 발견하고 대처하기 위한 과정


2. UI 스토리보드의 구성요소

- 스토리보드(Storyboard)의 활용

UX 스토리보드의 작성 프로세스

- 사용자 시나리오를 시각화하면서 평가하는 과정을 거친다

- 사용자 Task에 따른 세부적인 기능들 간의 흐름과 관계망을 파악할 수 있다.

- 개발자와 사용자 간의 피드백을 받으면 스토리보드를 재정비할 수 있다

UX Concept → 기능 → 순서 → 관계 → 구조 → 설계 → 연결 → 검증 → 디자인 개발         

- UI 스토리보드 작성 프로세스

UX 스토리보드의 구성요소

- Feature list : UX concept/UX Needs의 구현에 필요한 기능 리스트

- User Task-flow : 해당 기능수행과 사용자의 행위 매핑 및 흐름도

- Information Architecture(IA) : 정보의 구조화와 위계관계망(우선순위)

- Wireframe : 해당기능 구현을 위한 인터페이스 요소의 배치와 화면 구조

- Workflow : 여러 개의 와이어프레임 또는 개별 기능 간 화면 전환 흐름도


3. UI 상세 화면 설계(Skeleton) 방법론

UI 상세 화면 설계 프로세스

Feature List → Task Flow → Process Diagram → IA → Wire-frame → Work-flow

UI feature 리스트 작성 단계

- UI 구현에 수반되는 앱시스템, 서비스, 장치 등 인터페이스 Feature 목록 나열하고 앱 개발에 필요한 기능들을 추출하고 우선순위를 정의하는 단계

→ 사용자의 니즈를 충족시키기 위한 앱의 기능들을 나열한다.

→ 우선순위 설정 방법에 따라 기술된 기능의 우선순위를 정한다.

→ 기능간의 포함관계를 고려하여 삭제 및 추가한다.

→ 정의된 기능들에 대해 우선순위를 설정한다. 

User Task-Flow 작성 단계

- 기능수행을 위한 사용자의 행위 순서(흐름)로 나열하고 검증하는 단계

(각 페이지마다 가지고 있는 기능을 그리면 된다)

Process Diagram 작성 단계

- 각 기능들 사이 관계(조건과 실행)를 정립하여 구조화하는 단계

(각 페이지들과의 관계를 Yes/No로 프로세스 흐름대로 표시한다.)

IA(Information Architecture) 구조화 단계

- 각 기능들을 정보의 위계와 관계망으로 구조화하기

(기업 조직도처럼 기능별로 조직도를 그린다)

Wireframe 설계 단계

- 해당기능 구현을 위한 인터페이스와 실제 화면에 그려보기

(각 화면을 그림으로 그려보는 것이다.)

Workflow 설계 단계

- 화면전환 및 화면 간 상호작용 및 시뮬레이션 해보기

(Wireframe으로 만들어낸 설계를 화면전화이 발생시 어떤 기능을 가지는지 작성하는 것이다.)


학습정리

UI 스토리보드의 정의와 목적

 - UX구현에 수반되는 사용자와 테스크, 인터페이스 간 상호작용을 시각화하여,

 - 개발자/디자이너와의 의사소통을 돕는 도구이자

 - 완성해야 할 앱서비스와 예상되는 사용자경험을 미리 보기 위한 방법론이다.

UI 스토리보드의 구성요소

 - 스토리보드는 사용자 Task에 따른 세부적인 기능들 간의 흐름과 관계망을 파악할 수 있다.

 - UX 스토리보드의 구성요소 :

    Feature list, User Task-flow, Information Architecture(IA), Workflow

UI 상세 화면 설계(Skeleton) 방법론

 - UI 상세 화면 설계 프로세스

    1) UI feature 리스트 작성 단계

    2) User Task-Flow 작성 단계

    3) Process Diagram 작성 단계

    4) IA(Information Architecture) 구조화 단계

    5) Wireframe 설계 단계

    6) Workflow 설계 단계


12강 UI 디자인 패턴과 UI 가이드문서 작성


1. UI 디자인 패턴과 적용 가이드

- 접근성과 항해성 관련 UI 패턴

사용자가 인터페이스를 사용하면서 경헝하게 되는 기능 및 이벤트/컨텐츠의 방위(orientation)와 경로(path)의 인지와 탐색을 위한 UI 패턴

- Side Menu(drawer)

- Action Bar(Android)

- Dropdown Navigation

- Dash board

- Pop-over Navigation

- Side Menu(drawer)

- 메뉴(이벤트) 호출/컨텍스트 유지

- 여러 가지 기능을 화면 내 배치하지 않고, 좌우 Side Menu로 숨겨진 공간에 배치하여 화면 내 구성요소 단순화

- 장점 : 화면 내 공간 효율성 각 기능 간 context 분리가 명확

- 단점 : 다른 기능 수행 시 현재 화면 유지가 어려움

- Action Bar(Android)

- 접근성 향상

- 전체 페이지 내 공통된 2~3개의 기능을 항상 제공하면서 접근이 자주 있는 기능의 배치

- 장점 : 모든 페이지에서 일관되게 제공되는 형태를 통해 주요기능에 대한 접근성 확보/공간 효율

- 단점 : 상단 바에 너무 많은 기능이 제시되면 혼잡도 증가

- Dropdown Navigation

- 접근성/공간 절약

- 메뉴들을 숨겼다가 펼쳐서 해당 메뉴 선택하여 이동하는 경우, 세부 카테고리가 위에서 아래로 펼쳐지는 구조

- 장점 : 각 기능/메뉴 간 전환이 쉽고 빠름. 3D 효과와 함께 제시함으로써 시각적으로 쉽게 인지 가능

- 단점 : 각 기능간 타이틀 바를 표시하므로 공간 활용 비효율적, 3D 효과로 인해 인지적 부담 유발 가능

- Dash board

- 카테고리 커스텀

- 사용자 관련 데이터를 가공하고 개인화하여 보여줄 때, 복수의 기능 카테고리를 한 페이지 안에 표시

- 장점 : 주로 아이콘과 함께 표시되어 어떤 컨텐츠를 담고 있는지 직관적으로 확인할 수 있음

- 단점 : Dash Board 내 제시 가능한 카테고리 개수가 제한적임(스크롤로 보완 가능)

- Pop-over Navigation

- navi-컨텍스트 유지

- 메뉴 개수가 4~5 이상이고 페이지간 전환시 Navi-context유지(머물러 있는)가 필요할 때, 버튼을 눌렀을 때 메뉴나 기능이 화면 위에 오버레이(overlay) 형태로 표시

- 장점 : 화면 위에 이동 가능한 메뉴나 접근 가능한 기능들을 제시 가능

- 단점 : 메뉴 제공 시 화면의 일부를 덮을 수 있음

- 학습성 관련 UI 패턴

처음 사용자, 또는 초급 사용자를 위해 시각적 언어와 익숙한 사용성을 제공하여 학습성을 높이기 위한 UI 패턴

- Guide Text

- Coach Mark

- Guide Text

- 데이터 입력 방식의 학습성

- 사용자가 처음 페이지에 진입하여 데이터가 없을 때, 또는 데이터 입력 필드에서 해당 필드 내 입력될 데이터를 텍스트로 안내

- 장점 : 해당 영역에서 필요한 설명을 그 안에서 설명해주므로 직관적이고, 사용자의 행동을 유도할 수 있음

- 단점 : 텍스트 양이 너무 많아질 경우 화면이 복잡해질 수 있음

- Coach Mark

- 학습성/특정 피쳐

- 앱 실행 후 처음 접하는 기능과 인터렉션 등을 좀더 자세히 페이지 상에서 설명

- 장점 : 직접 인터랙션을 따라 하게 유도할 수도 있음

- 단점 : 모든 사용자에게 제공하여 번거로울 수 있음

- 공간 효율성 관련 UI 패턴

단위화면(기능) 구조의 컴포넌트화를 통해 접근성을 높이고 최대한 화면 공간 구성의 효율성을 확보

- Compose Screens

- Contextual Hovering Menu

- Card UI

- Compose Screens

- 접근성/멀티 이벤트

- 메시지를 작성하는 화면으로 키보드 상단에 수행 가능한 액션들을 제공하여 추가 기능에 대한 접근성을 높임

- 장점 : 텍스트 입력 외에 추가적인 기능도 페이지 전환 없이 바로 수행이 가능하고, 추가 기능을 강조할 수 있음

- 단점 : 화면의 절반을 차지하는 키보드 위에 추가로 1줄을 더 차지하므로 공간 활용이 비효율적.

- Contextual Hovering Menu

- 접근성/멀티 이벤트

- 모든 페이지에서 수시로 접근해야 하는 기능이 있을 경우, 화면 낸 상시로 떠있는 형태의 메뉴 아이콘 제공

- 장점 : 수시로 접근해야 하는 기능을 할당하여 모든 페이지에서 접근성을 높임

- 단점 : 화면 내 항상 일부 영역을 차지하므로, 해당 영역에 이미지나 주요 정보를 가릴 수 있음

- Card UI

- 유연한 레이아웃

- 다양한 컨텐츠를 카드 형태로 나열하여 보여줌

- 장점 : 컨텐츠의 개수가 늘어나도 정렬/그룹/확장 등을 통해 레이아웃을 유동적으로 대응할 수 있음

- 단점 : 텍스트가 위주인 컨텐츠에는 적당하지 않음


2. OS 별 앱 UI 구조와 특성

- iOS : Human Interface Guideline

컨텐츠 중심(Defer to content)

- 사용자가 컨텐츠를 이해하고 상호작용 하는 것을 도와줘야 하는 반면, 컨텐츠에 집중하지 못하도록 방해해서는 안된다.

- 전체 화면을 최대한 활용

- 각종 UI 요소는 최대한 절제, 사용자가 컨텐츠에 집중할 수 있도록 함

- 반투명 컨텐츠 레이어 뒤에 현재 작업의 힌트를 제공해서 문맥(context) 유지

시각적 명료성(Provide Clarity)

- 글꼴은 읽기 쉽게, 아이콘은 이해하기 쉽게, 장식적인 요소는 절제

- 여백을 적극적으로 활용

- 색 사용을 절제하여 컨텐츠 강조, 키 컬러를 통해 주요 기능 강조

- 자동으로 자간, 행간을 조정하는 시스템 폰트 활용

정보와 시각의 계층 구조 활용(Depth for Communication)

- 상호작용을 위한 정보와 시각의 계층 구조 활용, 눈으로 보여지는 요소들은 층 구성(layered)으로 이루어져 사용자의 이해를 돕고 재미를 추가한다.

- 정보를 별도 레이어로 표시하여 작업 문맥(context) 유지

- 상위 레이어를 통해 폴더를 표현하고 폴더 내 컨텐츠와 스크린을 분리

- 카테고리 구분을 레이어 형태로 표현

- Android : Human Interface Guideline

사용자를 매혹하기(Enchat Me)

- 애니메이션, 사운드 효과 등을 통해 사용자를 자극하거나 사용자가 좀 더 원하는 기능을 맞춤 기능으로 제공

- 표면의 미적 요소나 애니메이션, 사운드 효과를 통해 사용자를 자극

- 사용자가 직접 터치하고 조작할 수 있는 형태의 버튼을 제공

- 주요 기능을 저해하지 않는 범위 내에서 맞춤 기능 제공

- 사용자가 매번 선택하도록 요구하기보다, 이전 선택을 기반으로쉽게 접근하도록 제시

사용자 생활을 단순하게 만들기(Simplify My Life)

- 텍스트보다는 사진으로 정보를 전달하고, 너무 복잡한 기능은 뒤에 숨겨두어 앱 사용 방식을 단순화

- 가능한 간단한 단어로 이루어진 짧은 문구를 사용

- 기능을 시각적으로 단순하게 만들기보다 눈에 띄게 만들어서 기능적 차이를 알아볼 수 있게 하고, 같은 방식으로 작동하도록 제공 

- 현재 필요하지 않은 옵션은 숨기고 작업 진행 상황에 맞게 옵션을 표시

- 정말 중요한 태스크를 제외하고는 작업을 중단하는 일은 최소화

사용자를 놀라게 만들기(Make Me Amazing)

- 복잡한 태스크를 쉽게 완료할 수 있도록 세분화하고 명료한 피드백을 제공하거나, 복잡한 기능을 손쉽게 활용할 수 있도록 간편한 방법으로 제공

- 사용자가 자기 탓으로 느끼지 않도록 명확한 복구 지침을 제공

- 복잡한 태스크를 쉽게 완료할 수 있도록 여러 단계로 나누고, 미묘한 피드백이라도 제공

- 초보자들이 하기 힘든 기능은 단축키와 같이 쉽게 접근할 수 있는 형태로 제공

- 화면 내 중요한 기능을 쉽게 찾고 수행할 수 있도록 제공


3. UI 설계 문서의 작성 방법론

- UX/UI 개발 프로세스의 이해

UX/UI 기획 → UI 설계문서 → GUI 디자인 → GUI 가이드라인 → Coding 개발

- UX/UI 기획의 주요 산출물

사용자요구 분석( User Need Analysis)

사용자분석 리서치 → 페르소나 작성 → 사용성 테스트

정보/컨텐츠 개발전략 문서(Contents Strategy)

벤치마킹 → 컨셉모델 → (정보)컨텐츠 인벤토리/IA 문서

- UI 설계문서(UI document)

UI 설계문서의 개념과 목적

- UX 기획 설계를 토대로 해당 프로젝트의 실물 개발에 필요한 이미지 리소스, 텍스트 크기, 기타 컴포넌트의 속성 및 위치 등 UI 개발을 위한 일종의 설계도면과 같다

- 디자인을 개발하기 위한 설명서, 즉 개발자와 디자인 실무자를 연결해주는 일종의 협업 도구이기 때문에 개발자가 쉽고 원활히 알아볼 수 있도록 문서를 작성하는 것이 중요하다.

UI 설계문서의 구조와구성요소

- 프로젝트 정의/목적, 기본 규칙(Basic Rule), 세부 화면 정의, 수정보완 업데이트 히스토리 등

- 주요 내용 : 태스크 플로우차트, 와이어프레임, IA, 키스크린, 스토리보드 등


학습정리

UI 디자인 패턴과 적용 가이드

 - 접근성과 항해성 관련 UI 패턴

 - 학습성 관련 UI 패턴

 - 공간 효율성 관련 UI 패턴

OS 별 앱 UI 구조와 특성

 - iOS : 컨텐츠 중심, 시각적 명료성, 정보와 시각의 계층 구조

 - Android : 사용자를 매혹하기, 단순하게 만들기, 사용자를 놀라게 만들기

UI 설계 문서의 작성 방법론

 - UX/UI 기획의 주요 산출물 : 사용자 요구분석, 정보/컨텐츠 개발전략 문서, UI 설계문서

 - UI 설계문서는 UX기획을 토대로 해당 프로젝트의 실물 개발에 위한 일종의 설계도면과 같다.




'Legend 개발자 > T아카데미' 카테고리의 다른 글

Spring Framework  (0) 2017.09.07
모바일 GUI 디자인  (0) 2017.09.05
jQuery (JavaScript)  (0) 2017.09.02
컴퓨터 알고리즘 중급  (0) 2017.08.31
JavaScript  (0) 2017.08.30
Posted by 전설의아이
|

9강 jQuery와 jQuery Mobile 개요

- jQuery는 John Resig에 의해 2006년 1월 BarCamp NYC에서 발표된 오픈소스 자바스크립트 프레임워크

- 'Write Less, Do More'

- DOM의 쉬운 조작에서부터, 쉽고 일관된 이벤트 처리, 각종 효과 기능 제공을 통한 쉬운 시각화 지원, 쉬운 Ajax 지원, 쉬운 내장형 객체의 확장까지 자바스크립트의 전반을 지원하는 프레임워크

- jQuery UI라고 불리는 UI기능을 포함해 JQuery 기반의 프러그인 라이브러리가 많음

- jQuery Mobile 스마트 디바이스 프레임워크는 현재 가장 많은 스마트 디바이스 지원 범위를 가지는 프레임워크

- 2010년 8월 프로젝트를 공식 발표함

- jQuery Mobile은 iOS 휴먼 인터페이스 가이드라인의 흐름을 적용한 스마트 디바이스용 프레임워크로 폭넓은 스마트 디바이스 지원과 더불어 시멘틱 웹의 HTML을 전제로 설계되어 있기 때문에 높은 접근성을 제공함

- 마크 업 기반의 개발 스타일을 채택하고 있어서 복잡한 자바스크립트 코드없이 HTML 태그의 속성 조작만으로도 간단한 웹 앱 제작이 가능

- HTML5와 CSS3기반의 사용자 인터페이스, 페이지 이동 애니메이션 Ajax 통신 지원 등 스마트 디바이스에 최적화된 기능을 제공하며, jQuery 기능을 활용하면 좀 더 고급스러운 기능을 가진 웹 앱을 구현할 수 있음

 

jQuery

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>09-01</title>
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            // 여러분의 코드는 여기에...
        </script>
    </head>
    <body>
 
    </body>
</html>
cs

 

jQuery 모바일

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>09-02</title>
        <link rel="stylesheet" href="js/jquery.mobile-1.4.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.4.2.js"></script>
        <script type="text/javascript">
            // 여러분의 코드는 여기에...
        </script>
    </head>
    <body>
 
    </body>
</html>
cs

 

9강끝

 

10강 jQuery 기본

 

1. jQuery 핵심 개념

- jQuery는 자바스크립트에서 DOM 객체를 질의(query)해조작한다는 의미를 강조하듯이, 문서 탐색 및 조작을 위한 보다 쉬운 노드 접근 기술을 제공

- HTML DOM과 자바스크립트 사이의 상호작용을 간단하게 해주는 것이 jQuery의 가장 큰 특징

- jQuery는 HTML DOM 객체에 접근 하기 위해 셀렉터(selector) 매커니즘을 사용

- CSS 셀렉터로 문서의 특정 노드를 찾을 수 있음

 

2. jQuery() 와 $()

- jQuery()는 HTML DOM의 특정 노드에 접근하거나, DOM 요소를 생성하거나, DOM구조의 로딩을 완료한 후 실행할 콜백함수를 지정하기 위해 사용하는 함수

- ()안에 매개변수 셀렉터를 기술하면 셀렉터를 해석해 HTML DOM 구조 상의 노드를 찾아 jQuery 객체로 변환해 반환하고, HTML 태그 문자열이 매개변수로 전달되면 HTML DOM 요소를 생성하고, 매개변수로 함수가 전달되면 콜백함수로 등록하여 DOM 로딩 완료시 호출함

- jQuery 객체가 반환되면 해당 객체와 이벤트를 바인딩하거나, 효과를 연결하는 작업이 가능

- jQuery의 별칭으로 $를 사용할 수 있어 $()를 더 많이 사용함

- jQuery 객체의 메소드는 jQuery 객체 자신을 반환 값으로 전달하기 때문에 메소드 체인 구성이 가능

 

3, jQuery(document).ready(function(){...})

- jQuery 이벤트인 문서 로딩 이벤트에 대한 이벤트 핸들러를 구현할 때 사용

- 매개변수로 전달된 document 객체를 jQuery 객체로 변환하고, jQuery 객체의 프로토타입 멤버인 ready() 메소드의 매개변수인 함수가 문서 로딩 이벤트의 이벤트 핸들러 함수로 등록됨

- 주로 익명함수를 매개변수로 사용 $(document).ready(function(){...})형태로도 사용

- HTML 문서는 가장 먼저 DOM 구조가 로딩되고, 이어서 이미지와 같은 요소 컨텐츠들이 로딩

- 이후 Window 객체가 로딩되고, 웹 브라우저에서 Window 객체의 load이벤트가 발생되는데, ready() 메소드에 전달되는 이벤트 핸들러 함수의 호출 시점은 DOM 구조가 로딩이 완료되었을 때임

- 화면의 초기 상태를 제어하는 코드나 요소의 이벤트 핸들러를 등록하는 코드가 주로 기술됨

- jQuery(document).ready(function(){...})와 jQuery(function(){...})는 기본적으로 문서 로딩 이벤트 핸들러를 여러 개 등록할 수 있도록 지원

- 이 함수들은 HTML의 load 이벤트와는 다른 시점의 이벤트를 지원하기 때문에, DOM 구조 로딩 후 리소스들의 로딩이 완료되기 전과 후를 분리해 처리할 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>10-01</title>
        <style type="text/css">
            div {
                font-size: 12pt
            }
            .header {
                color: #000080;
                font-size: 24pt;
            }
            .content {
                color: #008000;
            }
            .footer {
                color: #800080;
                font-size: 14pt;
            }
        </style>
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                $('#header').addClass('header');
                $('#content').addClass('content');
                $('#footer').addClass('footer');
            });
        </script>
    </head>
    <body>
        <div id="header">
            <p>
                jQuery
            </p>
        </div>
        <div id="content">
            <p>
                jQuery는 John Resig에 의해 2006년 1월 BarCamp NYC에서 발표된
                오픈소스 자바스크립트 프레임워크로 'Write Less, Do More' 컨셉을
                가진 프레임워크입니다. DOM의 쉬운 조작에서부터, 쉽고 일관된 이벤트
                처리, 각종 효과 기능 제공을 통한 쉬운 시각화 지원, 쉬운 Ajax 지원,
                쉬운 내장형 객체의 확장까지 자바스크립트의 전반을 지원하는 프레임워크
                입니다. jQuery UI라고 불리는 UI 기능을 포함해 jQuery 기반의 플러그인
                라이브러리가 많습니다.
            </p>
        </div>
        <div id="footer">
            <p>
                &copy; 2014 T academy
            </p>
        </div>
    </body>
</html>
cs

 

 

 

11강 셀렉터 

 

1. 셀렉터

- jQuery의 셀렉터(selector)는 문서 내의 노드를 쉡게 식별하고 참조하기 위해 사용하는 기술로 CSS 셀렉터와 동일

- jQuery가 자체적으로 제공하는 필터도 있음

 

2. HTML 요소 접근과 jQuery 객체화

- jQuery에서는 $() 함수의 매개변수 값으로 셀렉터를 전달하면 셀렉터를 해석해 DOM에서 노드를 찾아 jQuery 객체로 변환해서 반환함

- 이 때 사용하는 셀렉터의 종류는 기본 셀렉터, 계층 셀렉터, 속성 셀렉터 그리고 필터 셀렉터가 있음

 

3. HTML 요소 접근과 jQuery 객체화 - 기본 셀렉터

$('*')

$('h3')

$('.content')

$('#message')

$('div, .header, #menu')

분류 

셀렉터 

기능 

Basic(기본) 

모든 요소를 선택 

 #id

id값을 가진 요소를 선택 

 .class

class속성 값을 가진 요소를 선택 

 element

요소를 선택 

 selector1, selector2, selector3

복수의 셀렉터 중 일치하는 것을 선택 

 

 

4. HTML 요소 접근과 jQuery 객체화 - 계층 셀렉터

$('div#lectures li')

$('div>p')

$('#first + li')

$('#second ~ li')

- 자식은 바로 밑에 있는 요소를 의미하고

- 자손은 자식 밑에 있는 자식들의 요소까지를 포함한다.

- first, second는 다음 형제요소를 나타낼 때 사용한다

분류 

셀렉터 

기능 

Hierarchy 

ancestor descendant 

ancestor 요소의 모든 자손 요소 descendant를 선택 

parent > child 

parent 요소 자식 요소를 선택 

prev + next

prev 요소 다음의 형제 요소 next를 선택 

prev ~ siblings

prev 요소 다음의 형제 요소들 siblings를 선택 

 

5. HTML 요소 접근과 jQuery 객체화 - 속성 셀렉터

$('div#lectures li[href='#lec03']')

$('div#reference li[href^='http://']')

$('[src][alt]')

- 속성 셀렉터의 큰 특징은 [] 안에 속성을 기술한다.

분류

셀렉터 

기능 

Attribute 

[attr] 

attr 속성을 가지는 요소를 선택 

[attr=value] 

attr 속성 값이 value인 요소를 선택

[attr!=value] 

attr 속성 값이 value가 아닌 요소를 선택

[attr^=value]

attr 속성 값이 value로 시작하는 요소를 선택

[attr$=value]

attr 속성 값이 value로 끝나는 요소를 선택

[attr*=value]

attr 속성 값에 value를 포함하는 요소를 선택

[selector1][selector2][selector3]

셀렉터에 일치하는 속성을 가지고 있는 요소를 선택

 

6. HTML 요소 접근과 jQuery 객체화 - 필터 셀렉터

분류

셀렉터 

기능 

Basic 

:animate 

show, hide, slideUp, slideDown 등의 명령으로 현재 애니메이션 중인 요소를 선택 

:first 

첫번째 요소를 선택 

:last 

마지막 요소를 선택 

:not(selector)

selector에 의해 선택된 요소들 이외의 것을 선택 

:even 

짝수번째의 요소를 선택 

:odd 

홀수번째 요소를 선택 

:eq(index)

index와 같은 index의 요소를 선택 

:gt(index)

index와 같은 index의 요소를 선택 

:lt(index)

index와 같은 index의 요소를 선택 

:header

h1, h2, ... 요소를 선택 

Content

:contains(text 

text 문자열을 내용으로 가지고 있는 요소를 선택 

:empty 

요소에 텍스트가 없을 경우 요소를 선택 

:has(selector) 

selector에 일치하는 자손 요소를 가지고 있는 요소를 선택 

:parent 

:empty와 반대로 요소에 텍스트가 있을 경우 선택 

Visibility

:hidden 

보이지 않는 요소를 선택 

:visible 

보이는 요소를 선택 

Child

:nth-child(index) 

index번째 자식 요소를 선택. index는 1부터 시작함에 유의.

:nth-child(even | odd)

짝수/홀수번째 자식 요소를 선택

:nth-child(Nn)

N배수번째 자식 요소를 선택 

:first-child 

첫번째 자식 요소를 선택

:last-child

마지막 자식 요소를 선택

:only-child

자식 노드가 하나인 요소를 선택 

Forms

:hidden 

숨겨진 입력 요소를 선택 

:enabled

사용 가능 상태에 있는 요소를 선택 

:disabled

사용 불가능 상태에 있는 요소를 선택

:checked

체크 상태에 있는 요소를 선택

:selected

선택 상태에 있는 요소를 선택 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>11-01</title>
        <style type="text/css">
            div {
                font-size: 12pt;
                line-height: 16pt;
            }
            .header {
                color: #000080;
                font-size: 24pt;
            }
            .content {
                color: #008000;
            }
            .footer {
                color: #800080;
                font-size: 14pt;
            }
            .evenitem {
                background-color: #4596CE;
                color: #FFFFFF;
            }
            .odditem {
                background-color: #FFF5BA;
            }
        </style>
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                $('#header').addClass('header');
                $('#content').addClass('content');
                $('#footer').addClass('footer');
 
                $('#list > div:nth-child(2n)').addClass('evenitem');
                $('#list > div:nth-child(2n+1)').addClass('odditem');
 
                var $elements = $('#list > div');
 
                $('#message').text('전체 강좌 ' + $elements.length + '건');
 
                var resultStr = '';
 
                $('<h4>강좌</h4>').appendTo('#result');
 
                $elements.each(function(index, element) {
                    resultStr = (index + 1+ '. ' + $(element).text();
 
                    $('#result').append(resultStr);
                    $('#result').append('<br/>');
                });
            });
        </script>
    </head>
    <body>
        <div id="header">
            <p>
                jQuery Selector
            </p>
        </div>
        <div id="content">
            <div>
                <p id="message"></p>
            </div>
            <div id="list">
                <div>
                    안드로이드
                </div>
                <div>
                    iOS
                </div>
                <div>
                    하이브리드 앱
                </div>
                <div>
                    모바일 앱 기획
                </div>
                <div>
                    UX
                </div>
            </div>
            <div>
                <p id="result"></p>
            </div>
        </div>
        <div id="footer">
            <p>
                &copy; 2012 T academy
            </p>
        </div>
    </body>
</html>
cs

- 통상 JavaScript 와 jQuery를 분리하기 위해서 jQuery앞에 $를 붙여서 구분한다.

- appendTo는 어디에 붙여라 라는 뜻

 

11강끝

 

12강 jQuery 이벤트 처리

 

1. 이벤트 종류

구분 

이벤트 

설명 

문서 로딩 

ready 

해당 DOM 로딩이 완료되었을 때 

마우스

click 

마우스로 클릭할 때 (자바스크립트 이벤트) 

dbclick 

마우스로 더블클릭할 때 (자바스크립트 이벤트) 

focusin

요소가 포커스를 얻을 때 

focusout 

요소가 포커스를 잃을 때(자바스크립트 이벤트 

hover

mouseenter와 mouseleave를 하나로 묶음 

mouseenter 

요소 안으로 마우스가 들어왔을 때 (자식 노드에서는 이벤트 감지 안함) 

mouseleave 

요소로부터 마우스가 벗어날 때(자식 노드에서는 이벤트 감지 안함) 

mousedown 

마우스 버튼을 눌렀을 때(자바스크립트 이벤트) 

mouseup 

마우스 버튼을 놓았을 때(자바스크립트 이벤트) 

mousemove 

마우스의 포인터를 이동하였을 때(자바스크립트 이벤트) 

mouseout 

요소로부터 마우스가 벗어날 때(자바스크립트 이벤트) 

mouseover 

요소 안으로 마우스 포인터가 들어왔을 때(자바스크립트 이벤트) 

키보드

keypress 

키를 눌렀을 때(자바스크립트 이벤트) 

keydown 

키를 누르고 있을 때(자바스크립트 이벤트) 

keyup 

키를 떼었을 때(자바스크립트 이벤트)  

focusin 

요소가 포커스를 얻을 때 

focusout 

요소가 포커스를 잃을 때(자바스크립트 이벤트)  

focus 

요소가 포커스를 얻을 때(자바스크립트 이벤트)  

blur 

요소가 포커스를 잃을 때(자바스크립트 이벤트)  

change

요소의 값이 변경되었을 때(자바스크립트 이벤트)  

select 

사용자가 텍스트를 선택했을 때(자바스크립트 이벤트)  

submit 

폼의 내용을 전송할 때(자바스크립트 이벤트)  

웹브라우저

resize 

요소의 사이즈가 변경되었을 때(자바스크립트 이벤트)  

scroll 

스크롤할 때(자바스크립트 이벤트)  

 

2. 이벤트 등록 및 제거

- jQuery는 이벤트 처리에 있어 크로스 브라우징 제공

- 이벤트를 요소에 등록하기 위해선 먼저 셀렉터를 이용해 이벤트를 처리하고자 하는 요소를 찾아 jQuery 객체를 생성한 후, on(), one(), off() 메소드 등을 이용하여 특정 이벤트에 대한 이벤트 핸들러를 등록하거나 제거함

 

3. 이벤트 등록 - on() 메소드

- on()메소드는 현재 선택된 요소에 대해 하나 이상의 이벤트와 이벤트 핸들러 함수를 연결하는 메소드

.on(events [, selector] [, data], handler(event))

.on(events-map [, selector] [, data])

- events : 스페이스로 구분된 하나 이상의 이벤트 문자열립니다.

- selector : 셀렉터 문자열은 이벤트가 트리가 되는 현재 선택된 요소의 자손 요소를 필터링합니다. 만일 null 값을 갖거나 생략되면 현재 선택된 요소에 이벤트가 도달했을 때 트리거됩니다.

- data : 이벤트가 트리거 되면 handler 함수에서 event.data 프로퍼티로 참조할 수 있습니다.

- handler(event) : 이벤트가 트리거 되면 실행되는 이벤트 핸들러 함수입니다.

- events-map : 스페이스로 구분된 하나 이상의 이벤트 문자열과 이벤트 핸들러 함수를 키: 값으로 구성한 맵입니다.

$('p').on('click', function(){

alert( $(this).text() );

});

$('body').on("click", "p", function(){

alert( $(this).text() );

});

function myHandler(event) {

alert(event.data.foo);

};

$('p').on('click',{foo: 'bar'}, myHandler);

$('form').on('submit', false);

$('form').on('submit', function(event) {

event.preventDefault();

});

$('form').on('submit', function(event) {

event.stopPropagation();

});

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>12-01</title>
        <style type="text/css">
            .test {
                color: #000;
                padding: .5em;
                border: 1px solid #444;
            }
            .active {
                color: #900;
                font-weight: bold;
            }
            .inside {
                background-color: aqua;
            }
        </style>
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                $("div.test").on({
                    click : function() {
                        $(this).toggleClass("active");
                    },
                    mouseenter : function() {
                        $(this).addClass("inside");
                        $(this).text("mouseenter");
                    },
                    mouseleave : function() {
                        $(this).removeClass("inside");
                        $(this).text("mouseleave");
                    }
                });
            });
        </script>
    </head>
    <body>
        <div class="test">
            ready
        </div>
    </body>
</html>
cs

 

4. 이벤트 등록 - one() 메소드

- one() 메소드 역시 현재 선택된 요소에 대해 하나 이상의 이벤트와 이벤트 핸들러 함수를 연결하는 메소드이지만, on() 메소드와 달리 한 번만 실행

.one(events [, selector] [, data], handler(event))

.one(events-map [, selector] [, data])

- events : 스페이스로 구분된 하나 이상의 이벤트 문자열립니다.

- selector : 셀렉터 문자열은 이벤트가 트리가 되는 현재 선택된 요소의 자손 요소를 필터링합니다. 만일 null 값을 갖거나 생략되면 현재 선택된 요소에 이벤트가 도달했을 때 트리거됩니다.

- data : 이벤트가 트리거 되면 handler 함수에서 event.data 프로퍼티로 참조할 수 있습니다.

- handler(event) : 이벤트가 트리거 되면 실행되는 이벤트 핸들러 함수입니다.

- events-map : 스페이스로 구분된 하나 이상의 이벤트 문자열과 이벤트 핸들러 함수를 키: 값으로 구성한 맵입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>12-02</title>
        <style type="text/css">
            div {
                width: 60px;
                height: 60px;
                margin: 5px;
                float: left;
                background: green;
                border: 10px outset;
                cursor: pointer;
            }
            p {
                color: red;
                margin: 0;
                clear: left;
            }
        </style>
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                var n = 0;
                $('div').one('click'function() {
                    var index = $('div').index(this);
                    $(this).css({
                        borderStyle : "inset",
                        cursor : "auto"
                    });
                    $('p').text(index + '번 인덱스에 있는 div가 클릭되었습니다.(총 ' + +++ ' 번 클릭됨)');
                });
            });
        </script>
    </head>
    <body>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <p>
            녹색 상자를 클릭하세요...
        </p>
    </body>
</html>
cs

 

5. 이벤트 제거 - off() 메소드

- off() 메소드는 현재 선택된 요소에 대해 하나 이상의 이벤트와 이벤트 핸들러 함수의 연결을 제거하는 메소드

.off(events [, selector] [, handler(event)])

.off(events-map [, selector])

- events : 스페이스로 구분된 하나 이상의 이벤트 문자열입니다.

- selector : 셀렉터 문자열은 현재 선택된 요소의 자손 요소를 필터링합니다.

- handler(event) : 이벤트와 연결을 제거하고자 하는 하나 이상의 이벤트에 연결되어 있는 이벤트 핸들러 함수입니다.

- events-map : 이벤트와 연결을 제거하고자 하는 스페이스로 구분된 하나 이상의 이벤트 문자열과 이벤트 핸들러 함수를 키 : 값으로 구성한 맵입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>12-03</title>
        <style type="text/css">
            button {
                margin: 5px;
            }
            button#theone {
                color: red;
                background: yellow;
            }
        </style>
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
 
                function aClick() {
                    $("div").show().fadeOut("slow");
                }
 
 
                $("#bind").click(function() {
                    $("body").on("click""#theone", aClick).find("#theone").text("이 버튼에 클릭 기능이 추가되었습니다...");
                });
                //body태그안에서 #theone이라는 아이디가 click이 되었을 때 aClick을 실행해라 
                $("#unbind").click(function() {
                    $("body").off("click""#theone", aClick).find("#theone").text("이 버튼은 클릭 기능이 제거되었습니다...");
                });
            });
        </script>
    </head>
    <body>
        <button id="theone">
            이 버튼은 클릭 기능이 제거되었습니다...
        </button>
        <button id="bind">
            클릭 기능 추가
        </button>
        <button id="unbind">
            클릭 기능 제거
        </button>
        <div style="display:none;">
            버튼이 클릭되었습니다!
        </div>
    </body>
</html>
cs

 

6. 이벤트 취소와 이벤트 전파 차단

- jQuery에서 이벤트 처리를 위해 이벤트 핸들러로 등록된 콜백함수가 호출될 때 인자로 jQuery 이벤트 객체가 전달되는데 이 이벤트 객체를 이용하면 쉽게 이벤트의 흐름을 제어할 수 있음

- 요소의 기본 액션을 취소하기 위해선 이벤트 등록 함수( on(), one() )의 콜백함수에 전달되는 jQuery이벤트 객체의 preventDefault()메소드를 호출함

- 특정 요소에서 발생한 이벤트의 버블링을 차단하기 위해선 이벤트 등록 함수( on(), one() )의 콜백함수에 전달되는 jQuery 이벤트 객체의 stopPropagation() 메소드를 호출함

$('form').on('submit', function(event){

...

event.preventDefault(); //form에 작성한 내용을 서버로 보내지 않겠다는 뜻

})

$('body').on('click', 'a', function(event){

...

event.preventDefault();//a링크의 링크기능이 비활성화됨

})

$('p').click(function(event){

event.stopPropagation(); //클릭 이벤트가 Bubbling되는 것을 방지하는 기능

...

})

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>12-04</title>
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
 
                $('a').click(function(event) {
                    event.preventDefault();
                    $('<div/>').append('<a> 태그의 기본 ' + event.type + ' 액션이 취소되어 있습니다.').appendTo('#log');
                });
 
            });
        </script>
    </head>
    <body>
        <a href="http://jquery.com">jquery.com</a>
        <div id="log"></div>
    </body>
</html>
cs

 

JavaScript 이벤트에서 했던 코드를 jQuery로 변경한 소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>12-05</title>
        <style type="text/css">
            div {
                cursor: pointer;
            }
            div#inner {
                background-color: #adff2f;
            }
            div#outer {
                background-color: #dda0dd;
            }
        </style>
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
 
                $('#outer').click(function(event) {
                    $('<div/>').append('외부 div를 클릭하였습니다.').appendTo('#log');
                });
 
                $('#inner').on('click'function(event) {
                    event.stopPropagation();
                    //inner 이벤트를 클릭했을 때 outer 이벤트가 발생할 수 있으니 
                       //이를 방지하기 위해서 event.stopPropagation()을 작성한 후 
                    //추가로 이벤트를 작성하였음.
                    $('<div/>').append('내부 div를 클릭하였습니다.').appendTo('#log');
                });
 
            });
        </script>
    </head>
    <body>
        <div id="outer">
            외부영역을
            <div id="inner">
                내부 영역을 클릭해 보세요!!!
            </div>
            클릭해보세요!!!
        </div>
        <div id="log"></div>
    </body>
</html>
cs

 

12강끝 

 

13강 jQuery 효과

 

1. 기본효과

- 기본효과는 HTML 요소를 보이거나 감추는 기능

- hide() 메소드는 요소에 대해 display:none을 적용하고, show()는 display:block 또는 display:inline을 적용함

- hide(), show(), toggle() 메소드를 사용하면 요소의 display 속성값을 jQuery 데이터 캐시에 저장해 두기 때문에 복원 시 display 설정을 이전 값으로 돌려줌

- hide() 메소드는 요소가 사라지는 애니메이션 효과를 주기 위해 사용

.hide()

.hide( duration [, callback] )

.hide( [duration] [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

- show() 메소드는 요소가 나타나는 애니메이션 효과를 주기 위해 사용

.show()

.show( duration [, callback] )

.show( [duration] [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

- toggle() 메소드는 show()와 hide()를 번갈아 실행시켜 애니메이션 효과를 주기 위해 사용

.toggle( duration [, callback] )

.toggle( [duration] [, easing] [, callback] )

.toggle( showOrHide )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

- showOrHide : 요소를 나타낼 것인지(true), 숨길 것인지(false) 알려주는 불리언 값입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>13-01</title>
        <script src="js/jquery-1.11.1.js"></script>
        <style type="text/css">
            div.card {
                background: #ece023;
                width: 30px;
                height: 40px;
                margin: 2px;
                float: left;
                line-height: 2;
                text-align: center;
                font-weight: bold;
                display: none;
            }
        </style>
        <script type="text/javascript">
            $(document).ready(function() {
                $("#show").click(function() {
                    $("div.card").first().show("fast"function showCard() {
                        $(this).next("div.card").show("fast", showCard);
                    });
                });
                $("#hide").click(function() {
                    $("div.card").last().hide("fast"function hideCard() {
                        $(this).prev("div.card").hide("fast", hideCard);
                    });
                });
            });
        </script>
    </head>
    <body>
        <div>
            <button id="show">
                보이기
            </button>
            <button id="hide">
                감추기
            </button>
        </div>
        <div>
            <div class="card">
                1
            </div>
            <div class="card">
                2
            </div>
            <div class="card">
                3
            </div>
            <div class="card">
                4
            </div>
            <div class="card">
                5
            </div>
        </div>
    </body>
</html>
cs

 

2. 페이딩

- 페이딩은 HTML 요소의 불투명도(opacity)를 조절하는 기능으로 fadeIn(), fadeOut(), fadeToggle(), fadeTo() 메소드를 사용해 요소를 점점 밝게 또는 점점 흐리게 보이도록 조절함

- fadeIn() 메소드는 요소가 display:none일 경우 display:block 또는 display:inline으로 복원하고, opacity를 0에서 1로 변경하여 서서히 나타나는 애니메이션 효과를 주기 위해 사용

.fadeIn( duration [, callback] )

.fadeIn( [duration] [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

- fadeOut() 메소드는 opacity를 1에서 0으로 변경하고, 모두 사라지면 display:none으로 변경해 서서히 사라지는 애니메이션 효과를 주기 위해 사용

.fadeOut( duration [, callback] )

.fadeOut( [duration] [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

- fadeToggle() 메소드는 fadeIn()과 fadeOut()를 번갈아 실행시켜 애니메이션 효과를 주기 위해 사용

.fadeToggle( [duration] [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

- fadeTo()메소드는 0~1 사이의 값을 가진 불투명도(opacity)를 지정하여 서서히 사라지거나 나타나는 애니메이션 효과를 주기 위해 사용

.fadeTo( duration, opacity [, callback] )

.fadeTo( duration, opacity [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- opacity : 0~1 사이의 불투명도를 나타내는 숫자 값입니다.

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>13-02</title>
        <script src="js/jquery-1.11.1.js"></script>
        <style type="text/css">
            .pictframe {
                color: #AAAAAA;
                border: 1px solid #444;
                width: 302px;
                height: 400px;
            }
            #image {
                position: relative;
                width: 302px;
                height: 400px;
                display: none;
            }
        </style>
        <script type="text/javascript">
            $(document).ready(function() {
                $("#fadein").click(function() {
                    $("#image").fadeIn(3000);
                });
                $("#fadeout").click(function() {
                    $("#image").fadeOut(3000);
                });
            });
        </script>
    </head>
    <body>
        <div class="pictframe">
            <img src="alaskan_malamute.jpg" id="image" />
        </div>
        <div>
            <button id="fadein">
                페이드인
            </button>
            <button id="fadeout">
                페이드아웃
            </button>
        </div>
    </body>
</html>
cs

 

3. 슬라이딩

- 슬라이딩은 HTML 요소의 높이를 조절하여 접었다 폈다(collapsible)할 수 있는 기능

- slideDown(), slideUp(), slideToggle() 메소드를 이용해 아코디언(accordian) 혹은 네비게이션 등에 많이 사용

- 이미지를 사용할 경우엔 반드시 블록 요소에 감싸서 블록 요소에 슬라이딩 효과를 주어야 애니메이션 진행 과정에서 픽셀 깨짐 현상들이 발생하지 않음

- slideDown() 메소드는 요소의 높이를 0에서 원래 값으로 변경하면서 펼치는 애니메이션 효과를 주기 위해 사용

.slideDown( [duration] [, callback] )

.slideDown( [duration] [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

- slideUp() 메소드는 요소의 높이를 현재 높이에서 0으로 변경하면서 접히는 애니메이션 효과를 주기 위해 사용

- slideUp() 메소드가 수행을 완료하면 요소는 display:none 상태가 됨

.slideUp( [duration] [, callback] )

.slideUp( [duration] [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

- slideToggle 메소드는 slideUp()과 slideDown()을 번갈아 실행시켜 애니메이션 효과를 주기 위해 사용

.slideToggle( [duration] [, callback] )

.slideToggle( [duration] [, easing] [, callback] )

- duration : 애니메이션이 실행되는 시간(1/1000초 단위)을 설정하는 문자열 또는 숫자 값입니다. 'slow', 'normal', 'fast' 문자열을 사용할 수 있습니다. (각각 200, 400, 600)

- callback : 애니메이션이 끝났을 때 호출되는 함수입니다.

- easing : 트랜지션에 사용하는 easing 함수 이름의 문자열입니다. easing 함수는 플러그인이기 때문에 관련 라이브러리 파일이 필요합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>13-03</title>
        <script src="js/jquery-1.11.1.js"></script>
        <style type="text/css">
            body {
                width: 360px;
            }
            .header {
                color: #000080;
                font-size: 24pt;
            }
            .content {
                color: #008000;
            }
            .footer {
                color: #800080;
                font-size: 14pt;
            }
            ul#menubar {
                width: 360px;
            }
            ul#menubar, ul#menubar ul {
                text-indent: 10px;
                list-style: none;
                padding: 0;
            }
            li.menu {
                margin-bottom: 2px;
            }
            div.menuitem {
                height: 32px;
                line-height: 2;
                background: #6b8e23;
                color: #ffffff;
                font-weight: bold;
                cursor: pointer;
            }
            ul.submenuitem li {
                height: 32px;
                line-height: 2;
                background-color: #f5f5dc;
                cursor: pointer;
            }
            ul.submenuitem li a {
                color: #000000;
                text-decoration: none;
                overflow: hidden;
                display: block;
                width: 100%;
                height: 100%;
            }
            ul.submenuitem li:hover {
                background: #f0e68c;
            }
        </style>
        <script type="text/javascript">
            $(document).ready(function() {
                $('#header').addClass('header');
                $('#content').addClass('content');
                $('#footer').addClass('footer');
 
                $('.submenuitem').hide();
                $('div.menuitem').bind('click'function() {
                    if ($(this).next().css('display'== 'none') {
                        $('.submenuitem').slideUp();
                    }
                    $(this).next().slideDown();
                });
            });
        </script>
    </head>
    <body>
        <div id="header">
            <p>
                jQuery Effect
            </p>
        </div>
        <div id="content">
            <ul id="menubar">
                <li class="menu">
                    <div class="menuitem">
                        Andoird
                    </div>
                    <ul class="submenuitem">
                        <li>
                            <a href="#">Android 네트워크 고급활용</a>
                        </li>
                        <li>
                            <a href="#">Android를 위한 Advanced Java</a>
                        </li>
                        <li>
                            <a href="#">Android 기반의 모바일 게임 프로그래밍</a>
                        </li>
                    </ul>
                </li>
                <li class="menu">
                    <div class="menuitem">
                        iOS
                    </div>
                    <ul class="submenuitem">
                        <li>
                            <a href="#">iPhone을 위한 Objective-C</a>
                        </li>
                        <li>
                            <a href="#">iPhone 애플리케이션 프로그래밍</a>
                        </li>
                    </ul>
                </li>
                <li class="menu">
                    <div class="menuitem">
                        하이브리드 앱
                    </div>
                    <ul class="submenuitem">
                        <li>
                            <a href="#">웹 기술을 활용한 하이브리드 앱 프로그래밍</a>
                        </li>
                        <li>
                            <a href="#">HTML5 활용을 위한 자바스크립트</a>
                        </li>
                        <li>
                            <a href="#">HTML5와 CSS3를 활용한 모바일 웹 프로그래밍</a>
                        </li>
                    </ul>
                </li>
                <li class="menu">
                    <div class="menuitem">
                        모바일 앱 기획
                    </div>
                    <ul class="submenuitem">
                        <li>
                            <a href="#">논리적 사고와 기획안 작성</a>
                        </li>
                        <li>
                            <a href="#">모바일 웹 앱 동향</a>
                        </li>
                        <li>
                            <a href="#">모바일 서비스 기획</a>
                        </li>
                        <li>
                            <a href="#">앱 아이디어 도출 및 사업기획서 작성</a>
                        </li>
                    </ul>
                </li>
                <li class="menu">
                    <div class="menuitem">
                        UX
                    </div>
                    <ul class="submenuitem">
                        <li>
                            <a href="#">모바일 디자인을 위한 Photoshop Skill-Up</a>
                        </li>
                        <li>
                            <a href="#">Mobile UX Insight</a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
        <div id="footer">
            <p>
                &copy; 2014 T academy
            </p>
        </div>
    </body>
</html>
cs

 

13강끝

 

14강 jQuery Mobile 컴포넌트 - 페이지, 버튼, 툴바


1. 단일 페이지와 다중 페이지에서 페이지 전환

- jQuery Mobile은 웹을 근간으로 하는 기술이기 때문에 화면 간의 전환에 HTML의 링크 <a>태그를 이용함

- jQuery Mobile은 단일 HTML 페이지 내에서 data-role="page"속성을 가진 여러 태그들을 페이지 컨테이너로 사용하며, 가장 먼저 기술한 페이지 컨테이너를 보여줌

- 나머지 페이지 컨테이너는 표시되지 않으며, 특정 페이지 컨테이너로의 전환은 <a> 태그의 href 속성의 id 셀렉터를 통해 이루어짐


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>14-01</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <!-- 첫 번째 페이지 시작 -->
        <div data-role="page" id="page1">
            <div data-role="header">
                <h3>첫 번째 페이지 헤더</h3>
            </div>
            <div data-role="content">
                <p>
                    첫 번째 페이지 내용
                </p>
                <p>
                    <a href="#page2">두 번째 (내부)페이지 전환</a>
                </p>
                <p>
                    <a href="14-02.html">세 번째 (외부)페이지 전환</a>
                </p>
            </div>
            <div data-role="footer">
                <h4>첫 번째 페이지 풋터</h4>
            </div>
        </div>
        <!-- 첫 번째 페이지 끝 -->
        <!-- 두 번째 페이지 시작 -->
        <div data-role="page" id="page2" data-add-back-btn="true">
            <div data-role="header">
                <h3>두 번째 페이지 헤더</h3>
            </div>
            <div data-role="content">
                <p>
                    두 번째 (내부)페이지 내용
                </p>
            </div>
            <div data-role="footer">
                <h4>두 번째 페이지 풋터</h4>
            </div>
        </div>
        <!-- 두 번째 페이지 끝 -->
    </body>
</html>
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>14-02</title>
    </head>
    <body>
        <p>
            이 내용은 jQuery Mobile에 의해 DOM에 추가되지 않습니다.
        </p>
        <!-- 세 번째 페이지 시작 -->
        <div data-role="page" id="page3" data-add-back-btn="true">
            <div data-role="header">
                <h3>세 번째 (외부)페이지 헤더</h3>
            </div>
            <div data-role="content">
                <p>
                    세 번째 (외부)페이지 내용
                </p>
            </div>
            <div data-role="footer">
                <h4>세 번째 (외부)페이지 풋터</h4>
            </div>
        </div>
        <!-- 세 번째 페이지 끝 -->
    </body>
</html>
 
cs


2. 페이지 전환 애니메이션

효과

특징 

fade 

페이드인/페이드아웃 효과를 적용합니다. 

pop 

화면 가운데서 페이지가 확대되며 나타납니다. 

flip 

화면 가운데 Y축을 기준으로 360도 회전하면서 나타납니다. 

turn 

화면 좌측의 Y축을 기준으로 360도 회전하면서 나타납니다. 

flow 

이전 화면은 밑으로 빠져 흘러가 사라지고, 새로운 화면이 흘러가다 밑에서 올라옵니다. 

slidefade 

좌우 슬라이딩과 페이드 효과가 함께 적용됩니다. 

slide 

좌우 슬라이딩 효과가 적용됩니다. 

slideup 

페이지가 위로 슬라이딩됩니다. 

slidedown 

페이지가 아래로 슬라이딩됩니다. 

- 페이지 전환 애니메이션을 설정하려면 <a> 태그에 data-transition 속성 값으로 효과 이름을 기술

- 아무런 설정을 하지 않았다면 fade가 적용

- <a> 요소에 대해 data-rirection 속성 값을 "reverse"로 설정하면 적용된 애니메이션 방향과 반대 방향의 효과를 줌

- 왼쪽으로 슬라이딩하는 slide의 경우 data-direction 속성에 "reverse"를 설정하면 페이지가 오른쪽으로 슬라이딩함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>14-03</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <!-- 첫 번째 페이지 시작 -->
        <div data-role="page" id="page1">
            <div data-role="header">
                <h3>첫 번째 페이지 헤더</h3>
            </div>
            <div data-role="content">
                <p>
                    첫 번째 페이지 내용
                </p>
                <p>
                    <a href="#page2" data-transition="slide">두 번째 페이지 전환</a>
                </p>
            </div>
            <div data-role="footer">
                <h4>첫 번째 페이지 풋터</h4>
            </div>
        </div>
        <!-- 첫 번째 페이지 끝 -->
        <!-- 두 번째 페이지 시작 -->
        <div data-role="page" id="page2">
            <div data-role="header">
                <h3>두 번째 페이지 헤더</h3>
            </div>
            <div data-role="content">
                <p>
                    두 번째 페이지 내용
                </p>
                <p>
                    <a href="#page1" data-transition="slide" data-direction="reverse">첫 번째 페이지 전환</a>
                </p>
            </div>
            <div data-role="footer">
                <h4>두 번째 페이지 풋터</h4>
            </div>
        </div>
        <!-- 두 번째 페이지 끝 -->
    </body>
</html>
 
cs


3, 페이지 돌아가기

- 첫 번째로 페이지 컨테이너에 data-add-back-btn="true"속성을 기술하면 자동으로 헤더 좌측에 Back 버튼이 생성

- data-back-btn-text와 data-back-btn-theme 속성을 설정해 텍스트와 적용 테마를 변경할 수 있음

- 두 번째로 <a> 태그의 data-rel 속성에 "back" 값을 지정

- href 속성을 직접 지정하는 것보다 data-rel="back" 속성을 기술해 사용할 것을 권장함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>14-04</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <!-- 첫 번째 페이지 시작 -->
        <div data-role="page" id="page1">
            <div data-role="header">
                <h3>첫 번째 페이지 헤더</h3>
            </div>
            <div data-role="content">
                <p>
                    첫 번째 페이지 내용
                </p>
                <p>
                    <a href="#page2" data-transition="slide">두 번째 페이지 전환</a>
                </p>
            </div>
            <div data-role="footer">
                <h4>첫 번째 페이지 풋터</h4>
            </div>
        </div>
        <!-- 첫 번째 페이지 끝 -->
        <!-- 두 번째 페이지 시작 -->
        <div data-role="page" id="page2" data-add-back-btn="true">
            <div data-role="header">
                <h3>두 번째 페이지 헤더</h3>
            </div>
            <div data-role="content">
                <p>
                    두 번째 페이지 내용
                </p>
                <p>
                    <a data-rel="back">첫 번째 페이지로 돌아가기</a>
                </p>
            </div>
            <div data-role="footer">
                <h4>두 번째 페이지 풋터</h4>
            </div>
        </div>
        <!-- 두 번째 페이지 끝 -->
    </body>
</html>
 
cs


4. 페이지 테마 적용하기

- jQuery Mobile은 기본 테마에 a(black), b(blue), c(gray), d(dark gray), e(yellow)까지 5개의 스왓치를

- data-role="page" 속성을 가지고 있는 페이지 컨테이너의 data-theme 속성에 5개의 값 중 하나를 정하면 기본 테마 색상이 변경됨


5. 기본 버튼과 옵션

- jQuery Mobile에서 버튼은 <a> 태그나 <button>, <input>태그를 사용해 만듭니다.

- <a>태그를 버튼으로 만들기 위해서는 data-role="button" 속성을 추가하면 됩니다.

옵션 

특징 

data-mini 

기본값 false, true 일 경우 버튼의 세로 높이와 글자의 크기를 작게 합니다. 

data-inline 

기본값 false, true일 경우 버튼의 폭을 텍스트에 맞춰 줄입니다. 

data-corner 

기본값 true, false일 경우 버튼의 모서리를 직각으로 만듭니다. 

data-shadow 

기본값 true, false일 경우 버튼의 그림자 스타일을 적용하지 않습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>14-05</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="index">
            <div data-role="header">
                <h3>jQuery Mobile : Button</h3>
            </div>
            <div data-role="content">
                <a href="#" data-role="button">Link Button</a>
                <a href="#" data-role="button" class="ui-disabled">Link Button (disabled)</a>
                <a href="#" data-role="button" data-mini="true">Link Button (mini)</a>
                <a href="#" data-role="button" data-inline="true">Link Button (inline)</a>
                <button>
                    Button element
                </button>
                <input type="button" value="Button" />
                <input type="submit" value="Submit Button" />
                <input type="reset" value=" Reset Button" />
            </div>
            <div data-role="footer">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


6. 아이콘 적용하기

- jQuery Mobile 에서는 버튼에 아이콘을 추가하기 위해서 data-icon 속성에 값을 추가하면 됨

- 아이콘은 기본적으로 왼쪽에 위치하며, 위치를 변경하기 위해 data-iconpos 속성 값으로 left, right, top, button 값을 사용하여 변경함

- data-iconpos 속성에 "notext" 값을 설정하면 아이콘만 있고 텍스트는 없는 버튼이 표시됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>14-06</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="index">
            <div data-role="header">
                <h3>jQuery Mobile : Button</h3>
            </div>
            <div data-role="content">
                <a href="#" data-role="button" data-icon="arrow-u" data-iconpos="top"> data-iconpos="top"</a>
                <a href="#" data-role="button" data-icon="arrow-l" data-iconpos="left"> data-iconpos="left"</a>
                <a href="#" data-role="button" data-icon="arrow-r" data-iconpos="right"> data-iconpos="right"</a>
                <a href="#" data-role="button" data-icon="arrow-d" data-iconpos="bottom"> data-iconpos="bottom"</a>
                <a href="#" data-role="button" data-icon="star" data-iconpos="notext"> data-iconpos="star"</a>
            </div>
            <div data-role="footer">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


7. 그룹버튼 만들기

- 여러 버튼을 <div> 태그로 묶고 data-role="controlgroup" 속성을 기술하면 세로로 그룹화된 버튼이 생성됨

- <div> 태그에 data-type="horizontal"속성을 추가하고 각 버튼에 data-line="true"를 지정하면 가로 방향의 그룹버튼을 만들 수 있음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>14-07</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="index">
            <div data-role="header">
                <h3>jQuery Mobile : Button</h3>
            </div>
            <div data-role="content">
                <div data-role="controlgroup">
                    <a href="#" data-role="button" data-icon="check">Yes</a>
                    <a href="#" data-role="button" data-icon="delete">No</a>
                </div>
                <div data-role="controlgroup" data-type="horizontal">
                    <a href="#" data-role="button" data-icon="check" data-inline="true">Yes</a>
                    <a href="#" data-role="button" data-icon="delete" data-inline="true">No</a>
                </div>
                <div data-role="controlgroup" data-type="horizontal">
                    <a href="#" data-role="button" data-icon="check" data-inline="true" data-mini="true">Yes</a>
                    <a href="#" data-role="button" data-icon="delete" data-inline="true" data-mini="true">No</a>
                </div>
            </div>
            <div data-role="footer">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


8. 버튼에 테마 적용하기 

- jQuery Mobile은 기본 테마에 a(black), b(blue), c(gray), d(dark gray), e(yellow)까지 5개의 스왓치를 제공

- 버튼에 data-theme 속성에 5개의 값 중 하나를 정하면 기본 테마 색상이 변경됨


9. 헤더 바와 풋터 바

- data-role="header" 속성을 가진 태그를 헤더 바(header bar)

- data-role="footer" 속성을 가진 태그를 풋터 바(footer bar)

- 헤더 바 안에는 <a> 태그를 최대 두 개까지 가질 수 있는데 먼저 기술된 <a> 태그는 좌측 버튼으로, 나중에 기술된 <a> 태그는 우측 버튼으로 생성됨

- 헤더 바 안에 <a> 태그 한 개가 있을 경우 <a> 태그에 class="ui-btn-right" 속성을 적용해 우측 버튼으로 만들 수도 있음

- 풋터 바는 풋터 바 내에 <a> 태그를 여럿 추가할 수 있지만 폭을 벗어나면 행을 바꿔 추가하게 됨

- 풋터 바는 추가된 내용들을 왼쪽 정렬하기 때문에 가운데 정렬을 고려할 필요가 있음

- 헤더 바와 풋터 바는 컨텐트 영역의 내용이 많아 스크롤이 되면 위 아래로 사라지는데 이를 방지하기 위해선 data-position="fixed" 속성을 기술하면 해결됨

- 컨텐트 영역을 탭 하는 순간 헤더 바와 풋터 바를 슬라이딩 애니메이션을 통해 위 아래로 사라지게 하려면 data-fullscreen="true" 속성을 주면 됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>14-08</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <style type="text/css">
            .footer {
                text-align: center;
            }
        </style>
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="index">
            <div data-role="header" data-position="fixed">
                <h3>시인의 마을</h3>
                <a href="#" data-icon="delete">취소</a>
                <a href="#" data-icon="check">저장</a>
            </div>
            <div data-role="content">
                <h3>희망을 만드는 사람이 되라</h3>
                <p>
                    이 세상 사람들 모두 잠들고
                    어둠속에 갇혀서 꿈조차 잠이 들 때
                    홀로 일어난 새벽을 두려워말고
                    별을 보고 걸어가는 사람이 되라
                    희망을 만드는 사람이 되라
                </p>
                <p>
                    겨울밤은 깊어서 눈만 내리고
                    돌아갈 길 없는 오늘 눈오는 밤도
                    하루의 일을 끝낸 작업장 부근
                    촛불도 꺼져가는 어두운 방에서
                    슬픔을 사랑하는 사람이 되라
                    희망을 만드는 사람이 되라
                </p>
                <p>
                    절망도 없는 이 절망의 세상
                    슬픔도 없는 이 슬픔의 세상
                    사랑하며 살아가면 봄눈이 온다.
                    눈 맞으며 기다리던 기다림 만나
                    눈 맞으며 그리웁던 기다림 만나
                    얼씨구나 부등켜안고 웃어 보아라
                    절씨구나 뺨 부비며 울어 보아라
                </p>
                <p>
                    별을 보고 걸어가는 사람이 되어
                    희망을 만드는 사람이 되어
                    봄 눈 내리는 보리밭 길 걷는 자들은
                    누구든지 달려와서 가슴 가득히
                    꿈을 받아라
                    꿈을 받아라.
                </p>
                <p>
                    정호승
                </p>
            </div>
            <div data-role="footer" data-position="fixed" class="footer">
                <a href="#" data-icon="plus">추가</a>
                <a href="#" data-icon="arrow-u">위로</a>
                <a href="#" data-icon="arrow-d">아래로</a>
            </div>
        </div>
    </body>
</html>
 
cs


10. 네비게이션 바

- 네비게이션 바는 data-role ="navbar" 속성을 태그에 추가해 사용

- 네비게시션 바는 헤더 바나 풋터 바에 포함될 수 있는 탭 형태의 버튼 그룹

- 초기 활성화 버튼을 표시하고자 하면 <a> 태그에 class="ui-btn-active" 속성을 지정하면 됨

- 기본적으로 아이콘의 위치는 top이고, 일괄적으로 아이콘의 위치를 변경하려면 data-role="navbar" 속성을 가진 태그에 data-iconpos 속성을 추가하면 됨

- 한 행에 최대 5개까지 탭 버튼을 추가할 수 있으며 5개를 넘어가면 순서대로 한 행에 두개씩 여러 행으로 탭 버튼을 배치함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>14-09</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="index">
            <div data-role="header" data-position="fixed">
                <h3>header</h3>
                <a href="#" data-icon="gear" class="ui-btn-right">Options</a>
                <div data-role="navbar">
                    <ul>
                        <li>
                            <a href="#">One</a>
                        </li>
                        <li>
                            <a href="#">Two</a>
                        </li>
                        <li>
                            <a href="#">Three</a>
                        </li>
                    </ul>
                </div>
            </div>
            <div data-role="content">
 
            </div>
            <div data-role="footer" data-position="fixed">
                <div data-role="navbar">
                    <ul>
                        <li>
                            <a href="#" data-icon="grid">Summary</a>
                        </li>
                        <li>
                            <a href="#" data-icon="star">Favs</a>
                        </li>
                        <li>
                            <a href="#" data-icon="gear">Setup</a>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </body>
</html>
 
cs


11. 툴바에 테마 적용하기 

- jQuery Mobile은 기본 테마에 a(black), b(blue), c(gray), d(dark gray), e(yellow)까지 5개의 스왓치를 제공

- 버튼에 data-theme 속성에 5개의 값 중 하나를 정하면 기본 테마 색상이 변경됨


14강끝 


15강 jQuery Mobile 컴포넌트 - 리스트 뷰


1. 리스트 뷰

- jQuery Mobile에서는 리스트뷰(Listview)라는 리스트를 표시하는 UI를 제공

- 리스트는 <ul>, <ol> 태그를 기반으로 만들며, data-role="list view"속성을 추가하면 스마트 디바이스에 최적화된 리스트를 제공함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-01</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="index">
            <div data-role="header" data-position="fixed">
                <h3>리스트 뷰</h3>
            </div>
            <div data-role="content">
                <ul data-role="listview">
                    <li>
                        <a href="15-02.html" data-transition="slide">연결된 리스트</a>
                    </li>
                    <li>
                        <a href="15-03.html" data-transition="slide">일련번호를 가진 리스트</a>
                    </li>
                    <li>
                        <a href="15-04.html" data-transition="slide">중첩 리스트</a>
                    </li>
                    <li>
                        <a href="15-05.html" data-transition="slide">스플릿 버튼 리스트</a>
                    </li>
                    <li>
                        <a href="15-06.html" data-transition="slide">리스트 디바이더</a>
                    </li>
                    <li>
                        <a href="15-07.html" data-transition="slide">카운트 버블</a>
                    </li>
                    <li>
                        <a href="15-08.html" data-transition="slide">썸네일 리스트</a>
                    </li>
                    <li>
                        <a href="15-09.html" data-transition="slide">아이콘 리스트</a>
                    </li>
                    <li>
                        <a href="15-10.html" data-transition="slide">리스트 형식 적용</a>
                    </li>
                    <li>
                        <a href="15-11.html" data-transition="slide">인셋 스타일</a>
                    </li>
                    <li>
                        <a href="15-12.html" data-transition="slide">검색 필터 적용</a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


2. 연결된 리스트

- 리스트의 항목 <li>태그 안에 <a> 태그를 입력하면 오른쪽 끝에 화살표가 표시가 되는 연결된 리스트(linked list)가 생성됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>15-02</title>
    <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
    <script src="js/jquery-1.11.1.js"></script>
    <script src="js/jquery.mobile-1.3.2.js"></script>
  </head>
  <body>
    <div data-role="page" id="linkedlist" data-add-back-btn="true">
      <div data-role="header" data-position="fixed">
        <h3>연결된 리스트</h3>  
        <a href="#index" data-role="button" data-icon="home" 
           data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
      </div>
      <div data-role="content">
        <ul data-role="listview">
          <li><a href="#">item #1</a></li>
          <li><a href="#">item #2</a></li>
          <li><a href="#">item #3</a></li>
          <li><a href="#">item #4</a></li>
          <li><a href="#">item #5</a></li>
        </ul>
      </div>
      <div data-role="footer" data-position="fixed">
        <h4>&copy; 2014 T academy</h4>
      </div>
    </div>
  </body>
</html>
 
cs


3. 일련번호를 가진 리스트

- <ol> 기반의 리스트를 구성하면 일련번호가 표시되는 리스트 생성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-03</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="numberedlist" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>일련번호를 가진 리스트</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ol data-role="listview">
                    <li>
                        <a href="#">item #1</a>
                    </li>
                    <li>
                        <a href="#">item #2</a>
                    </li>
                    <li>
                        <a href="#">item #3</a>
                    </li>
                    <li>
                        <a href="#">item #4</a>
                    </li>
                    <li>
                        <a href="#">item #5</a>
                    </li>
                </ol>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


4. 중첩 리스트

- 리스트의 항목<li> 안에 중첩된 <ul> 또는 <ol> 기반의 연결 리스트를 구성할 수 있는데, 하위 리스트에는 상위 리스트에서 선택한 항목이 헤더에 표시되고, 기본적으로 테마 b가 적용됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-04</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="nestedlist" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>중첩 리스트</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview">
                    <li>
                        item #1
                        <ul>
                            <li>
                                <a href="#nestedlist">child item #1</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #2</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #3</a>
                            </li>
                        </ul>
                    </li>
                    <li>
                        item #2
                        <ul>
                            <li>
                                <a href="#nestedlist">child item #1</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #2</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #3</a>
                            </li>
                        </ul>
                    </li>
                    <li>
                        item #3
                        <ul>
                            <li>
                                <a href="#nestedlist">child item #1</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #2</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #3</a>
                            </li>
                        </ul>
                    </li>
                    <li>
                        item #4
                        <ul>
                            <li>
                                <a href="#nestedlist">child item #1</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #2</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #3</a>
                            </li>
                        </ul>
                    </li>
                    <li>
                        item #5
                        <ul>
                            <li>
                                <a href="#nestedlist">child item #1</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #2</a>
                            </li>
                            <li>
                                <a href="#nestedlist">child item #3</a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


5. 스플릿 버튼 리스트

- 리스트의 항목 <li> 태그에 <a> 태그를 2개 작성하면 스플릿 버튼 리스트(split button list)가 생성됨

- 스플릿 버튼 리스트는 첫번째 <a> 태그의 텍스트는 출력하고, 두번째 <a> 태그는 연결 아이콘만 표시됨

- 리스트에 data-split-icon 속성을 추가해 아이콘을 변경할 수 있고, data-split-theme 속성으로 아이콘의 테마(기본은 테마 b)를 변경할 수 있음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-05</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="splitbuttonlist" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>스플릿 버튼 리스트</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview"  data-split-icon="gear" data-split-theme="a">
                    <li>
                        <a href="#">item #1</a><a href="#"></a>
                    </li>
                    <li>
                        <a href="#">item #2</a><a href="#"></a>
                    </li>
                    <li>
                        <a href="#">item #3</a><a href="#"></a>
                    </li>
                    <li>
                        <a href="#">item #4</a><a href="#"></a>
                    </li>
                    <li>
                        <a href="#">item #5</a><a href="#"></a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


6. 리스트 디바이더

- 리스트의 <li> 태그에 data-role="list-divider" 속성을 추가하면 리스트 디바이더(list divider)를 생성

- 리스트 디바이더는 주로 카테고리나 제목을 표시하는 경우 많이 사용함

- 리스트에 data-dividertheme 속성을 추가해 리스트 디바이더의 테마(기본 테마 B)를 변경할 수 있음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-06</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="listdivider" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>리스트 디바이더</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview" data-dividertheme="a">
                    <li data-role="list-divider">
                        title
                    </li>
                    <li>
                        <a href="#">item #1</a>
                    </li>
                    <li>
                        <a href="#">item #2</a>
                    </li>
                    <li data-role="list-divider">
                        title
                    </li>
                    <li>
                        <a href="#">item #3</a>
                    </li>
                    <li>
                        <a href="#">item #4</a>
                    </li>
                    <li>
                        <a href="#">item #5</a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


7. 카운트 버블

- 리스트의 <li> 태그 내의 <span> 영역에 class="ui-li-count" 속성을 추가하면 항목의 오른쪽에 카운트 버블(count bubble)을 표시함

- 주로 새로운 소식의 건수 혹은 신규 등을 표시하는데 사용

- 리스트에 data-count-theme 속성을 추가해 카운트 버블의 테마를 변경할 수 있음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-07</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="countbubble" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>카운트 버블</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview" data-count-theme="a">
                    <li>
                        <a href="#">item #1<span class="ui-li-count">New</span></a>
                    </li>
                    <li>
                        <a href="#">item #2<span class="ui-li-count">0</span></a>
                    </li>
                    <li>
                        <a href="#">item #3<span class="ui-li-count">15</span></a>
                    </li>
                    <li>
                        <a href="#">item #4<span class="ui-li-count">7</span></a>
                    </li>
                    <li>
                        <a href="#">item #5<span class="ui-li-count">11</span></a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


8. 썸네일 리스트

- 리스트의 <li> 태그 안에 <img> 태그를 사용하면 왼쪽에 이미지가 표시되는 썸네일 리스트(thumbnail list)를 만들 수 있음

- 썸네일 리스트는 왼쪽 영역에 가로 80px, 세로 80px로 이미지를 표시


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-08</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="thumbnaillist" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>썸네일 리스트</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview">
                    <li>
                        <a href="#"><img src="alaskan_malamute.jpg" />item #1</a>
                    </li>
                    <li>
                        <a href="#"><img src="goldenretriever_puppies.jpg" />item #2</a>
                    </li>
                    <li>
                        <a href="#"><img src="goldenretriever_puppy.jpg" />item #3</a>
                    </li>
                    <li>
                        <a href="#"><img src="samoyed.jpg" />item #4</a>
                    </li>
                    <li>
                        <a href="#"><img src="samoyed_puppy.jpg" />item #5</a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


9. 아이콘 리스트 

- 리스트의 <li> 태그 안에 <img> 태그에 class="ui-li-icon" 속성을 추가하면 아이콘처럼 더 작은 이미지로 표시되는 아이콘 리스트를 만들 수 있음

- 아이콘 리스트는 왼쪽 영역에 가로 16px, 세로 16px로 이미지를 표시


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-09</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="iconlist" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>아이콘 리스트</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview">
                    <li>
                        <a href="#"><img src="alaskan_malamute_16X16.jpg" class="ui-li-icon"/>item #1</a>
                    </li>
                    <li>
                        <a href="#"><img src="goldenretriever_puppies_16X16.jpg" class="ui-li-icon" />item #2</a>
                    </li>
                    <li>
                        <a href="#"><img src="goldenretriever_puppy_16X16.jpg" class="ui-li-icon" />item #3</a>
                    </li>
                    <li>
                        <a href="#"><img src="samoyed_16X16.jpg" class="ui-li-icon" />item #4</a>
                    </li>
                    <li>
                        <a href="#"><img src="samoyed_puppy_16X16.jpg" class="ui-li-icon" />item #5</a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


10. 컨텐트 형식 적용하기

- 리스트 내의 <li> 태그에 <h#>, <p>, <strong>과 같은 태그들을 이용해서 형식을 적용할 수 있으며, <p> 와 같은 태그에 class="ui-li-aside" 속성을 추가하여 오른쪽 상단에 표시되게 할 수도있음


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-10</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="listformatting" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>리스트 형식 적용</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview" data-dividertheme="a" data-count-theme="b">
                    <li data-role="list-divider" >
                        2014년 6월 19일<span class="ui-li-count" >3</span>
                    </li>
                    <li>
                        <a href="#">
                        <p class="ui-li-aside">
                            <strong>12:47 오후</strong>
                        </p> <h3>title #1</h3>
                        <p>
                            <strong>subject #1</strong>
                        </p>
                        <p>
                            description #1
                        </p> </a>
                    </li>
                    <li>
                        <a href="#">
                        <p class="ui-li-aside">
                            <strong>10:13 오전</strong>
                        </p> <h3>title #2</h3>
                        <p>
                            <strong>subject #2</strong>
                        </p>
                        <p>
                            description #2
                        </p> </a>
                    </li>
                    <li>
                        <a href="#">
                        <p class="ui-li-aside">
                            <strong>07:45 오전</strong>
                        </p> <h3>title #3</h3>
                        <p>
                            <strong>subject #3</strong>
                        </p>
                        <p>
                            description #3
                        </p> </a>
                    </li>
                    <li data-role="list-divider">
                        2014년 6월 18일<span class="ui-li-count">2</span>
                    </li>
                    <li>
                        <a href="#">
                        <p class="ui-li-aside">
                            <strong>03:28 오후</strong>
                        </p> <h3>title #4</h3>
                        <p>
                            <strong>subject #4</strong>
                        </p>
                        <p>
                            description #4
                        </p> </a>
                    </li>
                    <li>
                        <a href="#">
                        <p class="ui-li-aside">
                            <strong>10:45 오전</strong>
                        </p> <h3>title #5</h3>
                        <p>
                            <strong>subject #5</strong>
                        </p>
                        <p>
                            description #5
                        </p> </a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


11. 인셋 스타일

- 리스트에 data-inset="true" 속성을 추가하면 인셋 스타일(inset style)의 리스트를 만들 수 있음

- 이 속성이 적용되면 모서리가 둥글고 여백이 있는 리스트를 표시함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-11</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="insetstyle" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>인셋 스타일</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview" data-inset="true">
                    <li>
                        <a href="#">item #1</a>
                    </li>
                    <li>
                        <a href="#">item #2</a>
                    </li>
                    <li>
                        <a href="#">item #3</a>
                    </li>
                    <li>
                        <a href="#">item #4</a>
                    </li>
                    <li>
                        <a href="#">item #5</a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


12. 검색 필터 적용 리스트

- jQuery Mobile은 리스트 내의 항목을 검색할 수 있는 검색 필터 구현 기능을 제공

- 리스트에 data-filter="true" 속성을 추가하면 리스트 상단에 검색 상자가 표시됨

- 리스트에 data-filter-placeholder 속성과 문자열 값을 함께 추가하면 플레이스 홀더 값으로 표시됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>15-12</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="index" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>검색 필터 적용</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <ul data-role="listview" data-filter="true" data-filter-placeholder="검색어를 입력하세요...">
                    <li>
                        <a href="#">item #1</a>
                    </li>
                    <li>
                        <a href="#">item #2</a>
                    </li>
                    <li>
                        <a href="#">item #3</a>
                    </li>
                    <li>
                        <a href="#">item #4</a>
                    </li>
                    <li>
                        <a href="#">item #5</a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


13. 리스트 뷰에 테마 적용하기

- 리스트 전체의 테마는 리스트에 data-theme 속성을 추가해 변경할 수 있음

- data-theme 속성은 <li> 태그에도 지정할 수 있어서 항목 별로도 다른 테마를 설정할 수 있음


15강끝 


16강 jQuery Mobile 컴포넌트 - 폼


1. 필드 컨테이너

- jQuery Mobile은 스마트 디바이스에서 사용자 입력을 최적화한 폼 요소를 제공

- 이러한 폼 요소를 사용하기 위해선 data-role="fieldcontain" 속성을 가진 요소 안에 폼 입력 요소를 추가해야 함

- 이 속성을 적용하면 화면 폭에 따라 라벨의 위치가 폼 요소의 좌측 혹은 좌측 상단 위에 놓이게 됨

- jQuery Mobile은 텍스트 입력을 위한 <input> 태그의 다양한 타입을 지원하며, 입력 타입에 맞춰서 스마트 디바이스의 소프트 키보드가 제공됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>16-01</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="index">
            <div data-role="header" data-position="fixed">
                <h3>폼 요소</h3>
            </div>
            <div data-role="content">
                <ul data-role="listview">
                    <li>
                        <a href="16-02.html" data-transition="slide">텍스트 입력 필드</a>
                    </li>
                    <li>
                        <a href="16-03.html" data-transition="slide">슬라이더</a>
                    </li>
                    <li>
                        <a href="16-04.html" data-transition="slide">플립 토글 스위치</a>
                    </li>
                    <li>
                        <a href="16-05.html" data-transition="slide">라디오 버튼</a>
                    </li>
                    <li>
                        <a href="16-06.html" data-transition="slide">체크박스 버튼</a>
                    </li>
                    <li>
                        <a href="16-07.html" data-transition="slide">셀렉트 메뉴</a>
                    </li>
                </ul>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>16-02</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="text" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>텍스트 입력 필드</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <form name="myform">
                    <div data-role="fieldcontain">
                        <label for="name">이름</label>
                        <input type="text" id="name"/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="pass">패스워드</label>
                        <input type="password" id="pass"/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="email">이메일</label>
                        <input type="email" id="email"/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="phone">전화</label>
                        <input type="tel" id="phone"/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="age">나이</label>
                        <input type="number" id="age"/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="url">URL</label>
                        <input type="url" id="url"/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="search">검색</label>
                        <input type="search" id="search" placeholder="검색어를 입력하세요."/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="content">내용</label>
                        <textarea id="content" cols="40" rows="8"></textarea>
                    </div>
                </form>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


2. 슬라이더

- jQuery Mobile은 HTML 5에 추가된 range 타입의 input 태그를 지원함

- 범위를 나타내기 위해 min, max 속성을 지정하고 초기값을 value 속성에 지정

- step 속성이 있어서 슬라이딩 시 증감 설정 가능


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>16-03</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="slider" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>슬라이더</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <form name="myform">
                    <div data-role="fieldcontain">
                        <label for="year">년도</label>
                        <input type="range" id="year" value="2014" min="1900" max="2030"/>
                    </div>
                </form>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


3. 플립 토글 스위치

- 플립 토글 스위치(flip toggle switch)는 on/off 스위치처럼 동작하는 사용자 인터페이스

- select 요소에 data-role="slider" 속성을 추가하면 사용 가능

- 일반적으로 스위치 on에 해당하는 값을 두 번째 옵션으로 지정해서 사용함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>16-04</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="fliptoggle" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>플립 토글 스위치</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <form name="myform">
                    <div data-role="fieldcontain">
                        <label for="gender">성별</label>
                        <select name="gender" id="gender" data-role="slider">
                            <option value="남자">남자</option>
                            <option value="여자">여자</option>
                        </select>
                    </div>
                </form>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


4. 라디오 버튼

- jQuery Mobile 에서는 라디오 버튼을 사용하기 위해 radio 타입의 <input> 태그와 <label>을 묶어 사용함

- 라디오 버튼 그룹을 만들기 위해 data-role="controlgroup"속성을 가진 <fieldset> 태그 안에 위치시키면 사용하기 쉬운 라디오 버튼이 생성됨

- <fieldset> 태그에 <legend> 태그를 추가해 라디오 버튼 그룹에 대한 라벨을 생성함

- 기본적으로 세로로 출력되며 <fieldset> 태그에 data-type="horizontal"속성을 추가하면 가로로 배치됨


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>16-05</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="radio" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>라디오 버튼</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <form name="myform">
                    <div data-role="fieldcontain">
                        <fieldset data-role="controlgroup">
                            <legend>
                                가장 좋아하는 견종
                            </legend>
                            <input type="radio" name="dog" value="골든 리트리버" id="dog1" checked="checked"/>
                            <label for="dog1">골든 리트리버</label>
                            <input type="radio" name="dog" value="알래스칸 말라뮤트" id="dog2"/>
                            <label for="dog2">알래스칸 말라뮤트</label>
                            <input type="radio" name="dog" value="사모예드" id="dog3"/>
                            <label for="dog3">사모예드</label>
                            <input type="radio" name="dog" value="시베리안 허스키" id="dog4"/>
                            <label for="dog4">시베리안 허스키</label>
                        </fieldset>
                    </div>
                    <div data-role="fieldcontain">
                        <fieldset data-role="controlgroup" data-type="horizontal">
                            <legend>
                                방문 횟수
                            </legend>
                            <input type="radio" name="visit" value="1회" id="visit1" checked="checked"/>
                            <label for="visit1">1회</label>
                            <input type="radio" name="visit" value="2회" id="visit2"/>
                            <label for="visit2">2회</label>
                            <input type="radio" name="visit" value="3회" id="visit3"/>
                            <label for="visit3">3회</label>
                            <input type="radio" name="visit" value="4회 이상" id="visit4"/>
                            <label for="visit4">4회 이상</label>
                        </fieldset>
                    </div>
                </form>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


5. 체크박스 버튼

- jQuery Mobile에서는 체크박스 버튼을 사용하기 위해 checkbox 타입의 <input> 태그와 <label>을 묶어 사용

- 체크박스 버튼 그룹을 만들기 위해 data-role="controlgroup" 속성을 가진 <fieldset> 태그 안에 위치시키면 사용하기 쉬운 체크박스 버튼이 생성됨 <fieldset> 태그에 <legend> 태그를 추가해 체크박스 버튼 그룹에 대한 라벨을 생성함


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>16-06</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="checkbox" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>체크박스 버튼</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <form name="myform">
                    <div data-role="fieldcontain">
                        <fieldset data-role="controlgroup">
                            <legend>
                                좋아하는 견종
                            </legend>
                            <input type="checkbox" name="dog1" value="골든 리트리버" id="dog1"/>
                            <label for="dog1">골든 리트리버</label>
                            <input type="checkbox" name="dog2" value="알래스칸 말라뮤트" id="dog2"/>
                            <label for="dog2">알래스칸 말라뮤트</label>
                            <input type="checkbox" name="dog3" value="사모예드" id="dog3"/>
                            <label for="dog3">사모예드</label>
                            <input type="checkbox" name="dog4" value="시베리안 허스키" id="dog4"/>
                            <label for="dog4">시베리안 허스키</label>
                        </fieldset>
                    </div>
                </form>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


6. 셀렉트 메뉴

- 셀렉트 메뉴는 네이티브 옵션 메뉴를 기반으로 동작

- data-native-menu="false" 속성을 지정하면 jQuery Mobile이 제공하는 팝업 방식의 셀렉트 메뉴를 사용

- 다중 선택 기능은 data-native-menu 속성의 값이 false일 경우에만 가능하며, mutiple="mutiple"속성을 설정해 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>16-07</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="select" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>셀렉트 메뉴</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content">
                <form name="myform">
                    <div data-role="fieldcontain">
                        <label for="dog1">가장 좋아하는 대형 견종</label>
                        <select name="dog1" id="dog1">
                            <option value="">선택하세요</option>
                            <option value="골든 리트리버">골든 리트리버</option>
                            <option value="알래스칸 말라뮤트">알래스칸 말라뮤트</option>
                            <option value="사모예드">사모예드</option>
                            <option value="시베리안 허스키">시베리안 허스키</option>
                        </select>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="dog2">가장 좋아하는 중소형 견종</label>
                        <select name="dog2" id="dog2" data-native-menu="false" multiple="multiple">
                            <option value="">선택하세요</option>
                            <option value="포메라니안">포메라니안</option>
                            <option value="웰시코기">웰시코기</option>
                            <option value="푸들">푸들</option>
                            <option value="비글">비글</option>
                        </select>
                    </div>
                </form>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


16강끝 


17강 jQuery Mobile 컴포넌트 - 컨텐트 서식 적용, 테마롤러


1. 레이아웃 그리드

- 스마트 디바이스는 스크린 폭이 그다지 넓지 않기 때문에 다중 컬럼 레이아웃을 사용하는 것을 일반적으로 비권장

- 버튼이나 네비게이션 탭과 같이 옆으로 작은 요소들을 배치해야 하는 경우 jQuery Mobile은 ui-grid로 불리는 블록 스타일 클래스를 통해 CSS기반의 다중 컬럼 분할 기능을 제공함

클래스

설명 

ui-grid-a 

두 개의 컬럼을 균등 분할해 레이라웃을 구성합니다. 

ui-grid-b 

세 개의 컬럼을 균등 분할해 레이라웃을 구성합니다. 

ui-grid-c

네 개의 컬럼을 균등 분할해 레이라웃을 구성합니다. 

ui-grid-d

다섯 개의 컬럼을 균등 분할해 레이라웃을 구성합니다. 

- 그리드는 폭을 100% 사용하고, 패딩과 마진이 없으며, 보더와 백그라운드가 없는 보이지 않는 컨테이너임

- 그리드 컨테이너 내에서 자식 요소는 순차적으로 ui-block-a/b/c/d/e 클래스를 지정하여 배치함

- 다중 행을 구성할 때 ui-block-a 클래스가 적용된 요소가 각 행의 맨 앞에 배치됨


2. 콜렙서블 컨텐트 블록

- data-role="collapsible" 속성을 이용하면 탭(tap) 조작으로 내용을 접었다 폈다하는 콜렙서블 컨텐트 블록(collapsible content block)을 만들 수 있음

- 콜렙서블 컨텐트 블록에서는 h1 ~ h6 요소를 이용해 제목을 설정

- 콜렙서블 컨텐트 블록은 블록이 접힌 상태를 기본값으로 가지며, data-collapsed="false" 속성을 지정해 펼친 상태를 표시할 수 있음

- 기본적으로 인셋이 적용되어 있기 때문에 인셋을 제거하기 위해선 data-inset="false" 속성을 지정하면 됨

- data-mini="true" 속성으로 컴팩트 버전을 만들 수 있으며, data-collapsed-icon 과 data-expanded-icon 속성을 이용해 아이콘을 변경할 수 있음


3. 콜렙서블 셋(아코디언)

- data-role="collapsible-set" 속성을 이용하면 탭(tap) 조작으로 내용을 접었다 폈다하는 콜렙서블 셋(collapsible set)을 생성

- 콜렙서블 셋은 모든 블록이 접힌 상태를 기본값으로 가지며, data-collapsed="false 속성을 지정한 블록은 펼친 상태를 표시


4. 테마롤러 디자인하기

- jQuery Mobile에서는 테마롤러라는 온라인 도구를 이용해 직관적으로 테마를 디자인할 수 있는 도구를 제공함

- 이 도구를 통해 테마 디자인 작업을 완료하면 사용자 정의 테마의 CSS 파일을 다운로드 받을 수 있음

- http://themeroller..jquerymobile.com/


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>17-01</title>
        <link rel="stylesheet" href="themes/forbeto.css" />
        <link rel="stylesheet"  href="js/jquery.mobile.structure-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
    <body>
        <div data-role="page" id="formtheme" data-add-back-btn="true" data-theme="a">
            <div data-role="header" data-position="fixed" data-theme="a">
                <h3>폼 테마 적용</h3>
                <a href="#index" data-role="button" data-icon="home"
                data-transition="slide" data-direction="reverse" class="ui-btn-right">Home</a>
            </div>
            <div data-role="content" data-theme="a">
                <form name="myform">
                    <div data-role="fieldcontain">
                        <label for="textinput">텍스트 입력 필드</label>
                        <input type="text" id="textinput" placeholder="입력하세요."/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="slider">슬라이더</label>
                        <input type="range" id="slider" value="0" min="0" max="100" step="1"/>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="flipswitch">플립 토글 스위치</label>
                        <select name="flipswitch" id="flipswitch" data-role="slider">
                            <option value="off">Off</option>
                            <option value="on">On</option>
                        </select>
                    </div>
                    <div data-role="fieldcontain">
                        <fieldset data-role="controlgroup">
                            <legend>
                                라디오 버튼(세로)
                            </legend>
                            <input type="radio" name="radiov" value="선택 #1" id="radio1" checked="checked"/>
                            <label for="radio1">선택 #1</label>
                            <input type="radio" name="radiov" value="선택 #2" id="radio2"/>
                            <label for="radio2">선택 #2</label>
                            <input type="radio" name="radiov" value="선택 #3" id="radio3"/>
                            <label for="radio3">선택 #3</label>
                        </fieldset>
                    </div>
                    <div data-role="fieldcontain">
                        <fieldset data-role="controlgroup" data-type="horizontal">
                            <legend>
                                라디오 버튼(가로)
                            </legend>
                            <input type="radio" name="radioh" value="선택 #1" id="radio4" checked="checked"/>
                            <label for="radio4">#1</label>
                            <input type="radio" name="radioh" value="선택 #2" id="radio5"/>
                            <label for="radio5">#2</label>
                            <input type="radio" name="radioh" value="선택 #3" id="radio6"/>
                            <label for="radio6">#3</label>
                        </fieldset>
                    </div>
                    <div data-role="fieldcontain">
                        <fieldset data-role="controlgroup">
                            <legend>
                                체크박스 버튼
                            </legend>
                            <input type="checkbox" name="checkbox1" value="선택 #1" id="checkbox1"/>
                            <label for="checkbox1">선택 #1</label>
                            <input type="checkbox" name="checkbox2" value="선택 #2" id="checkbox2"/>
                            <label for="checkbox2">선택 #2</label>
                            <input type="checkbox" name="checkbox3" value="선택 #3" id="checkbox3"/>
                            <label for="checkbox3">선택 #3</label>
                        </fieldset>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="selectnative">셀렉트 메뉴(native)</label>
                        <select name="selectnative" id="selectnative">
                            <option value="">선택하세요</option>
                            <option value="선택 #1">선택 #1</option>
                            <option value="선택 #2">선택 #2</option>
                            <option value="선택 #3">선택 #3</option>
                            <option value="선택 #4">선택 #4</option>
                        </select>
                    </div>
                    <div data-role="fieldcontain">
                        <label for="selectjqm">셀렉트 메뉴(jqm)</label>
                        <select name="selectjqm" id="selectjqm" data-native-menu="false" multiple="multiple">
                            <option value="">선택하세요</option>
                            <option value="선택 #1">선택 #1</option>
                            <option value="선택 #2">선택 #2</option>
                            <option value="선택 #3">선택 #3</option>
                            <option value="선택 #4">선택 #4</option>
                        </select>
                    </div>
                </form>
                <label for="columngrid">컬럼 레이아웃 그리드</label>
                <div name="columngrid" id="columngrid">
                    <div class="ui-grid-a">
                        <div class="ui-block-a">
                            <button data-theme="c" data-icon="arrow-l" >
                                Previous
                            </button>
                        </div>
                        <div class="ui-block-b">
                            <button data-theme="c" data-icon="arrow-r" data-iconpos='right'>
                                Next
                            </button>
                        </div>
                    </div>
                    <div class="ui-grid-b">
                        <div class="ui-block-a">
                            <button data-theme="c">
                                Cancel
                            </button>
                        </div>
                        <div class="ui-block-b">
                            <button data-theme="a">
                                No
                            </button>
                        </div>
                        <div class="ui-block-c">
                            <button data-theme="b">
                                Yes
                            </button>
                        </div>
                    </div>
                    <div class="ui-grid-solo">
                        <div class="ui-block-a">
                            <button data-theme="b">
                                More
                            </button>
                        </div>
                    </div>
                </div>
                <label for="collapsibleblock">콜랩서블 컨텐트 블록</label>
                <div name="collapsibleblock" id="collapsibleblock" data-role="collapsible" data-collapsed="false" data-theme="e" data-content-theme="c">
                    <h3>제목</h3>
                    <p>
                        컨텐트
                    </p>
 
                    <div data-role="collapsible" data-theme="c" data-content-theme="c">
                        <h3>제목</h3>
                        <p>
                            컨텐트
                        </p>
                        <div data-role="collapsible" data-theme="d" data-content-theme="d">
                            <h3>제목</h3>
                            <p>
                                내용
                            </p>
                        </div>
                    </div>
 
                    <div data-role="collapsible" data-content-theme="c">
                        <h3>제목</h3>
                        <form action="#" method="get">
                            <div data-role="fieldcontain">
                                <label for="textarea">내용:</label>
                                <textarea cols="40" rows="8" name="textarea" id="textarea"></textarea>
                            </div>
                            <fieldset class="ui-grid-a">
                                <div class="ui-block-a">
                                    <button type="reset" data-theme="c">
                                        취소
                                    </button>
                                </div>
                                <div class="ui-block-b">
                                    <button type="submit" data-theme="b">
                                        전송
                                    </button>
                                </div>
                            </fieldset>
                        </form>
                    </div>
 
                    <div data-role="collapsible" data-content-theme="c">
                        <h3>제목</h3>
                        <p>
                            내용
                        </p>
                        <ul data-role="listview" data-inset="true" data-theme="d">
                            <li>
                                <a href="#">아이템 #1</a>
                            </li>
                            <li>
                                <a href="#">아이템 #2</a>
                            </li>
                            <li>
                                <a href="#">아이템 #3</a>
                            </li>
                            <li>
                                <a href="#">아이템 #4</a>
                            </li>
                        </ul>
                    </div>
                </div>
                <label for="collapsibleset">콜랩서블 셋</label>
                <div name="collapsibleset" id="collapsibleset" data-role="collapsible-set">
                    <div data-role="collapsible" data-collapsed="false">
                        <h3>제목</h3>
                        <p>
                            내용
                        </p>
                    </div>
                    <div data-role="collapsible">
                        <h3>제목</h3>
                        <p>
                            내용
                        </p>
                    </div>
                    <div data-role="collapsible" data-collapsed="false">
                        <h3>제목</h3>
                        <p>
                            내용
                        </p>
                    </div>
                    <div data-role="collapsible">
                        <h3>제목</h3>
                        <p>
                            내용
                        </p>
                    </div>
                    <div data-role="collapsible">
                        <h3>제목</h3>
                        <p>
                            내용
                        </p>
                    </div>
                </div>
            </div>
            <div data-role="footer" data-position="fixed" data-theme="a">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


17강끝 


18강 jQuery Mobile 이벤트


1. mobileinit 이벤트

- jQuery Mobile이 구동되면 document 객체에서 mobileinit 이벤트가 트리거 되는데, on() 메소드에서 이 mobileinit 이벤트에 대한 이벤트 핸들러를 등록하면 jQuery Mobile 환경설정에 대한 사용자 초기화가 가능함

$(document).on("mobileinit", function(event){

//사용자 정의 환경 설정 초기화를 실행합니다.

});

- 스크립트는 mobileinit 이벤트가 jQuery Mobile 라이브러리 로딩 시 발생하므로, jQuery 라이브러리 참조 구문과 jQuery Mobile 라이브러리 참조 구문 사이에 위치시킴

<script src="js/jquery-1.11.1.js></script>

<script src="js/custom-scripting.js></script>

<script src="js/jquery.mobile--1.4.2.js></script>

- mobileinit 이벤트는 페이지 컨테이너 단위의 초기화가 아닌 전체 웹 앱의 초기화를 의미하며 앱이 최초 구동 시 한 번 발생하는 이벤트임

2. 기본환경 설정
- jQuery Mobile의 기본 환경 설정은 mobileinit 이벤트 발생 시 이벤트 핸들러에서 $.extend 메소드로 $.mobile 객체를 확장해 기본 설정을 변경 가능
$(document).on("mobileinit", function(){
$.extend( $.mobile , {
foo: bar
});
});
또는
$(document).on("mobileinit",function(){
$.mobile.foo = bar;
});

설정 프로퍼티 

기본값 

설명 

activeBtnClass 

"ui-btn-active" 

활성화된 버튼에 사용되는 CSS 클래스 

activePageClass

"ui-page-active"

현재 페이지에 대한 CSS 클래스 

ajaxEnabled 

true 

Ajax 방식의 페이지 전환을 사용할지에 대한 설정 

allowCrossDomainPages 

false 

기존의 페이지 전환 방식을 도메인 간에서도 사용할지에 대한 설정. 폰 갭을 사용하면 true로 설정해야 함 

autoInitializePage

true 

DOM이 준비되면 $.moblie.initialize() 메소드를 자동으로 호출할 지에 대한 설정 

defaultDialogTransition 

'pop' 

다이얼로그 화면 전환 기본 설정 

defaultPageTransition 

'fade' 

페이지 전환 기본 설정 

ns

"" 

data- 속성에 사용되는 네임스페이스. "myns-"로 지정하면 data-myns- 속성으로 바뀜. 이 프로퍼티를 변경하면 테마CSS 변경이 필요 

pageLoadErrorMessage 

"Error Loading Page" 

Ajax를 통해 페이지 로딩이 실패할 때 보여줄 텍스트 

pageLoadErrorMessageTheme 

"e"

에러 메시지박스가 사용하는 테마 

transitionFallbacks.[transition] 

"fade" 

특정 화면 전환의 3D 변환을 지원하지 않는 브라우저에 대한 대체 화면 전환 


3. 페이지 초기화 이벤트(pagebeforecreate, pagecreate, pageinit)

- jQuery Mobile은 페이지의 태그들과 관련된 플러그 인들을 자동 초기화함

- 페이지 플러그인에 의해 제어되는 자동 초기화는 실제 자동 초기화 전과 후에 이벤트를 디스패치(event dispatch)하는데, 이 때 사전 초기화와 사후 초기화를 통해 페이지를 조작할 수 있음

- 이 이벤트는 매번 페이지가 나타나고 사라질 때마다 발생하는 페이지 전환 이벤트와 달리 페이지 당 한 번만 발생한다는 점에 주의

- jQuery Mobile에서는 페이지를 직접 로딩하는 Ajax를 이용한 페이지 로딩이든 간에 상관없이 작동하는 pagenit 이벤트를 ready 이벤트 대신 사용할 것을 권장함

- pagebeforecreate→pagecreate→pageinit 순으로 작동

$( '#aboutPage' ).on( 'pagebeforecreate', function(event){

//위젯이 자동 초기화(auto-initialization)되기 전 이 페이지를 여기서 조작합니다.

});

$( '#aboutPage' ).on( 'pagecreate', function(event){

//페이지가 DOM에 생성되었을 때 page create 이벤트가 발생하며 커스텀 위젯을 만드는 작업 등을 여기서 합니다.

});

$( '#aboutPage' ).on( 'pageinit', function(event) ){

//페이지에서 필요한 초기화 작업을 여기서 조작합니다.

});


4. 페이지 변경 이벤트(pagebeforechange, pagechange, pagechangefailed)

- 페이지 간의 네비게이션은 $.mobile.changePage() 메소드 호출을 통해 이렁남

- 이 메소드는 우리가 이동하고자 하는 페이지가 DOM에 로드되고 추가된 후, 현재 페이지와 다음 페이지 사이의 페이지 전환 애니메이션이 시작되도록 하는 것을 담당함

- 이 과정에서 changePage() 메소드는 두 개의 이벤트를 발생 시키는데, pagebeforechange 이벤트가 먼저 발생하고, 변경 요청의 성공 여부에 따라 pagechange 이벤트 혹은 pagechangefailed 이벤트가 발생함

pagebeforechange→pagechange(성공시)

 →pagechangefailed(실패시)


5. 페이지 전환 이벤트(pagebeforeshow, pagebeforehide, pageshow, pagehide)

- 페이지 전환 이벤트는 현재 페이지를 새 페이지로의 변경을 애니메이션 처리하는 데 사용

- 페이지 전환 이벤트는 페이지가 나타나거나 사라지기 전후 발생

pagebeforehid→pagebeforeshow→pagehide→pageshow


6. 페이지 로드 이벤트(pagebeforeload, pageload, pageloadfailed)

- 외부 페이지가 DOM으로 로드될 때 발생하는 이벤트 입니다. 가장 먼저 pagebeforeload 이벤트가 발생하고, 다음으로 pageload나 pageloadfailed이벤트가 발생합니다.

pagebeforeload→pageload

   →pageloadfailed


7. tap, taphold 이벤트

- tap 이벤트는 터치 발생후 트리거되는 이벤트이고 taphold는 터치를 계속 유지하면 트리거되는 이벤트

- taphold 이벤트 발생을 위한 유지시간은

$.event.special.tap.tapholdThreshold 프로퍼티에 설정

- 기본 값은 750(ms)


8. swipe, swipeleft,swiperight 이벤트

- 1초 안에 수평 30픽셀 이상, 수직 75픽셀 이하 드래그가 발생하면 swipe 이벤트가 발생

- 모든 swipe 이벤트는 조건을 만족할 때 발생하게 되며, 설정 프로퍼티를 통해 변경이 가능

- swipeleft 이벤트는 왼쪽으로 움직이는 스와이프 이벤트가 발생했을 때 트리거 되고, swiperright 이벤트는 오른쪽으로 움직이는 스와이프 이벤트가 발생했을 때 트리거 됨

설정 프로퍼티

기본값 

설명 

$.event.special.swipe.scrollSuppressionThredshold 

10px 

수평 이동이 이 이상이면 스크롤이 일어나지 않도록 합니다. 

$.event.special.swipe.durationThredshold

1000ms

스와이프 이동 최대 시간

$.event.special.swipe.horizontalDistanceThredshold

30px

스와이프 수평이동의 최소값

$.event.special.swipe.verticalDistanceThredshold

75px

스와이프 수직이동의 최대값


9. orientationchange 이벤트

- 디바이스가 수직 혹은 수평으로 방향을 바꾸면 orientationchange 이벤트가 발생

- 이벤트가 발생할 때 window 객체의 orientation 프로퍼티 값을 이용하면 세부 제어가 가능


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>18-01</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            // mobileinit 이벤트가 발생할 경우의 처리
            $(document).on('mobileinit'function(event) {
                // 기본 화면 전환이 fade인 것을 slide로 변경합니다.
                $.extend($.mobile, {
                    defaultPageTransition : "slide",
                });
 
                console.log(event.type);
            });
 
            // 페이지 초기화 이벤트 발생 시
            $(document).on({
                pagebeforecreate : function(event) {
                    console.log(event.type);
                },
                pagecreate : function(event) {
                    console.log(event.type);
                },
                pageinit : function(event) {
                    console.log(event.type);
                }
            });
 
            // 페이지 변경 이벤트 발생 시
            $(document).on({
                pagebeforechange : function(event) {
                    console.log(event.type);
                },
                pagechange : function(event) {
                    console.log(event.type);
                },
                pagechangefailed : function(event) {
                    console.log(event.type);
                },
            });
 
            // 페이지 전환 이벤트 발생 시
            $(document).on({
                pagebeforeshow : function(event) {
                    console.log(event.type);
                },
                pageshow : function(event) {
                    console.log(event.type);
                },
                pagebeforehide : function(event) {
                    console.log(event.type);
                },
                pagehide : function(event) {
                    console.log(event.type);
                }
            });
 
            // 페이지 로드 이벤트 발생 시
            $(document).on({
                pagebeforeload : function(event) {
                    console.log(event.type);
                },
                pageload : function(event) {
                    console.log(event.type);
                },
                pageloadfailed : function(event) {
                    console.log(event.type);
                }
            });
 
        </script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="first">
            <div data-role="header" data-position="fixed">
                <h3>Events</h3>
            </div>
            <div data-role="content">
                <p>
                    첫번째 페이지
                </p>
                <div>
                    <a href="#second" data-role="button">두 번째 페이지로</a>
                    <a href="18-02.html" data-role="button">세 번째 페이지(외부)로</a>
                </div>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
        <div data-role="page" id="second" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>Events</h3>
            </div>
            <div data-role="content">
                <p>
                    두 번째 페이지
                </p>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>18-03</title>
    </head>
 
    <body>
        <div data-role="page" id="third" data-add-back-btn="true">
            <div data-role="header" data-position="fixed">
                <h3>Events</h3>
            </div>
            <div data-role="content">
                <p>
                    세 번째 페이지(외부)
                </p>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


18강끝


19강 jQuery Mobile 유틸리티


1. $.mobile.changPage()

- 페이지 간의 네비게이션은 $.mobile.changePage()메소드 호출을 통해 일어남

- 이 메소드는 우리가 이동하고자 하는 페이지가 DOM에 로드되고 추가된 후, 현재 페이지와 다음 페이지 사이의 페이지 전환 애니메이션이 시작되도록 하는 것을 담당

프로퍼티

타입 

기본값 

설명 

allowSamePageTransition

boolean 

false 

동일한 현재 페이지에 대한 요청에 페이지전환 적용 

changeHash 

boolean 

true 

로케이션 바의 해시를 갱신할 지 여부 

data 

object, string 

undefined 

Ajax 페이지 요청을 통해 전달할 데이터 

dataUrl 

string 

undefined 

changePage() 완료 시 로케이션을 갱신할 때 사용할 URL 

pageContainer 

jQuery collection 

$.mobile.pageContainer 

페이지를 포함하는 요소 

reloadPage 

boolean 

false 

강제로 페이지를 리로드 

reverse 

boolean 

false 

페이지가 나타날 때의 방향 

role 

string 

undefined 

페이지를 나타낼 때 사용하는 data-role의 기본 값 

showLoadMsg 

boolean 

true 

외부 페이지 로딩시 로딩메시지 표시 여부 

transition

string 

$.mobile.defaultPageTransition 

페이지를 나타낼 때의 기본 전환 애니메이션 

type 

string 

"get" 

페이지 요청 메소드(get/post) 


2. $.mobile.loadPage()

- 외부 페이지를 로딩해 DOM에 추가하는 역할을 담당

- changePage()가 내부적으로 호출하는 이 메소드는 첫 번째 인자로 전달된 URL에 해당하는 페이지를 백그라운드에서 로딩하는 역할을 하며 현재 페이지에 영향을 주지는 않음

- 두 번째 인자로 프로퍼티를 이용해 객체 리터럴을 전달

프로퍼티 

타입 

기본값 

설명 

data

object, string 

undefined 

Ajax 페이지 요청을 통해 전달할 데이터 

loadMsgDelay 

number 

50 

로딩 메시지가 나타나기 전의 지연시간(ms) 

pageContainer 

jQuery collection 

$.mobile.pageContainer 

로드된 후 페이지를 포함하는 요소 

reloadPage 

boolean 

false 

강제로 페이지를 리로드 

role 

string 

undefined 

페이지를 나타낼 때 사용하는 data-role의 기본 값 

showLoadMsg 

boolean 

false 

외부 페이지 로딩 시 로딩 메시지 표시 여부 

type

string 

"get" 

페이지 요청 메소드(get/post) 


3. $.mobile.loading()

- $.mobile.loader.prototype.options의 옵션들을 이용하거나 프로퍼티를 이용해 객체 리터럴을 전달하면 페이지 로딩 메시지를 표시하거나 보이지 않게 함

프로퍼티 

타입 

기본값 

설명 

theme

string 

"a" 

에시지에 대한 테마 스와치 

text 

string 

"loading" 

로딩 메시지 문자열 

textonly 

boolean 

false 

true일 경우 메시지가 나타나면 스피너 이미지가 사라짐 

textVisible

boolean 

false 

true일 경우스피너 아래 메시지가 보임 

html 

string 

"" 

로더의 innerHTML을 교체 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>19-01</title>
        <link rel="stylesheet"  href="js/jquery.mobile-1.3.2.css" />
        <script src="js/jquery-1.11.1.js"></script>
        <script type="text/javascript">
            $(document).on('mobileinit'function() {
                $.mobile.loader.prototype.options.theme = "a";
                $.mobile.loader.prototype.options.text = "loading";
                $.mobile.loader.prototype.options.textonly = false;
                $.mobile.loader.prototype.options.textVisible = false;
            });
 
            $(document).on('pagecreate'function() {
 
                $('#default').on('tap'function(event) {
                    $.mobile.loading('show', {
                        theme : $.mobile.loader.prototype.options.theme,
                        text : $.mobile.loader.prototype.options.text,
                        textonly : $.mobile.loader.prototype.options.textonly,
                        textVisible : $.mobile.loader.prototype.options.textVisible
                    });
                });
 
                $('#textonly').on('tap'function(event) {
                    $.mobile.loading('show', {
                        theme : $.mobile.loader.prototype.options.theme,
                        text : "텍스트만 표시되는 로더",
                        textonly : true,
                        textVisible : true
                    });
                });
 
                $('#theme_a').on('tap'function(event) {
                    $.mobile.loading('show', {
                        theme : "a",
                        text : "페이지 로딩 중 (Theme a)",
                        textonly : false,
                        textVisible : true
                    });
                });
 
                $('#theme_b').on('tap'function(event) {
                    $.mobile.loading('show', {
                        theme : "b",
                        text : "페이지 로딩 중 (Theme b)",
                        textonly : false,
                        textVisible : true
                    });
                });
 
                $('#hide').on('tap'function(event) {
                    $.mobile.loading('hide');
                });
 
            });
 
        </script>
        <script src="js/jquery.mobile-1.3.2.js"></script>
    </head>
 
    <body>
        <div data-role="page" id="main">
            <div data-role="header" data-position="fixed">
                <h3>Utilities</h3>
            </div>
            <div data-role="content">
                <p>
                    메시지 로더
                </p>
                <div>
                    <button id="default">
                        Default Loader
                    </button>
                    <button id="textonly">
                        Text Only
                    </button>
                    <button id="theme_a" data-theme="a">
                        Theme a
                    </button>
                    <button id="theme_b" data-theme="b">
                        Theme b
                    </button>
                    <button id="hide">
                        Hide
                    </button>
                </div>
            </div>
            <div data-role="footer" data-position="fixed">
                <h4>&copy; 2014 T academy</h4>
            </div>
        </div>
    </body>
</html>
 
cs


19강끝 


'Legend 개발자 > T아카데미' 카테고리의 다른 글

모바일 GUI 디자인  (0) 2017.09.05
UX/UI 기획  (0) 2017.09.04
컴퓨터 알고리즘 중급  (0) 2017.08.31
JavaScript  (0) 2017.08.30
HTML&CSS  (0) 2017.08.28
Posted by 전설의아이
|

1강 컴퓨터 알고리즘 성능분석(1)


1. 컴퓨터 알고리즘 성능분석

- 컴퓨터 알고리즘

컴퓨터 알고리즘의 정의 : 문제를 해결하기 위한 과정을 상세하게 단계적으로 표현한 것으로 입력과 출력으로 문제를 정의

단계

내용

문제정의

현실 세계의 문제를 컴퓨터를 이용하여 풀 수 있도록 입력과 출력의 형태로 정의

알고리즘 설명

문제를 해결하기 위한 단계를 차례대로 설명

정확성 증명

항상 올바른 답을 내고 정상적으로 종료되는지 증명

성능분석

수행시간이나 사용공간에 대한 알고리즘의 성능을 비교하기 위한 분석 

- 컴퓨터 알고리즘의 성능분석

특정 기계에서 수행 시간을 측정하는 방법 : 현실적으로 불가능

절대적 시간을 측정하여 비교하는 방법 : 공정한 비교가 불가능

위 두가지를 해결하기 위해 → 점근적 표기법 사용 (Asymptotic notations)

점근적 표기법이란?

O - notation (빅오 표기)

Ω - notation (오메가 표기)

Θ - notation (쎄타 표기)

→ "T(n)으로 표현하고 최고차 항만 고려"

- 재귀함수에 대한 성능분석

T(n) =

 Θ(1)              if n=1 

 2T(n/2)+Θ(n)   if n>1

→ "T(n)에 대한 수식으로 표현하는 것이 쉽지 않음."

그래서 아래와 같은 방법이 나왔음.

대체법 (Substitution Method) : T(n)이라고 하는 함수에다가 생각하는 값을 집어넣어서 확인하는 방법

리컬젼 트리 매소드 (Recursion-tree Method) : 재귀 함수를 트리형태로 그려보고 트리에 나오는 값을 확인하는 방법

마스터 매소드 (Master Method) : 함수의 값이 aT(n)+b 와 같이 나왔을 때 a와 b의 값을 통해 값을 확인하는 방법


2. 대체법(Substitution Method)

- 대체법(Substitution Method)을 통한 성능분석 : 해답의 형태를 추측 → 수학적 귀납법을 이용하여 추측한 해답이 맞음을 증명

Question:) 다음 재귀식에 대한 점근적 상한의 시간복잡도를 구하시오.

→ T(n) = 2T( [n/2] ) + n

→ 추측 : T(n)=O(n lg n)

→ 증명 : T(n) <= cn lg n 적절한 상수 c를 설정

T( [n/2] ) <= c[n/2] lg( [n/2] )에 대해 성립하는지 증명 (T(n)<=cn lg n이라고 추측했었음 )

T(n) <= 2(c[n/2] lg( [n/2] )) + n

<= cn lg(n/2) + n (log의 성질을 통해 lg(n/2)일 경우 lg n - lg 2로 표현할 수 있음)

  = cn lg n - cn lg 2 + n (여기에 나온 lg2는 밑수가 2인 로그이기 때문에 1이 된다.)

  = cn lg n - cn +n (cn이큰지? n이큰지 비교할 때 c를 상수라고 생각을 하면 해당 공식은

    cn lg n보다 작거나 같다는 것을 알 수가 있다.)

<= cn lg n             

(as long as c>=1)

적절한 c를 설정 

T(n) = cn lg n

n=1, T(1) = c1 · lg1 = 0 (판단하기가 힘들다)

n=2, T(2) = c2 · lg2 = 2c    <= 4 (c가 2라고 생각했을 때 4보다 작다)

n=3, T(3) = c3 · lg3 = 4.8c  <= 5 

n=4, T(4) = c4 · lg4 = 8c    <= 8

남은 것은 n0이가 어디냐? 즉 시작점은 어디인지, 이때 만족하는 c값을 설정해주면 된다.


학습정리

컴퓨터 알고리즘 성능평가 : 문제를 해결하는 알고리즘은 여러 종류가 있을 수 있는데 이 중에서 가장 적합한 것을 고르기 위해서는 성능 평가와 비교가 필요하며 이를 위해서 상대적 평가를 할 수 있는 점근적 표현법이 사용됨

대체법(Substitution Method) : 재귀알고리즘은 T(n)으로 간단히 계산하기가 쉽지 않기 때문에 추측을 통해 대체법을 이용하여 수학적 귀납법을 증명하는 방법을 이용함.


2강 컴퓨터 알고리즘 성능분석(2)


1. 재귀 함수와 재귀 트리

  재귀트리를 이용하는 방법은 먼저 주어진 함수에 값을 추측하고, 추측한 값을 대체법을 이용하여 증명하는 방법이다.

- 재귀 함수에 대한 성능 분석

재귀 함수라는 것은 일반적으로 점근적 표기법(Asymptotic notations) 으로 표현할 수 없는 경우가 많다 그 이유는 아래의 표와 같이 T(n)이 자기자신의 입력값만 바뀌로 자기자신을 호출하기 때문이다. 그래서 이것을 일반적인 다차식으로 변환하는 과정이 필요한데 그 방법이 대체법 (Substitution Method), 리컬젼 트리 매소드 (Recursion-tree Method), 마스터 매소드 (Master Method)이다.

T(n) =

 Θ(1)              if n=1 

 2T(n/2)+Θ(n)   if n>1

재귀 함수의 성능 분석을 위해 재귀 트리를 이용할 때는 적절한 해답을 찾기 위해 좋은 추측을 하는 것

좋은 추측은 대체법을 통해 증명하고, 재귀함수의 성능을 분석

Question) T(n) = 3T ( [n/4] ) + Θ(n제곱)

→ T(n) = O(n제곱) 임을 보이시오.

→ 재귀 함수를 이용한 추측

→ 대체법을 이용한 증명

- 트리에서 각 노드는 각 하위 문제에 대한 비용을 표현

- 트리에서 레벨에 속한 노드들의 합은 레벨의 총비용을 표현

- 트리의 각 레벨의 비용을 모두 더하면 재귀 트리 전체의 비용

T(n) = 3T ( [n/4] ) + Θ(n제곱) 해당 식은 

T(n) = 3T ( [n/4] ) + c(n제곱) 이며 아래와 같이 트리로 표현할 수 있다. 

c(n제곱)

 /

\ 

T(n/4) 

 T(n/4)

T(n/4) 

이 식에서 n대신에 (4/n)을 집어 넣으면 T(n/4) = 3T( n/(4제곱) ) + ( (n/4)제곱 )이나오고 다시 트리로 표현하면 이와 같이 나온다.

c(n제곱)

  /

 | 

 \

T(n/4) 

T(n/4) 

 T(n/4)

  /

 | 

 \

  /

 | 

 \

  /

 | 

 \

T(n/16) 

T(n/16) 

T(n/16) 

T(n/16) 

T(n/16) 

T(n/16) 

T(n/16) 

T(n/16) 

T(n/16) 

이 작업을 반복을 하면 root는 c(n제곱)이고 그의 자식들은 계속 1/4씩 나누어 지면서 뻗어나간다.

해당 그림에서 각 노드들은 cost 이고, cost들을 합한 것이 level당 cost 값이며, 각 level 들의 합은 전체 트리의 cost 값이다. 그러면 첫 번째로 해야할 것은 각노드들의 값이 나왔으니 각 level들의 값을 구해야 한다. 그러면 총 몇 level인지를 살펴봐야 한다.

- Subproblem size for a node at depth i : n/(4의 i승) 

(level이 i라고 했을 때 node 하나의 크기는 얼마인가? level이 하나씩 늘어날 때마다 1/(4의i승)씩 늘어난다.)

- The number of nodes at depth i : 3의 i승

(level이 늘어남에 따라 node의 갯수는 3의 배수로 늘어난다 [ 3T(n/4) ] )

- The number of levels : log4의 n + 1 (총 높이는 몇개인가?)

(level의 갯수는 몇개인가? n이 1이 될 때까지의 값을 구하면 되기 때문에, h = (4의i승)에 로그를 취하면 log4의 n + 1이 나오고 여기서 1은 최소에 n이 전체 입력으로 주어졌을 때이다, 즉 t(n)일 때 때문에 1을 더해준다. )

- The number nodes at the last level : n의 (log4의 3)승

(마지막단, 즉leaf단 에서 leaf node는 총 몇개 인가를 구하는 것이다. 매번 3개씩 증가하면서 1/4만큼 값이 감소하기 때문에 값이 n의 (log4의 3)승 이 나온다)

- 각층의 값을 구하면 leaf 단의 값은  n의 (log4의 3)승 높이는 log4이다.

제일 높은 층의 값이 c(n제곱)

두번 째 층의 값이 3c(n/4)제곱

세번 째 층의 값이 9c(n/16)제곱이며 이는 층을 내려갈 수록 (3/16)를 곱해나가기 때문에

제일 높은 층의 값 c(n제곱) →  c(n제곱)

두번 째 층의 값 3c(n/4)제곱  →  (3/16) c(n제곱)

세번 째 층의 값 9c(n/16)제곱  →  ( (3/16)의 제곱 ) c(n제곱) 으로 표현할 수 있으며

leaf 노드까지 가면 상단에 구한 Θ(n의 (log4의 3)승) 값을 더해주면 된다.

- 그러므로 T(n) =  c(n제곱) + (3/16) c(n제곱) + ( (3/16)의 제곱 ) c(n제곱) + … + Θ(n의 (log4의 3)승)     으로 표현할 수가 있다.

- 위기 식은 (3/16)의 등비수열이기 때문에 T(n) = [ log4의 (n-1) 시그마 i=0 ] + Θ(n의 (log4의 3)승) 

    으로 표현할 수가 있다.

- 처음에 문제에서 구하라는 값이 T(n) = O(n제곱) 임을 보이시오. 이기 때문에

     [ log4의 (n-1) 시그마 i=0 ] 식이 어느만큼 커질 것인가를 생각하면 된다.

|x|<1, [∞ 시그마 k=0] X의 k승 = 1 / (1 - x)

x의 절대값이 1보다 작다고 했을 때 x의 지수승을 모두 무한대로 더하면 결국 1 / (1 - x) 이라는 등비수열의 합공식과 같게 된다.

- T(n) = [ log4의 (n-1) 시그마 i=0 ] + Θ(n의 (log4의 3)승)  (주어진 식 정리를 하자면)

빅오를 구하는 것이기 때문에 시그마가 무한대로 가도 된다. 그러므로

[ log4의 (n-1) 시그마 i=0 ]는 (1 / ( 1- (3/16)))c(n의제곱)이며

  =  (1 / ( 1- (3/16)))c(n의제곱) + Θ(n의 (log4의 3)승)

  = (16/13)c(n의제곱) + Θ(n의 (log4의 3)승)

여기서 최고차항만 따지면 앞은 2고 뒤는 1이기 때문에

  = O(n의제곱) (이라고 할 수 있다.)

- 여기까지 했으면 해당식이 O(n의 제곱)이라고 리컬젼 트리 매소드 (Recursion-tree Method)을 통해서 추측만 한 것이기 때문에 대체법(Substitution Method)으로 증명을 시작하면 된다. 그럼 지금까지 무엇을 한거냐고 물어본다면 해당식을 트리방식으로 만들어서 각 노드들의 합을 구한 후 노드들의 합인 level의 합을 구해서 해당값이 O(n의제곱)이랑 같을 것이다라고 좋은 추측을 할 수 있다는 것을 알게 된 것이다.

- T(n) = 3T ( [n/4] ) + Θ(n제곱) 해당식이 O(n의제곱)이라는 것을 증명하려면 

T(n)<=d(n의제곱) (d>0, c>0) 라는 것을 생각할 수가 있다.

T(n) <= 3T ( [n/4] ) + Θ(n제곱) 여기에 3T ( [n/4] )는 3d( [n/4]의제곱 )으로 

Θ(n제곱은 c(n제곱) 바꿔서 증명을 시작한다.

  <= 3d( [n/4]의제곱 ) + c(n제곱)

  <= 3/16d(n의제곱) + c(n제곱) (단순한 수학적인 계산을 하였음)

  <= d(n의제곱) (여기서 d(n의제곱)라고 말할 수 있는 이유는 d가 c보다 크기 때문이며)

더 정확하게 가려면 d>=(16/13)c을 만족할 때 T(n) <= d(n의제곱) 이 성립된다고 할 수가 있다.


학습정리

재귀 트리를 이용한 성능 분석 : 재귀 함수의 성능 분석을 위해 재귀 트리를 그려 해답을 추측하고, 이를 대체법을 이용하여 증명하는 방법이 있음


3강 확률분석(1)


1. Hiring 문제를 이용한 확률분석

- Hiring problem의 정의 : 지원자 중 가장 뛰어난 직원을 고용하려고 할 때, 최소의 비용을 계산하는 문제

1. 지원자를 매일 1명씩 인터뷰

2. 면접 후에 지원자 고용여부를 즉시 판단

3. 지원자를 고용하면 기존의 직원은 해고

→ 지원자를 인터뷰 할 때마다 인터뷰 비용 지불 Ci

→ 지원자를 고용할 때마다 고용 비용 지불 Ch

- Hiring problem의 수도코드

HIRE-ASSISTANT(n) (n은 인터뷰의 숫자)

best ← 0 (candidate 0 is a least-qualified dummy candidate) (가장 좋은 사람이 제일 처음에는 0값으로 설정이 되어 있어야 그 다음으로 오는 사람들이 best로 설정이 되어서 가장 좋은 사람들을 쉽게 선택할 수 있다. 그리서 가장 least-qualified를 뽑게 된다. )

for i ← 1 to n

do interview candidate i

if candidate i is better than candidate best

then best ← i (candidate i is better than candidate best) (best보다 더 좋은 best가 오면 그사람을 고용을 한다.)

hire candidate i

- Hiring problem의 비용계산

 

 인터뷰

고용 

횟수 

1회 비용 

Ci 

Ch 

전체 비용

n·Ci 

m·Ch 

- 인터뷰 비용 Ci는 고용비용Ch에 비해 매우 낮음

인터뷰 횟수는 n번 → 고정

고용 횟수 m번 → 변동

→ 고용비용 m·Ch를 최소로 만들면 전체 비용이 최소됨

- 최악의 경우는 ①모든 인터뷰어를 고용하는 경우로

m=n이고 비용은 m(Ci + Ch)

②인터뷰를 받으러 오는 사람들이 뒤쪽으로 갈수록 점점 더 우수한 사람들인 경우로 오름차순으로 정렬된 경우 

→ 이런 경우가 발생할 수 있지만 확률은 매우 낮음

→ n명의 후보자들이 오름차순으로 정렬될 확률은 1/n

- 평균적인 경우에 대한 확률적 분석이 필요

- 가장 우수한 사람이 첫 번째 오는 경우의 수 x 비용

- 가장 우수한 사람이 두 번째 오는 경우의 수 x 비용

- 가장 우수한 사람이 세 번째 오는 경우의 수 x 비용

       ... ...

- 가장 우수한 사람이 n 번째 오는 경우의 수 x 비용

- Indicator Random Variables

X를 고용횟수의 m에 대한 변수라고 하고

x를 경우의 수, Pr{X=x}를 각 경우의 확률이라고 하면

x의 범위는 1부터 n이므로 기대값 E[X]는 다음과 같다.

E[X]= [n 시그마 x=1] x Pr {X =x } 

위의 식은 X 모든 고용횟수에 대한 기대값이라는 것은 각각의 경우의 수에다가 확률 값을 곱하고 그 경우가 1번 부터 n번까지 모두 올라가는 경우라고 볼 수 있다.

여기까지는 Indicator Random Variables가 적용된 것이 아니며 위의 식은 → 계산이 쉽지 않다

Indicator Random Variables를 적용하기 위해서 Xi를 정의를 하고

Xi는 i번째 인터뷰가 고용되는 경우에 대한 indicator random variable이라고 하면

Xi = I{candidate i is hired}

{

1 if candidate i is hired,

}

0 if candidate i is not hired, 

i번째 사람이 고용이 되면 1 그렇지 않으면 0

그러므로 우리가 찾고자 하는 인터뷰에 대한 고용횟수를 구하는 식인

X = X1 + X2 + X3 + ... + Xn  이 나온다.

- i번째 인터뷰이가 고용되는 경우는 1번째부터 i - 1 번째 인터뷰이가 i 번째 인터뷰이 보다 우수하지 않은 경우이므로 확률은 1/i   즉, E[Xi] = Pr { candidate i is hired } = 1/i





'Legend 개발자 > T아카데미' 카테고리의 다른 글

UX/UI 기획  (0) 2017.09.04
jQuery (JavaScript)  (0) 2017.09.02
JavaScript  (0) 2017.08.30
HTML&CSS  (0) 2017.08.28
컴퓨터 알고리즘 초급  (0) 2017.08.10
Posted by 전설의아이
|

1강 JavaScript 개요

 

1. 자바스크립트란?

- 웹 브라우저에 내장되어 있는 스크립트(script) 언어

- 객체지향(object oriented) 프로그래밍

- 인터프리터(interpreter) 방식

- 동적이면서 약한 타입(dynamic and weak typing) 언어

 

2. 웹 개발환경의 변화

- 1994년 Bredan Eich가 개발

- 1995년 넷스케이프 네비게이터 2.0에 탑재

- 모든 웹 브라우저에 내장된 클라이언트 측 스크립트 언어

- 2005년 초 Ajax 기술의 보급

- 2008년부터 가열된 웹 브라우저간의 자바스크립트 엔진 성능 경쟁

 

3. 웹 개발환경의 변화 (계속)

- 서버 측에서의 자바스크립트 프로그래밍

- 2009년 Ryan Dahl이 Node.js 개발

- HTML 5의 중심에 놓여 웹 표주능로서 위상을 가짐

- 모바일 환경까지 그 응용 범위의 세를 더욱 확장

 

4. 모바일 앱 개발환경과 자바스크립트의 위상

- 2007년 아이폰의 등장과 함께 시작된 스마트폰의 열풍

- 엄청난 모바일 앱 시장의 성장

- 스마트 폰 플랫폼의 다양성이 바로 문제의 발단

- 개발 비용의 증가, 유지보수 비용의 증가

- 모바일 웹 브라우저의 신속한 HTML5 지원

- jQuery Mobile, Sencha Touch 와 같은 모바일 웹 앱 개발 프레임워크 등장

- 모바일 웹 앱(mobile web app) - 속도의 한계

- 하이브리드 모바일 앱(hybrid mobile app) 대안

- 모바일 시대의 앱 개발에 있어 자바스크립트의 위상과 중요성이 날로 높아짐

 

5. 자바스크립트 개발도구 설치

- eclipse, aptana 설치

 

 1강끝

 

2강 변수, 데이터 타입, 리터럴

 

1. <script> 태그와 자바스크립트 - 자바스크립트 코드의 실행

- 스크립트 코드 파싱 → 스크립트 코드 실행 → 함수 호출 → 함수 패싱 → 함수 실행

- HTML에 있는 JS 코드가 파싱이 된 후, JS 코드 실행 하면 전역 스코프에 패싱이 됨, 함수 호출 후, 함수 스코드에 함수와 함수의 변수가 패싱이 됨

 

2. 자바스크립트 출력하기 - HTML 페이지에서의 자바스크립트 기술 방식

- 인라인 스크립트 방식

<script>태그 아래 자바스크립트 코드를 직접 작성

- 외부 스크립트 방식

자바스크립트 코드를 외부 파일(확장자는 js)에 작성하고 이 파일의 이름을 <script>태그의 src속성 값으로 지정

- 외부 스크립트와 인라인 스크립트는 동시에 작성 불가 (인라인스크립트의 내용은 무시됨)

- <script> 태그는 <head>태그 아래 혹은 <body> 태그 아래에 작성 가능.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-01</title>
    </head>
    <body>
        <script type="text/javascript">
            document.writeln('<script>태그 아래의 인라인 스크립트에 의한 출력입니다.<br/>');
        </script>
        <script type="text/javascript" src="02-01.js">
            document.writeln('외부 스크립트를 사용할 때는 <script> 태그아래 내용이 무시됩니다.<br/>')
        </script>
    </body>
</html>
cs

위는 JavaScript소스가 포함된 HTML 파일이고 아래는 링크가 걸어진 js파일이다. 

1
2
document.writeln("src속성에 기술된 외부 스크립트에 의한 출력입니다.<br/>")
document.writeln("안녕하세요! 자바스크립트입니다<br/>")
cs

 

3. 문장규칙

- (1) 문장의 끝에 세미콜론(;)을 붙입니다.

- (2) 대소문자를 구별합니다.

- (3) 문장에서의 화이트 스페이스 문자는 무시됩니다.

화이트 스페이스 문자는 공백 space tab이다.

 

4. 주석

- // 행의 끝까지를 주석으로 처리하는 단일 행 주석

- /**/ 여러 라인에 걸쳐 주석 블록을 구성할 수 있는 복수 행 주석

 

5. 변수 선언과 var

- 변수 : 프로그램이 어떤 값을 메모리에 저장해 두고 다시 사용하기 위한 공간

- var 키워드 : 자바스크립트는 값을 저장하기 위한 공간을 확보하기 위해 var 키워드를 이용해 변수를 선언

var 변수명 [=초기값];

- 변수 선언 시 초기값을 지정하지 않을 경우, 값을 저장할 때까지 그 변수는 undefined 상태임

- 변수 선언의 예

var a; (undifined)

var b,c;

var d=0;

var e=2, f=4;

var g=6, h;

var i, j =8;

- 변수 선언 시 var 키워드 생략이 가능하지만, 변수 스코프 문제가 발생할 수 있으므로 var 키워드는 생략하지 않는 것이 좋습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-02</title>
    </head>
    <body>
        <script type="text/javascript">
            //변수 선언
            var a;
            var b,c;
            var d=0;
            var e=2, f=4;
            var g=6, h;
            var i, j=8;
            document.writeln("a:"+a+'<br/>'); //a:undefined
            document.writeln("b:"+b+'<br/>'); //b:undefined
            document.writeln("c:"+c+'<br/>'); //c:undefined
            document.writeln("d:"+d+'<br/>'); //d:0
            document.writeln("e:"+e+'<br/>'); //e:2
            document.writeln("f:"+f+'<br/>'); //f:4
            document.writeln("g:"+g+'<br/>'); //g:6
            document.writeln("h:"+h+'<br/>'); //h:undefined
            document.writeln("i:"+i+'<br/>'); //i:undefined
            document.writeln("j:"+j+'<br/>'); //j:8
            var k=10;
            var l='문자열';
            document.writeln("k:"+k+'<br/>'); //k:10
            document.writeln("l:"+l+'<br/>'); //l:문자열
            l=12;
            document.writeln("l:"+l+'<br/>'); //l:12
        </script>
    </body>
</html>
cs

 

6. 식별자 규칙

- (1) 첫번째 문자는 [A-Z a-z _$] 만 사용합니다.

- (2) 나머지 문자는 [A-Z a-z _$ 0-9] 만 사용합니다.

kor_score

averageScore

phone1

_amount

$val

- (3) 자바스킯트 예약어는 사용할 수 없습니다.

 

7. 값에 의한 데이터 타입 결정

- 저장되는 값에 따라 변수의 데이터 타입이 바뀝니다.

var k=10;

var l= '문자열';

l = 12;

 

8. 값을 저장하는 기본형 데이터 타입

데이터 타입 

 특징

숫자 

자바스크립트는 정수 값과 실수 값을 구분하지 않습니다. 모든 숫자는 IEEE 754 표준에 의해 정의된 8바이트 크기의 실수로 표현하며 (상당히 큰 범위)의 숫자를 표현할 수 있습니다.

문자열

(string)

유니코드 문자나 숫자, 문장부호들의 시퀀스로 텍스트를 표현합니다. 작은따옴표(') 혹은 큰 따옴표(") 쌍으로 문자열을 둘러싸서 문자열을 표현합니다. 단일 문자 표현은 길이가 1인 문자열로 표현합니다. 

불리언

(boolean)

불리언 형은 참/거짓의 진리 값 두 개를 표현하는데, true 또는 false 값을 가집니다. 

null 

예약어 null은 보통 참조 타입과 함께 쓰여, 어떠한 객체도 나타내지 않는 특수한 값으로 사용합니다. 

undefined 

undefined는 변수는 선언되었으나 값이 할당된 적이 없는 변수에 접근하거나, 존재하지 않는 객체 프로퍼티에 접근할 경우 반환되는 값입니다. 

 

9. 참조값을 저장하는 참조형 데이터 타입

데이터 타입

특징 

배열

(array) 

배열은 데이터 값들의 모음입니다. 배열의 각 데이터 값에는 0부터 시작하는 인덱스라는 번호가 있어서 배열명 다음에 대괄호([])로 둘러싼 인덱스를 써서 값을 가져올 수 있습니다. 

객체

(object) 

객체는 이름이 붙은 값들의 모음입니다. 이 이름이 붙은 값들을 프로퍼티라고 하며, 객체 프로퍼티는 객체명 다음에 점(.)과 프로퍼티명을 붙이거나, 객체명 다음에 대괄호([])로 둘러싼 프로퍼티명의 문자열을 써서 접근할 수 있습니다. 

함수

(function) 

자바스크립트에서 함수는 객체 프로퍼티에 할당될 수 있는 실행가능한 코드를 가지고 있는 데이터 타입입니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-03</title>
    </head>
    <body>
        <script type="text/javascript">
            //데이터 타입
            var num = 10//숫자형
            var str = '자바스크립트'//문자열형
            var point = { x:300, y:400 }; //객체
            var arr =10203040 ]; //배열
            //함수
            var add = function(op1, op2) {
                return op1 + op2;
            };
            
            document.writeln('num: '+num+'<br/>'); //num:10
            document.writeln('str: '+str+'<br/>'); //str:자바스크립트
            document.writeln('point.x: '+point.x+'<br/>'); //point.x:300
            document.writeln('point["y"]: '+point["y"]+'<br/>'); //point["y"]:400
            document.writeln('arr[0]: '+arr[0]+'<br/>'); //arr[0]:10
            document.writeln('arr[3]: '+arr[3]+'<br/>'); //arr[3]:40
            document.writeln('add: '+add+'<br/>'); //add:function(op1,op2){return op1+op2;}
            document.writeln('add(2,3): '+add(2,3)+'<br/>'); //add(2,3):5
        </script>
    </body>
</html>
cs

 

10. 기본형 데이터 타입과 참조형 데이터 타입의 변수 선언과 메모리 할당

-  // 기본형 데이터 타입

var num = 10;

var str = '자바스크립트';

- // 참조형 데이터 타입

var point = {x:300, y:400};

var arr= [ 10, 20, 30, 40 ];

 

11. 리터럴

- 리터럴(Literal) : 프로그램의 코드 상에 데이터의 값을 표현하는 방식

- 자바스크립트의 리터럴 :

숫자 리터럴, 문자 리터럴, 배열 리터럴, 객체 리터럴, 함수 리터럴, 불리언 리터럴, 그리고 undefined와 null 리터럴

 

12. 숫자 리터럴

- 자바스크립트에서 숫자 리터럴 중 정수(fixed point) 리터럴은 10진수, 16진수로 표현

- 16진수 리터럴은 '0x' 나 '0X'로 시작하고 뒤에 16진수 숫자들을 붙여 표현

- 16진수 숫자는 0~9과, 10~15를 표현하는 a(혹은 A) ~ f(혹은 F) 중 하나를 사용

- 8진수 리터럴은 0으로 시작하고 뒤에 0~7 사이의 숫자들을 붙여 표현

Ex:) 0     32767     0xff     0377

- 자바스크립트에서 숫자 리터럴 중 부동소수점(floating poing) 리터럴 표기법으로는 실수표기법과 지수표기법이 있음

- 실수표기법 : [digits][.digits]

- 지수표기법 : [digits][.digits][(e|E)[(+|x)]]digits]

Ex:) 3.14     98.45     .3333333333333     1.5e10     5.25E-21

- Infinity, NaN를 포함한 모든 숫자 데이터는 typeof 연산의 결과 "number"를 반환

Infinity는 무한대를 나타내는 숫자이고

NaN은 산술연산을 했는데 그 결과 값이 숫자가 아니였다라는 상수값이다.

상수

정의 

Infinity 

무한대를 나타내는 특수한 숫자 값입니다. isFinite() 함수가 false값을 반환하면 Infinity 값임을 확인할 수 있으며, ==비교연산이 가능합니다. 

NaN 

숫자가 아님을 나타내는 특수한 숫자 값입니다. NaN값에 대한 확인은 == 비교연산을 사용할 수 없으며, 반드시 isNaN() 함수를 사용해야 합니다.

Number.Max_VALUE 

숫자로 표현할 수 있는 가장 큰 수(1.7976931348623157 x 10 308승)를 정의하고 있습니다.

Number.MIN_VALUE 

숫자로 표현할 수 있는 가장 작은 수(5 x 10 -324승)를 정의하고 있습니다. 

Number.NaN 

NaN과 동일합니다. 

Number.POSITIVE_INFINITY 

양의 무한대(Infinity)를 나타내는 특수한 숫자 값입니다. 

Number.NEGATIVE_INFINITY 

음의 무한대(-Infinity)를 나타내는 특수한 숫자 값입니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-04</title>
    </head>
    <body>
        <script type="text/javascript">
            var a=10;            
            document.writeln('a: '+a+'<br/>'); //a:10
            document.writeln('typeof a: '+typeof a+'<br/>'); //typeof a:number
            document.writeln('isFinite(a): '+isFinite(a)+'<br/>'); //isFinite(a):true
            document.writeln('isNaN(a): '+isNaN(a)+'<br/>'); //isNAN(a):false
            document.writeln('<br/>');
            
            var b=1/0;            
            document.writeln('b: '+b+'<br/>'); //b:Infinity
            document.writeln('typeof b: '+typeof b+'<br/>'); //typeof b:number
            document.writeln('isFinite(b): '+isFinite(b)+'<br/>'); //isFinite(b):false
            document.writeln('isNaN(b): '+isNaN(b)+'<br/>'); //isNAN(b):false
            document.writeln('<br/>');
            
            var c= * "4times";        
            document.writeln('c: '+c+'<br/>'); //c:NaN
            document.writeln('typeof c: '+typeof c+'<br/>'); //typeof c:number
            document.writeln('isFinite(c): '+isFinite(c)+'<br/>'); //isFinite(c):false
            document.writeln('isNaN(c): '+isNaN(c)+'<br/>'); //isNAN(c):true
            document.writeln('<br/>');
            
        </script>
    </body>
</html>
cs

 

13. 문자열 리터럴

- 문자열 리터럴은 유니코드 문자들을 작은따옴표(') 또는 큰따옴표(")로 둘러싸서 표현

- 작은따옴표로 만든 문자열내에서는 큰따옴표를 포함할 수 있고, 큰따옴표로 만든 문자열에서는 작은 따옴표를 포함할 수 있음

- 문자열 리터럴은 한 줄을 넘을 수 없으며, 만일 문자열 리터럴 내에서 줄바꿈을 표현하고자 한다면 이스케이프 시퀀스 '\n'를 사용합니다.

Ex:)  '' //빈 문자열

"" //빈 문자열

'문자열 리터럴'

'작은따옴표로 만든 문자열에는 큰따옴표(")를 포함할 수 있습니다.' 

"큰따옴표로 만든 문자열에는 작은따옴표 (')를 포함할 수 있습니다." 

이스케이프 시퀀스 

유니코드 

의미 

\0 

\u000 

널 문자 

\b 

\u0008

백스페이스

\t

\u0009

수평 탭

\n

\u000A

줄바꿈 문자

\v

\u000B

수직 탭

\f

\u000C

폼 피드 (새로운 페이지로 이동)

\r

\u000D

캐리지 리턴 (현재 행의 처음으로 이동)

\"

\u0022

큰 따옴표

\'

\u0027

작은 따옴표

\\

\u005C

역슬래시

\xXX

 

두 개의 16진수 XX에 의해 지정되는 Latin-1문자

\uXXXX

 

네 개의 16진수 XXXX에 의해 지정되는 유니코드 문자

- 역슬래시 자체를 출력하려면 이스케이프 시퀀스 \\을 사용

- 작은따옴표 자체를 출력하려면 \'을, 큰따옴표 자체를 출력하려면 \"을 사용

'작은따옴표로 만든 문자열에 \\\'를 통해 작은따옴표(\')를 포함할 수 있습니다.'

"큰따옴표로 만든 문자열에 \\\"를 통해 큰따옴표(\")를 포함할 수 있습니다.";

'이 문자열은 줄바꿈을 통해 첫번째 행을 출력하고, \N이어 두번째 행을 출력합니다.'

'원주율 \u03c0는 원의 둘레와 지름의 비율입니다.

- 유니코드 문자 \u03c0는 수학기로 p(파이)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-05</title>
    </head>
    <body>
        <script type="text/javascript">
            //문자열 리터럴
            var str1 = '문자열 리터럴';
            var str2 = '작은따옴표로 만든 문자열에는 큰따옴표(")를 포함할 수 있습니다.';
            var str3 = "큰따옴표로 만든 문자열에는 작은따옴표(')를 포함할 수 있습니다.";
            
            document.writeln(str1 + '<br/>');
            document.writeln('<br/>');
            document.writeln(str2 + '<br/>');
            document.writeln(str3 + '<br/>');
            document.writeln('<br/>');
            
            var str4 = '작은따옴표로 만든 문자열에 \\\'를 통해 작은따옴표(\')를 포함할 수 있습니다.';
            var str5 = "큰따옴표로 만든 문자열에 \\\"를 통해 큰따옴표(\")를 포함할 수 있습니다.";
            var str6 = '이 문자열은 줄바꿈을 통해 첫번째 행을 출력하고, \n이어 두번째 행을 출력합니다.';
            var str7 = '원주율\u03c0는 원의 둘레와 지름의 비율입니다.';
            
            document.writeln(str4 + '<br/>');
            document.writeln(str5 + '<br/>');
            document.writeln(str6 + '<br/>');
            document.writeln(str7 + '<br/>');
            document.writeln('<br/>');
            
        </script>
    </body>
</html>
cs

 

14. 배열 리터럴

- 배열 : 데이터 값들의 모음

- 배열의 원소인 데이터 값은 배열명 다음에 대괄호([])로 둘러싼 인덱스(index)를 써서 그 값을 가져오거나 변경할 수 있음

- 배열의 인덱스는 0부터 시작해서, 배열의 원소 개수 -1까지의 유효범위를 가짐

- 배열의 원소의 개수는 length 프로퍼티에 접근해 알 수 있음

- 자바스크립트에서 배열의 원소는 어떠한 데이터 타입이라도 사용할 수 있음

- 배열 리터럴은 콤마(,)로 구분한 값을 대괄호([])로 감싸서 표현함

Ex) [] //빈 배열

[ 95, 91, 100, 286, 95.33] //숫자를 원소로 갖는 배열

[ '홍길동', '이순신', '강감찬' ] //문자열을 원소로 갖는 배열

//배열을 원소로 갖는 배열

[['을지문덕', '연개소문'], ['광개토대왕', '세종대왕'], ['김유신', '계백']]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-06</title>
    </head>
    <body>
        <script type="text/javascript">
            //배열 리터럴
            //빈 배열
            var arr1 = [];
            
            document.writeln("arr1[0]: "+ arr1[0+'<br/>'); //arr1[0]:undefined
            document.writeln("arr1[1]: "+ arr1[1+'<br/>'); //arr1[1]:undefined
            document.writeln("arr1[2]: "+ arr1[2+'<br/>'); //arr1[2]:undefined
            document.writeln("arr1[3]: "+ arr1[3+'<br/>'); //arr1[3]:undefined
            document.writeln('arr1.length: '+ arr1.length +'<br/>'); //arr1.length: 0
            document.writeln('<br/>');
            
            arr1[0= 95;
            arr1[2= 100;
            document.writeln("arr1[0]: "+ arr1[0+'<br/>'); //arr1[0]:95
            document.writeln("arr1[1]: "+ arr1[1+'<br/>'); //arr1[1]:undefined
            document.writeln("arr1[2]: "+ arr1[2+'<br/>'); //arr1[2]:100
            document.writeln("arr1[3]: "+ arr1[3+'<br/>'); //arr1[3]:undefined
            document.writeln('arr1.length: '+ arr1.length +'<br/>'); //arr1.length: 3
            document.writeln('<br/>');
            
            //1차원 배열
            var arr2 = ['홍길동''이순신''강감찬'];
            
            document.writeln('arr2[0]: '+ arr2[0]+'<br/>'); //arr2[0]: 홍길동
            document.writeln('arr2[1]: '+ arr2[1]+'<br/>'); //arr2[1]: 이순신
            document.writeln('arr2[2]: '+ arr2[2]+'<br/>'); //arr2[2]: 강감찬
            document.writeln('arr2[3]: '+ arr2[0]+'<br/>'); //arr2[3]: undefined
            document.writeln('arr2.length: '+ arr2.length +'<br/>'); //arr2.length: 3
            document.writeln('<br/>');
 
            //배열을 원소로 하는 배열(2차원 배열)
            var arr2d = [
                ['을지문덕''연개소문'],
                ['광개토대왕''세종대왕'],            
                ['김유신''계백']
            ];
 
            document.writeln('arr2d[0]: '+ arr2d[0]+'<br/>'); //arr2d[0]: 을지문덕, 연개소문
            document.writeln('arr2d[1]: '+ arr2d[1]+'<br/>'); //arr2d[1]: 광개토대왕, 세종대왕
            document.writeln('arr2d[2]: '+ arr2d[2]+'<br/>'); //arr2d[2]: 김유신, 계백
            document.writeln('arr2d[3]: '+ arr2d[0]+'<br/>'); //arr2d[3]: undefined
            document.writeln('arr2.length: '+ arr2.length +'<br/>'); //arr2.length: 3
            document.writeln('<br/>');
 
            document.writeln('arr2d[0][0]: '+ arr2d[0][0]+'<br/>'); //arr2d[0][0]: 을지문덕
            document.writeln('arr2d[0][1]: '+ arr2d[0][1]+'<br/>'); //arr2d[0][1]: 연개소문
            document.writeln('arr2d[0].length'+ arr2d[0].length+'<br/>'); //arr2d[0].length: 2
            document.writeln('arr2d[1][0]: '+ arr2d[1][0]+'<br/>'); //arr2d[1][0]: 광개토대왕
            document.writeln('arr2d[1][1]: '+ arr2d[1][1]+'<br/>'); //arr2d[1][1]: 세종대왕
            document.writeln('arr2d[1].length'+ arr2d[1].length+'<br/>'); //arr2d[1].length: 2
            document.writeln('arr2d[2][0]: '+ arr2d[2][0]+'<br/>'); //arr2d[2][0]: 김유신
            document.writeln('arr2d[2][1]: '+ arr2d[2][1]+'<br/>'); //arr2d[2][1]: 계백
            document.writeln('arr2d[2].length'+ arr2d[2].length+'<br/>'); //arr2d[2].length: 2
            document.writeln('arr2d[3][0]: '+ arr2d[3][0]+'<br/>'); //arr2d[3][0]이 undefined이므로 에러발생
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

15. 객체 리터럴

- 객체 : 이름이 붙어 있는 데이터 값들의 모음

- 프로퍼티 :

이름이 붙어 있는 값

객체의 프로퍼티는 객체명 다음에 점(.)과 프로퍼티명을 붙이거나, 객체명 다음에 대괄호([])로 둘러싼 프로퍼티명의 문자열을 써서 접근할 수 있음

프로퍼티에는 배열, 함수, 객체를 포함한 어떠한 값이라도 담을 수 있음

- 메소드 :

함수가 프로퍼티에 저장될 경우 프로퍼티명이 메소드명이 됨

객체가 소유한 메소드를 호출하기 위해서는 객체명 다음에 점(.)을 붙이고 함수를 호출하기 위해 메소드명과 ()를 사용함

- 중괄호({})로 전체를 감싸고, 프로퍼티명과 프로퍼티값을 콜론(;)으로 구분하며, 각각의 프로퍼티들을 콤마(,)로 분리해 작성

- 객체 리터럴의 프로퍼티명을 식별자뿐만 아니라 문자열로도 기술할 수 있음

Ex:) var point = {"x" : 300, "y" : 200}; //(x,y) 좌표 객체

var rectangle = {

topLeft : { x:300, y:200 }, //좌측상단 (x,y) 좌표 객체

bottomRight : { x:350, y:280 }, //우측하단 (x,y) 좌표 객체

size : function(){ //면적 계산 메소드

return (this.bottomRight.x - this.topLeft.x) * (this.bottomRight.y - this.topLeft.y);

}

};

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-07</title>
    </head>
    <body>
        <script type="text/javascript">
            //객체 리터럴
            var p1 = { x:300, y:200 }; //(x,y)좌표가 (300,200)인 객체 생성
            var p2 = { x:350, y:280 }; //(x,y)좌표가 (350,280)인 객체 생성
            
            var rect = {
                topLeft : p1, //사각형의 좌측상단좌표정보 => 초기값으로 p1 객체 참조
                bottomRight : p2, //사각형의 우측하단 좌표 정보 => 초기값으로 p2 객체 참조
                size : function() { //사각형의 면적 계산 메소드
                    return (this.bottomRight.x-this.topLeft.x)*(this.bottomRight.y-this.topLeft.y);
                }                
            };    
 
            document.writeln('위치 변경 전 사각형의 넓이: '+rect.size()+'<br/>');
            document.writeln('<br/>');
            
            p1 = { x:200, y:300 };
            p2 = { x:300, y:400 };
            rect.topLeft = p1; //사각형의 좌측상단 좌표 정보 => 좌표가 변경된 p1 객체 참조
            rect.bottomRight = p2; // 사각형의 우측하단 좌표 정보 => 좌표가 변경된 p2 객체 참조
            
            document.writeln('위치 변경 후 사각형의 넓이:'+rect.size()+'<br/>');
            document.writeln('<br/>');
            
        </script>
    </body>
</html>
cs

 

16. 함수 리터럴

- 함수

어떤 입력 값을 이용해 미리 정의된 로직을 처리하여 결과를 반환하는 구조

- 자바스크립트에서 함수

객체 프로퍼티에도 할당될 수 있는 실행가능한 코드 값

객체 프로퍼티에 저장된 함수를 객체의 메소드라고 부름

함수도 데이터 타입의 하나로 다룰 수 있기 때문에 변수, 배열, 객체 프로퍼티에 저장할 수 있으며, 다른 함수의 전달인자로 넘겨줄 수도 있음

- function 키워드에 이어 소괄호 (()) 안에 함수 호출 시 전달하는 인수들 (arguments)에 의해 초기화되는 매개변수(parameters) 목록, 마지막으로 함수의 몸체 중괄호({}) 안에 함수가 수행해야 할 실행코드와 결과 값을 반환하는 return문으로 구성됨

- 만일 반환 값이 없는 return 문을 기술하거나, return 문 자체가 없으면 undefined 값을 반환함

Ex:) var add = function(op1, op2){

return op1 + op2;

};

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-08</title>
    </head>
    <body>
        <script type="text/javascript">
            //함수 리터럴
            var add = function(op1, op2){
                return op1 + op2;                
            };
            
            document.write('add(5,3):'+add(5,3)+'<br/>'); //add(5,3): 8
            document.write('<br/>');
                    
        </script>
    </body>
</html>
cs

 

17. 불리언 리터럴

- 불리언 리터럴 : 참/거짓의 진리 값 두 가지를 표현

true 또는 false 값을 가짐

불리언 값은 일반적으로 비교의 결과로 생성되며, 제어 구조 내에서 조건을 판단하는 곳에 주로 사용됨

불리언 값은 산술연산에서 true는 숫자 1로, false는 숫자 0로 변환되며, 문자열 연산에서 true는 문자열 "true"로, false는 문자열 "false"로 변환되고, 논리연산에서 0, undefined, null, NaN, "" 값은 false로 변환되어 평가됨

Ex:) var isOpened = false; //isOpend는 false 값을 가진 불리언 변수가 됨

!isOpend //isOpend가 false 일 때 !(not 연산)에 의해 전체 식의 결과가 true가 됨

score >= 70 //score의 값이 70 이상이면 이 식은 true로 평가됨

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-09</title>
    </head>
    <body>
        <script type="text/javascript">
            //불리언 리터럴
            var score = 88;
            var message = '불합격';
            
            //score 값이 70이상일 경우 비교의 결과로 true를 반환하고,
            //message변수에 '합격'문자열 값을 저장합니다.
            if(score >= 70){
                message = '합격';
            }
            
            document.writeln(score + '점은' + message + '입니다.<br/>');
            document.write('<br/>');
            
            //0, undefined, null, NaN, ""은 논리연산에서 false로 변환되어 평가됩니다.
            var a = 0;
            var b = undefined;
            var c = null;
            var d = NaN;
            var e = "";
            
            document.writeln('!0 => ' + !+ '<br/>'); //true
            document.writeln('!undefined => ' + !+ '<br/>'); //true
            document.writeln('!null => ' + !+ '<br/>'); //true
            document.writeln('!NaN => ' + !+ '<br/>'); //true
            document.writeln('!"" => ' + !+ '<br/>'); //true
            document.write('<br/>');
            
        </script>
    </body>
</html>
cs

 

18. undefined와 null

- undefined

변수가 선언은 되었지만 값이 할당된 적이 없는 변수에 접근하거나, 존재하지 않는 객체 프로퍼티에 접근할 경우 반환되는 값

논리 연산에서 false로, 산술 연산에서는 NaN로, 문자열 연산에서는 "undefined"로 변환되어 연산됨

- null

예약어

보통 참조 타입과 함께 쓰여, 어떠한 객체도 나타내지 않는 특수한 값으로 사용

논리 연산에서 false로 변환되며, 산술 연산에서는 0으로, 문자열 연산에서는 "null"로 변환되어 연산됨

Ex:) var a; //변수 선언 시 명시적인 초기화 할당 값이 없을 때 undefined값이 할당

var obj={};

obj.prop; //obj 객체 내에 prop 프로퍼티는 존재하지 않으므로 undefined를 반환

obj = null; //null값을 이용해 객체 참조를 제거

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>02-10</title>
    </head>
    <body>
        <script type="text/javascript">
            //undefined와 null
            var a; //변수 초기값 미지정 시 undefined 값이 할당됩니다.
            var obj = {}; //프로퍼티가 없는 빈 객체를 생성합니다.
            
            document.write('a: ' + a + '<br/>'); //a:undefined
            document.write('obj: ' + obj + '<br/>'); //obj:[object Object]
            document.write('obj.prop: ' + obj.prop + '<br/>'); //obj.prop:undefined
            
            obj = null//객체 참조를 제거합니다.
            document.write('obj: ' + obj + '<br/>'); //obj:null
            document.write('<br/>');
            
            if(!a) //!undefined
                document.writeln('변수 a는 초기화가 필요합니다.<br/>');
                
            if(!obj) //!null
                document.writeln('변수 obj는 참조하는 객체가 없습니다.<br/>');
            
        </script>
    </body>
</html>
cs

 

 2강끝

 

3강 연산자, 제어문, 예외처리

 

1. 산술연산자

연산자 

의미 

특징 

덧셈연산

피연산자가 숫자일 경우 덧셈 연산을 행합니다.

피연산자가 불리언일 경우 true는 1로, false는 0으로 변환되어 덧셈연산을 행합니다.

피연산자의 한 쪽이 문자열일 경우 나머지 피연산자도 문자열로 변환되어 문자열 접합연산을 행합니다.

피연산자의 한쪽이 객체일 경우 객체는 문자열로 변환되고, 나머지 피연산자도 문자열로 변환되어 문자열 접합연산을 행합니다.

-

뺄셈연산

피연산자가 모두 숫자일 경우 뺄셈 연산을 행합니다.

*

곱셈연산

피연산자가 모두 숫자일 경우 곱셈 연산을 행합니다.

/

나눗셈연산

피연산자가 모두 숫자일 경우 나눗셈 연산을 행합니다.

%

나머지연산

피 연산자가 모두 숫자일 경우 나머지 연산을 행합니다.

연산자 

의미

특징

++

전치증가연산

피연산자의 값을 1 증가시킵니다. 대입연산자와 함께 사용하면 먼저 피연산자의 값을 1 증가시키고, l-value에 증가된 피연산자의 값을 대입합니다.

++

후치증가연산

피연산자의 값을 1 증가시킵니다. 대입연산자와 함께 사용하면 먼저 l-value에 현재의 피연산자의 값을 대입하고, 이후 피연산자의 값을 1 증가시킵니다.

--

전치감소연산

피연산자의 값을 1 감소시킵니다. 대입연산자와 함께 사용하면 먼저 피연산자의 값을 1 감소시키고, l-value에 감소된 피연산자의 값을 대입합니다.

--

후치감소연산

피연산자의 값을 1 감소시킵니다. 대입연산자와 함께 사용하면 먼저 l-value에 현재의 피연산자의 값을 대입하고, 이후 피연산자의 값을 1 감소시킵니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-01</title>
    </head>
    <body>
        <script type="text/javascript">
            //산술연산자
            var num = 20;
            var str = '20';
            var bool = true;
            var obj = {};
            
            //피연산자가 숫자일 경우 덧셈 연산을 행합니다.
            document.writeln('num + 13: ');
            document.writeln(num + 13); //33
            document.writeln('<br/>');
        
            //피연산자가 불리언일 경우 true는 1로, false는 0으로 변환되어 덧셈연산을 행합니다.
            document.writeln('bool + 1: ');
            document.writeln(bool + 1); //2
            document.writeln('<br/>');
 
            //피연산자의 한 쪽이 문자열일 경우 나머지 피연산자도 문자열로 변환되어 문자열 접합연산을 행합니다.
            document.writeln('str + 13: ');
            document.writeln(str + 13); //2013
            document.writeln('<br/>');
        
            //피연산자의 한 쪽이 객체일 경우 객체는 문자열로 변환되고, 나머지 피연산자도 문자열로 변환되어 문자열 접합연산을 행합니다.
            document.writeln('obj + 10: ');
            document.writeln(obj + 10); //[2013]object Object]10
            document.writeln('<br/>');
 
            //후치증가연산은 먼저 피연산자의 값을 반환하고, 피연산자의 값을 1증가시킵니다.
            var x = 3;
            var y = x++;
            document.writeln('x ' + x + '<br/>'); //x:4
            document.writeln('y ' + y + '<br/>'); //y:3
            document.writeln('<br/>');
                    
            //전치증가연산은 먼저 피연산자의 값을 1 증가시키고, 피연산자의 값을 반환합니다.
            x = 3;
            y = ++x;
            document.writeln('x ' + x + '<br/>'); //x:4
            document.writeln('y ' + y + '<br/>'); //y:4
            document.writeln('<br/>');
                                
        </script>
    </body>
</html>
cs

 

2. 대입연산자

연산자

특징 

예 

l-value에 r-value를 대입

x = 5; 

+=

l-value에 r-value를 더한 값을 l-value에 대입

x = 5; x += 3; //8

-=

l-value에서 r-value를 뺀 값을 l-value에 대입

x = 5; x -= 3; //2

*=

l-value에 r-value를 곱한 값을 l-value에 대입

x = 5; x *= 3; //15

/=

l-value를 r-value로 나눈 값을 l-value에 대입

x = 5; x /= 3; //1.666667

%=

l-value를 r-value로 나눈 나머지 값을 l-value에 대입

x = 5; x %= 3; //2

&=

l-value에 r-value를 비트 AND 연산한 값을 l-value에 대입

x = 5; x &= 2; //0

|=

l-value에 r-value를 비트 OR 연산한 값을 l-value에 대입

x = 5; x |= 2; //7

^=

l-value에 r-value를 비트 XOR 연산한 값을 l-value에 대입

x = 5; x ^= 2; //7

<<=

l-value에 r-value만큼 좌측 시프트한 값을 l-value에 대입

x = 5; x <<= 2; //20

>>=

l-value에 r-value만큼 우측 시프트한 값을 l-value에 대입

x = 5; x >>= 2; //1

>>>=

l-value에 r-value만큼 부호없는 우측 시프트한 값을 l-value에 대입

x = 5; x >>>= 2; //1

 

3. 비교연산자

연산자

특징 

예 

==

좌우 표현식의 평가가 동일할 경우 true 반환

undefined와 null을 동등하다고 평가

문자열과 숫자를 비교할 경우 숫자를 문자열로 변환 후 평가

숫자와 불리언 값을 비교할 경우 true는 1로, false는 0으로 변환 후 평가

객체를 숫자 또는 문자열과 비교할 경우 객체의 valueOf() 또는 toString() 변환 값인 기본 타입 값으로 평가

5==5 //true

5=='5' //true

true==1 //true

!=

좌우 표현식의 평가가 다를 경우 true 반환

5!=3 //true

<

좌측 표현식의 결과가 우측 표현식의 결과보다 작은 경우 true반환

5<3 //false

<=

좌측 표현식의 결과가 우측 표현식의 결과보다 작거나 같은 경우 true반환

5<=3 //false

>

좌측 표현식의 결과가 우측 표현식의 결과보다 큰 경우 true 반환

5>3 //true

>=

좌측 표현식의 결과가 우측 표현식의 결과보다 크거나 같은 경우 true 반환

5>=3 //true

===

좌우 표현식의 평가가 동일하고, 데이터 타입도 같을 경우 true 반환 ==와 다르게 타입 변환을 하지 않음

5==='5' //false

!==

좌우 표현식의 평가가 다르거나, 혹은 데이터 타입이 다른 경우 true반환 ==와 다르게 타입 변환을 하지 않음

5!=='5' //true

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-03</title>
    </head>
    <body>
        <script type="text/javascript">
            //비교연산자
            var x = 5;
            var y = 3;
            var z = '5';
 
            document.writeln('x == y: ' + (x == y) + '<br/>'); //x==y; false            
            // == 연산자에서 문자열과 숫자를 비교할 경우 숫자가 문자열로 변환되어 비교연산을 수행합니다.
            document.writeln('x == z:' + (x == z) + '<br/>'); // x==z:true
            document.writeln('x != y:' + (x != y) + '<br/>'); // x!=y:true
            document.writeln('x != z:' + (x != z) + '<br/>'); // x!=z:false
            document.writeln('x < y:' + (x < y) + '<br/>'); // x<y:false
            document.writeln('x <= y:' + (x <= y) + '<br/>'); // x<=y:false
            document.writeln('x > y:' + (x > y) + '<br/>'); // x>y:true
            document.writeln('x >= y:' + (x >= y) + '<br/>'); // x>=y:true
            // === 연산자에서는 비교연산 시 데이터 타입 변환을 수행하지 않습니다.
            document.writeln('x === z:' + (x === z) + '<br/>'); // x===y:false
            document.writeln('x !== y:' + (x !== y) + '<br/>'); // x!==y:true
            document.writeln('x !== z:' + (x !== z) + '<br/>'); // x!==y:true
            document.writeln('<br/>'); 
            
            var arr1 = ['홍길동''이순신''강감찬'];
            var arr2 = ['홍길동''이순신''강감찬'];
            //==연산자에서 참조형을 비교하는 경우 참조값이 같을 경우에만 true를 반환합니다.
            document.writeln('arr1 == arr2:' + (arr1 == arr2) + '<br/>'); // arr1==arr2:false
            
        </script>
    </body>
</html>
cs

 

4. 논리연산자

연산자 

특징 

예 

&& 

좌우 표현식의 평가가 모두 true인 경우 true 반환

좌측 표현식의 평가가 false일 경우 우측 표현식은 실행되지 않음 

true&&true //true

true&&false //false

false&&true //false

false&&false //false

||

좌우 표현식의 평가 중 어느 하나가 true인 경우 true 반환

좌측 표현식의 평가가 true일 경우 우측 표현식은 실행되지 않음 

true||true //true

true||false //true

false||true //true

false||false //false

!

 표현식의 평가가 false일 경우 true를, true인 경우 false를 반환

!true //false

!false //true 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-04</title>
    </head>
    <body>
        <script type="text/javascript">
            //논리연산자
            var calculator;
 
            //&&연산에서 좌측 표현식이 undefined값을 가지면 false로 평가되어 우측 평가식을 실행하지 않습니다.
            calculator&&document.writeln('calculator.add(2,3):'+calculator.add(2,3));
            
            calculator={
                add:function(op1,op2){
                    return op1+op2;    
                }
            };
 
            //&&연산에서 좌측 표현식이 -, undefined, null, NaN "" 이외의 값을 가지면 true로 평가되어 우측 평가식을 실행합니다.
            calculator&&document.writeln('calculator.add(2,3): '+calculator.add(2,3));
            
            //||연산에서 좌측 표현식이 undefined값을 가지면 false로 평가되어 우측 평가식을 실행합니다.
            calculator.subract||(calculator.subtract = function(op1,op2){return op1-op2; });
            document.writeln('</br>');
            calculator.subtract&&document.writeln('calculator.subtract(2,3): '+calculator.subtract(2,3));
            
        </script>
    </body>
</html>
cs

 

5. 비트연산자

연산자

특징

사용 예

&

좌우 표현식의 평가 비트가 모두 1인 겨우 1 반환

5&2 //0

|

좌우 표현식의 평가 비트 중 비트 하나가 1인 경우 1 반환

5|2 //7

^

좌우 표현식의 평가 비트가 서로 다른 비트인 경우 1반환

5^2 //7

~

표현식의 평가 비트를 반전

~5 //-6

<<

표현식의 평가 비트를 좌측으로 시프트

5<<2 //20

>>

표현식의 평가 비트를 우측으로 시프트

5>>2 //1

>>>

표현식의 평가 비트를 우측으로 시프트하면서 좌측을 0으로 채움

-5>>>2 //1073741822

 

6. 기타연산자

연산자

특징

,

좌측 피연산자부터 우측 피연산자로 피연산자를 계속해서 평가

var x = 1, y = 2, z = 3;

delete

피연산자로 지정된 객체의 프로퍼티나 배열의 원소를 삭제

delete arr[2];

//true 혹은 false 반환

instanceof

피연산자의 객체 타입 조사

arr instanceof Array

//true 혹은 false 반환

new

새로운 객체를 생성하고, 이를 초기화하기 위한 생성자 함수를 호출

var arr = new Array();

// 참조값을 반환

typeof

피연산자의 데이터 타입을 문자열로 반환

typeof '문자열'

//string

void

피연산자의 값을 무시하고 undefined를 반환

void 0

?

조건식 ? 식1 : 식2. 조건식의 결과가 true일 경우 식1을, false일 경우 식2를 평가

(score >= 70) ? '합격' : '불합격'

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-05</title>
    </head>
    <body>
        <script type="text/javascript">
            //기타연산자
            
            //배열 객체에 숫자, 문자열, 불리언, Date객체, 배열 객체들을 원소로 담습니다.
            var arr = [ 1'홍길동''010-1234-5678'truenew Date(), [102030]];
            
            document.writeln('typeof arr[0]: '+ typeof arr[0+'</br>'); //number
            document.writeln('typeof arr[1]: '+ typeof arr[1+'</br>'); //string
            document.writeln('typeof arr[2]: '+ typeof arr[2+'</br>'); //string
            document.writeln('typeof arr[3]: '+ typeof arr[3+'</br>'); //boolean
            document.writeln('typeof arr[4]: '+ typeof arr[4+'</br>'); //object
            document.writeln('typeof arr[5]: '+ typeof arr[5+'</br>'); //object
            document.writeln('<br/>');
            
            document.writeln('arr[4] instanceof Date: ' + (arr[4] instanceof Date+ '<br/>'); //true
            document.writeln('arr[4].constructor: ' + (arr[4].constructor) + '<br/>'); //function Date(){}
            document.writeln('arr[5] instanceof Array: ' + (arr[5] instanceof Array+ '<br/>'); //true
            document.writeln('arr[5].constructor: ' + (arr[5].constructor) + '<br/>'); //function Array(){}
            document.writeln('<br/>');
 
            document.writeln('arr: ' + arr + '<br/>');
            document.writeln('<br/>');
            document.writeln('delete arr[2]: ' + delete arr[2+ '<br/>'); //true
            document.writeln('arr[2]: ' + arr[2+ '<br/>'); //undefined
            document.writeln('<br/>');
            document.writeln('arr: ' + arr + '<br/>');
            document.writeln('<br/>');
            
            var point = {
                x : 20,
                y : 30,
                toString : function(){
                    return '{ x: ' + this.x + ',y: ' + this.y + "}";
                }
            };
            
            //point 객체 출력 시에 point 객체 내의 정의한 toString 메소드를 호출합니다.
            document.writeln('point: ' + point + '<br/>');
            //point 객체의 y 프로퍼티를 제거합니다.
            document.writeln('delete point.y: ' + delete point.y + '<br/>');
            document.writeln('point: ' + point + '<br/>');
            //point 객체의 toString 메소드를 제거합니다.
            document.writeln('delete point.toString: ' + delete point.toString + '<br/>');
            document.writeln('point: ' + point + '<br/>');
 
            document.writeln('<br/>');
            
        </script>
    </body>
</html>
cs

 

7. if 문

- if 문은 조건표현식의 평가에 따라 특정 문장을 실행할 수 있는 기능을 제공하는 기본적인 분기 제어문

- if(조건표현식)

문장;

- if(조건표현식){

문장#1;

...

} else {

문장#2;

...

}

- if(조건표현식#1){

문장#1;

...

} else if (조건표현식#2) {

문장#2;

...

} else {

문장#3;

...

}

- if 문에서 사용되는 조건들은 상호 배타적

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-06</title>
    </head>
    <body>
        <script type="text/javascript">
            //if 문
            
            var score = 88;
            var level;
            
            //if 문의 조건식은 상호 배타적으로 동작하므로, 조건을 중복해서 작성하실 필요가 없으며
            //조건을 만족했을 경우 실행할 문장이 하나일 경우 블록을 생략할 수 있습니다.
            if(score >= 90) { //90점이상 100점 이하
                level = 'A';
            } else if (score >= 80) { //80점이상 90점 이하
                level = 'B';
            } else if (score >= 70) { //70점이상 80점 이하
                level = 'C';
            } else if (score >= 60) { //60점이상 70점 이하
                level = 'D';
            } else { //60점 미만
                level = 'F';
            }
            
            document.writeln(score + '점은' + level + '학점입니다. <br/>');
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

8. switch 문

- switch 다음에 오는 () 안에는 주로 변수가 오지만, 반환 값을 제공하는 어떤 표현식이든 올 수 있음

- switch의 블록 ({})에는 여러 개의 case 문과 한 개의 선택적 default 문이 사용됨

- 표현식이 반환하는 값에 의해 case 문이 실행되며, 실행된 case 문에 break 문이 없을 경우 switch 블록을 빠져나가지 못하고, 다음 case 문들도 실행됨에 유의

- switch (표현식) {

case 값#1;

문장#1;

break;

case 값#2;

문장#2;

break;

case 값#3;

문장#3;

break;

default;

문장#4;

break;

}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-07</title>
    </head>
    <body>
        <script type="text/javascript">
            //switch 문
            
            var month = 2;
            var days;
            
            switch(month){
                case 4:
                case 6:
                case 9:
                case 11//4, 6, 9, 11월의 경우
                    days = 30;
                    break;
                case 2//2월의 경우
                    days = 28;
                    break;
                default//1, 3, 5, 7, 8, 10, 12월의 경우
                    days = 31;
                    break;
            }
            
            document.writeln(month + '월의 날짜는 ' + days + '일까지입니다. <br/>');
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

9. &&와 ||를 이용한 조건문

- 논리연산자 &&와 ||의 짧은 논리 회로 연산자 (Short Circuit Logical Operator)의 성격을 이용

- &&연산자의 경우 좌측 피연산자의 평가 값을 true로 변환할 수 있으면 우측 피연산자의 표현식을 평가 할 수 있어 if 문과 같은 기능을 수행

- ||연산자의 경우 좌측 피연산자의 평가 값이 false로 변환할 수 있는 경우 우측 피연산자를 평가해 값을 반환

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-08</title>
    </head>
    <body>
        <script type="text/javascript">
            //&&와 ||을 이용한 조건문
            
            var arr;
            
            //arr이 undefined일 경우 비어있는 배열 객체를 대입합니다.
            arr = arr||[];
            
            arr[0= '홍길동';
            arr[1= '이순신';
            arr[2= '강감찬';
            
            //arr이 배열객체가 존재할 경우 arr배열의 길이를 출력합니다.
            arr && document.writeln('arr.length: ' + arr.length + '<br/>');
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

10. while 문

- while 문은 기본적인 반복문으로, 표현식이 true로 평가되면 몸체에 해당하는 블록 내의 문장들을 실행

- 문장을 모두 실행한 뒤 다시 표현식을 평가하는데 이 때 false로 평가되면 while문이 종료되고 프로그램의 다음 문장이 실행

- 주의할 점은 평가식을 false로 만들 수 있는 종료 조건을 만드는 것

- 종료 조건을 만들지 않으면 while 문은 무한 루프에 빠짐

- while (표현식) {

문장들

}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-09</title>
    </head>
    <body>
        <script type="text/javascript">
            //while문
            
            var count = 0;
            
            //while 문의 조건식을 만족하는 동안 블록 내의 문장들을 반복 실행합니다.
            while (count < 10){
                document.write(count + '<br/>');
                count++;
            }
            
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

11. do..while 문

- do...while 문은 while 문과 비슷한 성격을 가진 반복문으로, 표현식이 true로 평가되면 몸체에 해당하는 블록 내의 문장들을 실행

- 최소한 한번은 블록 내의 문장들을 실행

- do...while 문 끝에 세미콜론(;)이 붙임

- 문장을 모두 실행한 뒤 다시 표현식을 평가하는데 이 때 false로 평가되면 do...while 문이 종료되고 프로그램의 다음 문장이 실행

- Ex:) do {

문장들

} while (표현식);

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-10</title>
    </head>
    <body>
        <script type="text/javascript">
            //do...while문
            
            var count = 0;
            
            //do...while 문의 조건식을 만족하는 동안 블록 내의 문장들을 반복 실행합니다.
            do {
                document.write(count + '<br/>');
                count++;
            } while (count < 10);
            
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

12. for문

- for문은 초기식을 한 번만 실행

- 조건식의 평가 결과가 true일 경우 블록 내의 문장 실행

- 블록 내 문장 실행이 완료되면 증감식이 실행

- 다시 조건식의 평가 결과에 따라 for 문의 계속 혹은 종료 결정

- Ex:) for(초기식; 조건식; 증감식){

문장들

}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-11</title>
    </head>
    <body>
        <script type="text/javascript">
            //for문
            
            var arr2d=[
                ['을지문덕''연개소문'],
                ['광개토대왕''세종대왕'],
                ['김유신''계백']
            ];
            
            for (var i=0; i<arr2d.length; i++){
                for (var j=0; j<arr2d[i].length; j++){
                    document.writeln(arr2d[i][j] + '<br/>');
                }
            }
            
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

13. for...in문

- for...in 문은 객체의 프로퍼티나 배열의 원소에 대해 순서대로 반복처리를 실행

- 변수에는 객체로부터 취한 프로퍼티명이 저장되거나, 배열로부터 취한 인덱스번호가 저장

- Ex:) for (변수 in 객체 혹은 배열) {

문장들

}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-12</title>
    </head>
    <body>
        <script type="text/javascript">
            //for...in문
            
            //배열 객체를 선언하고 name과 age 프로퍼티를 가진 객체를 원소로 초기화 합니다.
            var arr= [
                { name:'을지문덕', age: 50 },
                { name:'연개소문', age: 35 },
                { name:'광개토대왕', age: 28 },
                { name:'세종대왕', age: 38 },
                { name:'김유신', age: 46 },
                { name:'계백', age: 36 }
            ];
            
            //바깥 for...in 반복문에서는 배열의 인덱스를 취해 idx에 저장합니다.
            for (var idx in arr){
                document.writeln('{');
                //안쪽 for...in 반복문에서는 배열의 원소인 객체의 프로퍼티명을 취해 prop에 저장합니다.
                    for (var prop in arr[idx]){
                        document.writeln(prop + ':' + arr[idx][prop]);
                        if(prop == 'age')
                            break;
                            document.writeln(',');
                    }
                document.writeln('}<br/>');
            }
 
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

14. 예외

- 예외란 예외적인 상황이나 에러가 발생했음을 나타내느 객체

- 자바스크립트는 런타임에서 에러가 발생할 때마다 예외를 발생시킴.

- 프로그램에서 throw 문을 사용하여 명시적으로 예외를 발생시킬 수도 있음

- throw 문에서 사용하는 표현식의 결과 타입은 대부분 Error 객체 혹은 Error 객체를 상속받은 객체이지만, 에러메시지를 담은 문자열이나 에러코드를 나타내느 숫자값도 유용하게 사용

- Ex:) throw 표현식;

throw new Error('에러메시지');

 

15. try...catch...finally

- try...catch...finally 문은 자바스크립트의 예외처리 기법

- 예외가 발생하면 자바스크립트 인터프리터는 정상적인 프로그램 실행을 즉시 중단하고 가장 가까운 예외처리기로 처리를 넘김

- 예외처리기는 try...catch...finally 블록의 catch 절을 사용해 작성

- 예외를 처리할 try...catch...finally 블록이 없는 함수에서 예외가 발생하면 함수를 호출했던 블록으로 예외가 전파되며, 어떠한 예외처리기도 찾지 못하면 이 예외는 에러로 취급

- Ex:) try{

//정상적으로 처리되어야 할 코드들을 기술합니다.

//코드 실행 중 런타임에서 에러가 발생하여 예외가 발생하거나,

//throw문을 통해 예외를 직접 발생시킬 수도 있으며,

//호출한 함수를 통해 예외가 전파될 수도 있습니다.

} catch (e) {

//예외가 발생할 경우에만 실행되는 블록으로

//예외와 관련된 정보를 ()에 선언된 변수 e를 통해 참조합니다.

//이 블록에서 예외를 처리할 수도 있고

//예외를 무시할 수도 있으며,

//throw문을 통해 예외를 다시 발생시킬 수도 있습니다.

} finally {

//try블록이 모두 실행 완료되거나,

//예외가 발생하여 catch 블록이 실행된 후에도

//무조건 실행이 필요한 코드를 이 블록에 기술합니다.

}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>03-13</title>
    </head>
    <body>
        <script type="text/javascript">
            //try...catch...finally
            
            var x = 5;
            var result;
            
            try{
                document.writeln('\u2460 <br/>');
                result = x * y; //y는 정의되어 있지 않은 변수이므로 런타임에서 에러가 발생합니다.
                document.writeln('\u2461'+result+'<br/>');    
            } catch(e){ //try 블록에서 발생한 에러에 대한 예외를 catch 블록에서 처리합니다.
                document.writeln('\u2462' + e + '<br/>');
            } finally { //finally 블록은 예외 발생과 상관없이 무조건 수행됩니다.
                document.writeln('\u2463 <br/>');
            }
            
            document.writeln('<br/>');
 
            try{
                document.writeln('\u2460 <br/>');
                result = x / 0
                document.writeln('\u2461'+result+'<br/>');
                throw new Error('0으로 나눌 수 없습니다.'//예외 객체를 만들어 던집니다.    
            } catch(e){ //try 블록에서 발생한 에러에 대한 예외를 catch 블록에서 처리합니다.
                document.writeln('\u2462' + e + '<br/>');
            } finally { //finally 블록은 예외 발생과 상관없이 무조건 수행됩니다.
                document.writeln('\u2463 <br/>');
            }
 
        </script>
    </body>
</html>
cs

 

3강끝 

 

4강 함수

 

1. 함수의 정의

- 일반적으로 함수란 어떤 입력 값을 이용해 미리 정의된 로직을 처리하여 결과를 반환하도록 만든, 여러번에 걸쳐 호출에 의해 실행될 수 있는 코드 블록

- 함수는 매개변수(parameter) 혹은 전달인자 (argument)라고 불리는 지역변수를 가질 수 있는데, 이 매개변수는 함수를 호출하는 시점에 값을 갖게 됨

- 함수는 반환값을 가질 수 있는데, 반환값은 return 문에 의해 함수를 호출한 표현식의 결과로 전달됨

 

2. 자바스크립트에서 함수의 역할

 역할

특징 

호출 루틴으로서의 함수

호출에 의해 실행되며, 매개변수에 전달된 값을 이용해 미리 정의된 로직을 처리하여 결과를 반환 코드 블록

데이터로서의 함수

변수, 객체 프로퍼티, 배열원소에 저장될 수 있고, 매개변수의 전달 값 또는 다른 함수의 반환 값으로도 사용이 가능 

메소드로서의 함수

객체 프로퍼티에 저장되어 객체를 통해 호출하는데 사용

생성자 함수

new 연산자와 함께 사용하여 객체를 생성하고 초기화하는데 사용

 

3. 함수를 정의하는 3가지 방법

- function 문을 이용해 함수를 정의

- function 함수명([매개변수 목록]){

문장들

[return 반환값;]

}

- 함수 리터럴을 이용해 함수를 정의

- var 변수명 = function([매개변수 목록]){

문장들

[return 반환값;]

};

- Function 생성자를 이용해 함수를 정의

- var 변수명 = new Function(['매개변수'[, '매개변수'[,...]]], '문장들');

var 변수명 = new Function('[매개변수 목록]','문장들');

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-01</title>
    </head>
    <body>
        <script type="text/javascript">
            //함수의 정의와 호출
            
            //function 문에 의해 정의된 print 함수는 매개변수 message에 전달된 값을 출력합니다.
            function print(message) {
                document.writeln(message);
            }
            
            //function 문에 의해 정의된 println 함수는 매개변수 message에 전달된 값과
            //문자열'<br/>'을 접합연산한 결과를 출력합니다.
            function println(message) {
                document.writeln(message + '<br/>');
            }
            
            //function 문에 의해 정의된 distance 함수는 x,y 프로퍼티를 가진 객체를 매개변수로 하여
            //내장객체 Math가 제공하는 sqrt함수를 호출해 두 점간의 거리를 반환합니다.
            function distance(p1, p2) {
                var dX = p2.x - p1.x;
                var dY = p2.y - p1.y;
                return Math.sqrt(dX * dX, dY * dY);//내장객체 Math가 제공하는 sqrt함수를 호출합니다.
            }
            
            var pointA = { x:25, y:40 };
            var pointB = { x:50, y:80 };
 
            print('pointA와 pointB 사이의 거리: ');
            println(distance(pointA, pointB));
            
            //함수리터럴에 의해 정의된 area 함수는 x,y 프로퍼티를 가진 객체를 매개변수로 하여
            //두 점을 이용해 구성된 사각형의 면적을 반환합니다.
            var square = function(leftTop, rightButtom) {
                var width = rightButtom.x - leftTop.x;
                var height = rightButtom.y - leftTop.y;
                return width * height;
            };
            
            print('pointA와 pointB로 구성한 사각형의 넓이: ');
            println(square(pointA, pointB));
            
            //Function 생성자에 의해 정의된 triangle 함수는 base와 height 매개변수에 전달된 값을 이용해
            //삼각형의 면적을 반환합니다.
            var triangle = new Function('base''height''return(base*height) / 2;');
            print('base와height로 구성한 삼각형의 넓이;');
            println(triangle(30,20));
            
        </script>
    </body>    
</html>
 
cs

 

4. 변수의 전역스코프와 지역스코프

- 스코프(scope)란 코드에서 변수를 참조할 수 있는 해당 변수의 유효범위를 결정하는 개념

- 자바스크립트는 코드 전체에서 접근 가능한 전역(global)스코프와 함수 내의 코드에서만 접근 가능한 지역(local) 스코프만 존재

- 전역 스코프를 가진 변수를 전역 변수, 지역 스코프를 가진 변수를 지역변수라고 함

- 자바스크립트는 블록({}) 스코프가 존재하지 않음에 유의

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-02</title>
    </head>
    <body>
        <script type="text/javascript">
            //전역 스코프와 지역 스코프
            
            //전역 스코프를 가진 전역 변수
            var x = 'global x';
            var y = 'global y';
            
            function func(){
                
                //지역 스코프를 가진 지역 변수는 반드시 var 키워드와 함께 선언되어야 합니다.
                var x = 'local x';
                
                //var 키워드 없을 경우 전역스코프에 접근해 동일 이름을 가진 전역변수를 사용하며,
                //만일 동일 이름의 전역 변수가 없을 경우 전역변수를 새로 등록합니다.
                y = '???';
            
                document.writeln('x: ' + x + '<br/>');
                document.writeln('y: ' + y + '<br/>');
                document.writeln('<br/>');                
            }
            
            document.wrtieln('func() 호출 전 <br/>');
            document.writeln('x: ' + x + '<br/>');
            document.writeln('y: ' + y + '<br/>');
            document.writeln('<br/>');                
            
            document.writeln('func() 호출<br/>');
            func();
            
            document.writeln('func() 호출 후 <br/>');
            document.writeln('x: ' + x + '<br/>');
            document.writeln('y: ' + y + '<br/>');
            document.writeln('<br/>');                
            
        </script>
    </body>    
</html>
cs

 

5. 함수의 매개변수와 스코프

- 함수의 매개변수는 지역스코프를 갖는 지역변수로, 함수를 호출하는 표현식으로부터 그 값을 전달 받음

- 전역스코프의 전역변수 값을 함수의 매개변수로 전달할 때 그 값이 함수의 지역스코프의 매개변수로 복사됨

- 이 전달된 값이 기본형일 경우 전역변수와 매개변수는 상호 독립적인 값이 되며, 참조값이 전달된 경우 전역변수와 매개변수가 동일 객체를 참조하게 됨

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-03</title>
    </head>
    <body>
        <script type="text/javascript">
            //함수의 매개변수와 스코프
            
            //값을 매개변수로 전달하는 경우 함수 내에서의 매개변수 조작은 원본 값에 아무런 영향을 미치지 않습니다.
            function swapByValue(x,y){
                var temp = x;
                x = y;
                y = temp;
            }
            
            //참조값을 매개변수로 전달하는 경우 매개변수가 원본 객체를 참조하므로
            //함수 내에서 매개변수를 통한 객체 조작은 원본 객체에 영향을 미칩니다.
            function swapByReference(o){
                var temp = o.x;
                o.x = o.y;
                o.y = temp;
            }
            
            var a = 5;
            var b = 8;
            var obj = {x:5, y:8};
            
            document.writeln('swap함수 호출 전<br/>');
            document.writeln('a: ' + a + ', b: ' + b + '<br/>');
            document.writeln('obj.x: ' + obj.x + ', obj.y:' + obj.y + '<br/>');
            document.writeln('<br/>');
            
            swapByValue(a,b);
            swapByReference(obj);
            
            document.writeln('swap함수 호출 후<br/>');
            document.writeln('a: ' + a + ', b: ' + b + '<br/>');
            document.writeln('obj.x: ' + obj.x + ', obj.y:' + obj.y + '<br/>');
            document.writeln('<br/>');
            
        </script>
    </body>    
</html>
cs

 

6. 함수의 매개변수와 인자

- 자바스크립트 함수는 함수 정의 시 선언된 매개변수에 상관없이 인자를 전달할 수 있으며, 어떤 데이터 타입의 값이라도 전달할 수 있음

- 선언된 매개변수보다 적은 수의 인자 값들을 전달하면, 값을 전달받지 못한 남은 매개변수들은 undefined 값을 갖게 됨

- 생략이 가능한 매개변수는 매개변수 목록의 끝에 위치하도록 하여 임의로 생략할 수 있게 만드는 것이 중요

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-04</title>
    </head>
    <body>
        <script type="text/javascript">
            // 함수의 생략 가능한 매개변수
 
            function sum(array, start, end) {
                // 매개변수 array에 전달된 값이 없을 경우 빈 배열을 할당합니다.
                // if 문을 대신해 다음의 || 연산자를 이용한 조건문을 작성할 수도 있습니다.
                // array = array || [];
                if (!array)
                    array = [];
                // 매개변수 start에 전달된 값이 없을 경우 0을 할당합니다.
                if (!start)
                    start = 0;
                // 매개변수 end에 전달된 값이 없을 경우 배열의 원소의 갯수를 할당합니다.
                if (!end)
                    end = array.length;
 
                // 매개변수 array에 전달된 값이  배열 객체일 경우에만 합계를 계산합니다.
                if ( array instanceof Array) {
                    // 매개변수 start와 end에 전달된 값이 숫자일 경우에만 합계를 계산합니다.
                    if (( typeof start) != 'number' || ( typeof end) != 'number')
                        throw new Error('sum(): 두번째 매개변수와 세번째 매개변수의 전달 인자는 숫자여야 합니다.');
 
                    var result = 0;
                    for (var i = start; i < end; i++) {
                        // 배열 array의 원소가 숫자 타입일 경우에만 합계를 계산합니다.
                        if (( typeof array[i]) != 'number')
                            throw new Error('sum(): array[' + i + ']에 저장된 값  ' + array[i] + '는 숫자 타입이 아닙니다.');
                        result += array[i];
                    }
 
                    return result;
 
                } else {// 매개변수 array에 전달된 값이  배열 객체가 아닐 경우 예외를 발생시킵니다.
                    throw new Error('sum(): 첫번째 매개변수의 전달 인자는 배열이어야 합니다.');
                }
            }
 
            var arr1 = [12345];
            var obj = {
                name : '홍길동',
                phone : '010-1234-5678'
            };
            var arr2 = [12'3rd'45];
 
            try {
                document.writeln('sum(arr1, 0, arr1.length): ' + sum(arr1, 0, arr1.length+ '<br/>');
                document.writeln('sum(arr1, 0, 4): ' + sum(arr1, 04+ '<br/>');
                document.writeln('sum(arr1, 0): ' + sum(arr1, 0+ '<br/>');
                document.writeln('sum(arr1, 2): ' + sum(arr1, 2+ '<br/>');
                document.writeln('sum(arr1): ' + sum(arr1) + '<br/>');
                document.writeln('sum(): ' + sum() + '<br/>');
                document.writeln('sum(obj): ' + sum(obj) + '<br/>');
            } catch (e) {
                document.writeln(e + '<br/>');
            }
 
            try {
                document.writeln('sum(arr1, \'x\', 4): ' + sum(arr1, 'x'4+ '<br/>');
            } catch (e) {
                document.writeln(e + '<br/>');
            }
 
            try {
                document.writeln('sum(arr2): ' + sum(arr2) + '<br/>');
            } catch (e) {
                document.writeln(e + '<br/>');
            }
 
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

7. 함수와 명시적인 이름을 가진 인자 전달

- 함수 호출 시 매개변수를 객체로 전달하여, 메소드 내에서 전달된 객체의 프로퍼티를 인자로 활용하는 방법

- 코드의 가독성을 더욱 높일 수 있으며, 매개변수의 순서에 상관없이 값을 자유롭게 전달할 수 있고, 생략된 매개변수를 명확히 표현할 수 있는 특징이 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-05</title>
    </head>
    <body>
        <script type="text/javascript">
            // 함수의 명시적인 이름을 가진 인자 전달
 
            function power(arg) {
                //매개변수 arg로 전달된 객체에 base프로퍼티가 정의되어 있지 않을 때
                //base프로퍼티를 추가하여 1로 설정합니다.
                if (!arg.base) {
                    arg.base = 1;
                }
 
                //매개변수 arg로 전달된 객체에 exponent프로퍼티가 정의되어 있지 않을 때
                //exponent프로퍼티를 추가하여 0으로 설정합니다.
                if (!arg.exponent) {
                    arg.exponent = 0;
                }
 
                //내장객체 Math의 pow 함수를 호출해 결과를 반환합니다.
                return Math.pow(arg.base, arg.exponent);
            }
 
 
            document.writeln('power({base:3, exponent:2})의 결과 값: ' + power({
                base : 3,
                exponent : 2
            }) + '<br/>');
            document.writeln('power({base:3})의 결과 값: ' + power({
                base : 3
            }) + '<br/>');
            document.writeln('power({exponent:2})의 결과 값: ' + power({
                exponent : 2
            }) + '<br/>');
            document.writeln('<br/>');
 
        </script>
    </body>
</html>
cs

 

8. 함수에 인자로 함수를 전달

- 자바스크립트에서 함수는 데이터의 속성을 갖고 있어서, 변수, 객체의 프로퍼티에도 저장될 수 있으며, 함수의 전달 인자로도 사용될 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-06</title>
    </head>
    <body>
        <script type="text/javascript">
            //사칙연산 관련 메소드를 가진 calculator객체를 정의합니다.
            var calculator = {
                add : function(x, y) {
                    return x + y;
                },
                subtract : function(x, y) {
                    return x - y;
                },
                multiply : function(x, y) {
                    return x * y;
                },
                divide : function(x, y) {
                    return x / y;
                }
            };
 
            //위에 정의된 calculator 객체의 메소드를 첫번째 매개변수의 전달 값으로,
            //나머지 두 개의 매개변수는 첫번째 매개변수로 전달된 calculator 객체의 메소드의
            //매개변수로 사용할 operate1 함수를 정의합니다.
            function operate1(operator, operand1, operand2) {
                return operator(operand1, operand2);
            }
 
            //첫번째 매개변수로 calculator 객체의 프로퍼티명을 전달하고, 나머지 두 개의 매개변수는
            //calculator 객체의 메소드의 매개변수로 사용할 operate2 함수를 정의합니다.
            function operate2(operatorName, operand1, operand2) {
                //프로퍼티 타입이 함수일 경우 그 메소드를 실행합니다.
                if (( typeof calculator[operatorName]) == 'function')
                    return calculator[operatorName](operand1, operand2);
                else
                    throw new Error('operator2():' + operatorName + '은(는) 정의되어 있지 않은 연산자입니다.');
            }
 
            //((3 - 8) + (2 * 5))
            var result1 = operate1(calculator.add, operate1(calculator.subtract, 38), operate1(calculator.multiply, 25));
 
            document.writeln('result1:' + result1 + '<br/>');
 
            try {
                var result2 = operate2('add', operate2('subtract'38), operate2('multiply'25));
                document.write('result2: ' + result2 + '<br/>');
            } catch(e) {
                document.write(e + '<br/>');
            }
 
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

9. 함수에 함수 리터럴을 전달하는 익명함수

- 함수 리터럴을 이용해 정의한 함수를 이름 없는 함수, 즉 임명함수 (unnamed function)라고 부름

- 이름이 없기 때문에 주로 변수, 객체 프로퍼티에 저장하거나, 함수의 인자 혹은 반환 값으로 주로 사용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-07</title>
    </head>
    <body>
        <script type="text/javascript">
            //함수에 함수 리터럴을 전달하는 익명함수
 
            var calculator = {
                //operate 메소드의 첫번째 매개변수는 함수를 인자로 전달 받습니다.
                operate : function(method, operand1, operand2) {
                    if ( typeof method == 'function') {
                        if ( typeof operand1 != 'number' || typeof operand2 != 'number')
                            throw new Error('operate(): 두번째, 세번째 매개변수는 반드시 숫자를 전달해야 합니다.');
                        return method(operand1, operand2);
                    } else
                        throw new Error('operate(): 첫번째 매개변수로 함수를 전달해야 합니다.');
                }
            };
 
            try {
                //calculator operate 메소드의 첫번째 매개변수로 익명함수를 전달합니다.
                var result1 = calculator.operate(function(x, y) {
                    return x + y;
                }, 23);
                document.writeln('result1: ' + result1 + '<br/>');
 
                //두번째, 세번째 매개변수로 숫자가 아닌 값을 전달하면 예외를 발생시킵니다.
                var result2 = calculator.operate(function(x, y) {
                    return x + y;
                }, '2'3);
                document.writeln('result2: ' + result2 + '<br/>');
 
            } catch (e) {
                document.writeln(e + '<br/>');
            }
            document.writeln('<br/>');
 
            //익명함수를 정의하고 바로 호출해 결과를 얻을 수도 있습니다.
            var result3 = (function(x, y) {
                return x + y;
            })(23);
            document.writeln('result3: ' + result3 + '<br/>');
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

10. 중첩함수

- 자바스크립트에서 함수는 다른 함수 안에 중첩되어 정의될 수 있음

- 중첩함수(inner function)는 함수 내에서만 호출할 수 있으며, 함수 외부에서는 직접 호출할 수 없음

- 이런 특징으로 특정 함수에서만 필요한 기능을 외부에 노출시키지 않고 구현할 수 있으며, 함수 내부에 선언된 변수에 접근할 수 있기 때문에 객체지향의 정보은닉이라는 특징을 구현하는데 사용될 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-08</title>
    </head>
    <body>
        <script type="text/javascript">
            // 중첩함수
 
            function circle(radius) {
                var pi = 3.14;
 
                // 중첩함수는 내부 변수에 접근가능합니다.
                function area(r) {
                    return r * r * pi;
                }
 
                // 중첩함수는 내부에서만 호출 가능합니다.
                return area(radius);
            }
 
 
            document.writeln('circle(5): ' + circle(5+ '<br/>');
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

11. 스코프 체인

- 지역 스코프는 함수 단위로 관리되며, 이 지역 스코프를 관리하는 객체를 호출 객체

- 함수의 매개변수, 지역변수가 호출 객체의 프로퍼티

- 전역 스코프를 나타내는 객체를 전역 객체, 루트(root) 객체라고함

- 전역 변수와 전역 함수는 전역 객체의 프로퍼티와 메소드

- var 키워드 없이 변수를 선언하면 전역 객체에 등록되어 전역 변수가 되므로, 함수의 지역 변수로 선언하기 위해선 반드시 var 키워드를 사용해 변수를 선언해야 함

- 스코프 체인는 전역 객체와 함수 호출 시 생성된 호출 객체를 생성 순서대로 연결한 리스트

- 함수는 함수가 호출되는 시점을 기준으로 스코프 체인에 연결되어 있는 모든 것들에 접근 가능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-09</title>
    </head>
    <body>
        <script type="text/javascript">
            // 스코프 체인
 
            // 1. 전역 레벨의 파싱 결과 전역객체에 프로퍼티 x와 outer가 정의됩니다.
 
            var x = '전역 객체에 등록되어 있는 x 프로퍼티 값';
 
            function outer() {
                var y = 'outer 함수의 호출 객체에 등록되어 있는 y 프로퍼티 값';
 
                function inner() {
                    var z = 'inner 함수의 호출 객체에 등록되어 있는 z 프로퍼티 값';
                    document.writeln('x: ' + x + '<br/>');
                    document.writeln('y: ' + y + '<br/>');
                    document.writeln('z: ' + z + '<br/>');
                }
 
                // 3. 함수 레벨의 파싱 결과 inner 함수에 대한 호출 객체에 arguments 프로퍼티가 초기화되고,
                //    프로퍼티 z가 정의되고,
                //    outer 함수의 호출 객체와 inner 함수의 호출 객체 간에 스코프 체인이 연결되고,
                //    inner 함수의 코드를 실행합니다.
                //    이 때 x는 전역객체에, y는 outer 함수의 호출객체에, z는 inner 함수의 호출객체에 접근해서
                //    그 값을 취합니다.
                inner();
 
            }
 
            // 2. 함수 레벨의 파싱 결과 outer 함수에 대한 호출 객체에 arguments 프로퍼티가 초기화되고,
            //    프로퍼티 y와  inner가 정의되고,
            //    전역객체와 outer 함수의 호출 객체 간에 스코프 체인이 연결된 후,
            //    outer 함수의 코드를 실행합니다.
            outer();
 
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

12. 콜백함수

- 콜백함수는 직접 호출하는 함수가 아닌 어떤 특정 시점이나 조건을 만족했을 때 호출될 수 있도록 라이브러리 함수의 인자로 전달되는 함수를 말함

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-10</title>
    </head>
    <body>
        <script type="text/javascript">
            // 콜백함수
 
            function main() {
 
                var array = [];
 
                // 내장객체 Math의 random 함수는 0 ~ 1 사이의 값을 반환하고,
                // 내장객체 Math의 ceil 함수는 인자 값 이상의 최소 정수를 반환합니다.
                for (var i = 0; i < 10; i++) {
                    array[i] = Math.ceil(Math.random() * 45);
                }
 
                // work 함수를 호출하면서 첫번째 매개변수로 처리할 데이터 data를,
                // 두번째, 세번째 매개변수로 콜백함수 even과 odd를 전달합니다.
                work(array, even, odd);
 
            }
 
            // 콜백함수 even은 짝수가 발견될 때마다 호출될 함수로 당시의 배열 인덱스와 원소를 출력합니다.
            function even(idx, num) {
                document.writeln((idx + 1+ '번째 데이터는 짝수 ' + num + '입니다.<br/>');
            }
 
            // 콜백함수 odd는 홀수가 발견될 때마다 호출될 함수로 당시의 배열 인덱스와 원소를 출력합니다.
            function odd(idx, num) {
                document.writeln((idx + 1+ '번째 데이터는 홀수 ' + num + '입니다.<br/>');
            }
 
            // work 함수는 매개변수로 전달받은 배열 data에서
            // 짝수가 발견될 때마다 매개변수로 전달받은 콜백함수 callback1를 호출하고,
            // 홀수가 발견될 때마다 매개변수로 전달받은 콜백함수 callback2를 호출합니다.
            function work(data, callback1, callback2) {
                for (var i = 0; i < data.length; i++) {
                    if (data[i] % == 0)
                        callback1(i, data[i]);
                    else
                        callback2(i, data[i]);
                }
            }
 
            // main 함수를 실행합니다.
            main();
 
        </script>
    </body>
</html>
cs

 

13. 비공개 속성/함수를 만들 수 있는 함수 클로저

- 클로저 : 실행될 코드와 함수의 유효 범위, 다시 말해 함수의 호출 객체와 연결된 스코프 체인의 조합

- 함수의 지역변수에 대한 중첩함수를 만들면 비공개 속성과 접근자 메소드를 구현해 객체지향의 정보은닉을 실현할 수 있음.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>04-11</title>
    </head>
    <body>
        <script type="text/javascript">
            // 클로저
 
            // 1. 전역 레벨의 파싱 결과 전역객체에 프로퍼티 makeId와 id가 정의됩니다.
 
            function makeId() {
                var lastId = 0;
 
                return function() {
                    return ++lastId;
                };
            }
 
            // 2. 함수레벨의 파싱 결과 makeId() 함수에 대한 호출 객체에 arguments 프로퍼티가 초기화 되고,
            // 프로퍼티 lastId가 정의되고,
            // 전역객체와 makeId() 함수의 호출객체 간에 스코프 체인이 연결된 후,
            // makeId() 함수가 실행되고, id는 익명함수를 반환받습니다.
            var id = makeId();
 
            // 3. 함수 레벨의 파싱 결과 id 함수에 대한 호출 객체에 arguments 프로퍼티가 초기화되고,
            //    makeId 함수의 호출 객체와 id 함수의 호출 객체 간에 스코프 체인이 연결되고,
            //    id 함수의 코드를 실행합니다.
            //    이 때 lastId는 makeId 함수의 호출객체에 접근해서
            //    그 값을 취합니다.
            document.writeln('id: ' + id() + '<br/>');
            document.writeln('id: ' + id() + '<br/>');
            document.writeln('id: ' + id() + '<br/>');
            document.writeln('id: ' + id() + '<br/>');
            document.writeln('id: ' + id() + '<br/>');
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

 4강 끝

 

5강 객체

 

1. 객체의 정의

- 자바스크립트의 객체는 이름과 값으로 구성된 프로퍼티들의 집합, 이름이 붙어 있는 데이터 값들의 모음이며, 복합 타입

- 자바스크립트의 모든 객체는 Object 생성자 함수를 상속하며, 공통으로 Object에서 상속받은 프로퍼티와 메소드가 있음

 

2. 생성자 : 객체를 정의하는 방법

객체 리터럴을 사용

var empty={ };

var point = { x : 20, y : 30 };

var student = {

name : '홍길동',

age : 20,

phone : '010-1234-5678',

toString : function() {

return '{ name : ' + this.name + ', age : ' + this.age + ', phone : ' + this.phone +' '}';

}

};

 

new 연산자와 Object() 생성자 함수 호출를 이용해 객체를 만들고, 그 객체에 프로퍼티를 추가

Object() 생성자 함수를 사용하면 객체 리터럴 { }와 같이 빈 객체를 생성할 수 있음

var empty = new Object();

var point = new Object();

point.x = 20;

point.y = 30;

var student = new Object();

student.name='홍길동';

student.age='20';

student.phone='010-1234-5678';

student.toString = function(){

return '{ name : ' + this.name +', age : ' + this.age + ', phone : ' + this.phone + '}';

};

 

원하는 타입의 객체를 생성하고 초기화하기 위해서 필요한 것이 생성자 함수를 직접 정의하는 것

생성자 함수는 객체를 만드는 틀

생성자의 이름은 new 연산자와 생성자 함수 호출을 통해 만들게 될 객체의 타입을 분명하게 나타내는 것이 좋음

생성자의 이름 첫문자를 대문자로 하는 이유도 다른 함수와 구별하기 위함

생성자 함수의 역할은 this키워드가 나타내는 객체를 초기화할 뿐 다른 역할은 수행하지 않는 것을 원칙으로 함

생성자 함수의 구현 시 return 문은 사용하지 않음

function Student(n, a, p) {

this.name = n;

this.age = a;

this.phone = p;

this.toString = function(){

return '{ name : ' + this.name +', age : ' + this.age + ', phone : ' + this.phone + '}';

}

}

 

3. new 연산자, 생성자 함수, 그리고 this

- new 연산자가 생성하는 객체에는 아무런 프로퍼티도 정의되어 있지 않음

- 객체 생성 이후 new 연산자는 지정된 생성자 함수를 호출하여 명시된 인자들을 전달하고 방금 생성된 새 객체도 this 키워드를 통해 전달함

- 생성자 함수는 이 this 키워드를 사용하여 나름대로의 새 객체를 초기화하는데 이 때 this는 생략할 수 없음

 

4. 생성자 함수를 이용한 객체 생성

- 자바스크립트가 제공하는 기본 생성자 함수들이 아닌 사용자 정의 생성자 함수를 이용해 객체를 생성하는 방법도 기존의 방법과 동일 

var student1 = new Student('홍길동', 20, '010-1234-5678') 

var student2 = new Student('이순신', 40, '010-2468-1357');

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>05-01</title>
    </head>
    <body>
        <script type="text/javascript">
            // 생성자 함수: 객체를 정의하는 방법
 
            // 이 함수는 Rectangle 생성자 함수로 설계되었습니다.
            function Rectangle(x, y, w, h) {
                // this 키워드는 생성자 함수에 의해 생성되는 객체를 나타냅니다.
                // 따라서 다음의 구문은 pointX, pointY, width, height 프로퍼티를 생성자 함수에 의해
                // 생성되는 객체에 추가하고  매개변수 x, y, w, h로 전달된 값을 pointX, pointY, width, height
                // 프로퍼티에 대입하는 문장이 됩니다.
                this.pointX = x;
                this.pointY = y;
                this.width = w;
                this.height = h;
                this.toString = function() {
                    return 'Rectangle : { pointX : ' + this.pointX + ', pointY : ' + this.pointY + ', width : ' + this.width + ', height : ' + this.height + ' }';
                };
 
                // 생성자 함수는 return 문을 만들지 않습니다.
            }
 
            // new 연산자는  아무런 프로퍼티도 정의되어 있지 않은 비어있는 객체를 생성합니다.
            // 객체 생성 이후 new 연산자는 지정된 생성자 함수를 호출하여 명시된 인자들을 전달하고
            // 방금 생성돤 새로운 객체에 대한 참조를 생성자 함수 내의 this 키워드를 통해 전달합니다.
            // 생성자 함수는 이 this 키워드와 전달된 인자 값들을 사용하여 새로운 객체를 초기화합니다.
            var rect1 = new Rectangle(1001202030);
            var rect2 = new Rectangle(2503003050);
 
            document.writeln(rect1 + '<br/>');
            document.writeln(rect2 + '<br/>');
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

5. 객체의 멤버

- 객체의 프로퍼티와 메소드가 객체의 멤버

- 객체의 멤버는 일반적으로 생성자 함수 내에서 this 키워드를 이용해 추가되며, this 키워드는 new 연산자에 의해 새로 생성된 객체를 나타냄 자바스크립트에서 객체의 멤버는 런타임 시 동적으로 추가와 삭제가 가능하므로 주의가 필요 

var rect1 = new Rectangle(100, 120, 20, 30); 

var rect2 = new Rectangle(250, 300, 30, 50);

rect1.area = function(){

return this. width * this.height;

}; 

document.writeln('rect1.area(): ' + rect1.area() + '<br/>'); 

document.writeln('rect2.area(): ' + rect2.area() + '<br/>'); //TypeError발생

 

6. 멤버 접근

- 특정 객체를 통하지 않고 생성자 함수를 통해서 접근되는 프로퍼티나 호출되는 메소드가 필요할 경우도 있음

- Math() 생성자 함수의 모든 메소드는 생성자 함수를 통해 호출됨

- 이러한 멤버 접근 방법은 생성자 함수의 프로퍼티나 메소드를 만들면 전역변수나 전역함수를 사용하는 것보다 이름 충돌의 문제를 해결해줄 수 있다는 점에서 유용

Math.random(); //0~1사이의 수를 반환합니다.

Math.round(1.58);    //2를 반환합니다.

Math.PI; //원주율을 반환합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>05-02</title>
    </head>
    <body>
        <script type="text/javascript">
            // 생성자 함수의 프로퍼티와 메소드
 
            function Area() {
            }
 
            // Area 생성자 함수에 삼각형의 넓이를 계산하는 메소드를 추가합니다.
            // Area 생성자 함수의 프로퍼티로 추가되어 Area 생성자 함수를 통해서만 접근합니다.
            Area.triangle = function(base, height) {
                return base * height / 2;
            };
 
            // Area 생성자 함수에 사각형의 넓이를 계산하는 메소드를 추가합니다.
            // Area 생성자 함수의 프로퍼티로 추가되어 Area 생성자 함수를 통해서만 접근합니다.
            Area.rectangle = function(width, height) {
                return width * height;
            };
 
            // Area 생성자 함수에 원의 넓이를 계산하는 메소드를 추가합니다.
            // Area 생성자 함수의 프로퍼티로 추가되어 Area 생성자 함수를 통해서만 접근합니다.
            Area.circle = function(radius) {
                return Math.PI * Math.pow(radius, 2);
            };
 
            document.writeln('Area.triangle(10, 6): ' + Area.triangle(106+ '<br/>');
            document.writeln('Area.rectangle(10, 6): ' + Area.rectangle(320+ '<br/>');
            document.writeln('Area.circle(5): ' + Area.circle(5).toFixed(2+ '<br/>');
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

7. 프로토타입 객체

- 자바스크립트의 모든 객체는 프로토타입이라 불리는 객체를 내부적으로 참조

- 프로토타입 객체의 실체는 new 연산자와 Object 생성자 함수 호출을 통해 생성한 Object 객체

- 객체는 프로토타입 객체에 있는 프로퍼티를 상속

- 프로토타입 객체를 이용하면 좀 더 효율적으로 메소드를 추가할 수 있음

 

8. prototype 프로퍼티

- new 연산자는 빈 객체를 생성하고, 해당 객체의 prototype 프로퍼티를 생성자 함수의 prototype 프로퍼티 값을 이용해 설정

- 모든 함수에는 prototype 프로퍼티가 있으며, 함수가 정의될 때 생성되고 초기화됨

- 프로토타입 객체는 생성자 함수와 연결되고, 이 생성자 함수를 통해서 생성되는 객체들은 생성자 함수와 연결된 프로토타입 객체의 프로퍼티들을 똑같이 상속

- 프로토타입 객체가 메소드나 상수와 같은 프로퍼티들을 위치시키기에 적합한 곳

- 프로토타입 객체에 의한 상속을 통해 메모리 사용량을 줄일 수 있으며, 프로토타입 객체에 프로퍼티가 변경되거나 추가되어도 기존 객체들 역시 변경되거나 추가된 프로퍼티를 바로 사용할 수 있다는 장점이 있음

Rectangle.prototype.area = function(){

return this.width * this.height;

}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>05-03</title>
    </head>
    <body>
        <script type="text/javascript">
            // 프로토타입 객체와 prototype 프로퍼티
 
            function Rectangle(x, y, w, h) {
                this.pointX = x;
                this.pointY = y;
                this.width = w;
                this.height = h;
            }
 
            // 모든 함수가 가지고 있는 prototype 프로퍼티는 프로토타입 객체에 대한 연결을 가집니다.
            // Rectangle 생성자 함수의 prototype 프로퍼티가 참조하는 객체에 toString 이란
            // 이름의 프로퍼티를 추가하는데 그 값으로 함수 리터럴을 대입하여 메소드를 추가합니다.
            // 이 메소드는  Rectangle 생성자 함수를 통해 생성되는 객체에 상속될 것입니다.
            Rectangle.prototype.toString = function() {
                return 'Rectangle : { pointX : ' + this.pointX + ', pointY : ' + this.pointY + ', width : ' + this.width + ', height : ' + this.height + ' }';
            };
 
            // 위의 toString() 메소드와 마찬가지로 Rectangle 생성자 함수의 prototype 프로퍼티가
            // 참조하는 객체에 area() 메소드를 추가하여, Rectangle 생성자 함수를 통해 생성되는
            // 객체에 상속될 것입니다.
            Rectangle.prototype.area = function() {
                return this.width * this.height;
            };
 
            var rect1 = new Rectangle(1001202030);
            var rect2 = new Rectangle(2503003050);
 
            document.writeln('rect1: ' + rect1 + '<br/>');
            document.writeln('rect1.area(): ' + rect1.area() + '<br/>');
 
            document.writeln('rect2: ' + rect2 + '<br/>');
            document.writeln('rect2.area(): ' + rect2.area() + '<br/>');
 
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

9. constuctor 속성

- 자바스크립트의 모든 객체는 객체를 초기화하는데 사용하는 생성자 함수를 참조하는 constructor 프로퍼티를 가지고 있음

- constructor 프로퍼티를 이용해 객체의 타입을 판단할 수 있으며, 객체 생성도 가능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>05-04</title>
    </head>
    <body>
        <script type="text/javascript">
            // consturctor 프로퍼티
 
            function Rectangle(x, y, w, h) {
                this.pointX = x;
                this.pointY = y;
                this.width = w;
                this.height = h;
            }
 
 
            Rectangle.prototype.toString = function() {
                return 'Rectangle : { pointX : ' + this.pointX + ', pointY : ' + this.pointY + ', width : ' + this.width + ', height : ' + this.height + ' }';
            };
 
            Rectangle.prototype.area = function() {
                return this.width * this.height;
            };
 
            var rect1 = new Rectangle(1001202030);
 
            if (rect1.constructor == Rectangle)
                document.writeln('rect1 객체의 생성자 함수는 Rectangle입니다.<br/>');
 
            if (rect1.constructor.prototype == Rectangle.prototype)
                document.writeln('rect1 객체의 생성자 함수의 프로토타입 객체는 Rectangle 생성자함수의 프로토타입 객체와 동일합니다.<br/>');
 
            var rect2 = new rect1.constructor(2503003050);
            document.writeln('rect2: ' + rect2 + '<br/>');
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

10. 네임스페이스

- 자바스크립트는 네임스페이스 구조를 지원하지 않음

- 빈 객체를 이용해 네임스페이스와 같은 기능을 제공할 수 있음

- 네임스페이스를 정의하기 위해 구현 코드가 없는 생성자 함수를 작성하고, 생성자 함수에 프로퍼티를 추가하는 것과 동일한 방법으로 하위의 생성자 함수를 정의

- 네임스페이스를 사용할 경우 하위 생성자 함수를 이용해 객체를 생성할 경우, 네임스페이스를 포함한 FQN#으로 생성자 함수를 호출해야 함에 유의

 

 5강끝

 

6강 상속

 

1. 객체 생성 과정

- new 연산자는 빈 객체를 생성합니다.

- 생성자 함수는 this 키워드를 통해 전달된 새로운 객체에 생성자 함수 내에 작성된 프로퍼티 혹은 메소드를 추가하는 초기화 작업을 수행합니다.

- 새로운 객체의 prototype 프로퍼티에 생성자 함수의 prototype 프로퍼티 값이 전달되어 객체와 생성자 함수는 동일한 프로토타입 객체를 참조하게 됩니다.

- this가 가리키는 객체를 반환합니다.

 

2. 프로토타입 체인과 프로토타입 멤버 상속

- 자바스크립트는 프로토타입 기반의 상속 메커니즘을 제공

- 객체를 생성하면 객체의 생성자 함수의 프로토타입 객체에 정의된 멤버를 상속

- 객체의 생성자 함수의 프로토타입 객체와 Object() 생성자 함수의 프로토타입 객체가 연결되어 있음

- 객체를 거쳐 프로토타입 객체로 멤버를 검색할 수 있는 연결을 프로토타입 체인(prototype chain)이라 함

- 멤버에 대한 검색은 맨 먼저 객체를 대상으로 수행하고, 만일 해당 멤버를 찾지 못하면 프로토타입 객체를 다음으로 검색하고, 마지막으로 Object 생성자 함수의 프로토타입 객체까지 검색하게 됨

 

3. Object 객체의 주요 멤버

멤버 

설명 

constructor 

객체 생성자 함수를 참조하는 프로퍼티 

toString() 

객체의 문자열 표현을 반환 

valueOf() 

객체의 기본형 표현을 반환 

hasOwnProperty(prop) 

객체가 직접 prop프로퍼티를 갖고 있는가?

(프로토타입 객체의 프로퍼티는 false를 반환) 

propertyIsEnumerable(prop) 

for...in 문으로 prop 프로퍼티/메소드를 열거할 수 있는가?

isPrototypeOf(obj) 

호출 객체가 obj 객체의 프로토타입인가? 

 

 

4. 프로토타입 체인과 프로토타입 멤버 상속

- Function 객체의 주요 멤버

멤버 

설명 

apply(obj,[arg1, arg2, ... argn]) 

첫번째 매개변수 obj는 객체를 전달해 함수 내부의 this에 할당되고,두번째 매개변수는 함수의 인자들을 저장한 배열 객체로 호출 함수에 전달됩니다. 만일 obj 값이 null인 경우 전역 객체가 this에 할당됩니다.

call(obj, arg1, arg2, ... argn) 

첫번째 매개변수 obj는 객체를 전달해 함수 내부의 this에 할당되고, 두번째 매개변수부터는 함수의 인자들로 호출 함수에 전달됩니다. 만일 obj 값이 null인 경우 전역 객체가 this에 할당됩니다. 

toString() 

함수를 정의하는 코드를 반환 

- 모든 함수는 Function 객체의 프로토타입 멤버를 상속하고, 모든 함수의 프로토타입 객체는 Object 객체의 프로토타입 객체를 상속하며, 모든 생성자 함수의 객체는 Object 객체의 프로토타입 객체를 상속함

- 프로토타입 멤버 상속은 하위 생성자 함수의 prototype 프로퍼티가 new 연산자와 상위 생성자 함수 호출을 통해 생성된 객체를 참조해서 구현하며, 상위 생성자 함수의 프로토타입 멤버를 상속하게 됨

- 프로토타입 객체가 상위 생성자 함수를 통해 만들어졌기 때문에 constructor 프로퍼티는 상위 생성자 함수를 참조하고 있어 constructor 프로퍼티를 하위 생성자 함수로 변경함

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>06-01</title>
    </head>
    <body>
        <script type="text/javascript">
            // 프로토타입 체인과 프로토타입 멤버 상속
 
            // Car 생성자 함수의 프로토타입 객체는 new 연산자와 Object 생성자 함수 호출을 통해 생성된 객체이며,
            // 프로토타입 객체에 constuctor 프로퍼티는 자동으로 Car 생성자 함수를 참조합니다.
            var Car = function() {
            };
            Car.prototype = {
                startEngine : function() {
                    document.writeln('시동을 겁니다...<br/>');
                },
                accelerate : function() {
                    document.writeln('속도를 올립니다...<br/>');
                },
                decelerate : function() {
                    document.writeln('속도를 줄입니다...<br/>');
                },
                stopEngine : function() {
                    document.writeln('시동을 끕니다...<br/>');
                }
            };
 
            // K5 생성자 함수의 프로토타입 객체는 new 연산자와 Object 생성자 함수 호출을 통해 생성된 객체이며,
            // 프로토타입 객체에 constuctor 프로퍼티는 자동으로 K5 생성자 함수를 참조합니다.
            var K5 = function() {
            };
 
            // K5() 생성자 함수의 prototype 프로퍼티가 new 연산자와 Car() 생성자 함수 호출을 통해 생성된 객체를
            // 참조하면 Car() 생성자 함수의 프로토타입 멤버를 상속하게 됩니다.
            K5.prototype = new Car();
            // 프로토타입 객체가 Car() 생성자 함수를 통해 만들어졌기 때문에 constructor 프로퍼티는
            // Car() 생성자 함수를 참조하게 됩니다. 따라서 constructor 프로퍼티를 K5() 생성자 함수로 변경합니다.
            K5.prototype.constructor = K5;
 
            K5.prototype.startNavigation = function() {
                document.writeln('네비게이션 안내를 시작합니다...<br/>');
            };
            K5.prototype.stopNavigation = function() {
                document.writeln('네비게이션 안내를 종료합니다...<br/>');
            };
 
            var k5 = new K5();
            k5.startEngine();
            k5.startNavigation();
            k5.accelerate();
            k5.decelerate();
            k5.stopNavigation();
            k5.stopEngine();
 
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

5. 객체 멤버 상속

- 프로토타입 멤버 뿐만 아니라 특정 객체의 멤버를 상속해야 하는 경우 Function 객체의 메소드 apply() 혹은 call()을 사용해 생성자 체이닝(constructor chaining)을 구현

- 상위 생성자 함수의 멤버를 new 연산자와 하위 생성자 함수를 통해 생성할 객체의 멤버로 추가하는 객체 멤버 상속을 수행함

- 하위 생성자 함수의 프로토타입 객체가 new 연산자와 상위 생성자 호출을 통해 생성된 객체가 되는데 이 객체 내에는 이미 객체 멤버 상속을 통해 프로퍼티를 가지고 있으므로 프로토타입 객체의 프로퍼티를 제거하는 과정이 필요함

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>06-02</title>
    </head>
    <body>
        <script type="text/javascript">
            // 객체 멤버 상속을 위해 Function() 생성자의 메소드 apply()와 call()을 사용해 구현하는  생성자 체이닝
 
            var Car = function(f) {
                this.fuel = f;
                this.velocity = 0;
                this.isDriving = false;
            };
 
            Car.prototype = {
                startEngine : function() {
                    this.isDriving = true;
                    this.fuel -= 5;
                    document.writeln('Car: 시동을 겁니다... (isDriving: ' + this.isDriving + ', fuel: ' + this.fuel + ')<br/>');
                },
                accelerate : function() {
                    this.velocity += 5;
                    this.fuel -= 5;
                    document.writeln('Car: 속도를 올립니다++++ (velocity: ' + this.velocity + ', fuel: ' + this.fuel + ')<br/>');
                },
                decelerate : function() {
                    this.velocity -= 5;
                    this.fuel -= 1;
                    document.writeln('Car: 속도를 줄입니다---- (velocity: ' + this.velocity + ', fuel: ' + this.fuel + ')<br/>');
                },
                stopEngine : function() {
                    this.isDriving = false;
                    this.fuel -= 5;
                    document.writeln('Car: 시동을 끕니다... (isDriving: ' + this.isDriving + ', fuel: ' + this.fuel + ')<br/>');
                }
            };
 
            var K5 = function(f, m) {
                // 객체 멤버 상속
                Car.apply(this, [f]);
                // 또는 Car.call(this, f);
                this.model = m;
            };
 
            K5.prototype = new Car();
            K5.prototype.constructor = K5;
            delete K5.prototype.fuel;
            delete K5.prototype.velocity;
            delete K5.prototype.isDriving;
 
            K5.prototype.accelerate = function() {
                this.velocity += 10;
                this.fuel -= 5;
                document.writeln('K5 ' + this.model + ': 속도를 올립니다++++ (velocity: ' + this.velocity + ', fuel: ' + this.fuel + ')<br/>');
            };
 
            K5.prototype.decelerate = function() {
                this.velocity -= 10;
                this.fuel -= 1;
                document.writeln('K5 ' + this.model + ': 속도를 줄입니다---- (velocity: ' + this.velocity + ', fuel: ' + this.fuel + ')<br/>');
            };
 
            K5.prototype.startNavigation = function() {
                document.writeln('K5 ' + this.model + ': 네비게이션 안내를 시작합니다...<br/>');
            };
 
            K5.prototype.stopNavigation = function() {
                document.writeln('K5 ' + this.model + ': 네비게이션 안내를 종료합니다...<br/>');
            };
 
            var k5 = new K5(1000'2013년형');
            document.writeln('>>> k5.fuel: ' + k5.fuel + '<br/>');
            k5.startEngine();
            document.writeln('>>> k5.fuel: ' + k5.fuel + '<br/>');
            k5.startNavigation();
            for (var i = 0; i < 5; i++)
                k5.accelerate();
            document.writeln('>>> k5.fuel: ' + k5.fuel + '<br/>');
            for (var i = 0; i < 5; i++)
                k5.decelerate();
            document.writeln('>>> k5.fuel: ' + k5.fuel + '<br/>');
            k5.stopNavigation();
            document.writeln('>>> k5.fuel: ' + k5.fuel + '<br/>');
            k5.stopEngine();
            document.writeln('>>> k5.fuel: ' + k5.fuel + '<br/>');
 
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

6. 객체의 타입 검사

- 자바스크립트는 타입에 대한 제약이 약해 직접 타입을 검사하는 방법을 익힐 필요가 있음

- 특히 프로토타입 상속을 한 사용자 정의 객체를 사용할 때는 typeof 연산자, instanceof 연산자, constructor 프로퍼티, toString() 메소드 등의 도움을 얻어 판단할 필요가 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta charset="utf-8" />
    <title>06-03</title>
  </head>
  <body>
    <script type="text/javascript">
      // typeof, instanceof, constructor 를 이용한 객체의 타입 검사
      
      function checkType(obj) {
        // 먼저 null일 경우 문자열 'null'을 반환합니다.
        if (obj == null)
          return 'null';
        
        // 제일 먼저 typeof 연산자를 이용해 문자열을 취합니다.
        var type = typeof obj;
        
        // typeof의 반환 값이 'object'이 아닐 경우 type 값을 반환합니다.
        if (type != 'object')
          return type;
        
        // obj.toString()의 결과를 str 변수에 저장합니다.
        var str = Object.prototype.toString.call(obj);
        
        // 생성자 이름을 추출합니다.
        var constructor = str.substring(8, str.length - 1);
        
        // 'Object'일 경우엔 constructor 프로퍼티까지 조사할 필요가 있습니다.    
        if (constructor != 'Object')
          return constructor;
        
        // 실제 Object 타입일 경우 constructor 값을 반환합니다. 
        if (obj.constructor == Object)
          return constructor;  
        
        // 사용자 정의 객체의 생성자 함수의 프로토타입 객체에 정의해 놓은 constructorname 
        // 프로퍼티가  있으면 constructorname을 반환합니다.
        if ('constructorname' in obj.constructor.prototype)
            return obj.constructor.prototype.constructorname;
        
        return '객체의 타입을 알 수 없습니다.';      
      }
      
      var Parent = function() {};
      Parent.prototype.constructorname = 'Parent';
      
      var Child = function() {};
      Child.prototype = new Parent();
      Child.prototype.constructor = Child;
      Child.prototype.constructorname = 'Child';
      
      var child = new Child();
      
      document.writeln('typeof Parent: ' + typeof Parent + ' <br/>');
      document.writeln('typeof Child: ' + typeof Child + ' <br/>');
      document.writeln('typeof child: ' + typeof child + ' <br/>');
      document.writeln('child instanceof Object: ' + (child instanceof Object+ ' <br/>');
      document.writeln('child instanceof Parent: ' + (child instanceof Parent) + ' <br/>');
      document.writeln('child instanceof Child: ' + (child instanceof Child) + ' <br/>');
      document.writeln('child.constructor === Object: ' + (child.constructor === Object+ ' <br/>');
      document.writeln('child.constructor === Parent: ' + (child.constructor === Parent) + ' <br/>');
      document.writeln('child.constructor === Child: ' + (child.constructor === Child) + ' <br/>');
      document.writeln('<br/>');
      
      document.writeln('checkType(child): ' + checkType(child) + ' <br/>');
      
    </script>
  </body>
</html>
cs

 

6강끝 

 

7강 내장 객체

 

1. Array

- Array 객체는 열을 다루기 위한 객체로, 배열의 원소에 대한 추가, 삭제, 정렬 등의 조작 기능을 제공

- new 연산자와 생성자 함수 호출을 이용해 Array 객체를 생성할 수 있지만, 배열 리터럴로도 많이 사용함

- 자바스크립트에서 배열은 크기가 자동으로 증가되는 특징을 가지고 있음

var students = new Array('홍길동', '이순신', '강감찬');

var students = new Array();

var students = new Array(10);

var students = ['홍길동', '이순신', '강감찬'];

var students = [];

 멤버

설명 

concat(arr) 

매개변수로 전달된 배열 객체를 현재 배열 객체에 연결 

join(del) 

배열의 원소를 구분문자열 del로 연결해 문자열을 반환 

slice(start [, end] 

start 인덱스에서 end-1 인덱스의 원소로 배열을 생성하여 반환 

splice(start, cnt [,rep [, ...]]) 

start 인덱스에서 cnt개의 원소를 rep,...로 치환 

pop() 

배열 끝의 원소를 꺼내 배열에서 삭제 

push(data1 [, data2, ...]) 

배열 끝에 원소를 추가 

shift() 

배열 처음에서 원소를 꺼내 삭제 

unshift(data1 [,data2, ...]) 

배열 처음에 원소들을 추가 

reverse() 

인덱스의 역순으로 배열을 정렬 

sort([func]) 

인덱스의 역순으로 배열을 정렬 

sort(func]) 

기본 오름차순으로 정렬, func은 두 인자를 가지며, 두 인자가 같을 때 0을, 첫번째 인자가 크면 1을, 두번째 인자가 크면 -1을 반환하는 콜백함수 

length 

배열의 크기 

toString()

[원소1, 원소2, ...] 형식의 문자열 반환 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>07-01</title>
    </head>
    <body>
        <script type="text/javascript">
            // Array
 
            var ary1 = ['홍길동''이순신''강감찬''을지문덕''광개토대왕'];
            var ary2 = ['이나영''임수정''이영애''김혜수'];
 
            document.writeln(ary1.concat(ary2), '<br/>');
            // 홍길동,이순신,강감찬,을지문덕,광개토대왕,이나영,임수정,이영애,김혜수
            document.writeln(ary1.join('/'), '<br/>');
            // 홍길동/이순신/강감찬/을지문덕/광개토대왕
            document.writeln(ary1.slice(1), '<br/>');
            // 이순신,강감찬,을지문덕,광개토대왕
            document.writeln(ary1.slice(12), '<br/>');
            // 이순신
            document.writeln(ary1.splice(12'계백''김유신'), '<br/>');
            // 이순신,강감찬
            document.writeln(ary1, '<br/>');
            // 홍길동,계백,김유신,을지문덕,광개토대왕
            document.writeln('<br/>');
            document.writeln(ary1.pop(), '<br/>');
            // 광개토대왕
            document.writeln(ary1, '<br/>');
            // 홍길동,계백,김유신,을지문덕
            document.writeln(ary1.push('권율'), '<br/>');
            // 5
            document.writeln(ary1, '<br/>');
            // 홍길동,계백,김유신,을지문덕,권율
            document.writeln(ary1.shift(), '<br/>');
            // 홍길동
            document.writeln(ary1, '<br/>');
            // 계백,김유신,을지문덕,권율
            document.writeln(ary1.unshift('세종대왕''장영실'), '<br/>');
            // 6
            document.writeln(ary1, '<br/>');
            // 세종대왕,장영실,계백,김유신,을지문덕,권율
            document.writeln('<br/>');
            document.writeln(ary1.reverse(), '<br/>');
            // 권율,을지문덕,김유신,계백,장영실,세종대왕
            document.writeln(ary1, '<br/>');
            //  권율,을지문덕,김유신,계백,장영실,세종대왕
            document.writeln(ary1.sort(), '<br/>');
            // 계백,권율,김유신,세종대왕,을지문덕,장영실
            document.writeln(ary1, '<br/>');
            // 계백,권율,김유신,세종대왕,을지문덕,장영실
            document.writeln('<br/>');
            document.writeln(ary1.length'<br/>');
            // 6
            document.writeln(ary1.toString(), '<br/>');
            // 계백,권율,김유신,세종대왕,을지문덕,장영실
        </script>
    </body>
</html>
cs

 

2. String

- String 객체는 문자열을 다루기 위한 랩퍼(wrapper) 객체로, 문자열의 검색, 부분 문자열의 추출, 변환 등의 조작 기능을 제공

- new 연산자와 생성자 함수를 이용해 String 객체를 생성할 수 있지만 리터럴로 표현하는 것이 일반적임

var greeting = new String('안녕하세요');

var greeting = '안녕하세요';

멤버

설명

indexOf(substr [, start]) 

start 인덱스로부터 정방향으로 부분문자열 substr과 일치하는 인덱스 반환 

lastIndexOf(substr [,start]) 

start 인덱스로부터 역방향으로 부분문자열 substr과 일치하는 인덱스 반환 

charAt(n) 

n번 인덱스의 문자를 반환 

slice(start [,end] 

문자열에서 start 인덱스에서 end-1 인덱스 사이의 문자를 반환 

substring(start [,end]) 

문자열에서 start 인덱스에서 end-1 인덱스 사이의 문자를 반환 

substr(start [, cnt])

문자열에서 start 인덱스에서 cnt 개의 문자를 반환 

split(str [, limit]) 

문자열을 분할문자열 str로 분할하여 그 결과를 배열로 반환(limit은 최대분할수) 

match(reg) 

정규표현 reg로 문자열을 검색, 일치한 부분문자열 반환 

replace(reg,rep) 

정규표현 reg로 문자열을 검색, 일치한 부분을 rep로 치환 

search(reg)

정규표현 reg로 문자열을 검색, 일치한 맨 처음 문자위치 반환 

toLowerCase() 

소문자로 치환 

toUpperCase() 

대문자로 치환 

concat(str) 

문자열 뒤에 문자열 str을 연결한 새로운 문자열을 반환 

length 

문자열의 길이 반환 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>07-02</title>
    </head>
    <body>
        <script type="text/javascript">
            // String
 
            var str1 = 'better tomorrow';
            document.writeln(str1.indexOf('t'), '<br/>');
            // 2
            document.writeln(str1.lastIndexOf('t'), '<br/>');
            // 7
            document.writeln(str1.indexOf('t'3), '<br/>');
            // 3
            document.writeln(str1.lastIndexOf('o'3), '<br/>');
            // -1
            document.writeln(str1.indexOf('mo'), '<br/>');
            // 9
            document.writeln('<br/>');
 
            var str2 = 'JavaScript';
            document.writeln(str2.charAt(4), '<br/>');
            // s
            document.writeln(str2.slice(58), '<br/>');
            // cri
            document.writeln(str2.substring(58), '<br/>');
            // cri
            document.writeln(str2.substr(53), '<br/>');
            // cri
            document.writeln(str2.split('S'), '<br/>');
            // Java,cript
            document.writeln('<br/>');
 
            document.writeln(str2.concat('프로젝트'), '<br/>');
            // JavaScript프로젝트
            document.writeln(str2.length'<br/>');
            // 10
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

3. Number

- Number 객체는 숫자를 다루기 위한 랩퍼 객체

- new 연산자와 생성자 함수를 이용해 Number 객체를 생성할 수 있지만 리터럴로 표현하는 것이 일반적임

var num = new Number(100);

var num = 100;

멤버

설명 

MAX_VALUE 

최대값(생성자 함수의 프로퍼티) 

MIN_VALUE 

최소값(생성자 함수의 프로퍼티) 

NaN 

숫자값이 아님(생성자 함수의 프로퍼티) 

NEGATIVE_INFINITY 

음수의 무한대(생성자 함수의 프로퍼티) 

POSITIVE_INFINITY 

양수의 무한대(생성자 함수의 프로퍼티) 

toString(n) 

n진수 값으로 변환 

toExponential(n) 

지수형식으로 변환(n은 소수점 이하의 행수) 

toFixed(n) 

소수점 이하 자리수 n에 맞춰 변환(자리수가 부족한 경우 0으로 채움) 

toPrecision(n)

전체 유효 자리수 n에 맞춰 변환(자리수가 부족한 경우 0으로 채움) 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>07-03</title>
    </head>
    <body>
        <script type="text/javascript">
            // Number
 
            var num1 = 255;
            document.writeln(num1.toString(16), '<br/>');
            // ff
            document.writeln(num1.toString(8), '<br/>');
            // 377
            document.writeln('<br/>');
 
            var num2 = 123.45678;
            document.writeln(num2.toExponential(2), '<br/>');
            // 1.23e+2
            document.writeln(num2.toFixed(3), '<br/>');
            // 123.457
            document.writeln(num2.toFixed(7), '<br/>');
            // 123.4567800
            document.writeln(num2.toPrecision(10), '<br/>');
            // 123.4567800
            document.writeln(num2.toPrecision(6), '<br/>');
            // 123.457
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

4. Math

멤버 

설명 

abs(n) 

n에 대한 절대값 반환 

max(n1, n2) 

n1과 n2 중 큰 값을 반환 

min(n1, n2) 

n1과 n2 중 작은 값을 반환 

pow(base, n)

base값의 n제곱을 반환 

random() 

0~1 사이의 난수 반환 

ceil(n) 

n이상의 최소 정수를 반환 

floor(n) 

n이하의 최대 정수를 반환 

round(n) 

반올림 값을 반환 

SQRT1_2 

1/2의 제곱근을 반환 

SQRT2

2의 제곱근을 반환 

sqrt(n) 

n의 제곱근을 반환 

PI

원주율을 반환 

cos(n)

n의 코사인 값을 반환 

sin(n) 

n의 사인 값을 반환 

tan(n) 

n의 탄젠트 값을 반환 

acos(n) 

n의 아크 코사인 값을 반환 

asin(n) 

n의 아크 사인 값을 반환 

atan(n) 

n의 아크 탄젠트 값을 반환 

상용로그 밑에 해당하는 상수 e 

LN2

2의 상용로그 값 

LN10 

10의 상용로그 값 

LOG2E 

2를 밑으로 한 e의 로그 값 

LOG10E 

10을 밑으로 한 e의 로그 값 

lon(n) 

n의사용로그 값 

exp(n)

지수함수로 e의 n승 값 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>07-04</title>
    </head>
    <body>
        <script type="text/javascript">
            // Math
            document.writeln(Math.abs(-15), '<br/>');
            //15
            document.writeln(Math.max(1015), '<br/>');
            // 15
            document.writeln(Math.min(-100), '<br/>');
            // -10
            document.writeln(Math.pow(23), '<br/>');
            // 8
            document.writeln(Math.random(), '<br/>');
            // 0.7477149321894746
            document.writeln('<br/>');
 
            document.writeln(Math.ceil(1.58), '<br/>');
            // 2
            document.writeln(Math.floor(1.58), '<br/>');
            // 1
            document.writeln(Math.round(1.58), '<br/>');
            // 2
            document.writeln(Math.ceil(-1.58), '<br/>');
            // -1
            document.writeln(Math.floor(-1.58), '<br/>');
            // -2
            document.writeln(Math.round(-1.58), '<br/>');
            // -2
            document.writeln('<br/>');
 
            document.writeln(Math.sqrt(3), '<br/>');
            // 1.7320508075688772
            document.writeln('<br/>');
 
            document.writeln(Math.PI, '<br/>');
            // 3.141592653589793
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

5. Date

- Date 객체는 리터럴 표현이 존재하지 않으며, new 연산자와 생성자 호출을 통해 객체를 생성해야 함

- Date 객체는 1970년 1월 1일 0시 0분 0초를 기준으로 시각을 관리하며, Date 객체의 월 지정값은 0~11임

var d = new Date();

var d = new Date('2012/12/10');

var d = new Date(2012, 11, 10, 22, 10, 33, 500);

멤버

설명

getFullYear()

년(4자리)

getMonth()

월(0~11)

getDate()

일(1~31)

getDay()

요일(0:일요일 ~ 6:토요일)

getHours()

시(0~23)

getMinutes()

분(0~59)

getSeconeds() 

ch(0~59) 

getMilliseconds() 

밀리초(0~999) 

getTime() 

1970년 1월 1일 0시를 기준으로 경과된 밀리초 

getTimezoneOffset()

세계협정시와의 시차 

setFullYear(y) 

년(4자리) 

setMonth(m) 

월(0~11) 

setDate(d) 

일(1~31) 

setHours(h) 

시(0~23) 

setMinutes(m) 

분(0~59) 

setSeconds(s) 

초(0~59) 

setMilliseconds(ms) 

밀리초(0~999) 

setTime(ts) 

1970년 1월 1일 0시를 기준으로 경과된 밀리초 

parse(str)

문자열을 해석해 1970년 1월 1일 0시를 기준으로 경과된 밀리초를 반환(생성자 함수를 통해 호출) 

UTC(y, m, d [,h [, mm [, s [,ms]]]])

전달 인자를 이용, 1970년 1월 1일 0시를 기준으로 경과된 밀리초를 반환 (생성자 함수를 통해 호출) 

toGMTString()

그리니치 표준시를 문자열로 반환 

toUTCString() 

세계협정시를 문자열로 반환 

toLocaleString()

지역정보에 따른 날짜와 시각을 문자열로 반환 

toDateString() 

날짜부분을 문자열로 반환 

toTimeString()

시각부분을 문자열로 반환 

toLocaleDateString() 

지역정보에 따른 날짜부분을 문자열로 반환 

toLocaleTimeString() 

지역정보 따른 시각부분을 문자열로 반환 

toString()

일시를 문자열로 반환 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>07-05</title>
    </head>
    <body>
        <script type="text/javascript">
            // Date
 
            var dat = new Date(20121110221033500);
            document.writeln(dat, '<br/>');
            // Mon Dec 10 2012 22:10:33 GMT+0900
            document.writeln(dat.getFullYear(), '<br/>');
            // 2012
            document.writeln(dat.getMonth(), '<br/>');
            // 11
            document.writeln(dat.getDate(), '<br/>');
            // 10
            document.writeln(dat.getDay(), '<br/>');
            // 1
            document.writeln(dat.getHours(), '<br/>');
            // 22
            document.writeln(dat.getMinutes(), '<br/>');
            // 10
            document.writeln(dat.getSeconds(), '<br/>');
            // 33
            document.writeln(dat.getMilliseconds(), '<br/>');
            // 500
            document.writeln(dat.getTime(), '<br/>');
            // 1355145033500
            document.writeln('<br/>');
 
            var dat2 = new Date();
            dat2.setFullYear(2012);
            dat2.setMonth(11);
            dat2.setDate(12);
            dat2.setHours(14);
            dat2.setMinutes(45);
            dat2.setSeconds(30);
            dat2.setMilliseconds(999);
            document.writeln('<br/>');
            document.writeln(dat2.toLocaleString(), '<br/>');
            // 2012년 12월 12일 수요일 오후 2:45:30
            document.writeln(dat2.toGMTString(), '<br/>');
            // Wed, 12 Dec 2012 05:45:30 GMT
            document.writeln(dat2.toUTCString(), '<br/>');
            // Wed, 12 Dec 2012 05:45:30 GMT
            document.writeln(dat2.toDateString(), '<br/>');
            // Wed Dec 12 2012
            document.writeln(dat2.toTimeString(), '<br/>');
            // 14:45:30 GMT+0900
            document.writeln(dat2.toLocaleDateString(), '<br/>');
            // 2012년 12월 12일 수요일
            document.writeln(dat2.toLocaleTimeString(), '<br/>');
            // 오후 2:45:30
            document.writeln('<br/>');
            document.writeln(Date.parse('2012/12/08'), '<br/>');
            // 1354892400000
            document.writeln(Date.UTC(20121230), '<br/>');
            // 1359504000000
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

6. JSON

- JSON은 자바스크립트에서 객체를 텍스트(plain text)로 표현하는 방식

- JSON은 시스템 간의 데이터 교환의 수단으로 사용되고 있는 XML보다 용량이 작고, 파싱에 걸리는 시간이 절약되는 이유로 시스템 간의 데이터 교환에 많이 사용되고 있으며, 웹 환경에 최적화되어 있는 자바스크립트에서 바로 객체화해 사용할 수 있기 때문에 생산성과 편의성 또한 높음

- JSON은 숫자, 문자열, 불리언, 배열, 객체를 표현할 수 있음

'{

"name" : "홍길동",

"address" : "서울특별시 관악구 낙성대동",

"orderItems" : [ 

{"item" : "멈추면, 비로소 보이는 것들", "price" : 15000, "qty" :1 },

{"item" : "어떻게 원하는 것을 얻는가?", "price" : 18000, "qty" :1 }

],

"baroOn" : true

}'

- JSON.parse() 함수를 이용해 JSON 문자열을 파싱하고 자바스크립트 객체로 변환

- JSON.stringify() 함수를 이용해 자바스크립트 객체를 JSON 문자열로 변환

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>07-06</title>
        </script>
    </head>
    <body>
        <script type="text/javascript">
            // JSON
 
            var orderJSON = '{ "name" : "홍길동", "address" : "서울특별시 관악구 낙성대동", "orderItems" : [ {"item" : "멈추면, 비로소 보이는 것들", "price" : 15000, "qty" : 1 }, {"item" : "어떻게 원하는 것을 얻는가?", "price" : 18000, "qty" : 1 } ], "baroOn" : true }';
 
            // JSON 문자열을 파싱하여 자바스크립트 객체로 변환합니다.
            var order = JSON.parse(orderJSON);
 
            document.writeln('order.name: ' + order.name + '<br/>');
            document.writeln('order.address: ' + order.address + '<br/>');
            document.writeln('<br/>');
 
            for (var i = 0; i < order.orderItems.length; i++) {
                for (var prop in order.orderItems[i]) {
                    document.writeln(prop + ' : ' + order.orderItems[i][prop] + '<br/>');
                }
                document.writeln('<br/>');
            }
            document.writeln('order.baroOn: ' + order.baroOn + '<br/>');
            document.writeln('<br/>');
        </script>
    </body>
</html>
cs

 

7강끝 

 

8강 웹브라우저와 자바스크립트

 

1. 웹 브라우저와 자바스크립트 실행환경

- Web Browser

Web Layout Engine

JavaScript Engine

Networking Engine

 

2. 웹 브라우저 객체

- 레벨 0 DOM에서는 클라이언트 측 객체 계층구조를 통해 다양하게 접근

 

3. HTML DOM

- DOM 표준 레벨 1은 1998년 10월에 표준화되었으며, Node와 Element.Attr, Document 같은 코어 DOM 인터페이스들이 정의되어 있고, HTML에 특화되어 있는 다양한 인터페이스들도 정의되어 있음

- 레벨 2는 2000년 11월에 표준화되었으며, 레벨 1을 확장하고, 문서 이벤트와 CSS 관련 표준 API를 정의하고, Core 모듈, HTML 모듈, CSS 모듈, Events 모듈과 같은 모듈화로 구성되었음

- 주요 노드 타입

인터페이스 타입

nodeType 상수 

nodeType값 

Element

Node.ELEMENT_NODE 

Attr 

Node.ATTRIBUTE_NODE 

Text 

Node.TEXT_NODE 

Comment 

Node.COMMENT_NODE 

Document 

Node.DOCUMENT 

- DOM API의 인터페이스 계충 구조

- DOM HTML API를 이용한 HTML 문서 요소 접근 및 조작

 API 용도

멤버 

설명 

문서 순회 

Node.childNodes 

Node 객체의 배열 객체처럼 작동하는 NodeList 객체로 자식노드 객체들에 대한 참조를 가지고 있습니다. 

Node.firstChild 

첫번째 자식노드 객체를 참조합니다. 

Node.lastChild 

마지막 자식노드 객체를 참조합니다. 

Node.nextSibling

인접한 다음 형제노드 객체를 참조합니다. 

Node.previousSibling 

인접한 이전 형제노드 객체를 참조합니다. 

문서 내

요소 찾기

Document.getElementByTagName(tag) 

태그명을 문자열 tag로 전달해 해당 태그들의 NodeList 객체를 반환합니다. NodeList 객체는 배열 객체와 같은 방법으로 사용할 수 있습니다. 

Document.getElementByid(id) 

id 속성이 같은 유일 노드 객체의 참조를 반환합니다. 

HTMLDocument.getElementsByName(name) 

name 속성이 같은 요소들의 HTMLCollection 객체를 반환합니다 

문서

수정하기 

CharacterData.data 

data 프로퍼티에 문자열을 제공해 텍스트 노드의 텍스트를 변경할 수 있습니다. 

Node.appendChild() 

자식노드 객체를 추가합니다. 

Node.removeChild() 

자식노드 객체를 제거합니다. 

문서에

새로운

내용

추가하기

Document.createElement() 

새로운 Element 객체를 생성하빈다. 

Document.createTextNode() 

새로운 TextNode 객체를 생성합니다. 

Node.appendChild() 

자식노드 객체를 추가합니다. 

Node.insertBefore() 

노드 객체를 앞에 추가합니다. 

Node.replaceChild() 

자식노드 객체를 교체합니다. 

Node.innerHTML 

DOM표준은 아니나 사실상의 표준프로퍼티인 innerHTML에 HTML텍스트 문자열을 기술하면 간단히 새로운 내용을 추가할 수 있습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>08-01</title>
        <script type="text/javascript">
            // 주어진 노드 객체의 모든 자식노드 중 노드타입이 엘리먼트인 노드의 이름을 출력합니다.
            function printTags(node) {
                var tags = '';
 
                // 노드타입이 엘리먼트인지를 검사합니다.
                if (node.nodeType == Node.ELEMENT_NODE) {
                    // nodeName 프로퍼티에 저장되어 있는 노드의 이름을 tags 변수에 저장합니다.
                    tags += node.nodeName + '<br/>';
                }
 
                // 자식노드 객체들에 대한 NodeList 객체를 저장합니다.
                var children = node.childNodes;
 
                // NodeList 객체의 length 프로퍼티를 이용해 printTags 함수를 재귀호출 합니다.
                for (var i = 0; i < children.length; i++) {
                    // printTags 함수에 NodeList 객체에 담긴 자식노드 항목들을 전달하여
                    // 실행된 결과를 tags 변수에 문자열 접합연산을 통해 저장합니다.
                    tags += printTags(children[i]);
                }
 
                return tags;
            }
 
            // HTML 문서가 파싱되고 외부 컨텐츠 로딩이 완료되면 웹 브라우저는 load 이벤트를 발생하는데,
            // 이 때 load 이벤트의 이벤트 핸들러로 등록된 함수가 실행됩니다. 이 load 이벤트 핸들러에서
            // id 값이 "result"인 div 태그를 찾아 innerHTML 프로퍼티에 html 문자열 값을 저장합니다.
            window.onload = function() {
                var result = document.getElementById('result');
                result.innerHTML = printTags(document);
            };
        </script>
    </head>
    <body>
        <div id="result"></div>
    </body>
</html>
cs

 

4. 이벤트와 이벤트 핸들러

이벤트

이벤트핸들러 프로퍼티 

발생시점 

대상요소 

abort 

onabort 

이미지 로딩이 중단되었을 때 

img 

load 

onload 

문서, 이미지 로딩이 완료되었을 때 

body, img 

unload 

onunload 

다른 페이지로 이동할 때 

body 

click

onclick 

마우스로 클릭할 때 

 

dbclick 

ondbclick 

마우스로 더블클릭할 때 

 

mousedown 

onmousedown

마우스 버튼을 눌렀을 때 

 

mouseup

onmouseup 

마우스 버튼을 놓았을 때 

 

mousemove 

onmousemove 

마우스의 포인터를 이동하였을 때 

 

mouseout 

onmouseout 

요소로부터 마우스가 벗어날 때 

 

mouseover 

onmouseover 

요소 안으로 마우스 포인터가 들어왔을 때 

 

contextmenu 

oncontextmenu 

컨텍스트 메뉴가 표시되기 전 

body 

keypress

onkeypress 

키를 눌렀을 때 

form 요소, body 

keydown

onkeydown 

키를 누르고 있을 때 

form 요소, body 

keyup

onkeyup 

키를 떼었을 때 

form 요소, body 

change 

onchange 

요소의 내용이 변경되었을 때 

input(text), select, textarea 

reset 

onreset 

reset버튼일 눌렸을 때 

form 

submit 

onsubmit 

submit 버튼일 눌렸을 때. form 내용을 전송하지 않으려면 false를 반환합니다. 

form 

blur 

onblur 

요소가 포커스를 잃었을 때 

button, input, label, select, textarea, body 

focus

onfocus 

요소가 포커스를 얻었을 때 

button, input, label, select, textarea, body 

resize 

onresize 

요소의 사이즈가 변경되었을 때 

body 

scroll 

onscroll 

스크롤할 때 

body 

 

5. 이벤트 핸들러 등록과 load 이벤트

- HTML 문서가 파싱되고 외부 컨텐츠 로딩이 완료되면 웹 브라우저에서는 load 이벤트가 발생하는데, 이 때 load 이벤트의 이벤트 핸들러로 등록된 함수가 실행됨

- load 이벤트 핸들러 함수를 자바스크립트 프로그램의 진입점으로 활용해 HTMl 요소에 대한 이벤트 핸들러 등록을 하는 초기화 작업을 수행할 수 있어 HTML 코드와의 분리가 용이함

function 이벤트핸들러함수(){

이벤트 발생 시 수행할 문장들

}

window.onload = function(){

var htmlElement = document.getElementById('id값');

htmlElement.이벤트핸들러프로퍼티명 = function(){

이벤트 발생 시 수행할 문장들

};

또는

htmlElement.이벤트핸들러프로퍼티명 = 함수명;

};

 

function 이벤트핸들러함수(){

이벤트 발생 시 수행할 문장들

}

function 초기화함수(){

var htmlElement = document.getElementById('id값');

htmlElement.이벤트핸들러프로퍼티명 = function(){

이벤트 발생 시 수행할 문장들

};

또는

htmlElement.이벤트핸들러프로퍼티명 = 이벤트핸들러함수명;

}

window.onload = 초기화함수명;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>08-02</title>
        <script type="text/javascript">
            // 버튼 "btnAdd"를 클릭하면 이 함수를 호출합니다.
            function add() {
                // id 속성 값이 'siteName', 'url', 'result'인 엘리먼트를 찾아 참조합니다.
                var siteNameElement = document.getElementById('siteName');
                var urlElement = document.getElementById('url');
                var resultElement = document.getElementById('result');
 
                // <a></a> 엘리먼트를 생성합니다.
                var anchorElement = document.createElement('a');
                // <a href="???"></a> 엘리먼트의  href 속성값을 urlElement에 저장된 값으로 대입합니다.
                anchorElement.href = urlElement.value;
                // siteNameElement에 저장된 값으로 텍스트노드를 생성합니다.
                var newTextNode = document.createTextNode(siteNameElement.value);
                // <a href="???"> ???? </a> 엘리먼트의 자식노드로 방금 전 만든 텍스트노드를 추가합니다.
                anchorElement.appendChild(newTextNode);
                // <br /> 엘리먼트를 생성합니다.
                var brElement = document.createElement('br');
                // resultElement의 자식노드로 anchorElement와 brElement를 추가합니다.
                resultElement.appendChild(anchorElement);
                resultElement.appendChild(brElement);
 
                // 입력 필드를 초기화합니다.
                siteNameElement.value = '';
                urlElement.value = '';
            };
 
            // 버튼 "btnCancel"을 클릭하면 이 함수를 호출합니다.
            function cancel() {
                // id 속성 값이 'siteName', 'url'인 엘리먼트를 찾아 참조합니다.
                var siteNameElement = document.getElementById('siteName');
                var urlElement = document.getElementById('url');
 
                // 입력 필드를 초기화합니다.
                siteNameElement.value = '';
                urlElement.value = '';
            };
 
            // HTML 문서가 파싱되고 외부 컨텐츠 로딩이 완료되면 웹 브라우저는 load 이벤트를 발생하는데,
            // 이 때 load 이벤트의 이벤트 핸들러로 등록된 함수가 실행됩니다. 이 load 이벤트 핸들러에서
            // id 값이 "btnAdd"와 "btnCancel"인 버튼을 찾아 click이벤트에 대해 이벤트 핸들러 함수를 등록합니다.
            window.onload = function() {
                var btnAddElement = document.getElementById('btnAdd');
                var btnCancelElement = document.getElementById('btnCancel');
 
                btnAddElement.onclick = add;
                btnCancelElement.onclick = cancel;
            };
        </script>
    </head>
    <body>
        <form>
            <label> 웹 사이트 :
                <br />
                <input type="text" id="siteName" size="50" />
                <br />
            </label>
            <label> URL :
                <br/>
                <input type="text" id="url" size="50" />
                <br />
            </label>
            <input type="button" id="btnAdd" value="추가" />
            <input type="button" id="btnCancel" value="취소" />
        </form>
        <div id="result"></div>
    </body>
</html>
cs

 

6. DOM 이벤트 핸들링

- 앞서 소개된 이벤트 핸들링 방식은 오래 전부터 클라이언트 측 자바스크립트에서 사용되어 온 방식인데, 여기에는 한 개의 HTML 요소에 둘 이상의 이벤트 처리가 안된다는 문제점이 있음

- DOM 레벨 2의 이벤트 리스너(event listener) 는 한 개의 HTML요소에서 복수의 이벤트와 연관을 맺을 수 있도록 하는 기능을 제공하며, 설정했던 이벤트 리스너를 쉽게 제거할 수도 있음

- 이벤트 리스너와 관련된 DOM API가 브라우저 호환성 문제가 있음

- 이벤트 리스너를 사용하는 경우에는 크로스 브라우징(cross browsing)을 고려한 코드를 작성해야 함(MS의 인터넷 익스플로러도 버전 9부터는 DOM 레벨 2 이벤트 모델 표준을 따르고 있음)

var htmlElement = document.getElementById('id값');

//FireFox, Chrome 과 같은 비 IE 웹브라우저의 경우

htmlElement.addEventListener(이벤트명, 이벤트핸들러함수명,false);

// IE 웹 브라우저의 경우

htmlElement.attachEvent(이벤트핸들러프로퍼티명, 이벤트핸들러함수명);

 

var htemlElement = document.getElementById('id값');

//FireFox, Chrome 과 같은 비 IE 웹브라우저의 경우

htmlElement.removeEventListener(이벤트명, 이벤트핸들러함수명,false);

// IE 웹 브라우저의 경우

htmlElement.detachEvent(이벤트핸들러프로퍼티명, 이벤트핸들러함수명);

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>08-03</title>
        <script type="text/javascript">
            // click 이벤트 발생 시 수행할 이벤트 핸들러 함수입니다.
            function addText() {
                var resultElement = document.getElementById('result');
                resultElement.innerHTML = '크로스 브라우징 이벤트 리스너 구현!!!';
 
            }
 
            // click 이벤트 발생 시 수행할 이벤트 핸들러 함수입니다.
            function clearText() {
                var resultElement = document.getElementById('result');
                resultElement.innerHTML = '';
            }
 
            // load 이벤트 발생 시 수행할 이벤트 핸들러 함수입니다.
            function init() {
                // id 속성 값이 'btnClick', 'btnCancel'인 버튼을 찾아 크로스 브라우징 기능이 구현된
                // 이벤트 리스너 등록 함수를 사용해 click 이벤트에 대한 이벤트 핸들러 함수를 등록합니다.
                var btnClickElement = document.getElementById('btnClick');
                var btnCancelElement = document.getElementById('btnCancel');
                addListener(btnClickElement, 'click', addText);
                addListener(btnCancelElement, 'click', clearText);
            }
 
            // 크로스 브라우징을 고려해 구현한 이벤트 리스너 등록  함수입니다.
            // el : 이벤트가 발생할 HTML 요소
            // ev : 이벤트
            // handler : 이벤트 핸들러 함수
            function addListener(el, ev, handler) {
                // FireFox, Chrome과 같은 비 IE 웹브라우저의 경우
                if (el.addEventListener) {
                    el.addEventListener(ev, handler, false);
                } else {// IE 웹 브라우저의 경우
                    el.attachEvent('on' + ev, handler);
                }
            }
 
            addListener(window'load', init);
 
        </script>
    </head>
    <body>
        <form>
            <input type="button" id="btnClick" value="눌러주세요" />
            <input type="button" id="btnCancel" value="취소" />
        </form>
        <div id="result"></div>
    </body>
</html>
cs

 

7. DOM 이벤트 전파

이벤트 흐름 단계

개요 

캡처 단계 

웹 브라우저에서 이벤트가 발생하고, 문서의 최상위 객체인 Document 객체에서 이벤트가 발생한 타겟 객체의 상위 객체까지 이벤트가 전파되는 단계 

타겟 단계  

이벤트가 발생한 객체로 전파되는 단계 

버블링 단계 

타겟 객체의 상위 객체에서 다시 최상위 객체인 Document 객체까지 전파되는 단계 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<!DOCTYPE html>
<html lang="ko">
    <head>
        <meta charset="utf-8" />
        <title>08-04</title>
        <style>
            .class1 {
                background-color: #adff2f;
            }
            .class2 {
                background-color: #dda0dd;
            }
        </style>
        <script type="text/javascript">
            // 크로스 브라우징이 적용된 이벤트 버블링 억제 함수
            function cancelBubbling(e) {
                // FireFox, Chrome과 같은 비 IE 웹브라우저의 경우
                if (e.stopPropagation) {
                    e.stopPropagation();
                } else {// IE 웹 브라우저의 경우
                    window.event.cancelBubble = true;
                }
            }
 
            // click 이벤트 발생 시 수행할 이벤트 핸들러 함수입니다.
            function outerFunc() {
                var resultElement = document.getElementById('result');
                resultElement.innerHTML = 'outer 에서 click 이벤트 발생';
 
            }
 
            // click 이벤트 발생 시 수행할 이벤트 핸들러 함수입니다.
            function innerFunc(e) {
                var resultElement = document.getElementById('result');
                resultElement.innerHTML = 'inner 에서 click 이벤트 발생';
                //cancelBubbling(e);  // 상위 객체로의 이벤트 버블링을 억제합니다.

                //여기서 cancelBubbling(e); 의 주석을 제거하면 이벤트 버블링 억제효과가 발생하여

                //inner 이벤트에 접근이 가능하다

            }
 
            // load 이벤트 발생 시 수행할 이벤트 핸들러 함수입니다.
            function init() {
                // id 속성 값이 'outer', 'inner'인 영역을 찾아 크로스 브라우징 기능이 구현된
                // 이벤트 리스너 등록 함수를 사용해 click 이벤트에 대한 이벤트 핸들러 함수를 등록합니다.
                var outerElement = document.getElementById('outer');
                var innerElement = document.getElementById('inner');
                outerElement.className = 'class2';
                innerElement.className = 'class1';
                addListener(outerElement, 'click', outerFunc);
                addListener(innerElement, 'click', innerFunc);
            }
 
            // 크로스 브라우징을 고려해 구현한 이벤트 리스너 등록  함수입니다.
            // el : 이벤트가 발생할 HTML 요소
            // ev : 이벤트
            // handler : 이벤트 핸들러 함수
            function addListener(el, ev, handler) {
                // FireFox, Chrome과 같은 비 IE 웹브라우저의 경우
                if (el.addEventListener) {
                    el.addEventListener(ev, handler, false);
                } else {// IE 웹 브라우저의 경우
                    el.attachEvent('on' + ev, handler);
                }
            }
 
            addListener(window'load', init);
 
        </script>
    </head>
    <body>
        <div id="outer">
            외부영역을
            <div id="inner">
                내부 영역을 클릭해 보세요!!!
            </div>
            클릭해보세요!!!
        </div>
        <div id="result"></div>
    </body>
</html>
cs

 

8. 웹브라우저별 이벤트 핸들링 모델

비교항목

비 IE(FireFox, Chrome 등) 

IE 

이벤트리스너 등록 

addEventListener() 

attachEvent() 

이벤트리스너 제거 

removeEventListener() 

detachEvent() 

이벤트 발생원 참조 

e.tartget 

window.event.srcElement 

마우스 왼쪽 버튼 

e.button의 값이 0 

window.event.button의 값이 1 

마우스 가운데 버튼 

e.button의 값이 1 

window.event.button의 값이 4 

마우스 오른쪽 버튼 

e.button의 값이 2 

window.event.button의 값이 2 

이벤트버블링 억제 

e.stopPropagation() 

window.event.cancelBubble = true 

이벤트디폴트동작 억제

e.preventDefault() 

window.event.returnValue = false 

 

9. 웹브라우저 호환성 테스트

//크로스 브라우징이 적용된 이벤트 리스너 등록 함수

function addListener(el, ev, handler){

//FireFox, Chrome과 같은 비 IE웹브라우저의 경우

if(el.addEventListener){

el.addEventListener(ev, handler, false);

} else {

//IE웹 브라우저의 경우

el.attachEvent('on' + ev, handler);

}

}

 

//크로스 브라우징이 적용된 이벤트 리스너 제거 함수

function removeListener(el, ev, handler){

//FireFox, Chrome과 같은 비 IE웹브라우저의 경우

if(el.removeEventListener){

el.removeEventListener(ev, handler, false);

} else {

//IE웹 브라우저의 경우

el.detachEvent('on' + ev, handler);

}

}

 

//크로스 브라우징이 적용된 이벤트 발생원 조사 함수

function getEventSource(e) {

//FireFox, Chrome과 같은 비 IE웹브라우저의 경우

if(e.target) {

return e.target;

} else{

//IE웹 브라우저의 경우

return window.event.srcElement;

}

}

 

//크로스 브라우징이 적용된 마우스 이벤트 버튼 확인 함수

function getButtonType(e) {

//FireFox, Chrome과 같은 비 IE웹브라우저의 경우

if(e.target){

switch (e.button) {

case 0;

return '왼쪽 버튼';

case 1;

return '가운데 버튼';

case 2;

return '오른쪽 버튼';

}

} else {

//IE웹 브라우저의 경우

switch (window.event.button) {

case 1;

return '왼쪽 버튼';

case 4;

return '가운데 버튼';

case 2;

return '오른쪽 버튼';

}

}

}

 

//크로스 브라우징이 적용된 이벤트 버블링 억제 함수

function cancelBubbling(e) {

//FireFox, Chrome과 같은 비 IE웹브라우저의 경우

if(e.stopPropagation) {

e.stopPropagation();

} else {

//IE웹 브라우저의 경우

window.event.cancelBubble = true;

}

}

 

//크로스 브라우징이 적용된 이벤트 디폴트 동작 억제 함수

function cancelEvent(e) {

//FireFox, Chrome과 같은 비 IE웹브라우저의 경우

if(e.preventDefault) {

e.preventDefault();

} else {

//IE웹 브라우저의 경우

window.event.returnValue = false;

}

}

 

8강끝

 

'Legend 개발자 > T아카데미' 카테고리의 다른 글

UX/UI 기획  (0) 2017.09.04
jQuery (JavaScript)  (0) 2017.09.02
컴퓨터 알고리즘 중급  (0) 2017.08.31
HTML&CSS  (0) 2017.08.28
컴퓨터 알고리즘 초급  (0) 2017.08.10
Posted by 전설의아이
|

1강 HTML5의 개요 및 개발환경 구축

 

1. 웹이란?

-Web(웹)이란, 사전적인 의미로 거미줄이란 뜻으로 IT에서는 WWW(world wide web) 말의 줄임말로써 사용된다. 세계의 컴퓨터들을 연결하여 정보 공유를 하는데 주 목적이 있다. 이렇게 연결되어 있는 상태를 네트워크에 연결되어 있다고 한다.

 

2. HTML5란?(HTML5의 개발 배경)

- 수많은 플러그인들로 인한 부작용을 막기 위해 개발되었다.

HTML5 개발 단계

- 익스플로러 독점

- 익스플로러에 맞는 많은 플러그인 양산

- 거대해져가는 브라우저 및 보안 취약점 발생

- MS를 제외한 회사들이 HTML표준안을 W3C에 제시

- HTML 표준안 무시

- 무시당한 회사들이 Web Application 1.0 개발

- W3C는 XHTML2.0 개발

- XHTML2.0의 쇠퇴

- W3C에서 Web Application 1.0을 웹표준안으로 수용

- Web Application 1.0을 HTML5로 개명

- 2014년 HTML5 정식 배포

 

3. 웹 표준이란?

- 모든 브라우저에서 웹서비스가 정상적으로 보여질 수 있도록 하는 것

- W3C에서 HTML5를 웹 표준으로 권고하고 이를 따름

- W3C[World Wide Web Consortium] - http://www.w3.org 월드와이드웹(WWW)의 창시자인 팀 버너스 리를 중심으로 창립된 월드와이드웹 컨소시엄

 

4. HTML5과 XHTML의 차이

- HTML5는 내용과 디자인을 분리하여 유지보수에 장점이 있다.

- XHTML은 내용과 디자인이 한 페이지에 있고

- HTML5는 분리되어 있다.

 

5. HTML5의 특징

- HTML5는 지금도 개발 중에 있고, 다양한 기능이 추가되었다.

- 멀티미디어를 직접 재생할 수 있다.

- 서버와 통신할 수 있다.

- 시멘틱 태그가 추가되어, 검색엔진의 검색능력을 극대화할 수 있다.

 

6. CSS3란?

- 웹 문서를 꾸며주는 언어이다.

- Cascading Style Sheets의 약자

- 웹 문서의 레이아웃을 설정한다.

- 하나의 웹 문서를 다양한 디바이스에 최적화해서 출력한다.

 

7. HTML5와 CSS3

- HTML5와 CSS3는 실과 바늘처럼 거의 항상 같이 한다.

- 내용 : HTML

- 디자인 : CSS

 

8. 개발 도구 익히기

- HTML5와 CSS3을 편집(코딩) 하기 위한 도구를 알아본다.

Notepad++

- 무료 버전으로 검색사이트에서 쉽게 다운받을 수 있다.

Visual Studio 2013 Express for Web

- 무료 버전으로 MS사이트에서 쉽게 다운받을 수 있다.

(Visual Studio 2013 Express for Web 검색 > 다운로드 > 설치)

 

9. HTML문서 무작정 만들어 보기

- 처음으로 HTML문서(웹 문서)를 제작해 본다.

 

10. 무료 웹 호스팅 신청하기

- zpat.info 무료 웹 호스팅 계정을 신청한다.

- (지금은 없어서 새로 찾아봐야 할듯...)

 

11. FTP란?

- file transfer protocol의 약자로 파일을 전송하는 프로토콜이다.

- FTP 서버(서버용 프로그램)

- FTP 사용자(클라이언트용 프로그램)

 

12. FTP 설치 및 사용방법

- FTP프로그램을 이용해서 FTP서버에 파일을 업로드할 수 있다.

 

13. 서버(웹)에서 HTML문서 확인

- 서버에 파일을 업로드 하고, 브라우저에서 확인해 본다.

 

14. 구글 크롬 설치

- 구글 크롬 브라우저를 설치하고 웹 문서를 출력해 본다.

 

15. 개발자 도구

- HTML문서를 제작하는데 만은 도움을 주는 도구이다.

F12 또는 오른쪽 마우스 > 요소검사를 선택한다.

 

학습정리

- HTML5의 등장 이유 : XHTML의 쇠퇴에 따른 대안으로 HTML5를 W3C에서 채택했다

- CSS란? : 웹 문서의 디자인을 담당하는 언어이다.

- FTP란? : 실제 서버에 웹 문서를 업로드 해서 어디서나 브라우저를 통해서 출력이 가능하게 만들어 주는 프로토콜이다.

 

2강 HTML5 태그 1 (HTML5 기본 태그 및 아이디 속성을 이용한 페이지 제작)

 

1. 태그와 속성

- HTML 문서는 '태그'로 만들어진다.

- HTML 문서의 뼈대는 html, head, body 태그로 구성되어 있다.

- 주로 body 태그 안에 실제 웹 문서에 표현되는 수없이 많은 태그들이 존재한다.

- 태그는 시작 태그와 종료 태그로 짝을 이루는 태그도 있고, 시작 태그만 존재하는 태그도 있다.

- 시작 태그와 종료 태그는 '/'로 구분한다.

- 각각의 태그마다 속성이 존재하고 속성에는 속성값이 존재한다.

 

2. 주석

- 주석은 html문서가 브라우저를 통해서 출력될 때 노출되지 않는다. (프로그래밍 설명문)

- 주석을 사용하는 이유

- 지금 내가 작성한느 문서를 나 자신 또는 다른 사람이 먼 훗날 다시 보게 될 때 좀 더 쉽게 문서를 파악하기 위해서 작성하는 프로그래밍 설명문

- 처음에는 다소 귀찮은 작업일수도 있지만 추후 발생되는 디버깅 또는 유지보스를 생각한다면 주석은 아주 중요한 요소

- 처음 HTML을 학습하는 단계에서는 주석의 중요성을 못 느낄 것이다. 그 이유는 주석은 어느 정도 규모가 되는 프로젝트에서 많은 문서를 제작할 때 그 필요성을 느끼게 해주기 때문이다.

- 지금처럼 html을 학습하는 초기 단계에서는 간단한 예제 위주로 html 문서를 작성하므로, 주석이 없어도 한눈에 HTML 문서의 구조를 파악할 수 있다.

 

3. HTML 문서 구조

- HTML 문서는 DOCTYPE, html, head, meta, title, body로 구성

<head> : head 태그에는 주로 웹 문서의 정의가 기술됨

<meta> : 이 문서가 무엇으로 만들어 졌는지 스펙정보가 기술됨

<title> : 브라우저 창이 뜰 때 창에 나오는 제목

<body> : body 태그에는 주로 웹 문서의 내용이 기술됨

- 우리가 실제로 브라우저를 통해서 확인되는 내용은 거의 대부분이 body태그의 내용

 

4. 텍스트 관련 태그

- 웹 문서는 주로 텍스트와 이미지로 구성됨

- 이 중에서 텍스트는 정보를 전달하기 위한 기본적인 요소로써, HTML에서도 다양한 태그를 제공하고 있음

- <h1> ~ <h6> 및 <p> 태그는 아주 많이 사용되는 태그

- <hr>태그를 사용하면 HTML화면에 줄이 그어진다

 

5. 하이퍼링크 태그

- 웹문서의 꽃인 앵커 태그가 가지고 있는 속성

<a>태그 : 웹 문서를 이동할 수 있게끔 해주는 태그

href 속성 : 웹 문서가 이동하게 될 주소를 속성값으로 가진다.

- <a>태그는 웹 서비스의 가장 중요한 요소 중 하나
- <a href = " @!#$%^*&^%$# " ></a>

- 앵커태그라고도 한다

 

6. 아이디 속성을 특정 위치 이동

- 태그의 아이디 속성을 이용한 페이지 내에서 특정 위치로 이동

- 작성예 : <hr id="info01" /><p><a href="#info01"></a></p>

 

학습정리

<h1>~<h6> 태그 : 주로 타이틀을 나타내는 태그로 사용된다.

<p> 태그 : 문단을 구분할 때 사용되는 태그이다.

<a href="#">태그 : 문서의 이동을 담당하는 태그이다. 앵커 태그의 경우 다양한 속성과 속성값을 알아두어야 한다.

 

3강 HTML5 태그 2 (목록 구성 태그)

 

1. 목록 관련 태그

- 목록을 나타내는 태그에는 대표적으로 ol, ul태그가 있다. 이들은 모두 목록(리스트)를 나타내기 위한 태그이다.

<ol> 태그

- 순서가 있는 목록을 나타낸다.

- 목록의 아이템은 <li>태그를 사용한다.

<ul>태그

- 순서가 없는 목록을 나타낸다.

- 목록의 아이템은 <li>태그를 사용한다.

- 기본적으로 웹 문서에서 목록을 나타낼 때는 <ol>또는 <ul> 태그 중 하나를 사용하고 아이템은 <li> 태그를 사용한다.

- 목록 태그의 구조 : <ol><li></li></ol>,    <ul><li></li></ul>

- 목록을 나타내는 태그로 dl, dt, dd 태그도 있음 <dl><dt><dd></dd></dt><dt><dd></dd></dt></dl>
도 있다.

- CSS에서 li { list-style :none; } 을 하면 list 스타일이 적용되지 않아 수평으로 출력이 된다.

 

2. 테이블 태그

- 표를 나타내는 태그는 <table>태그를 사용한다. <table> 태그 내부에 <tr>, <td> 등을 사용해서 내용을 표현한다.

<table> 태그 : 표를 나타내기 위한 태그

<tr> 태그 : table태그 내부태그로 테이블에서 행을 표현

<td> 태그 :  table 태그 내부태그로 테이블에서 열을 표현

- table 태그는 과거에는 웹 문서의 전체적인 레이아웃을 만들 때 많이 사용되었으나, 웹 표준 시대에는 회원가입, 게시판, 설문조사 등에 사용된다.

- <table border="1"><tr><th></th></tr><tr><td></td></tr></table>

- 열을 합치는 속성 colspan="?", 행을 합치는 속성 rowspan="?"

 

학습정리

<ol>태그 : 순서가 있는 목록을 나타낼 때 사용하는 태그로 목록 아이템은 <li>태그를 사용한다. 추후에 학습하게 될 CSS를 이용해서 가로형태로 변형도 한다.

<ul>태그 : 순서가 없는 목록을 나타낼 때 사용하는 태그로 목록 아이템은 <li>태그를 사용한다. 추후에 학습하게 될 CSS를 이용해서 가로형태로 변형도 한다.

<dl> 태그 : ol, ul태그와 함께 많이 사용되는 태그로 내부 태그로 dt, dd태그를 이용해서 리스트의 아이템을 나타낸다. 

<table> 태그 : 표를 나타내는 태그로 내부태그로 tr, th, td태그를 사용해서 셀을 나타낸다. 셀을 합치는 경우에는 colspan(열), rowspan(행) 속성을 이용한다. 주로 회원가입, 게시판, 설문조사 등과 같은 페이지의 레이아웃을 제작할 때 사용된다.

 

4강 HTML5 태그 3 (데이터 전송 및 이미지 태그)

 

1. 폼 관련 태그

- 사용자의 정보를 서버로 전달하기 위한 용도로 사용되는 태그

- <form><input/>...</form> → 데이터 처리

<form> 태그 : 데이터 처리 문서의 주소와 데이터 전달 방식을 속성으로 갖는다.

<form action ="#" method="get">

action은 input태그에 있는 submit버튼을 누를 때 해당되는 URL로 정보를 전송한다.

<input> 태그 : type 속성을 이용해서 사용자의 다양한 정보를 얻을 수있다.

text, password, file, radio, checkbox, submit

name 속성은 서버가 식별할 수 있는 이름이다. name이 중복되면 서버가 헷갈릴 수 있다.

radio 속성의 경우 name값을 동일하게해야 여러개 중 하나를 선택하게 할 수 있다.

checked 속성은 화면에 처음 출력이 될 때 기본값으로 체크되게 해준다. 

<select> 태그 : n개중에 하나를 선탁할 때

<select><option></option></select>

multiple 속성을 사용하면 다중 선택이 된다.

- 디자이너와 퍼블리셔는 폼 관련 태그를 디자인에 중점을 둔다.

- 웹 프로그래머는 데이터의 처리에 중점을 두고 작업을 한다.

- 다양한 데이터에 적합한 폼을 구성, 데이터 전송에 GET방식과 POST방식을 구분

GET방식은 URL에 정보가 추가되어 서버로 전송이 된다. 보안에 취약함

POST방식은 URL에 정보가 추가되지 않고 암호화되어 서버로 전송이 된다. 보안이 됨

 

<form action="#" method="get">

이름 : <input type="text" name="uname" /><br />

아이디 : <input type="text" name="uid" /><br />

비밀번호 : <input type="password" name="upw" /><br />

연락처 : <input type="text" name=uphone1" size="5" /> -

<input type="text" name=uphone2" size="5" /> -

<input type="text" name=uphone3" size="5" /><br />

사진 : <input type="file" name="upic"/><br />

성별구분 : <input type="radio" name="gender" value="m"> 남,

   <input type="radio" name="gender" value="w"> 여 <br />

사용언어 : <input type="checkbox" name="lan" value="kor" checked="checked" />한글,

   <input type="checkbox" name="lan" value="eng" />영어,    

   <input type="checkbox" name="lan" value="jap" />일어,

   <input type="checkbox" name="lan" value="chi" />중국어<br />

자기소개 : <textarea rows="5" cols="20"> 간단하게 입력하세요. <textarea><br />

국적 : <select>

<option>KOREA</option>

<option>USA</option>

<option>JAPAN</option>

<option>CHINA</option>

   </select><br />

좋아하는음식 : <select multiple="multiple">

<option>김치</option>

<option>불고기</option>

<option>파전</option>

<option>비빔밥</option>

   </select><br />

<input type="submit"/>

</form>

 

2. 이미지 태그

- 이미지를 사용하여 보다 효율적인 정보 전달을 할 수 있다.

- <img src="위치정보">

<img>태그 : 웹 문서에 이미지를 삽입하기 위한 태그

src 속성 : 이미지의 위치 정보를 속성값으로 가지고 있다.

alt 속성 : 사용자가 src주소에서 정보를 얻지 못할 때 해당 이미지의 정보가 무엇인지 사용자에게 알려주는 속성, alt 속성을 이용하여 시각장애인에게 사운드로 출력되어 정보를 전달해 줄 수 있다.

- 이미지는 웹 문서에서 텍스트와 함께 정보 전달 수단으로써 아주 중요한 역할을 하는 요소

- 이미지의 위치는 로컬뿐만 아니라 외부에 존재할 수도 있다.

- 이미지 태그와 속성을 이용한 이미지 삽입

<p><img src="img/Navi_dr.png" alt="꿈 story"></p>

<p><img src="img/Navi_dr.png" alt="꿈 story" width="500"></p> 이미지의 크기를 결정해주는 속성

<p><a href="#"><img src="#" alt="#"></a></p> 이미지에 링크를 삽입하는 경우

- 리스트 구조를 만들고, 리스트의 아이템으로 이미지를 사용

<ol><li><img src="#" alt="#"><a href=#"></a></li></ol> 이와 같이 사용할 수 있다.

 

학습정리

<form>태그 : 사용자의 정보를 서버로 전달하기 위한 태그

<input>태그 : 사용자의 다양한 정보를 type 속성을 이용해서 적절하게 처리한다.

          ex) type="password" → 비밀번호 입력

<img src="이미지 위치 정보">태그 : 웹 문서에 텍스트 외에 이미지를 삽입하여 효율적인 정보 전달을 가능하게 한다. alt 속성은 이미지가 손상되었을 때 이미지를 설명해주는 태그

 

 

5강 HTML5 태그 4 (HTML5 레이아웃 및 시멘틱 웹페이지 제작)

 

1. 페이지 레이아웃 설정 태그

- block 타입의 태그와 inline 타입의 태그

block 타입의 태그의 경우 자동으로 개행이 된다. Ex: <p>태그, <li>태그

inline 타입의 태그의 경우 <br>태그를 하지 않는 이상 개행이 안된다. Ex: <img>태그

<div>태그

- block 타입의 대표적인 태그

- 웹 문서의 레이아웃을 설정하는 용도로 많이 사용된다.

<span> 태그

- inline 타입의 대표적인 태그

- 웹 문서에서 특정한 의미를 나타내지는 않는다.

- <div>태그를 이용해서 웹 문서의 레이아웃을 자유롭게 구성할 수 있어야 한다.

 

2. 시멘틱 태그

- 검색 엔진이 보다 효율적으로 데이터를 검색할 수 있게 특정 태그를 사용해서 웹 문서를 제작하는 것을 시맨틱 웹이라고 한다.

- 시멘틱 태그 웹 문서 ← 효율적인 검색 ← 검색엔진

- 시멘틱 주요 태그

<header> 페이지의 헤드 영역

<footer> 페이지의 하단 영역

<nav> 페이지의 네비게이션(메뉴) 영역

<section> 페이지의 내용

<article> section과 유사하며, 글 또는 어떠한 내용 출력

<aside> 부가적인 내용

 

3. 시멘틱 태그를 이용한 웹페이지 제작

- 일반 태그는 <div></div> 위주로 구성되어 있음

- 시멘틱 태그는 <header></header> <nav></nav> <section></section> <footer></footer>로 구성되어 있음

- 검색엔진에 검색을 할 때 시멘틱 태그가 더 좋다.

 

학습정리

<div> 태그 : 웹 문서의 레이아웃을 설정하는데 가장 많이 사용되는 태그

시멘틱 태그 : 검색 엔진이 보다 효율적으로 데이터를 검색할 수 있게 특정 태그를 사용해서 웹 문서를 제작하는 것을 시멘틱 웹이라고 한다. 시멘틱 태그의 사용은 권장사항이다. 즉, 사용하지 않아도 웹 문서를 제작할 수 있다. 

 

6강 HTML5 태그 5 (HTML5 멀티미디어)

 

1. 멀티미디어 관련 태그

- 웹 문서에 멀티미디어 요소를 삽입하면, 정보 전달이 보다 효율적이다.

<embed> 태그 :

embed 태그를 이용해서 멀티미디어 요소를 삽입할 수 있다.

src : 재생하려는 파일의 경로와 이름

width : 가로 사이즈

height : 세로 사이즈

autostart : 자동실행 여부(true/false)

<embed src="#" width="?" height="?" autostart="false" />

<audio> 태그 :

audio 태그를 사용하면 웹 문서에 음악을 삽입할 수 있다.

audio 태그에는 다양한 속성이 있다.

src : 재생하려는 파일의 경로와 이름

controls : 컨트롤러 출력 (true.false로 출력하는 것이 아님)

autoplay : 자동 실행 (true.false로 출력하는 것이 아님)

loop : 반복 실행

<audio src="#" controls="controls" autoplay="autoplay" loop="loop" />

<video> 태그 :

vidio 태그를 사용하면 웹 문서에 동영상을 삽입할 수 있다.

vidio 태그의 다양한 속성이 있다.

src : 재생하려는 파일의 경로와 이름

type : 재생매체 타입

controls : 컨트롤러 출력

autoplay : 자동 실행

loop : 반복 실행

<video src="#" type="video/mp4" controls="controls" autoplay="autoplay" loop="loop" />

- 과거에 주로 사용된 embed 태그 외에 audio, video 태그를 이용해서 멀티미디어 요소를 웹 문서에 삽입할 수 있다.

 

학습정리

<embed> 태그 : embed 태그와 이용해서 멀티미디어 요소를 삽입할 수 있다.

<audio> 태그 : 웹 문서에서 음악을 재생하기 위한 태그이다.

<video> 태그 : 웹 문서에서 동영상을 재생하기 위한 태그이다. 

 

7강 CSS3 선택자 1 (스타일 기초 및 필수 선택자)

 

1. CSS3 적용 방법

- 다양한 CSS3 적용 방법

- HTML 태그에 직접 적용하는 방법

해당 HTML 태그에 직접 기술하여 CSS3의 속성을 적용한다.

Ex) <div style="background:#ff0000;">

- HTML 문서 내부에서 적용하는 방법

HTML 문서 내부에서 <style> 태그를 이용해서 CSS3를 적용한다.

<style>

div {

background : #000000 ;

}

</style>

- HTML 문서 외부에서 적용하는 방법

HTML 문서 외부에서 .css 파일을 이용해서 CSS3를 적용한다. 

<link href="???.css" type="text/css" rel="stylesheet">

- 가장 많이 사용되는 방법은 .css파일을 외부에 두고 HTML문서에서 <link> 태그를 이용하는 방법이다.

 

2. 선택자와 속성

- CSS3의 선택자와 속성

- CSS3 선택자

HTML 요소에 스타일을 적용하기 위해서는 우선적으로 해당 요소를 선택해야 한다.

HTML 요소를 선택하기 위해서 선택자를 이용한다.

CSS3에서는 크게 태그, 클래스, 아이디 선택자를 제공하고 있다.

- CSS3 속성

선택자를 이용해서 HTML요소를 선택한 후, 적절한 속성을 적용한다.

- CSS3을 잘 다루려면 우선적으로 HTML 문서의 전체적인 구조를 파악해야 한다.

- 문서의 구조를 파악하지 못하면 해당 요소를 정확하게 선택할 수 없다.

 

3. 전체 선택자

- CSS3의 대표적인 선택자

- 선택자

HTML 문서의 모든 요소를 선택하기 위한 선택자 *

<style>

*{

color : #000000 ;

}

</style>

 

4. 태그, 아이디, 클래스 선택자

- CSS3의 대표적인 선택자

- 태그 선택자 태그명

특정 태그를 선택할 때 사용

- 아이디 선택자 #아이디명

HTML 태그에 아이디를 지정하고, 지정된 아이디의 태그를 선택하는 선택자

- 클래스 선택자 .클래스명

HTML 태그에 클래스를 지정하고, 지정된 클래스의 태그를 선택하는 선택자

아이디 선택자와 차이점은 아이디는 주로 유니크한 이름을 사용하며, 클래스는 여러 개의 태그에 동일한 이름을 가질 수 있다는 점 

 

학습정리

태그 선택자 : HTML의 특정 태그를 선택할 때 사용한다.

아이디 선택자 : HTML 태그에 부여된 아이디를 이용해서 태그를 선택할 때 사용한다.

클래스 선택자 : HTML 태그에 부여된 클래스를 이용해서 태그를 선택할 때 사용한다.

 

8강 CSS3 선택자 2 (알아두면 편리한 다양한 선택자)

 

1. 속성 선택자

- HTML 태그의 속성을 이용하는 선택자

- 태그속성을 이용하는 방법

태그선택자[속성]

Ex) a[href] { color : #000000 }

- 태그 속성값을 이용하는 방법

태그선택자[속성=속성값]

Ex) a[href='http://www.google.com'] { color: #000000 }

- 속성 선택자의 사용방법

<style>

input {

color : green;

font-size : 30px;

font-weight : bold;

}

input[type=text] {

color : orange;

font-size : 50px;

width : 200px;

}

input [type=tel] {

color : red;

}

img[src] {

border : 5px solid green;

}

</style>

 

2. 링크 선택자

- <a> 태그에 CSS3 속성을 적용할 때 사용

- link 선택자

<a>태그를 선택할 때 사용

 Ex) a:link::after { content: '-' attr(href); }

content는 <a href="#">요기가 content다</a>

attr은 속성의 약자

링크선택자를 이용해서 CSS3 적용

#content a:link::after{

content: ' - ' attr(href);

}

<li><a href="#" target=_blank">T아카데미</a></li>

적용결과 : T아카데미 - #

 

3. 부정 선택자

- 명시한 선택자들 외의 요소를 선택할 때 사용

- 부정(:not) 선택자

:not 선택자를 이용해서 명시한 선택자들 외의 HTML 요소를 선택

Ex) li:not(.fa) { background-color:#000000 }

 

4. 문자 선택자

- 문자의 특정속성을 이용해서 CSS3를 적용할 때 사용

- :first-letter 선택자

첫 번째 문자를 선택할 때 사용

Ex) #history1 : first-letter { font-size:2em }

- :first-line 선택자

첫 번째 행을 선택할 때 사용

Ex) #history1 : first-line { font-weight:bold }

 

5. 후손 및 자손 선택자

- HTML 태그의 계층구조를 이용해서 CSS3를 적용할 때 사용

- 후손 선택자

특정 HTML 태그의 아래에 있는 모든 태그요소를 선택할 수 있다.

Ex) div li { background-color : red }

문서내에 div 하고 한칸 띄운후 li라고 하면 div안에 있는 후손인 li를 선택할 수가 있다.

후손은 자식, 손자까지 div안에 있으면 전체다 선택이 된다.

- 자손 선택자

특정 HTML 태그의 바로 아래에 있는 태그요소를 선택할 수 있다.

Ex) div > h1 { font-weight:bold }

문서네에 div한후 > 를 이용하면 >뒤에 나오는 h1만 선택하는 것이다.

- div:nth-child(숫자) 이 숫자는 몇번째child를 뜻하는 숫자이다.

 

6. 동위, 반응, 산태 선택자

- 동위 선택자

HTML 태그 계층구조를 고려하여 동등한 위치에 있는 태그요소를 선택한다.

Ex) h3~div { font-size : 10px }

~를 사용하면 h3와 동급인 태그 모두를 선택하여 CSS를 적용한다.

     h3+div {font-size : 20px}

+를 사용하면 h3를 기준으로 했을 때 첫번 째로 나오는 태그만 선택하여 CSS를 적용한다.

- 반응 선택자

웹 사이트를 이용하는 사용자의 반응에 따라 HTML 태그 요소를 선택한다.

Ex) :hover ◇마우스가 태그 위에 올라왔을 때 선택된다.

     .class명 : hover{ 속성값 } 이와같이 사용된다.

- 상태 선택자

HTML 태그 요소의 상태에 따라서 선택한다.

Ex) :focus ◇초점이 맞추어진 상태

     :checked ◇input 태그중 checked 상태

마우스의 focus가 맞추어 졌을 때 상태 선택자가 실행이 된다.

checked의 경우 체크가 됐을 때 상태 선택자가 실행이 된다.

 

학습정리

속성 선택자 : HTML태그의 속성을 이용해서 요소를 선택한다.

부정 선택자 : 선택한 태그요소 외에 나머지 태그요소를 선택할 수 있다.

후손 및 자손 선택자 : HTML 태그의 계층구조를 이용해서 태그요소를 선택한다.

                    후손 : 하위 모든 태그 선택

                    자손 : 바로 아래 태그만 선택

 

9강 CSS3 속성 1 (가시상태 속성)

 

1. 단위

- CSS3에서 주로 사용되는 단위로 px, em, pt가 있다.

- px단위 이용방법

절대적으로 속성의 크기를 설정한다.

Ex) font-size : 12px;

%를 사용하면 절대적에서 상대적으로 변경된다.

- em단위 이용방법

상대적으로 속성의 크기를 설정한다.

default 값이 1.0 그러므로 1.0보다 작게하면 축소, 1.0보다 크게하면 확대이다.

Ex) font-size : 1.5em

모든 디바이스 환경을 고려했을 때 em이 상대적이기때문에 px보다 응용범위가 넓다. 

- pt단위 이용방법

절대적으로 속성의 크기를 설정한다.

Ex) font-size : 16pt

 

2. display 속성

- HTML 요소를 화면에 출력하고, 제거하는 스타일 속성

- display 속성 이용방법

- display 속성값으로 none, block, inline, inline-block이 있다.

none : 브라우저 화면에 HTML요소를 제거

display : none;

화면에 출력을 하지 않는다

block : HTML요소를 block 타입으로 출력

display : block;

weight, height 값을 가진다.

inline : HTML요소를 inline타입으로 출력

display : inline;

inline 속성값을 사용하면 weight, height가 무시된다.

inline-block : 기본적으로 inline속성과 동일하고, 넓이(weight)와 높이(height)을 가질 수 있다.

display : inline-block;

 

3. visibility 속성

- display 속성과 비슷한 기능을 하며, 차이점을 확실하게 학습한다.

- visibility속성 이용방법

visibility 속성값으로 visible, hidder이 있다.

visible : HTML 요소를 출력한다. (default)

hidden : HTML요소를 출력하지 않는다.

Ex) visibility : hidden;

- display : none 과 visibility : hidden 비교

display : none → HTML 요소를 화면에 출력하지 않는다.

visibility : hidden → HTML 요소를 화면에 출력하지 않지만, 공간은 유지한다.

 

4. opacity 속성 (투명도)

- HTML 요소의 투명도를 조절할 수 있다.

- opacity 이용방법

0.0부터 1.0까지 투명도를 조절할 수 있따.

0.0 → 투명

1.0 → 불투명

Ex) opacity : 0.7;

 

학습정리

display 속성 : HTML 요소를 화면에 출력 또는 출력하지 안는다.

visibility 속성 : HTML요소를 화면에 출력 또는 출력하지 않는다. 출력하지 않더라도, HTML요소의 공간은 유지된다.

opacity 속성 : HTML 요소의 투명도를 설정할 수 있다. (0.0~1.0)  [0.0 = 투명] [1.0 = 불투명]

 

10강 CSS3 속성2 (레이아웃 관련 속성)

 

1. width & height 속성

- 태그 요소의 가로와 세로 크기를 설정할 수 있다.

- width & height 이요방법

가로와 세로의 크기를 설정한다.

단위는 주로 px, %를 사용한다.

Ex) width : 200px; height : 100px;

 

2. margin & padding 속성

- 태그 요소의 여백과 관련한 속성

- margin 이용방법

margin 속성값으로 태그요소의 외곽 여백을 설정할 수 있다.

Ex) margin-top : 10px;

     margin-right : 15px;

     margin-bottom : 20px;

     margin-left : 25px;

한번에 입력할 경우 margin : 10px, 15px, 20px, 25px; 로 적용된다.

상하와 좌우가 같을 경우 margin : 10px, 15px; 로 작성하면 상하는 10px, 좌우는 15px가 적용된다.

- padding 이용방법

padding 속성값으로 태그요소의 내부 여백을 설정할 수 있다.

Ex) padding-top : 10px;

     padding-right : 15px;

     padding - bottom : 20px;

     padding - left : 25px;

한번에 입력하는 방법과 상하,좌우 방법은 padding도 똑같다.

 

3. 테두리 관련 속성

- 테두리 관련 속성을 이용하면 전체 사이즈의 크기를 변경할 수 있다.

- box-sizing 속성 이용방법

border-box와 content-box 속성값을 이용해서 테두리의 위치를 태그요소의 내부 또는 외부로 위치할 수 있다.

Ex) box-sizing : border-box, box-sizing : content-box

border-box의 경우 영역 내부, content-box의 경우 영역 외부에 해당된다.

- border속성 이용방법

border속성을 이용해서 태그요소의 테두리를 설정할 수 있다.

Ex) border-width : 5px;, border-style : solid;, border-color : #ff6a00;

     border : 5px solid #ff6a00; (단축해서 사용하는 방법)

     solid : 실선, dashed : 점선, dotted : 점 

border-radius는 모서리를 둥굴게 하는 정도를 나타내는 속성값이다.

Ex) border-radius : 10px, 10px, 0px, 0px; (Top Right Bottom Left)

 

4. 배경 관련 속성

- HTML 요소의 배경을 지정할 수 있다.

- background-image 이용방법

태그요소에 배경 이미지를 지정할 수 있다.

Ex) background-image; 배경에 이미지를 넣는 방법

     url('#');

     background-size : 100%; (default값)

     background-repeat : no-repeat; (repeat는 이미지가 반복되서 나타나게하는 것이다.

  default로 repeat 값을 가진다.)

     background-repeat : x-repeat (x축으로반복한다.)

     background-repeat : y-repeat (y축으로 반복한다.)

     background-attachment : fixed; (이미지를 한 자리에 고정하는 것, 즉 스크롤을 내려도 이미지는 고정된다.)

 

학습정리

width & height 속성 : HTML요소의 가로 및 세로의 크기를 설정한다.

margin&padding 속성 : HTML요소를 외부(margin) 및 내부(padding) 여백을 설정한다.

테두리 관련 속성 : HTML요소를 테두리의 두께와 모양을 설정한다.

배경 관련 속성 : HTML요소를 배경에 이미지를 설정한다.

 

11강 CSS3 속성 3 (위치 관련 및 알아두면 편리한 속성)

 

1. 폰트 관련 속성

- 폰트와 관련된 선택자

- 아무리 좋은 폰트라도 사용자 컴퓨터에서 해당 폰트가 없으면 안보인다.

- font-size, font-family 속성 이용방법

font-size : 폰트의 크기를 설정할 수 있다.

Ex) font-size : 2.0em

font-family : 폰트를 설정할 수 있다.

폰트가 없으면 브라우저 기본폰트가 사용된다.

Ex) font-family : MingLiU_HKSCS-ExtB

- font-style, font-weight, line-height 속성 이용방법

font-style : 폰트의 이택릭체를 설정할 수 있다.

Ex) font-style : italic;

font-weight : 폰트의 볼드체를 설정할 수 있다.

Ex) font-weight : bolder;

line-height : 행간 설정을 할 수 있다.

Ex) line-height : 20px;

- text-align, text-decoration 속성 이용방법

text-align : 폰트의 정렬을 설정할 수 있다.

Ex) text-align : right; (속성값으로 right, left, center가 있다.)

text-decoration : 폰트의 표시를 설정할 수 있다.

Ex) text-decoration : none; (none을 사용하면 하이퍼링크를 지울 수 있고, underline은 줄을 추가한다.)

 

2. position 속성

- 태그 요소의 위치를 설정하는 속성

- position 속성에는 4가지의 속성값이 있다.

static : default 속성값으로 특별히 설정하지 않으면 static이다.

Ex) position : static;

absolute : 절대좌표를 이용해서 위치를 설정한다.

Ex) position : absolute; top : 100px; left : 100px;

relative : 기본 위치를 기준으로 설정만큼 이동된다.

Ex) position : relative; top : 0; left : 100px;

fixed : 브라우저의 절대좌표를 기준으로 설정된다.

fixed를 사용하면 해당 요소를 스크롤을 내려도 고정되게 할 수 있다.

Ex) position : fixed; top : 100px; left : 100px;

z-index : z축 좌표로 겹치는 부분에서 숫자가 높으면 위로, 숫자가 작으면 아래로 표시된다. 

 

3. overflow 속성

- overflow 속성은 내용이 태그 요소의 크기보다 클 때 설정할 수 있다.

- overflow 속성 이용방법

hidden과 scroll 속성값을 이용해서 넘치는 내용을 가리거나, 스크롤을 이용할 수 있다.

Ex) overflow : hidden, overflow : scroll

여기서 hidden을 사용하면 내용이 넘처도 scroll이 안 생긴다.

여기서 scroll을 사용하면 해당 요소에 scroll이 생긴다.

 

 

4. float 속성

- HTML 요소의 위치를 설정하는 속성, 주로 레이아수을 설정할 때 사용

- float 이용방법

left, right 속성값을 이용해서 HTML 요소를 정렬시킬 수 있다.

Ex) float : left(left값은 default로 가진다.), float : right; 

하나의 요소에 float : left를 설정하면 이어져 오는 요소도 float : left 속성을 가지게 된다.

 

5. 그림자 속성

- HTML요소에 그림자를 설정할 수 있다.

- text-shadow 이용방법

태그요소에 그림자를 만들어준다.

Ex) text-shadow : 5px, 10px, 15px, black; (오른쪽거리, 아래쪽거리, 투명도, 색상)

 

6. 그라디언트

- 2가지 이상의 색을 표현 할 때 사용되는 속성

- 그라디언트 이용방법

http://colorzilla.com/gradient-editor/에 접속해서 쉽게 이용할 수 있다.

- vender prefix (벤더프리픽스)는 각 제조사마다 벤더프리픽스를 만들어 내가 쓰는 코드는 이렇게 써야 한다는 것을 명시하는 것이다.

-webkit 사파리, 크롬

-moz 파이어폭스

-o 오페라

-ms 인터넷 익스프롤러

없으면 표준 속성이다.

<script src="prefixfree.min.js"></script>는 prefixfree.min.js파일을 적용한 것으로 vender prefix를 명시하지 않아도 prefixfree 파일이 알아서 자동적으로 설정해준다. 파일을 다운받아야 한다.

 

학습정리

폰트 관련 속성 : font-size, font-style, font-weight, line-height 등을 이용해서 폰트에 스타일 속성을 적용할 수 있다.

position 속성 : position 속성의 static, absolute, relative, fixed 속성값을 이용해서 html 요소의 위치를 설정할 수 있다.

float 속성 : float 속성의 left, right 속성값을 이용하면, html 요소의 정렬을 설정할 수 있다.

gradient 속성

CSS에서 gradient 속성은 설정하기 까다롭다. 따라서 http://colorzilla.com/gradient-deditor/에 접속하여 쉽게 gradient를 설정한다.

 

12강 CSS3 속성 4 (변형 속성 및 PC용 웹사이트 제작①)

 

1. Transition 관련 속성

- CSS를 이용한 HTML요소의 변형 기능

- transition-xx 속성 이용방법

transition-duration : 몇 초 동안 변형될지를 설정한다.

Ex) transition-duration : 3s → 변형이 3초 동안 이루어진다.

transition-delay : 몇 초 후에 재생될지를 설정한다.

Ex) transition-delay : 2s → 2초 후에 변형이 시작된다.

transition-property : 변형이 적용되는 속성을 설정한다.

transition-timing-function : 변형과 관련된 함수를 설정한다. :ease-in과 :ease-out라는 속성값이 있다.

:ease-in의 경우 변형되는 속도가 점점 빨라지는 것이며

:ease-out의 경우 변형되는 속도가 점점 느려지는 것이다.

- animation-xx 속성 이용방법

animation-duration : 몇 초 동안 애니메이션 될지를 설정한다.

Ex) animation-duration : 3s → 애니메이션이 3초 동안 이루어진다.

animation-delay : 몇 초 후에 애니메이션 될지를 설정한다.

Ex) animation-delay : 2s → 2초 후에 애니메이션이 시작된다.

animation-name : 애니메이션의 이름을 설정한다.

animation-timing-function : 애니메이션과 관련된 함수를 설정한다.

- 애니메이션을 설정할 때는

@keyframes (animation-name에서 설정한 이름값){

from { 속성값 }

to { 속성값 }

}

이와같이 설정한다.

- 애니메이션을 설정하는 속성 값중 transform : rotate(0deg~360deg); 를 사용하면 회전이 적용된다.

 

2. 웹 페이지 개요 및 레이아웃 구분

- 웹사이트의 레이아웃

우리는 다양한 웹사이트를 경험하고 있다.

하지만, 수많은 웹사이트의 레이아웃도 전체적으로 거의 비슷한 레이아웃을 가지고 있다.

 

3. 초기화

- 초기화란?

CSS를 작성하면서 가장 먼저 하는 작업은 초기화

초기화란 기본적인 설정(margin, padding, font-xx..) 등을 미리 설정해 두고 사용하는 것

*{ 기본적인 설정을 작성 } 이렇게 작성하는 것이 초기화이다.

Ex) a { text-decoration : none }

- Normalize.css란?

많이 사용하는 초기화 관련 스타일중 normalize.css는 브라우저간의 스타일을 동일하게 유지해주고 있다.

Download URL : http://neclolas.gethub.io/normalize.css/

 

4. 헤더 및 수평 메뉴 작성

www.yahoo.com를 통해서 전체적인 레이아웃을 만들어 본다.

width의 경우 100%로 잡았을 때 깨지는 경향이 있으니 99%를 잡는 것이 좋다.

 

학습정리

변형 및 애니메이션 : transition-xx, animation-xx 속성을 이용해서 HTML요소에 변형 및 애니메이션을 설정할 수 있다.

웹 페이지 레이아웃 : 지금까지 학습한 CSS속성들을 이용해서 헤더 및 수평메뉴를 만들 수 있다. 

 

13강 CSS3 속성4 (PC용 웹사이트 제작②)

 

1. 본문 구성

 

2. 목록 구성

 

3. 푸터 구성

 

학습정리

웹 페이지 구조 파악 : 제작하려는 웹 페이지를 가로로 면을 분할하면 쉽게 제작할 수 있다.

 

14강 CSS3 규칙

 

1. @import 규칙

- CSS 파일에 또 다른 CSS파일의 설정을 사용하기 위한 규칙

- @import 규칙 사용방법

@import url( '또 다른 CSS 파일명' );

Ex) @import url('title.css');

- @import 규칙을 사용해서 다른 CSS파일의 설정을 사용

1. link를 대신할 수 있습니다.

2. <style> 태그 내부에 위치해야 합니다.

3. <style> 태그 상단에 위치해야 합니다.

 

2. @media 규칙

- 하나의 HTML 문서를 다양한 장치에서 서로 다르게 CSS를 설정할 수 있는 기능을 제공

- link 태그에 media 속성을 이용하여 상황에 따른 CSS를 적용하는 방법

link 태그에 media속성과 속성값을 이용해서 CSS를 구분한다.

Ex) <link rel="stylesheet" href="content_pc.css" media="screen" />(PC환경 화면)

     <link rel="stylesheet" href="content_print.css" media=print" />(프린트환경 화면)

- link태그 대신 @media 규칙을 이용하여 상황에 따른 CSS를 적용하는 방법

@media규칙을 이용해서 CSS를 구분한다.\

Ex) @media screen {...}

- @media속성을 이용해서 다양한 장치에 맞게 CSS를 설정

- 미디어 종류

all : 모든 미디어 타입

aural : 음성 합성 장치

braille : 정자 표시 장치

handheld : 손으로 들고 다니면서 볼 수 있는 작은 스크린에 대응하는 용도

print : 인쇄 용도

projection : 프로젝터 표현 용도

screen : 컴퓨터 스크린을 위한 용도

tv : 음성과 영상이 동시 출력되는 TV와 같은 장치

embossed : 페이지에 인쇄된 점자 표시 장치

 

3. 웹 폰트

- 웹 폰트란?

인터넷만 열결되어 있다면, 다양한 폰트를 웹사이트 방문자에게 제공할 수 있도록 고안된 폰트

- 웹사이트를 방문하는 순간, 웹 폰트를 다운받아 웹사이트를 구성

link태그를 이용해서 사용하고, 웹 폰트의 URL을 속성값으로 사용한다.

Ex) <link href='http://fonts.googleapis.com/css?family=Poiret+One' rel='stylesheet' type='text/css'>

- 구글폰트에서 원하는 폰트를 검색을 한 후 원하는 소스코드만 복사 붙여넣기를 하면된다. 이는 CSS, JavaScript다 된다.

 

학습정리

@import 규칙 : 다른 CSS파일의 설정을 사용할 수 있다.

@media 규칙 : 다양한 장치에 따라 CSS설정을 다르게 할 수 있다.

웹 폰트 : link 태그와 href 속성을 이용해서 웹에 있는 폰트를 사용할 수 있다.

 

15강 모바일 웹페이지 개발 환경 및 뷰포트

 

1. 모바일 개발 환경

- IDE(Integrated Development Environment) 툴 설치

- Aptana Studio 설치 (Eclips가 더 좋음)

Nodejs_windows 설치 : http://go.aptana.com/installer_nodejs_windows

Aptana Studio 설치 : http://www.aptana.com

- Aptana 사용

프로젝트 및 웹 문서 만들고, 서버에서 확인

aptana 실행 및 workspace 변경

웹 프로젝트 생성

서버에 업로드 및 브라우저를 통한 확인

- 네이버에서 제공하는 코딩 전용서체를 사용하면 가독성이 뛰어나다

 

2. 뷰포트 개요 및 설정

- 모바일 환경에서 뷰포트의 개요와 설정에 대해서 학습한다.

- 뷰포트 개요

PC환경과 달리 모바일(스마트폰)환경에서는 디바이스마다의 해상도가 상이해서 PC환경의 웹 페이지가 모바일 환경에서는 매우 작게 보일 수 있음.

이를 해결하고자 뷰포트 기능을 사용함.

- 뷰포트 설정

width : 가로 넓이

Ex) width=device-width

initial-scale : 초기 확대 비율

Ex) initial-scale=1.0

user-scalable : 확대 및 축소 가능 여부

Ex) user-scalable=no

minimum-scale, maximum-scale : 최소, 최대 비율

Ex) minimum-scale=1.0, maximum-scale=2.0

뷰포트를 종합한 예

<meta charset="utf-8"

  name="viewport"

  content="width=device-width, initial-scale=1.0, minimum-scale=1.0, user-scalable=no" />

 

3. 반응형과 뷰포트

- 뷰포트와 같이 모바일 환경에서 웹페이지를 효율적으로 출력하기 위해서 CSS를 사용하는 방벙이 있다. 긜고 이러한 방법을 흔히 반응형 웹이라고 한다.

- 반응형 웹

사용자의 디바이스 환경에 따라 CSS를 적용 (@media)

Web 문서 → pc.css

  → mobile.css

  → tablet.css

 

학습정리

개발 환경 : 본인에 맞는 IDE툴을 선택하여 사용하고, FTP를 이용해서 서버에 업로드함.

뷰포트란? : PC환경과 달리 모바일(스마트폰) 환경에서는 디바이스마다의 해상도가 상이해서 PC환경의 웹 페이지가 모바일 환경에서는 매우 작게 보일 수 있음. 이를 해결하기 위해 뷰포트를 사용함.

반응형 웹 : 뷰포트와 달리 CSS속성을 이용해서 디바이스의 종류에 따라서 적합한 CSS를 적용함. 

 

16강 반응형 웹사이트 제작

 

1. 반응형 웹사이트 개요

- 반응형 웹이란?

최근 들어 다양한 디바이스가 등장

동일한 HTML문서가 해당 디바이스에서 최적화되어 보여야 할 필요성이 생김

하나의 HTML문서로 다양한 디바이스에 대응하기 위한 방법으로 미디어 쿼리를 이용한 방법이 반응형 웹이다.

 

<!DOCTYPE html>

<html>

<head>

<style>

/* 모바일 */

@media screen and (max-width : 767px) {

#wrap {

background-color : #ff0000;

color : #ffffff;

}

}

 

/* 태블렛 */

@media screen and (min-width : 768px) and (max-width : 959px) {

#wrap {

background-color : #00ff00;

color : #ffffff;

}

}

 

/* PC */

@media screen and (min-width : 960px) {

#wrap {

background-color : #0000ff;

color : #ffffff;

}

}

 

#wrap {

width : 80%;

border : 1px solid #cccccc;

margin : 0 auto;

}

 

#header {

width : 100%

border : 1px solid #cccccc;

}

 

#section { 

width : 100%

border : 1px solid #cccccc;

}

 

#footer { 

width : 100%

border : 1px solid #cccccc;

}

 

</style>

</head>

<body>

<div id="wrap">

<div id="header">

header

</div>

<div id="section">

section

</div>

<div id="footer">

footer

</div>

</div>

</body>

</html>

 

2. 미디어 쿼리

- 다양한 디바이스의 특징을 이용해서 CSS를 분기할 수 있다. 즉, 하나의 HTML 문서를 가지고 다양한 출력 장치에 맞게 CSS를 적용할 수 있다.

PC : @media screen and (min-width : 960px)

모바일 : @media screen and (max-width : 767px)

태블릿 : @media screen and (min-width : 768px) and (max-width : 959px)

 

3. PC용 및 스마트용 웹사이트 제작

- 미디어 쿼리를 이용해서 간단하게 pc, 태블릿, 모바일용 웹사이트를 제작한다.

 

학습정리

반응형 웹 : 다양한 디바이스에 최적화된 CSS을 적용한 웹

미디어 쿼리 : CSS를 분기하여 하나의 HTML문서에 여러 개의 CSS를 적용할 수 있다. 

 

17강 태블릿 레이아웃 제작

 

1. 태블릿 웹사이트 제작

- 태블릿 환경을 이해하고 그에 맞게 레이아웃을 설정합니다.

- 태블릿 환경에서 리스트의 경우 왼쪽에 두는 경우가 많거나 메뉴를 숨기는 기능을 사용한다.

- clear : both 속성을 사용하면 float로 영향을 받은 요소가 더이상 영향을 받지 않는다.

 

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<style>

* { 

margin : 0; padding : 0; }

body { font-family : 'Segoe UI' }

li { list-style : none; }

 

# {

height : 100px; line-height : 100px; background-color : #75356c; color : #ffffff;

}

 

#header p{

text-align : center; font-size : 2em; font-weight : bold;

}

 

#wrap { 

background-color:#e1e262;

overflow : hidden;

}

 

#wrap #nav_lnb {

width : 250px;

float : left;

}

 

#wrap #nav_lnb ul {

overflow : hidden;

}

 

#wrap #nav_lnb ul li a {

text-decoration : none; color : #ffffff;

padding : 20px;

display : block;

border-bottom : 1px dashed #dddddd; 

}

 

#wrap #content_wrap {

background-color : #75356c;

width : 100%;

float : left;

margin-left : -250px;

}

 

#wrap #content_wrap #content {

padding : 20px;

padding-right : 270px;

}

 

#wrap #content_wrap #content div:nth-child(1)  img {

float : left;

padding : 20px;

}

 

#wrap #content_wrap #content div:nth-child(2)  img {

clear : both;

float : right;

padding : 20px;

}

 

</style>

</head>

<body>

<div id="header">

<p>

Tablet PC Layout

</p>

</div>

<div id="wrap">

<div id="nav_lnb">

<ul>

<li><a href="#" alt="?">btn01</a></li>

<li><a href="#" alt="?">btn02</a></li>

<li><a href="#" alt="?">btn03</a></li>

<li><a href="#" alt="?">btn04</a></li>

<li><a href="#" alt="?">btn05</a></li>

</ul>

</div> 

<div id="content_wrap">

<div id="content">

<div>

<h2>SEOUL ANIMATION CENTER</h2>

<img src="#" alt="">

<p>

Operation of a comprehensive support ...

</p>

</div>

</div>

</div>

</div>

</body>

</html>

 

학습정리

브라우저의 크기를 고려한 레이아웃 : 다양한 디바이스의 화면 크기를 고려해서 margin 속성을 응용하여 레이아웃을 설정합니다.

 

18강 유동형 웹사이트 제작

 

1. 유동형 레이아웃 개요

- 유동형웹은 레이아웃을 비롯한 모든 요소를 상대적인 크기로 지정함

- 유동형웹이란?

웹문서의 모든 요소를 %로 설정하여, 브라우저의 크기에 대응함.

반응형웹과 달리 css문서를 하나만 작성하면 됨.

실제적으로 세부적인 요소까지 상대적인 크기로 설정하기 어려운 점이 있음.

 

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title></title>

<style>

*{

margin : 0;

padding : 0;

list-style : none;

color : #343434;

}

#wrap {

width : 80%;

margin : 0 auto;

border : 1px solid #cccccc;

box-sizing : border-box;

}

 

#wrap nav {

width : 100%;

}

 

#wrap nav ul {

overflow : hidden;

}

 

#wrap nav ul li {

float : left;

width : 20%;

border : 1px solid #ff0000;

box-sizing : border-box;

text-align : center;

}

#wrap section {

width : 100%;

background-color : #00ff00;

overflow : hidden;

}

 

#wrap section article {

float : left;

width : 70%;

}

 

#wrap section aside {

float : left;

width : 30%;

}

 

#wrap section aside div:nth-child(1) {

border : 1px solid #dddddd;

box-sizing : border-box;

text-align : center;

}

 

#wrap section aside div:nth-child(1) img {

max-width : 100%;

 

#wrap section aside div:nth-child(2) {

border : 1px solid #dddddd;

box-sizing : border-box;

text-align : center;

}

 

#wrap section aside div:nth-child(2) img {

min-width : 100%;

max-width : 100%;

}

 

#wrap section aside div:nth-child(3) {

border : 1px solid #dddddd;

box-sizing : border-box;

text-align : center;

}

 

#wrap section aside div:nth-child(3) img {

min-width : 100%;

}

 

</style>

</head>

<body>

<header>

<div id="wrap">

logo img

</div>

</header>

<nav>

<ul>

<li><a href="#none">nav1</a></li>

<li><a href="#none">nav2</a></li>

<li><a href="#none">nav3</a></li>

<li><a href="#none">nav4</a></li>

<li><a href="#none">nav5</a></li>

</ul>

</nav>

<section>

<article>

<div>

article1

</div>

<div>

article2

</div>

</article>.

<aside>

<img src="#">

</aside>

<aside>

<img src="#">

</aside>

<aside>

<img src="#">

</aside>

</section>

</body>

</html>

 

학습정리

유동형 웹 : 반응형 웹과 달리 html 요소의 상대적 크기를 이용해서 웹문서를 제작합니다. CSS문서를 하나만 만들어 사용하며, 세부적인 설정에 어려움이 있어 주로 심플한 레이아웃에 이용됩니다.

 

19강 그리드 시스템

 

1. 플러그인 설치

- 그리드 시스템 플러그인을 설치함.

- 플러그인 다운로드 및 설치

다운로드 : http://960.gs/

설치 : grid.css파일을 프로젝트 폴더로 이동함.

Column width 컬럼 두께

Number of columns 컬럼수

Gutter width 여백

 

2. 그리드 시스템을 이용한 레이아웃

- 그리드 시스템 플러그인을 이용해서 고정 & 가변 레이아웃을 제작함.

- <div class="clear"></div>를 사용하여 float 등 기존에 설정된 값을 clear 할 수 있다. 개행 효과도 있다.


<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

<title></title>

<link href="#" rel="stylesheet">

<style>

li {

ist-style : none;

}

.wrap {

text-align : center;

}


.header .gnb {

text-align : center;

}


.header .gnb ul {

overflow : hidden;

}


.header .gnb ul li {

width : 15%

float : left; padding-left : 20px; padding-right : 20px;

}


.wrap .logo {

margin : 0 auto;

border : 1px solid #cccccc;

}

</style>

</head>

<body>

<div class=container_12" wrap>

<div class="grid_12 header">

<div class="gnb">

<ul>

<li><a href="#" alt="">gnb1</a></li>

<li><a href="#" alt="">gnb2</a></li>

<li><a href="#" alt="">gnb3</a></li>

<li><a href="#" alt="">gnb4</a></li>

<li><a href="#" alt="">gnb5</a></li>

</ul>

</div>

</div>

<div class="logo">

<div>LOGO</div>

</div>

<div class="clear"></div>

<div class="section1">

<div class="grid_6">grid_6</div>

<div class="grid_6">grid_6</div>

<div class="clear"></div>

</div>
<div class="section2">
<div class="grid_4">grid_4</div>

<div class="grid_4">grid_4</div>

<div class="grid_4">grid_4</div>

<div class="clear"></div>

<div>

</div>

</body>

</html>


<!DOCTYPE html>

<html>

<head>

<title></title>

<meta charset="utf-8">

<link href="#" rel="stylesheet">

<style>

li {

list-style : none;

}


.header {


}


.header .gnb ul {

overflow : hidden;

}


.header .gnb ul li {

float : left

width : 20%;

}


.logo {

margin : 0 auto;

border : 1px solid #cccccc;

width : 200px;

}

</style>

</head>

<body>

<div class="container_12">

<div class="grid_12 header">grid_12</div>

<div class="gnb">

<ul>

<li><a href="#" alt="">gnb1</a></li>

<li><a href="#" alt="">gnb2</a></li>

<li><a href="#" alt="">gnb3</a></li>

<li><a href="#" alt="">gnb4</a></li>

<li><a href="#" alt="">gnb5</a></li>

</ul>

</div>

<div class="logo">

LOGO

</div>

<div class="clear"></div>


<div class="grid_6 section1">grid_6</div>

<div class="grid_6 section1">grid_6</div>

<div class="clear"></div>


<div class="grid_4 section2">grid_4</div>

<div class="grid_4 section2">grid_4</div>

<div class="grid_4 section2">grid_4</div>

<div class="clear"></div>

</div>

</body>

</html>


학습정리

그리드 시스템 : 지금까지 살펴본 예제들을 보면 전체적인 레이아웃을 개발자가 처음부터 만들어야 했습니다. 이러한 수고를 조금 줄여주고자 개발된 플러그인이 있습니다. 몇 가지 계산과 규칙만 알고 있다면 개발자는 쉽게 전체적인 레이아웃을 만들 수 있습니다. 


20강 SPA(Single Page Application)


1.SPA란?

- Single Page Application이란 단일 페이지를 이용한 웹서비스를 구성함

- template를 사용하여 SPA를 만들 수가 있다.

- 명령을 하면 template가 변환하면서 페이지가 변경된다.


2. SPA 프레임웍

- 프레임웍이란? 

- 다양한 SPA 프레임웍이 존재한다.

Sammy.js : http://sammyis.org/ 

Backbone.js : http://backboneis.org/

Knockout.js : http://knockoutjs.com/

Angular.js : https://angularjs.org/ (구글에서 만듬, 유명함)

- MVC 란?

Model : 사용자 데이터를 서버로 보내거나 데이터 베이스를 연결시켜주는 역할

View : HTML을 뿌려주는 것

Controller : 사용자로부터 어떤 요청이 들어왔는지 확인하는 것


3. SPA를 활용한 웹페이지 제작

- Sammy.js을 이용해서 SPA웹을 구성합니다.

- SPA 웹서비스 구성

라우트 → Main_template

    → Register_template

    → Login_template

라우트는 template를 고르는 역할을 한다.


학습정리

SPA란? : 기존의 웹서비스 구성은 여러 개의 html이 서버와 통신하는 방식이다. SPA는 하나의 페이지만을 이용해서 변경되는 정보만을 가공하여 미리 만들어 놓은 틀(템플릿)을 이용해서 정보를 출력한다.



'Legend 개발자 > T아카데미' 카테고리의 다른 글

UX/UI 기획  (0) 2017.09.04
jQuery (JavaScript)  (0) 2017.09.02
컴퓨터 알고리즘 중급  (0) 2017.08.31
JavaScript  (0) 2017.08.30
컴퓨터 알고리즘 초급  (0) 2017.08.10
Posted by 전설의아이
|

컴퓨터 알고리즘의 정의

문제, 해결방법, 효율성, 단계적

컴퓨터 알고리즘이란 효율적으로 문제를 해결하는 방법의 단계적 설명이다.

 

컴퓨터 알고리즘의 의미

컴퓨터 언어(Computer Language) 

- 컴퓨터와 대화하기 위해서 사용하는 언어

- C, C++, C#, Java, Python

컴퓨터 알고리즘(Computer Algorithm)

- 컴퓨터를 이용하여 주어진 문제를 풀기 위한 방법이나 절차

- 정렬알고리즘, 해시알고리즘, 최단거리알고리즘 등

컴퓨터 프로그램(Computer Program)

- 컴퓨터가 특정 작업을 수행하기 위해 짜여진 명령의 순서

컴퓨터를 이용해서 어떤 작업을 하려고 한다면 컴퓨터에게 할 일을 하나씩 차례대로 알려줘야 한다.

 

Ex1) T ACADEMY까지 올 때, 다음의 교통 수단을 이용해서 오는 방법을 단계별로 설명해보시오.

- 택시를 타고

1. 차가 다니는 대로변으로 이동을 해라

2. 택시를 잡기위한 의사표시 하기

3. 택시 운전자에게 목적지를 말하기

4. 차비를 지불하고 택시에서 내리기

5. T ACADEMY까지 걸어가기

- 지하철을 타고

- 버스를 타고

- 자전거를 타고

- 걸어서

 

이 중 가장 빠른 방법은 무엇이고, 가장 비용이 많이 드는 방법은 무엇인가?

어느 정도의 비용이 들고, 어느 정도의 시간이 드는지 생각해야 한다.

 

컴퓨터 알고리즘을 설명하기 위한 4단계

1. 문제 정의(Problem definition)

- 해결하고자 하는 문제는 무엇인가?

- 입력과 출력의 형태로 정의될 수 있는가?

- 컴퓨터가 수행할 수 있는 형태로 전환이 가능한가?

 

2. 알고리즘 설명(Algorithm description)

- 컴퓨터가 수행해야 할 내용은 하나씩 차례대로 정의한 과정

- 수치나 양에 대한 정확한 설명이 있어야 한다.

 

3. 정확성 증명(Correctness proof)

- 과정대로 수행하면 출력으로 항상 올바른 답을 내보내는가?

- 잘못된 답을 내보내는 경우는 없는가?

- 올바른 출력을 내보내고 정상적으로 종료되는가?

 

4. 성능 분석(Performance analysis)

- 수행시간(Running time)

- 사용공간(Space consumption)

 

학습정리 1

컴퓨터 알고리즘의 의미

 컴퓨터 알고리즘은 주어진 문제를 효율적으로 풀기 위한 방법을 단계별로 기술해 놓은 것이다. 따라서 기본적인 연산능력만 가지고 있다면 누구나 문제를 해결할 수 있도록 명확하게 기술되어야 한다.

 

컴퓨터 알고리즘의 분석

 컴퓨터 알고리즘은 크게 4단계로 이루어지는 데 각 단계는 문제 정의, 알고리즘 설명, 정확성 증명, 성능분석이다.

 

 

컴퓨터 알고리즘을 설명하기 위한 4단계

1. 문제 정의를 명확하게

2. 알고리즘 설명을 단계적으로 깔끔하게

3. 정확하게 이게 되는지 논리적으로 증명

4. 성능분석을 명확하게

 

컴퓨터 알고리즘에서 성능분석이 중요한 이유는 어떻게 효율적으로 해결할지가 중요하기 때문이다.

어떤 알고리즘이 어떤 문제를 푸는가?

많은 알고리즘 중에 문제를 해결하는데 좋은 알고리즘은 무엇인가?

 

컴퓨터 알고리즘의 분석

 컴퓨터 알고리즘의 수행시간 분석

- 특정 기계에서 수행시간을 측정하는 것은 공정하지 않다.

- 따라서 조건이 동일한 특정 기계에서 모든 알고리즘의 수행시간을 측정해야 하는데 이 방법은 현실적으로 불가능하다.

- 그러므로 수행연산의 횟수를 비교하는 방식으로 성능을 분석한다.

 

컴퓨터 알고리즘의 수행시간 분석

 수행시간은 입력으로 크기가 커지면 커질수록 시간이 많이 걸린다.

- 10개의 키를 정렬하는 시간이 100개의 키를 정렬하는 시간보다 길다.

 따라서 수행시간은 입력 크기 n에 대한 함수로 표현한다.

- 예를 들면 T(n). 또한 n에 대한 다항식에서 최고차 항만을 고려한다.

 

성능 분석의 비교 대상

- 산술연산(Arithmetic Calculation) : Add, Multiply, Exponent, Modular, ...

- 데이터 입출력(Data Movement) : Copy, Mve, Save, Load, ...

- 제어 연산(Access Control) : if, While, Register, ...

 

점근적 표기법(Asymptotic notation)

O-notation(빅오 표기)

- O(g(n))={f(n):n>=n0 인 모든 n에 대해 0<=f(n)<=cg(n)를 만족하는 양수 상수 c와 n0가 존재}.

- n0보다 오른쪽에 있는 모든 n에 대해서 함수 f(n)의 값은 cg(n)과 같거나 아래쪽에 있다.

- g(n)을 함수 f(n)의 점근적 상한(asymptotic upper bound)이라고 한다.

주어진 함수가 기준이되는 함수보다 윗쪽에 있는지 아랫쪽에 있는지 빅오의 경우는 아랫쪽에 위치한다.

 (Ex: 3n + 1 = O(n제곱) )

- n>=n0 에 대해 3n + 1 <= cn제곱 을 만족하는 c 와 n0가 있는지 증명한다.

- 양변을 n2으로 나누면 (3/n) + (1/n제곱) <=c 이 된다.

- n >= 1 과 c >= 4을 만족하면 위의 식은 항상 성립한다.

- 주어진 함수보다 항상 윗쪽에 있는 기준함수가 존재해서 아무리 함수가 느려진다고 하더라도 주어진 기준함수보다 항상 빠르다

 

Ω-notation(오메가 표기)

- Ω(g(n)) = {f(n) : n >= n0 인 모든 n에 대해 0<= cg(n) <= f(n)를 만족하는 양수 상수 c와 n0가 존재}

- n0 보다 오른쪽에 있는 모든 n에 대해서 함수 f(n)의 값은 cg(n)과 같거나 위쪽에 있다.

- g(n)을 함수 f(n)의 점근적 하한(asymptotic lower bound)이라고 한다.

 (Ex : 3n제곱 - 4n + 1 = Ω(n) )

- n >= n0 에 대해 3n제곱 - 4n + 1 >= cn 을 만족하는 c 와 n0가 있는지 증명한다.

- 양변을 n 으로 나누면 (3n) - 4 + (1/n) >= c 이 된다.

- n >= 2 과 c=2을 만족하면 위의 식은 항상 성립된다.

- 아무리 빨라진다고 해도 주어진 하한 보다는 더 이상 빨라질 수가 없다. 

 

Θ-notation(쎄타 표기)

- Θ(g(n))={f(n) : n>= n0인 모든 n에 대해 0<= c1g(n) <= f(n) <= c2g(n) 을 만족하는 양수 상수 c1, c2와 n0가 존재}.

- n0 보다 오른쪽에 있는 모든 n 에 대해서 함수 f(n)의 값은 c1g(n) 과 같거나 위쪽에 있고 c2g(n)과 같거나 아래쪽에 있다.

- g(n)을 함수 f(n)의 점근적 상한 및 하한(asymptotically tight bound)이라고 한다.

 (Ex : 1/2n제곱 -3n = Θ(n제곱) 

- n >= n0인 모든 n에 대해 c1n제곱 <= (1/2n제곱) - 3n <=  c2n을 만족하는 c1, c2 과 n0가 있음을 보이시오.

- 양변을 n제곱으로 나누면 c1 <= (1/2) - (3/n) <= c2이 된다.

- c1 <= (1/2) - (3/n) <= c2

- 오른쪽 부등호는 n >= 1 일 때 c2 >= (1/2)이면 성립한다.

- 왼쪽 부등호는 n > 7일 때 c1 <= (1/14) 이면 성립한다.

- 따라서, c1 = 1/14, c2 =1/2 n0 =7이면 다음이 성립한다.

- 1/2n제곱 -3n = Θ(n제곱)

- 빅오와 오메가가 합쳐져서 주어진 함수가 가장 정확하게 분석이 된다.

 

학습정리 2

컴퓨터 알고리즘의 4단계

 문제해결, 알고리즘 설명, 정확성 증명, 성능분석으로 이루어진다.

 

컴퓨터 알고리즘의 성능분석

 컴퓨터알고리즘의 성능분석은 공정하고 공평한 비교를 위해 점근적 표기법(빅오 표기, 오메가 표기, 쎄타 표기)에 의해 기술한다.

 성능분석은 주어진 함수를 몇번 수행하는가하는 상대적 비교를 통해서 하는 것이 공평한 비교이다.

 

정렬문제(Sorting problem)

입력(Input)

- n 개의 숫자들의 배열 < a1, a2, ... , an >.

출력(Output)

- 입력된 숫자의 배열이 a1 <= a2  <= ... an 조건을 만족하도록 다시 나열한 결과 < a1, a2, ... , an >.

 

 n개의 숫자들을 입력받아서 그것들이 점점 커지는 순서 또는 작아지는 순서로 다시 배열 혹은 나열한 것을 출력으로 내보내게 되면 정렬문제를 해결했다고 말할 수 있다.

 

오름차순 (Increasing Order)

내림차순 (Decreasing Order)

 

Ex: Input : < 5, 2, 4, 6, 1, 3 >

    Output : < 1, 2, 3, 4, 5, 6 >

 

선택정렬(Selection sort)

 선택정렬은 무엇인가?

- 선택하여 정렬하는 알고리즘

 무엇을 선택할 것인가?

- 최소값 선택 정렬 ( Min-Selection Sort) : 가장 작은 값을 선택 (오름차순)

1. 정렬되지 않은 숫자 중에 가장 작은 숫자를 선택한다.

2. 선택한 숫자를 정렬되지 않은 수자들 중 첫 번째 숫자와 자리를 바꾸면 선택된 숫자는 정렬된 것이다.

3. 모든 숫자를 옮길 때까지 1~2번 과정을 반복한다.

- 최대값 선택 정렬 ( Max-Selection sort) : 가장 큰 값을 선택 (내림차순)

 

정확성 증명

- 수학적 귀납법을 이용

- i번째 선택한 숫자가 i번쨰로 작은(혹은 큰) 숫자인지를 증명

 

성능분석

- 최고차 항을 Θ로 표현

최선/최악의 경우 수행시간 : Θ(n제곱)

최선/최악의 경우 공간: Θ(n)

- 입력 받은 숫자들의 배열이 어떤 형태이면,

최악의 경우가 되는가?

최선의 경우가 되는가?

 

학습정리 3

정렬문제의 정의

 n개의 숫자를 입력 받아 입력 받은 숫자들을 점점 커지는 순서나 점점 작아지는 순서로 다시 배열하여 출력하는 문제

 

선택정렬 알고리즘

 정렬문제를 푸는 컴퓨터 알고리즘 중의 하나로 현재 상황에서 가장 작거나 가장 큰 숫자를 선택하여 재배치하는 아이디어로 정렬문제를 해결하며 시간복잡도는 Θ(n제곱)

 

삽입정렬 알고리즘

 삽입정렬은 무엇인가?

 - 삽입을 이용한 정렬 알고리즘

 

무엇을 삽입할 것인가?

 Key 값과 정렬된 리스트가 주어졌을 때, Key 값을 정렬된 리스트의 알맞은 위치에 삽입

 Key가 3이고 정렬된 배열이 < 1, 2, 4, 5, 6 > 일 때 키를 알맞으 위치에 삽입한 배열은 < 1, 2, 3, 4, 5, 6 > 이다.

 그러므로 삽입정렬이란 Key 값과 정렬된 리스트를 입력으로 받아서 그 키 값을 알맞은 위치에 집어넣어 하나의 정렬된 리스트로 출력해서 내보내는 것 

 

삽입정렬 ( Insertion sort )

삽입정렬은 Key값을 하나씩 추가하면서 정렬한다.

 - A[1...n]이 주어진 배열이라고 하면

 - 첫 번째는 A[2]을 정렬된 배열 A[1]에 집어넣는다.

 - 두 번째는 A[3]을 정렬된 배열 A[1...2]에 집어넣는다.

 - N-1번째는 A[n]을 정렬된 배열 A[1...n-1]에 집어넣는다.

 - 위와 같이 배열 A에 원소를 하나씩 추가하면서 정렬하게 된다.

 

삽입정렬 수행시간 분석                             cost                     times

for j = 2 to A.length                                   c1                        n

key - A[j]                                            c2                        n-1
i = j-1                                                c3                        n-1
while i > 0 and A[i] > key                      c4                  n시그마j=2 ti

A[i+1]= A[i]                                   c5                 n시그마j=2 (ti-1)   

i = i -1                                         c6                 n시그마j=2 (ti-1)

A[i+1]=key                                          c7                        n-1

n-1 iterations of insertion.
Insert A[j] into A[1..j-1].
Find a place to put A[i].

ti : j에 대한 while loop의 수행횟수

T(n) : 각 줄의 cost와 times를 곱한 수의 합

 

입력의 크기가 동일하더라도 입력의 수행시간은

최선의 경우

배열 A[1-n]가 이미 정렬된 경우, tj=1

T(n) = c7시그마c1 (cost x times)

N에 대한 선형함수이므로 am+b 로 표현할 수 있다.

 

최악의 경우

배열 A[1...n]가 반대순서로 정렬되어 있는 경우

ti = {n(n-1)}/2 가 될 수가 있다.

T(n) = cc7시그마c1 (cost x times)

N에 대한 2차 함수이므로 an제곱 + bn + c로 표현할 수 있다.

 

평균의 경우

 

삽입정렬의 공간복잡도

 Θ(n) space : 제자리 정렬(Sorted in place)로 추가 공간을 사용하지 않는다.

 

학습정리 4

삽입정렬 알고리즘

 Key 값을 정렬된 배열에 알맞은 위치에 삽입하여 정렬문제를 푸는 알고리즘으로 시간복잡도는 Θ(n제곱)

 

합병정렬 알고리즘

 합병을 이용한 정렬알고리즘

 

무엇을 합병할 것인가?

 두 개의 정렬된 배열이 주어졌을 때, 정렬된 하나의 배열로 합병

 Ex: <1, 5, 6, 8><2, 4, 7, 9> -> <1, 2, 4, 5, 6, 7, 8, 9>

 

합병정렬의 수행시간

 두 개의 정렬된 배열의 길이를 각각 n1 이라고 n2 하면 수행시간은 Θ(n1 + n2)

 

주요 함수 : compare 와 move

- comparison 획수 <= movement 횟수

- Movement 횟수는 n1 + n2

- 따라서 comparison의 횟수는 n1 + n2 보다 작거나 같다.

- 결국, comparison 횟수 + movement 횟수 <= 2(n1 + n2)

- 최종적으로  Θ(n1 + n2)

 

A divide-and-conquer approach

 크기가 커서 풀기 어려운 하나의 문제를 크기가 작아서 풀기 쉬운 여러 개의 문제로 바꾸어서 푸는 방법

 

Divide - n kwys를 두개의 n/2 keys로 나눈다

Conquer - 합병정렬을 사용하여 두 개의 배열을 정렬한다.

Combine - 두 개의 정렬된 배열을 하나로 합치는 과정

 

합병정렬의 Pseudo Code

MERGE-SORT(A,p,r)           

if p < r

 q = [(p+r)/2]

 MERGE-SORT(A,p,q)

 MERGE-SORT(A,p+l,r)

 MERGE(A,p,q,r)

 

합병정렬의 (Merge SOrt)의 수행시간

Divide : Θ(1) - 배열을 나누는 과정으로 상수시간에 수행된다.

Conquer : 2T(n/2) - 두 개의 하위 배열의 문제를 푸는 과정

Combine : Θ(n) - Θ(n) 시간에 두 개의 정렬된 배열을 하나로 합치는 과정

 

따라서 T(n) 은 다음과 같은 재귀식으로 표현된다.

 T(n) = Θ(1)                  if n = 1

    2T(n/2) + Θ(1)     if n>1

이 때 c는 크기가 1인 문제를 푸는 시간

 T(n) = c                      if n = 1

    2T(n/2) + cn        if n>1

재귀트리를 이용한 풀이

n = c 가 될 때까지 배열은 쪼개진다.

결국 각 레벨의 합을 구하면 cn이고 층의 갯수를 곱하면 걸리는 시간을 계산할 수 있다.

n 개의 입력이 주어졌을 때 그것을 바이너리 형태로 쪼개개 되면 1이 될 때 까지 나누어야 하는 횟수는

lgn번이 된다. 그러므로 수행시간은 cn lgn + cn = Θ(n lgn)

 

학습정리 5

합병정렬 알고리즘

 이미 정렬된 두 개의 배열을 입력으로 받아 정렬된 하나의 배열을 출력하는 정렬 알고리즘 Θ(n lgn)

Divide-and-Conquer Approach

 크기가 커서 풀기 어려운 문제를 크기가 작아 풀기 쉬운 여러 개의 문제로 바꾸어서 문제를 푸는 방법

 

힙 정렬 (Heap Sort)

- 힙 구조의 특성을 이용한 정렬

- 수행시간은 합병정렬과 동일한  O(n lgn)

- 삽입정렬과 동일한 제자리 정렬 (Sort in Place)

 

힙의 형태 (The shape of a heap)

- 완전 이진 트리(Complete binary tree)에 가까운 형태

- 이진 트리(Binary tree)는 각 노드의 자식수가 2이하인 경우

- 완전 이진 트리는 Root 노드부터 Leaf 노드까지 빠짐없이 채워져 있는 트리

- 이진 트리는 왼쪽부터 채운다.

 

힙 구조를 만족하는 2가지 힙이 존재

- 최대힙 특성 (Max-Heap Property)

A[PARENT(i)] >= A[i]

- 부모 노드의 값은 항상 자식 노드의 값보다 크다.

- 따라서 전체 트리의 Root 노드 값이 가장 크다.

- 또한 각 하위 트리 구조의 Root 노드가 가장 큰 값을 가진다.

- 최소힙 특성 (Min-Heap Property)

A[PARENT(i) >= A[i]]

- 자식 노드의 값은 항상 부모 노드의 값보다 크다.

- 따라서 전체 트리의 Root 노드 값이 가장 작다.

- 또한 각 하위 트리 구조의 Root 노드가 가장 작은 값을 가진다.

 

힙의 배열 저장 방식

- Root 노드는 배열의 첫 번째 A[1]에 저장

- 각각의 노드들은 레벨별로 저장

 

힙을 배열에 저장하면 다음과 같이 검색이 가능

- PARENT(i) return [i/2]

- LEFT(i) return 2i

- RIGHT(i) return 2i + 1

 

노드의 높이 (Height of Node)

 노드의 높이는 현재 노드에서 leaf 노드까지 내려갈 때 가장 단순하게 내려가는 가장 긴 경로에서 (simple path) 거쳐야 하는 간선의 수이다.

 

힙의 높이 (Height of Heap)

- Θ(lgn)

- Heap은 완전 이진 트리 구조를 가지기 때문에 각 레벨마다 노드의 수가 2배씩 증가하므로 높이는 Θ(lgn)

 

힙 특성 관리

Max-Heapify

 노드가 입력으로 주어졌을 때

 노드의 좌 우 하위 트리들은 max-heap 특성을 유지하지만

 노드의 값이 하위 트리 값보다 작거나 같아서 max-heap 특성을 만족하지 않을 때 max-heap 특성이 유지되도록 바꾸는 연산

 주어진 노드의 값을 "흘러내리게" 해서

 주어진 노드와 하위 트리가 max-heap 특성을 가질 수 있도록 변경

 max-heap이란 부모노드가 자식노드보다 값이 큰 구조를 유지하는 것임

 

MAX-HEAPIFY의 수행시간, T(n)

- n을 하위 트리의 노드의 개수라고 할 때

- 노드의 값을 바꿀 때 수행시간 : Θ(1)

- 힙의 높이 O(h) = O(lgn)

- 따라서 전체 수행시간은 O(lgn)

 

학습정리 6

힙정렬 알고리즘

 입력받은 숫자를 힙구조로 만들어 정렬문제를 해결하는 알고리즘으로 시간복잡도는 Θ(nlgn)

 

BUILD-MAX-HEAP

BUILD-MAX-HEAP(A)

 A.heap - size = A.length

 for i = [ A.length /2 ] downto 1

  MAX-HEAPIFY(A,i)

 

MAX-HEAPIFY(A,i)는 자식을 가지는 마지막 노드부터 시작

Root 노드 방향으로 거슬러 올라가면서 HAX-HEAPIFY(A,i)를 진행

 

힙 구조 만들기 (Building a heap)의 수행시간

수행시간 분석

 - MAX-HEAPIFY를 한번 호출 할 때 마다 O(lgn)

 - MAX-HEAPIFY의 호출 횟수는 O(n)

 - 따라서 전체 수행시간은 O(nlgn)

 

최대값 추출(Extract-Max)

 Heap에서 가장 큰 값을 제거하고 Max-heap 구조를 복원하는 연산

 수행시간은 O(lgn)

 

힙 소트(Heap Sort)의 Pseudo Code

HEAPSORT(A)

 BUILD-MAX-HEAP(A)

 for i = [A.length /2 ] downto 2

  exchange A[1] with A[i]

  A.heap-size =A.heap-size-1

  MAX-HEAPIFY(A,1)

 

힙 소트 (Heap Sort)의 수행시간

- A[1...n]에 대해 BUILD-MAX-HEAP를 수행하는 시간 O(nlgn)

- Extract-Max를 n번 반복

- 전체 수행시간은 O(nlgn)

 

학습정리 7

힙정렬 알고리즘

 입력받은 숫자를 최대힙구조로 만들고 현재 값중에 가장 큰 값을 루트로부터 추출하여 큰값부터 차례대로 뽑아 정렬문제를 해결하는 알고리즘으로 시간복잡도는 Θ(nlgn)

 

퀵 정렬(Quicksort)

Divide-and-Conquer paradigm을 사용

- Partition을 이용

 

Partitioning

Use Pivot element

set Pivot

if number bigger than Pivot move to right

else move to left

 

퀵정렬의 Pseudo cod

QUICKSORT(A,p,r)

if p<r

 q = PARTITION(A,p,r)

 QUICKSORT(A,p,q-1)

 QUICKSORT(A,q+1,r)

 

Partition에 걸리는 시간 : Θ(n)

Partition의 획수

- 경우에 따라 횟수가 달라진다.

- Balanced partitioning

각 하위 문제의 크기가 기존 문제의 크기의 절반 정도인 [n/2] 과 [n/2]-1가 되도록 나누어지는 경우

T(n) <= 2T(n/2) + Θ(n) =  O(nlgn) 

- Unbalanced partitioning

T(n)=T(n-1) + Θ(n)

= n시그마k=1 Θ(k)

=Θ( n시그마k=1 k)

=Θ(n제곱)

최악의 경우

- 퀵 정렬은 최악의 경우에 O(n제곱) X time

- unbalanced partitioning이 최악의 경우가 되는가?

- 대체법(Substitution)을 이용하여 퀵 정렬의 시간복잡도가 O(n제곱)임을 보이시오.
  T(n) =max(0<=q<=n-1)(T(q)+T(n-q-1))+Θ(n)

- T(n)<=cn제곱를 만족하는 c가 있음을 보이면 된다.

- T(n)=O(n제곱)

 

평균적인 경우 (Average-case analysis)

- pivot가 비교하는 최대수는 1이다.

- O(nln) 이다.

 

무작위 퀵 정렬(Randomized quicksort)

- 최악의 경우를 피하기 위해 배열에서 Pivot을 무작위로 선택하는 방법

RANDOMIZED-PARTITION(A,p,r)

 i=RANDOM(p,r)

 exchange A[r} with A[i]

 return PARTITION(A,p,r)

 

무작위 퀵 정렬의 Pseudo Code

 RANDOMIZED-QUICKSORT(A,p,r)

if p<r

q = RANDOMIZED-PARTITION(A,p,r)

RANDOMIZED-QUICKSORT(A,p,q-1)

RANDOMIZED-QUICKSORT(A,q+1,r)

 

 

Best case 

Average case 

Worst case 

 Insertion sort  삽입

 Θ(n)

 Θ(n제곱)

 Θ(n제곱)

 Merge sort 합병

 Θ(nlgn)

 Θ(nlgn)

 Θ(nlgn)

 Selection sort 선택

 Θ(n제곱)

 Θ(n제곱)

 Θ(n제곱)

 Heapsort 힙

 Θ(n)

 -

 Θ(nlgn)

 Quicksort 퀵

 Θ(nlgn)

 Θ(nlgn)

 Θ(n제곱)

Θ(n) > Θ(nlgn) > Θ(n제곱)이 순으로 빠르다.

들어오는 데이터나 공간 중에서 가장 적합한 것을 선택한다.

힙정렬은 힙구조를 만들고 구조를 유지해야 하는 구현상의 난이도가 있다.

합병정렬은 추가공간을 더 사용한다.

퀵정렬은 Θ(nlgn)이만 pivot이 어디를 선택을 하는냐에 따라 성능의 차이가 있다.

 

학습정리 8

 퀵정렬은 Pivot과 partition을 이용하여 크기가 작은 숫자는 계속 앞쪽으로 이동시키고 크기가 큰 숫자는 계속 뒤쪽으로 이동시켜 정렬문제를 해결하는 알고리즘으로 시간복잡도는 Θ(nlgn)

 

비교정렬의 하한값

 비교를 이용하는 정렬

 - 지금까지 소개한 정렬 알고리즘은 비교연산으로 정렬을 하였다.

 - 비교연산은 두 개의 원소의 관계를 다음 중 하나로 판단하는 것이다.

 ai < aj, ai<=aj, ai=aj, ai>-aj, or ai>aj

 - 어떤 a라는 숫자와 b라는 숫자를 비교를 해서 이동을 시키면서 정렬하는 방법을 비교정렬이라고 한다.

 비교 정렬의 하한값(Lower bounds)

 - 비교연산으로 정렬방법은 아무리 빨라도 Ω(nlgn)보다 느리다. 

 

계수정렬 알고리즘

 계수정렬(Counting sort)

 무엇을 이용하여 정렬을 하는가?

 - 계수를 이용하여 정렬

 - 계수란 숫자의 계수를 세는 것을 뜻한다.

 - 실제 숫자를 세는 방법으로 숫자가 몇 개인지를 기록한다.

 - x라는 입력은 x보다 작은 원소의 개수가 i-1개라면 정렬 후에 i 번쨰에 위치해야 한다.

 - x보다 작은 원소의 개수는 원소의 개수를 세어서 확인할 수 있다.

 

계수 정렬의 특징

 - 입력 배열의 순서가 정렬 후에도 유지된다.

 - 이것을 "stable하다"라고 한다.

 

COUNTING-SORT(A,B,k)

Θ(k)    1. for i = 0 to k

          2.          C[i] =0

Θ(n)    3 for j =1 to A.length

          4 C[A[j]] = C[A[j]]+1

    5 C[i] contains the number of elements equal to i.

Θ(k)    6 for i = 1to k

    7          C[i] = C[i] + C[i-1]

    8 C[i] contains the number of elements less than or equal to i

Θ(n)    9 for j =A.length downto 1

    10        B[C[A[j]]] = A[j]

    11        C[A[j]] = C[A[j]] -1

 

전체 수행시간은 Θ(k+n) 

- k는 입력되는 정수의 범위이다.

- 만약 k=O(n)라면, 수행시간은 Θ(n)이 된다.

 

계수정렬이 유리한 경우 입력이 동일한 값이 여러번 반복이 되거나 숫자의 폭이 좁을 떄 유리하다.

 

기수정렬(Radix sort)

기수정렬의 예

(MSB -> LSB) - 큰 자릿수부터 작은 자릿수로 이동

 백의 자릿수를 먼저 정렬을 한 후, 십의 자릿수를 정렬을 하고 마지막으로 일의 자릿수를 정렬을 하는 방법 

(LSB -> MSB) - 작은 자릿수부터 큰 자릿수로 이동

 일의자릿수부터 정렬을 한후, 십의 자릿수를 정렬을 한 후, 마지막으로 백의 자릿수를 정렬을 하는 방법

 

기수 정렬의 Pseudo Code

RADIX-SORT(A,d)

1. for i =l to d

2. use a stable sort to sort array A on digit i

 

기수 정렬의 수행시간은 Θ(d(n+k))

- d자리 수 숫자 n개가 주어졌을 때 각 자리 수에서 최대 k값을 가질 수 있다고 가정

- d가 상수이고 k= O(n) 이므로 기수 정렬은 선형시간에 수행

 

기수정렬은 숫자들의 자릿수가 다 맞아야지 계산이 가능하다

 

학습정리 9

계수정렬 알고리즘

 입력 받은 배열에 있는 숫자의 범위를 확인하고 몇 개가 있는지를 세어보고 정렬하는 알고리즘으로 시간복잡도는 Θ(n)

기수정렬 알고리즘

 입력 받은 배열에 있는 숫자를 각 자리끼리 비교하여 정렬하는 알고리즘으로 시간복잡도는 Θ(n)

 

Direct-Address Tables

- 크기가 |U|인 테이블 T를 생성하고 key k를 slot k에 저장하는 방식

- 중복되는 key는 없다고 가정

 

Direct-Address Tables의 주요 함수

DIRECT-ADDRESS-SEARCH(T,k)

return T[k]

DIRECT-ADDRESS-INSERT(T,x)

T[x.key] = x

DIRECT-ADDRESS-DELETE(T,x)

T[x.key] = NIL

각각의 수행시간은 O(1)

 

Direct-Address Tables의 특징은 시간 복잡도가 굉장히 빠르다.

예를 들어 학생 수가 100만일 때

Direct-Address Tables은 학생 수만큼 키를 만들어준다. 즉 키를 100만개를 만든다.

 

Direct-Address Tables의 공간 복잡도

- Θ(|U|) 

- 실제 공간 사용을 전체 공간으로 나눈 |K|/|U|를 적재율이라고 한다.

- 만약 적재율이 낮다면, 실제로 대부분의 공간은 낭비된다.

Direct-Address Tables의 단점

 Direct-Address Tables에서 Table T의 크기를 보통 U라고하고 여기서 U의 숫자는 universe of keys의 숫자이다.

 예를 들면 100만개의 데이터를 저장할 것이라고 생각해서 U의 값을 100만개로 잡아 놓았을 때 실제 키는 100만개가 아닐 수가 있다. 그러므로 낭비되는 공간이 생기면서 단점이 되는 것이다.

 

Hash Tables

해슁(Hashing)

- key K를 저장할 때 slot k에 저장하는 것이 아니라 slot h(k)에 저장한다.

- 이것을 key k 가 slot h(k)로 해쉬되었다고 하며, h(k)를 key k의 해쉬값이라고 부른다.

- 이때 h()를 해쉬 함수(hash function)라고 부른다.   h : U -> {0,1 ... , m-1}

 

Hash Tables의 수행시간 분석

- Insertion : O(1)

- Deletion : O(1)

- Search : O(1)

- 이 때 Slot은 항상 비어져 있으며 이 중 연결리스트로 구현되어 있다고 가정하며 리스트의 길이를 I이라고 생각한다.

 

 해쉬 테이블은 각 학년의 학생이 50명이라고 했을 때 그 학생들 중 1~50번 까지 번호표를 주고, 각 학년의 같은 번호는 은 책상에서 공부를 시킨다. 그러면 200개의 좌석이 아닌 50개의 좌석으로 공부를 시킨다. 만약 다른 학년의 같은 번호가 동시에 공부를 하려고 하면 한 명은 공부를 못하게 되는 상황이 발생한다.

 이러한 상황을 충돌 문제(Collision)이라고 부른다.

 

충돌 문제 (Collision)

- 두 개의 key 가 동일한 hash 값을 갖는 경우 '충돌이 발생했다'라고 한다.

- 충돌을 피하는 방법은 충돌이 적은 좋은 해쉬 함수를 쓰는 것

- 하지만 테이블의 크기가 해쉬 함수의 치역 영역보다 크다면 |U|>m 충돌을 피하는 것은 매우 어렵다.

 

체인을 이용한 충돌해결법(Collision resolution by chaining)

- 중복되는 key 값이 있을 경우, 해당 슬롯을 연결리스트로 저장한다.
- 이경우로 해결할 경우 시간복잡도의 문제가 생긴다.
- 해쉬 테이블에 충돌이 많을 경우 길이가 긴 연결리스트가 생성이 되고, 연결리스트가 길면 찾아봐야하기 때문에 탐색시간이 길어 진다.

 

체인을 이용한 충돌해결법(Collision resolution by chaining)의 주요 함수

CHAINED-HASH-INSERT(T,x)

insert x into list T[h(x.key)]

CHAINED-HASH-DELETE(T,x)

delete x from the list T[h(x.key)]

CHAINED-HASH-SEARCH(T,k)

search for an element with key k in list T[h(k)]

 

최악의 경우의 수행시간(Worst Case)

- Θ(n)

- 모든 key 값 k가 하나의 slot으로 해슁되는 경우는 길이가 n인 이중 연결 리스트가 생성된다.

- 해쉬 테이블이 아닌 일반적인 리스트에 저장하는 것과 성능이 동일하다.

 

평균적인 수행시간(Average Case)

- Θ(1+a)

- 이때 a는 적재율 (load factor)이라고 부르며 a = n/m로 계산한다.

- n은 테이블의 원소 개수이고 m은 slot의 수이다.

 

좋은 해쉬 함수는 무엇인가?

 좋은 해쉬 함수는 simple uniform hashing을 만족하는 해쉬 함수이다.

 - 각각의 key는 중복 없이 m개의 slot으로 동일한 확률로 해쉬 되며(simple)

 - 각각의 key는 다른 key값의 해쉬값과 관계없이 해쉬 된다. (Uniformly)

 즉, 좋은 해쉬 함수는 모든 값이 골고루 나오는 것이다.

 - m 개의 slot이 있으면 중복 없이 확률적으로 m 개의 slot에 골고루 나누어지는 것이 좋으며 이것을 simple uniform hashing이라고 부른다.

 

해쉬 함수와 key

 해쉬함수에서는 key 값을 자연수로 가정

 - 즉, 자연수의 집합인 N= {0, 1, 2, ... }을 key의 집합으로 본다.

 만약 key가 자연수가 아닌 character나 string의 형태라면 자연수 형태로 변형하여 사용한다.

 - 입력이 pt라고 하면 ASCII 에서 p=112 and t=116이므로 pt는 (112x128)+116 = 14,452가 된다.

 

나눗셈 방법 (The division method)

 해쉬 함수로 나눗셈을 이용하는 방법으로 키값k를 m으로 나누고 나머지를 이용

- Modular 연산을 이용한다.

- h(k) = k mod m

- ex: m=12 , k=100 h(k) = 100 mod 12 = 4

 

효율적인 m의 선택 방법

 m = 2의 p지수승 인 경우는 피하는 것이 좋다.

- m = 2의 p의 지수승이가 되면 해쉬 함수 h(k)는 키 k의 하위 p비트가 된다.

 예 m = 2의 4승이면 h(k) = k mod 2의 4승이 된다.

- k = 10110100, m = 00010000, h(k) =0100

- 해쉬 함수가 key 값 전체에 따라 바뀌지 않고 하위 p비트에만 영향

- 하위 p 비트가 고루 나온다면 나쁜 선택은 아님

- 하지만 대부분 그렇지 않으므로 m = 2의p지수승인 경우는 피하는 것이 좋음!!!!!!!!!!

- 비슷한 이유로 m=2의 p지수승 -1 인 경우도 피하는 것이 좋다.

- m의 값이 2의 지수승에서 1을 뺀 값의 경우에는 2의 지수승과 큰 차이가 없다.

그러므로 어떤 값을 정하는 것이 좋냐면

2의 p지수승에 너무 가깝지 않은 소수를 선택하는 것이 좋다.

- 예를 들어 키의 수가 2,000 이라고 하면 해쉬 테이블의 크기를 m = 701 로 잡으면 좋다.

- 701 은 2000을 3으로 나누었을 때 2의 지수승에 가깝지 않은 소수이다.

  amortized analysis 에 의해 3으로 나누는 것이 효율적이라고 밝혀져 있다.

- h(k) = k mod 701

 

학습정리 10

Direct-Address Tables

 Direct-Address Tables은 검색, 삽입, 삭제가 빠른 장점이 있지만 실제 사용하는 공간이 낭비되는 경우가 많음

Hash Tables

 Hash Tables 는 Direct-Address Tables 에서 공간낭비를 줄이면서도 시간복잡도를 낮추기 위해서 사용하지만 충돌문제가 있으며 이를 해결하기 위한 Chained Hash Table은 시간이 느려질 수 있음

 

오픈 어드레싱 (Open addressin)

- Collision을 피하기 위한 다른 방법으로 key를 hash table에 직접 저장

- 오픈 어드레싱의 장점

포인터를 사용하지 않아도 되므로 구현이 간편

포인터를 사용하지 않으므로 추가 메모리 공간 사용이 가능

공간의 충돌 문제가 줄어들며 자료 검색이 미세하게 빨라진다.

 

선형 프로빙(Linear probing)

 다음과 같은 조건이 주어졌을 때 선형 프로빙으로 key값을 테이블에 저장

- m =13

- k = {5, 14, 29, 25, 17, 21, 18, 32, 20, 9, 15, 27}

h(k) = k mod 13  (mod는 나머지를 구하라는 뜻이다)

 선형 프로빙 방법은 mod를 통해 충돌이 되었을 때 링크 대신에 다음 값에 넣는 방법이다.

 다음 값에 넣었으나 기존 값으로 인해 또 충돌이 방생 했을 때 다음 값에 계속 넣어주면 된다.

 

삽입 연산 (Insertion)

- 빈 slot이 나올 떄까지 해쉬 테이블을 탐색

- Key가 삽입되는 형태에 따라서 빈 slot의 위치가 결정

- 모든 Key 값에 대해 탐색 순서는 < 0, 1, ..., m-1> 에 대해 < H(k, 0), h(k,1), ..., h(k,m-1) >을 탐색한다.

 

해쉬 삽입 (HASH-INSERT)의 Pseudo code

HASH-INSERT(T,k)

 i = 0

repeat

j = h (k, i)

if T[j] == NIL

  T[j] = k

  return j

else i = i + 1

until i == m

error "hash table overflow"

 

해쉬 검색 (HASH-Search)의 Pseudo code

HASH-Search(T,k)

 i = 0

repeat

j = h (k, i)

if T[j] == k

  return j

  i = i + 1

until T[j] == NIL or i == m

return NIL

 

해쉬 삭제(HASH-Delection)

 삭제는 실제로 key값을 삭제하는 것이 맞는가?

 - 실제로 값을 지우는 경우는 "DELETED"라고 표시한다.

 - 왜냐하면 빈 slot이 있는 경우, 원래 값이 있었는데 지워서 비어있는지 아니면 원래 값이 없어서 빈 slot인지를 구분할 수 없기 때문임.

 - 순차 검색에서 비어있는 공간이 나오면 그 이후는 찾아보지 않기 때문에 값이 있음에도 찾지 못할 수 있음.

 - 삭제를 하면 빈슬롯이 생긴다 그러면 데이터를 찾을 때 빈슬롯에 대해서 원래 빈슬롯인지? 지원서 빈슬롯인 된 것인지 판단하기가 어렵다. 빈슬롯이 생길경우 검색을 할 때 빈슬롯에서 중단이 되기 때문에 원하는 값을 제대로 못 찾을 수가 있다. 그러므로 삭제를 하고 나면 삭제를 했다는 것을 표시해주어서 빈 공간이 안나오게 해야한다.

 

세 가지 오픈 어드레싱(Open addressing) 기술

- 선형 프로빙 (Linear probing)

 일반적인 해쉬 함수 h' : U -> {0, 1, ..., m-1}가 주어졌을 때 보조 해쉬 함수 (auxiliary hash function)를 사용해서 선형 프로빙을 하는 방식

 h(k,i) = (h'(k)+i) mod m

 선형적인 형태로 충돌이 발생하면 1씩 증가하면서 빈 slot을 찾는 작업을 반복한다.

 위에서 설명한 선형 프로빙의 경우 다음칸으로 옮긴다고 했는데 위의 식에서 i는 충돌이 발생할 경우 숫자가 1이 증가가 되기 때문에 k값에 충돌 횟수를 더한 후 mod를 한 후 나온 값을 해당되는 곳에 넣는다.

 

선형 프로빙의 장점과 단점

- 구현은 매우 쉬우나 primary clustering문제가 있다.

- primary clustering이란 한번 충돌이 나면 그 부분에서 충돌이 집중적으로 발생하는 것을 뜻한다.

- 값이 들어있는 slot의 수가 많으면 평균 검색시간이 증가한다.

- key 값을 넣을 빈 slot은 뭉쳐있는 slot들의 끝부분에 존재하기 때문에 값이 들어있는 slot들이 뭉쳐있는 경우가 많다.

- primary clustering을 개선하기 위해 나온 것이 이차식 프로빙이다.

 

- 이차식 프로빙(Quadratic probing)

 이차식 프로빙은 다음과 같은 형태의 해쉬 함수를 사용한다.

 h(k,i) = (h'(k) + c1i+c2i제곱) mod m

 이 때 h'는 보조 해쉬 함수이고 c1과 c2는 0이 아닌 상수

 즉, 주어진 Hash 함수 외에 i에 대한 2차함수꼴로 slot을 이동하면서 빈 slot을 찾는다.

이차식 프로빙(Quadratic probing)의 단점

- 만약 두 key의 처음 probe 값이 동일하다면 빈 slot을 찾는 과정이 동일하므로 같은 slot을 탐색

  왜냐하면 h(k1, 0) = h(k2,0) 이면 h(k1,i) = h(k2,i)이기 때문이다.

- 이런 특성을 secondary clustering이라고 부른다.
  즉 처음 충돌한 위치가 같다면 다음 충돌할 위치에서도 반복적으로 계속 충돌이 나게 된다.

  (처음 시작 값이 같으면 매번 계산할 때마다 이전의 key 값과 동일한 위치만큼 이동하기 때문이다.)

 

- 이중 해싱(Double hashing)

이중 해싱은 다음과 같은 형태의 해쉬 함수를 사용한다.

h(k,i) = (h1(k) + i x h2(k)) mod m

처음 탐색하는 위치는 T[h1(k)]이다.

그 다음부터는 h2(k) modulo m만큼 이동하면서 탐색한다.

즉 충돌이 발생했을 때, 이동하는 거리가 hash 함수에 의해 계산되어 무작위로 빈 slot을 찾게 한다

이중 해싱(Double hashing)의 주의점

- h2(k)함수는 해쉬 테이블의 크기 m과 서로소 관계여야 한다.

- 이것을 만족하는 가장 쉬운 방법은 m을 2의 지수승으로 두고 h2가 항상 홀수가 되도록 만드는 것이다.

- 다른 방법은 m을 소수로 하고 h2을 m보다 작은 양수로 정하는 것이다

 

 

학습정리 11

Open-Addressing

 Open-Addressing 자료를 직접 기록하는 방법으로 검색, 삽입, 삭제가 빠르지만 충돌의 가능성이 있어서 Linear Probing, Quadratic Probing, Double Hashing 등의 방법을 이용하여 충돌을 최소화할 필요가 있음


그래프 G

그래프 G는 (V,E)의 쌍이다.

- 이 때 V는 정점(vertex)의 집합(set)이고 E는 간선(edge)의 집합이다.

- 정점은 독립된 개체(Stand-alone object)로 동그라미로 표현한다.

- 간선은 두 정점을 잇는 개체로 선이나 화살표가 있는 선으로 표현한다.


방향성 그래프(Directed graph)

- 방향성이 있는 간선을 가지고 있는 그래프이다.

- 간선이 방향을 가지기 때문에 화살표가 있는 선(arrows)을 사용한다.

- 각 간선은 한 정점을 떠나서 한 정점으로 들어간다.

- 일반적으로 각 정점은 숫자나 이름으로 구분한다.

  V = { 1, 2, 3, 4, 5, 6 }

- 각 간선은 간선이 떠나고 도착하는 정점의 쌍을 순서대로 적은 것으로 구분한다.

  E= { (1,2), (2,2), (2,4), (2,5), (4,1), (4,5), (5,4), (6,3) }

- 방향성 그래프에서 두 개의 정점에 대해 최대 2개의 간선이 존재


무방향성 그래프(An undirected graph)

- 무방향성 간선을 가진 그래프이다.

- 간선이 방향이 없으므로 직선(line)을 사용한다.

- 간선 (u,v)와 간선(v,u)는 같다.


인접(Adjacency)

- (u,v)라는 간선이 있다면, 정점 v와 정점 u가 '인접하다'고 한다.

- 무방향성 그래프에서는 인접관계는 동일하다.

정점 u가 정점 v에 인접하다면, 정점 v도 정점 u에 인접하다.

- 방향성 그래프에서는 같지 않다.


차수(Degree)

- 정점의 진출차수(out-degree)는 정점을 나가는 간선의 수이다.

- 정점의 진입차수(in-degree)는 정점으로 들어오는 간선의 수이다.

- 차수는 진입차수와 진출차수의 합이다.

degree = out-degree + in-degree

- 무방향성 그래프에서 진입차수와 진출차수는 정의할 수 없으며 차수만 정의할 수 있다.


경로(Path)

- 정점 u로부터 정점 v까지의 경로는 정점의 순서이다.

  즉, 정점의 순서가 < v0, v1, v2, , ... , vk > 라고 할 때 v0 = u, vk = v, 이고 각 vi+1가 vi에 인접한 경우이다.

- 경로의 길이(length)는 경로에 있는 간선의 수이다.

- 경로 < 1, 2, 4, 5 > 의 길이는 3이다.

- 정점 u에서 정점 v까지 경로가 있다면, v가 u에서 도달 가능하다고 한다.


단순경로(Simple path)

- 단순 경로는 경로에 있는 모든 정점들이 서로 다른 경우이다.


순환과 단일 순환(Cycle and simple cycle)

- 경로 < v0, v1, v2, ... , vk > 에서 v0 = vk라면 순환이 된다.

- 순환 < v0, v1, v2, ... , vk > 에서 v1, v2, ... , vk가 서로 다르다면 단일순환이다.

- 비순환 그래프(An acyclic graph) : 순환이 없는 그래프

- 연결 그래프(A connected graph) : 정점의 모든 쌍이 경로를 가지는 무방향성 그래프

- 연결 요소(Connected components) : 무방향성 그래프에서 정점들이 최대한 연결되어 있는 하위 그래프


강한 연결과 강한 연결 요소

강한 연결(Strongly connected)

- 방향성 그래프에서 정점의 각 쌍이 서로 도달 가능하다면 강하게 연결되어 있다고 한다. 

강한 연결 요소(Strongly connected components)

- 방향성 그래프에서 최대한 많은 정점을 강하게 연결한 하위 그래프


무방향성 그래프와 방향성 그래프의 변환

- 무방향성 그래프의 간선 (u,v)을 방향성 그래프의 (u,v)와 (v,u)의 두 개의 간선으로 바꾼다.

- 방향선 그래프 간선(u,v)을 무방향성 그래프 (u,v)로 바꾼다.

- Undirected graph G -> directed ver.G' -> imdorected ver.G'' 여기서 G와 G'은 같은가?

- Directed graph G -> undirected ver.G' -> directed ver.G'' 여기서 G와 G''은 같은가?

달라질 수가 있다.


완전 그래프(A complete graph)

- 무방향성 그래프에서 모든 정점의 쌍이 서로 인접하는 경우이다.

- 완전 그래프에서 정점이 n개라면 간선의 수는 몇 개인가? n(n+1)/2 개

- 포레스트(Forest) : 

순환하지 않는 무방향성 그래프

- 트리(Tree) : 

포레스트가 연결되어 있는 경우

연결된 비순환 무방향성 그래프(Connected, Acyclic, Undirected Graph)


Dag

- 비순환 방향성 그래프 ( A directed acyclic graph)

- Handshakig lemma

- IF G = (V, E) is an undirected graph

- 시그마v∈V degree(v) = 2|E| 

- Dag을 가지고 directed 그래프에서 사이클이 있느냐 없느냐를 구분하는 것


트리(Tree)

- 연결된 비순환 무방향성 그래프 (connected, acyclic, and undirected graph)

- 두 정점은 단일 단순 경로 (unique simple path)로 연결이 된다.

- 간선을 제거한다면 그래프는 더 이상 연결되지 않는다. (disconnected)

- 간선 하나를 추가한다면 그래프는 순환 (cycle)을 포함하게 된다.

- (|E| = |V| -1)을 만족한다.

그래프 G가 트리(tree)라면 다음을 만족한다.

- 그래프 G는 연결된 비순환 무방향성 그래프 (connected, acyclic, and undirected graph)이다.

- 그래프 G에서 어떤 두 정점들도 단일 단순 경로(unique simple path)로 연결된다.

- G가 연결되어 있을 때 어떤 간선을 제거하면, G는 더 이상 연결되지 않는다. (disconnected)

- G가 연결되어 있고 비순환이면 |E| = |V| -1

- G가 비순환일 때, 간선 하나를 추가하면, G는 순환을 가진다. (Cycled)

   

그래프에서 간선의 개수

- 방향성 그래프 (Directed graph) : |E| <= |V|제곱

- 비방향성 그래프 (Undirected graph) : |E| <= |V| (|V|-1) /2


학습정리 12

 그래프의 정의를 이해하고 특성을 이용하여 컴퓨터 알고리즘에 적응하기 위한 기초를 마련한다.

 그래프에서 Tree의 정의를 이해하여 Tree의 특성을 파악하고 문제를 해결하는 기초를 마련한다.


그래프 G는 (V,E)의 쌍이다.

- V는 정점(vertex)의 집합(set)이고 E는 간선(edge)의 집합이다.

- 정점은 독립된 개체(Stand-alone object)로 동그라미로 표현한다.

- 간선은 두 정점을 잇는 개체로 선이나 화살표가 있는 선으로 표현한다.

경로(Path)

- 정점 u로부터 정점 v까지의 경로는 정점의 순서이다.

- 즉, 정점의 순서가 < v0, v1, v2, ... , vk > 라고 할 때 v0 = u, vk = v, 이고 각 vi+1가 vi에 인접한 경우이다.

순환과 단일순환(Cycle and simple cycle)

- 경로  < v0, v1, v2, ... , vk >에서 v0 = vk라면 순환이 된다.

- 순환  < v0, v1, v2, ... , vk >에서 v1, v2, ... , vk가 서로 다르다면 단일순환이다.

 

포레스트(Forest)

- 순환하지 않는 무방향성 그래프

 

트리(Tree)

- 포레스트가 연결되어 있는 경우

- 연결된 비순환 무방향성 그래프(Connected, Acyclic, Undirected Graph)

트리(Tree) : 연결된 비순환 무방향성 그래프(Connected, acyclic, and undirected graph)

- 두 정점은 단일 단순 경로 (unique simple path)로 연결이 된다.

- 간선을 제거한다면 그래프는 더 이상 연결되지 않는다 (disconnected)

- 간선 하나를 추가한다면 그래프는 순환(cycle0을 포함하게 된다.

- (|E| = |V| -1)을 만족한다.

 

그래프의 표현

그래프 표현하기

- 인접리스트 표현 (Adjacency-list representation)

- 정점 하나당 리스트 하나인 크기가 |V|인 배열

- 정점 하나에 인접한 모든 정점을 리스트에 저장

- 비방향성 그래프에서는 방향성 그래프로 변환해서 저장

- Θ( V + E ) space

- 인접행령표현 (Adjacency-matrix representation)

- 크기가 |V| x |V|인 행렬

- 두 정점 i와 j를 잇는 간선이 있다면 행렬의 (i, j)는 1, 아ㅣ면 0.

- Θ(V제곱) space

- 무방향성은 양방향으로 간선이 존재하므로 하위 삼각 행렬이 상위 삼각 행렬과 대칭된다. (lower triangular matrix)

 

인접 리스트와 인접행렬의 비교

- 저장공간

 G가 성기면, 인접 리스트가 낫다. -> 왜냐하면 |E| < |V|제곱
 G가 촘촘하면, 인접행렬이 낫다 -> 행렬은 1비트만 사용하므로

- 간선을 찾는데 걸리는 시간

 인접행렬 : Θ(1) time

 인접리스트 : O(V) time

- 모든 간선을 찾거나 방문하는데 걸리는 시간

 인접행렬 : Θ(V제곱)

 인접리스트 : Θ(V + E)

가중 그래프 (Weightes graph)

- 간선이 숫자로 표현되는 값을 가지는 그래프

- 인접 리스트에서는 정점 외에 간선의 값을 추가 저장

- 인접행렬에서는 1 대신 간선의 값을 저장


학습정리 13

 그래프를 데이터로 표현하는 방법을 이해하여 데이터 구조 관점에 고려해 본다.

 그래프에서 가중치 값의 의미와 표현 방법에 대해 이해하기 위해 인접리스트와 인접행렬에 대해 알아본다.

 

트리탐색(Searching a tree)

- 넓이 우선 탐색 (Breadth-first search) : 거리를 기준으로 탐색

- 깊이 우선 탐색 (Depth first search) : 순서를 기준으로 탐색

넓이 우선 탐색

거리 (Distance)

- 정점 u부터 정점 v까지의 거리

- 정점 u부터 정점 v까지의 최단 경로(shortest path)에 있는 간선의 수 거리

- 최단경로는 simple path 중에서 경로에 있는 간선의 수가 제일 적은 것이라고 생각하면 된다.
- 그래프 G = (V,E)와 시작점(source) s가 주어졌을 때, s에서 도달 가능한 모든 간선을 탐색하여 찾는 과정

- 시작점으로부터 거리를 하나씩 늘리면서 정점을 발견한다.

- 먼저 거리가 1인 정점들을 모두 찾은 후 거리가 2인 정점을 찾는 식으로 거리를 늘려가면서 정점을 찾는다.

- 탐색을 하면서 시작점으로부터 거리도 계산한다.

시작점으로부터의 거리를 u,d라고 한다. 이와같이 표현된다 : u,d=3

바로 직전 정점 (predecessor vertex) : u.π=t

predecessor vertex :내가 출발점으로부터 도착점까지 이동할 때 내가 이전에 거쳐야하는 곳을 기록하는 것이다.

- 직전정점 그래프 Gπ=(Vπ,Eπ)

시작점으로부터 각 정점을 도달하기 직전에 들려야 하는 정점으로 만든 하위 그래프

Vπ = { v ∈ V: v.π ≠ NIL } U { s }
Eπ = { ( v.π, v ) : v ∈ Vπ - { s } }

직전정점 그래프 Gπ는 넓이 우선 탐색 트리이다.

모든 정점이 연결되어 있고 |Eπ| = |Vπ| - 1이다.

이때 Eπ에 포함된 간선을 트리 간선(tree edges)이라고 부른다.

- 정점의 색 구분(colors of vertices)

- 초기화한 정점 : 흰색(white) - (nt discovered)

- 발견된 정점 : 회색(grayed) - (discovered)

- 완료된 정점 : 검은색(blackened) - finished)

  완료의 의미는 모든 인접한 정점을 조사한 경우이다.


넓이우선탐색의 과정

BFS(G,s)

for each vertex u ∈ G.V - {s}
u.color = WHITE

u.d = ∞

u.π = NIL

s.color =GRAY

s.d =0

s.π = NIL

Q = θ

ENQUEUE(Q,s)

while Q ≠ θ

u = DEQUEUE(Q)

for each v ∈ G.Adj[u]

if v.color == WHITE

v.color=GRAY

v.d=u.d+1

v.π = u

ENQUEUE(Q,v)

u.color = BLACK

 

수행시간 분석

- 초기화 시간 : Θ(V)

- 그래프 탐색 시간 : O(V + E)

정점은 최대 한 번만 조사된다.

간선은 최대 두 번 조사된다.

- 따라서 전체수행시간 : O(V+E)

학습정리 14

넓이 우선 탐색(Breadth-First Search)

 넓이 우선 탐색은 거리를 우선으로 그래프를 탐색하는 알고리즘


깊이 우선 탐색(Depth-first search)

- 시간이나 순서를 위주로 탐색

타임스탬프(Timestamps)

- 각 정점은 타임스탬프를 두 개씩 가지고 있다.

v.d : 발견 시간(discovery time, when v is grayed)

v.f : 완료 시간(finishing time, when v is blacken)

 

정점의 색 구분(Colors of vertices)
- 초기화한 정점 : 흰색(white) - (not discovered)

- 발견된 정점 : 회색(grayed) - (discovered)

- 완료된 정점 : 검은색(blackened) - (finished)

  완료의 의미는 모든 인접한 정점을 조사한 경우이다.

 

깊이 우선 탐색 숲(depth-first forest)

- 직전 정점 그래프는 깊이 우선 탐색 숲(depth-first forest)이 된다.

 

Parenthesis theorem(for gray interval)

- 같이 깊이 탐색이라면 상위 정점들이 하위 정점들을 모두 포함

- 따로 떨어진 경우는 별개

 

간선의 분류(Classification of edges)

- 트리 간선 (Tree edges) : 탐색한 경로

- 후향 간선 (Back edges) : 자기자신 또는 탐색했던 경로를 뜻함

- 가로 간선 (Cross edges) : 서로 다른 출발점에서 이미 탐색한 곳을 탐색하는 경로를 뜻함

- 전향 간선 (Forward edges) : 종료지점이 시작지점으로 되돌아가는 경로를 뜻함

 

무방향성 그래프의 깊이 우선 탐색에서, 그래프의 각 간선은 트리간선이거나 후향 간선이다.

전향 간선이나 가로간선은 없는가? Cross edge?

 

수행시간 분석 : Θ(V+E)

학습정리 15

깊이 우선 탐색(Depth-first search)

 깊이 우선 탐색은 시간을 우선으로 그래프를 탐색하는 알고리즘으로 시작점으로부터 인접한 정점을 차례대로 방문함

 

최단 경로 문제

정의(Definition)

- 가중 간선 (Edge weight)

- 가중 경로 (Path weight)

경로에 속하는 모든 간선의 값을 더한 값

- 정점 u 에서 v 까지의 최단경로

정점 u에서 정점v까지의 경로 중에 경로의 값이 가장 작은 경로

정점 u를 시작점이라고 하고 정점 v 도착점(destination)이라고 한다.

- 정점 u에서 v까지의 최단 경로 값

δ(u,v)

- 최단 경로 문제의 구분

시작점(source)과 도착점(destination)의 수에 따라 다음과 같이 구분

1. Single-source & single-destination

출발점이 하나고 도착점이 하나이고 여러 경로중 가장 작은 값을 구하는 문제

2. Single-source

출발점 하나로부터 도달 가능한 모든 V의 최단 경로를 구하는 것

3. Single-destination

여러 출발점으로 부터 하나의 도착점까지의 최단 경로를 구하는 것

4. All pairs

그래프 안에 있는 모든 V를 쌍으로 존재하며 모든 경로를 구하는 것

 

다익스트라 알고리즘(Dijkstra's algorithm

- 하나의 시작점(source)에서 하나의 도착점(destination)을 가는 최단경로를 찾는 알고리즘

- 간선이 음의 값을 가져서는 안 된다. (non-negative edges only)

다익스트라 알고리즘의 수도 코드

DIJKSTRA(G,w,s)

INITIALIZE-SINGLE-SOURCE(G,s)

S <- Θ

Q <- V[G]

while Q ≠ Θ

do u <- EXTRACT-MIN(Q)

S <- S ∈ {u}

for each vertex v ∈ Adj[u]

do RELAX(u,v,w)

여기서 RELAX란 새로운 경로가 추가되면서 어느값이 더 짧은지 확인하는 것

 

수행시간 분석
- 배열로 구현한 경우 : O(V제곱)

- 힙구조로 구현한 경우 : O(VlgV + ElgV)
- 피보나치 힙으로 구현한 경우 : O(VlgV + E)

 

학습정리 16

다익스트라 알고리즘

 최단경로문제를 해결하는 다익스트라 알고리즘 정점을 하나씩 추가하면서 완화를 통해 새로운 경로에서 경로값을 계산하여 새로운 경로를 추가하여 최단 경로를 찾는 알고리즘 

 

벨만-포드 알고리즘(The Bellman-Ford algorithm)

음수 간선 값(Negative-weight edges)

음수 간선이 문제가 되는가? 아니다

음수 순환이 문제가 되는가? 맞다 그러나 모든 음수 순환이 문제가 되는 것이 아니고, 시작점에서 도착점중에 음수 순환이 존재하면 문제가 되는 것이다.

그러므로 최단경로는 출발점으로부터 도달가능하며 음의 값을 가지는 순환이 없는 경우로 생각할 수 있다.

 

최단 경로와 순환 (Cycles)

- 최단 경로는 순환을 포함해서는 안 된다.

- 최단 경로의 길이는 최대 |V|-1이다.

위의 조건을 만족하는 최단 경로는 Predecessor subgraph라고 부른다.

직전 정점 하위 그래프 (Predecessor subgraph)

- 최단 경로 트리(Shortest-path tree)가 된다.

- 최적해 구조(Optimal substructure)를 가진다.

최적해 구조에서 동일한 값이 나오는 경로가 여러개일 때 어느 경로가 좋다고 할 수가 없다.

 

완화(Relaxation)

- 현재 경로 값보다 더 적은 경로가 존재한다면 값을 변경한다.

 

벨만-포드 알고리즘(The Bellman-Ford algorithm)

- 하나의 시작점에서 하나의 도착점으로 가는 최단경로 문제를 해결하는 알고리즘이다.

- 음의 간선이 있는 경우에도 문제를 해결한다.

- 다익스트라와의 차이점은

1. 다익스트라는 음의 간수가 없어야하는데 벨만-포드는 있어도 된다.

2. 구현상에서의 차이점은 다익스트라는 정점을 하나씩 추가하면서 최적값을 Relax를 통해서 찾아내는 방식인 반면 다익스트라는 Relax를 계속 반복을 하면서 간선을 기준으로 한다.

- 벨만-포드 알고리즘의 수도 코드

BELLMAN-FORD(G,w,s)

INITIALIZE-SINGLE-SOURCE(G,s)

For u <-1 to |V[G]|-1

do for each edge(u,v) ∈ E[G]

do RELAX(u,v,w)

for each edge(u,v)  ∈ E[G]

do if d[v] > d[u] +w(u,v)

them return FALSE

return TRUE

Relaxation order

수행시간 : O(VE)

 

학습정리 17

벨만-포드 알고리즘

 음의 값을 가지는 그래프에서 Relax를 이용하여 순환문제를 회피하고 최단경로 문제를 해결하는 알고리즘 

 

플로이드-와샬 알고리즘(Floyd-Warshall algorithm)

인접 행렬 W

- 각 경로의 값은 다음과 같이 표시한다.

Wij=W(i,j)

최단경로 행렬 D

- 각 경로의 값은 다음과 같이 표시한다.

dio = δ(i,j)

직전 정점 행렬 π

- 각 행렬의 값은 다음과 같이 표시한다.

정점i와 정점 j 사이에 경로가 존재하지 않으면 πij = NIL

πij는 정점 j의 직전 정점이다.

 

PRINT-ALL-PAIRS-SHORTEST-PATH(Π,i,j)

if i=j

then print i

else if πij = NIL

then print "no path from" i "to" j "exists"

else PRINT-ALL-PAIRS-SHORTEST-PATH(Π,i,πij

print j

 

중간 정점

- 단순 경로 < v1, v2, .... , vl > 가 있다고 할 때, v1 과 vl 사이에 있는 정점을 중간 정점이라고 한다.

- 중간 정점이 하는 역할

- 최단 경로의 구성 The structure of a shortest path

플로이드-와샬 알고리즘은 중간 정점을 모두 실험해본다.

정점 집합이 V = {1,2, ..., n}라고 하면 i,j ∈ V 일 때, i 와 j 사이에 정점 집합 V에 속하는 모든 정점을 넣어보고 경로의 값이 가장 작아지는 경로를 찾는다.

따라서 수행시간은 Θ(V세제곱)이다 

i,j ∈ V일때,

i 와 j 사이에 정점 집합 V에 속하는 정점 {1,2, ... , k}을 넣어보고 경로의 값이 가장 작아지는 경로를 찾는다.

- 만약 k가 중간 정점이 아니라면 정점 {1,2, ..., k-1}에 대해 조사한다.

- 만약 k가 중간 정점이라면, 두 경우로 나누어 더 작은 경로를 찾는다

재귀해법

- 정점 i 부터 j 까지 최단경로를 dij(k승)라고 하자

- 이때 {1,2, ..., k}은 중간 정점의 집합이다.

- 다음과 같은 재귀식을 구할 수 있다.

 dij(k승) = wij                                                  if k=0

   min(dij(k-1승), dik(k승-1) + dkj(k승-1))     if k>=1

 

FLOYD-WARSHALL(W)

n <-rows[w]

D(0승) <- W

for k <- 1to n

do for i<-1 to n

do for j<-1 to n

do dij(k승) <- min(dij(k-1승), dik(k승-1) + dkj(k승-1))     

return D(n승)

 

학습정리 18

최단 경로문제

 최단경로문제는 출발점과 도착점이 주어졌을 때 두 정점을 연결하는 최단경로값을 찾는 문제로 Single Source-Single Destination 가 대표적

플로이드-와샬 알고리즘

 All pairs shortest path 문제를 해결하는 플로이드 - 와샬 알고리즘은 D(k)와 πij(k승)를 이용하여 시간 복잡도는 O(V3)

 

탐욕 알고리즘(Greedy Algorithm)

- 현재 상황에서 가장 좋아 보이는 답을 선택하는 방법

- 각 부분에서 최적을 선택하면 전체에서도 최적이 될 것이라는 가정을 전제로 한다.

- 선택은 항상 하위 문제에 대한 해답이 나오기 전에 선택된다.

 탐욕 알고리즘과 동적 프로그래밍의 차이점

탐욕 선택

(Greedy-choice property)

동적 프로그래밍

(Dynamic programming)

하위 문제를 풀기 전에 선택을 한다 

하위 문제를 풀고 나서 선택을 한다. 

항상 하나의 문제만을 고려한다. 

동시에 여러 개의 하위 문제를 고려한다. 

 

Ex:

0-1 배낭채우기 문제(0-1 knapsack)

- 도둑이 상점에서 n개의 물건을 훔친다고 하자.

- i번째 상품의 가치는 vi 달러이고 무게는 wi파운드이다.

- 도둑은 최대 W파우드를 가방에 넣을 수 있다.

- n, vi, wi과 W이 정수라고 할 때 어떤 물건을 훔쳐야 하는가?

 

가중 무방향성 그래프 (Weighted undirected graph)

- G = (V, E)

- 간선 집합에 속하는 각 간선 (u,v)는 w(u,v)을 가진다

 

신장트리 (Spanning Trees)

- 그래프 G의 신장트리 (A spanning tree for G)

트리가 그래프 G의 모든 정점을 포함할 때 그래프 G에 속하는 트리의 간선을 선택한 것

최소신장트리 (Minimum Spanning Trees)

- 신장트리의 비용 (Cost of a spanning tree)

w(T) = 시그마(u,v)⊆T w(u,v)

- 최소신장트리 문제 (Minimum-spanning-tree problem)

비용이 최소가 되는 신장트리를 찾는 문제

- 일반적인 MST

GENERIC-MST(G,w)

A <- θ

while A does not form a spanning tree

do find an edge(u,v) that is safe for A

A <- A U{(u,v)}

return A

- 최소신장트리는 한번에 하나의 간선이 늘어난다.

- 간선 (u,v)을 집합 A에 추가하고 A U {(u,v)} 가 최소신장트리의 일부가 되는지 확인한다.

이때 이런 간선을 안전간선 (safe edge)이라고 한다.

이렇게 하는 이유는 tree구조는 cycle이 생기면 안되기 때문이다.

 

프림 알고리즘(Prim's Algorithm)

V를 기준으로 인접하는 V를 하나씩 Greedy방식으로 추가하는 것

Tree가 연결할 수 있는 가장 작은 값을 하나씩 추가해나가는 방식이다.

최소신장트리(Minimum spanning Trees)

- cut(S, V-S)는 무방향성 그래프에서 정점을 두 개로 나눈 집합

- 간선 (u,v)의 끝점이 하나는 S에 있고 다른 하나가 V-S에 있는 경우를 간선 (u,s)가 cut(S, V-S)을 가로지른다(cross)라고 한다.

- 만약 A에 속한 어떤 간선도 cut을 가로지르지 않으면 cut이 A를 보장한다(respects)라고 한다.

- 만약 어떤 간선의 값이 cut을 가로지르는 간선 중에 가장 작다면 그 간선을 가벼운 간선(light edge)라고 한다.

집합 A 에 속하는 간선은 항상 트리를 형성한다.

트리는 임의의 rott 정점 r에서 시작하며 정점의 집합 V에 속하는 모든 정점을 포함할 때까지 확장한다.

각 단계에서 가벼운 간선(light edge)이 트리에 추가된다.

따라서, 알고리즘이 종료되면, 최소신장트리가 만들어진다.

MST-PRIM(G,w,r)

for each u ∈ V[G]

do keu[u] <- ∞

π[u] <- NIL

key[r] <- 0

Q <- V[G]

while Q ≠ θ

do u <- EXTRACT-MIN(Q)

for each v ∈ Adj[u]

do if v ∈ Q and w(u,v) < key[v]

then π[v] <- u

key[v] <-w(u,v)

 

쿠루스칼 알고리즘(Kruskal's Algorithm

프림 알고리즘과 달리 E값을 기준으로 한다.

쿠르스칼은 모든 간선을 다 추가할 때까지 진행된 후 종료된다.

MST-KRUSKAL(G,w)

A <- θ

for each vertex v ∈ V[G]

do MAKE-SET(v)

sort the edges of E into nondecreasing order by weight w

for each edge(u,v) ∈ E, taken in nondecreasing order by weight

do if FIND-SET(u) ≠ FIND-SET(v)

then A <- A U {(u,v)}

UNION(u,v)

return A

 

학습정리 19

프림 알고리즘

정점의 최선값을 선택하여 MST문제를 해결하는 알고리즘

쿠루스칼 알고리즘

 간선의 가중치값을 정렬하여 MST문제를 해결하는 알고리즘 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Legend 개발자 > T아카데미' 카테고리의 다른 글

UX/UI 기획  (0) 2017.09.04
jQuery (JavaScript)  (0) 2017.09.02
컴퓨터 알고리즘 중급  (0) 2017.08.31
JavaScript  (0) 2017.08.30
HTML&CSS  (0) 2017.08.28
Posted by 전설의아이
|