반응형

 

 

인터페이스 Collection <- (List, Set)

 

✔ 전체

clear()

isEmpty()

equals(Collection)

List<Integer> list1 = new ArrayList<>();
list1 = Arrays.asList(1,2,3);
System.out.println(list1.equals(Arrays.asList(1,2,3))); // true

 

✔ 요소

add(Object)

addAll(Collection)

remove(Object)

removeAll(Collection)

retainAll(Collection)

//removeAll
Collection<Integer> list1 = new ArrayList<>(Arrays.asList(1,2,3));
Collection<Integer> list2 = new ArrayList<>(Arrays.asList(1,2));
list1.removeAll(list2);
System.out.println(list1); // 3

//retainAll
Collection<Integer> list3 = new ArrayList<>(Arrays.asList(1,2,3));
Collection<Integer> list4 = new ArrayList<>(Arrays.asList(1,2));
list3.retainAll(list4);
System.out.println(list3); // 1, 2

 

✔ 변환

toArray()

iterator()

 

 


인터페이스 List <- (ArrayList, LinkedList)

 

✔ 요소

add(Object)

get(idx)

set(idx, Object)

remove(Object)

 

✔ 조회

contains(Object)

indexOf(Object)

lastIndexOf(Object)

 

✔ 정렬, 서브리스트

sort(Comparator)

subList(idx start, idx end)

 


구현체 ArrayList

 

Collection, List 메서드를 구현

배열을 이용해서 구현했기 때문에 위치 삽입, 삭제시 시간이 소모 된다.

대신 idx를 이용한 조회는 O(1)

 

ensureCapacity(N)

trimToSize()

 

add(idx, Object)

 

 

 


구현체 LinkedList

 

Collection, List 메서드를 구현

양쪽 노드를 참조하는 참조값으로 구현했기 때문에 위치를 알고 있다면 삽입, 삭제시 빠르다.

대신 idx를 이용한 조회는 O(n)

 

Queue의 구현체로 이용됨

isEmpty()

 

peek()

peekFirst()

peekLast()

 

offer(Object)

offerFirst(Object)

offerLast(Object)

 

poll()

pollFirst()

pollLast()

 

 

 

 

 

 



 

인터페이스 Set <- (HashSet, TreeSet)

 

✔ 요소

add(Object)

remove(Object)

 

✔ 조회

contains(Object)

 


구현체 HashSet

 

중복을 판단하기 위해 equals(), hashCode()를 호출한다.

 

 

 


구현체 TreeSet

 

레드 - 블랙트리로 구현되어 있다.

정렬된 위치에 Object를 저장한다. 정렬되어 있기 때문에 조회, 범위 조회에서 이점을 갖는다.

정렬을 위해 Comparator를 생성자에 부여하거나, Object가 Comparable을 구현하고 있어야 한다.

 

 

✔ 단일 조회

first()

last()

 

higher(Object)

ceiling(Object) - Object 포함 검색

floor(Object) - Object 포함 검색

lower(Object)

 

✔ 범위 조회

headSet(Object) - Object가 head(가장 큰 값)

headSet(Object, boolean) - Object를 포함할지 boolean으로 결정

 

tailSet(Object) - Object가 tail(가장 작은 값)

tailSet(Object, boolean) - Object를 포함할지 boolean으로 결정

 

subSet(Object , Object)

subSet(Object, boolean, Object, boolean) - Object를 포함할지 boolean으로 결정

 

 

 

 

 

 

 

 

 



인터페이스 Map

 

전체

clear()

isEmpty()

size()

 

요소

get(key)

put(key, value)

remove(key)

 

✔ 조회

containsKey(key)

containsValue(value)

 

✔ 변환

keySet()

values()

entrySet()

 

 

인터페이스 Map.Entry

 

getKey()

getValue()

setValue(value)

 


구현체 HashMap

 

getOrDefault(key, value) - 키가 있다면 value반환, 없다면 매개변수 value로 생성, 반환

 

 


구현체 TreeMap

 

하나를 찾을 경우 반환은 Entry, Key (메서드 접미사로 지정)

범위로 찾을 경우 반환은 Map

정렬을 위해 Comparator를 생성자에 부여하거나, Object가 Comparable을 구현하고 있어야 한다.

 

 

 

✔ 조회 - Entry, Key

 

firstEntry(key)

firstKey(key)

lastEntry(key)

lastKey(key)

 


 

키를 포함하지 않고 검색

higherEntry(key)

higherKey(key)

 

키를 포함하여 검색

ceilingEntry(key)

ceilingKey(key)

 

키를 포함하여 검색

floorEntry(key)

floorKey(key)

 

키를 포함하지 않고 검색

lowerEntry(key)

lowerKey(key)

 

 

✔ 범위 조회 - Map

 

headMap(key)

headMap(key, boolean)

 

tailMap(key)

tailMap(key, boolean)

 

subMap(key, key)

subMap(key, boolean, key, boolean)

반응형
반응형

본 글은 책 자바의 정석을 ref 하여 요약한 글입니다.


 

자바의 날짜와 시간 클래스 변화 과정

Date -> Calendar -> time패키지

* time패키지를 사용하는 것이 좋지만 Calendar를 오랫동안 사용했기 때문에 하위 호환성을 위해 알아두면 좋다.

 


Date

특정 시점의 날짜 정보를 저장하는 역할만 한다.

 

Calendar

시스템의 국가와 지역 설정을 확인하여 현재 날짜와 시간를 사용

getInstance로 객체를 가져온다. 

 

get(Calendar.MONTH)를 이용하여 날짜, 시간 등을 사용할 수 있다. 

* MONTH의 경우 1~12가 아닌 0~11로 되어있다.

 

set(년, 월, 일, 시간, 분, 초)를 이용하여 시간을 지정할 수 있다.

* 년이 맨 앞 기준으로 오버 로딩이 돼있으므로 맞춰서 사용

* 연도 없이 시, 분, 초 등을 사용할 경우 set(Calendar.HOUR, 3)을 이용해서 따로 지정해야 함

 

두 날짜의 차이를 구할 때는 getTimeInMillis()를 이용해서 구한다. ms단위로 반환하기 때문에

1000을 나눈 후 초단위로 사용하면 된다.

 

add(Calendar.MONTH, -10)를 이용하여 이전 시간, 이후 시간을 구해줄 수 있다.

* add()는 다른 속성의 날짜, 시간을 계산하지만, roll() 메서드는 다른 속성에 영향을 주지 않는다.

 


 

자바time패키지

 

LocalTime - 시간 클래스

LocalDate - 날짜 클래스

LocalDateTime - 날짜 시간 클래스

ZonedDateTime - 특정 타임존의 날짜 시간 클래스 (UTC, ASIA/Seoul..)

Instant - 특정 시점의 타임스탬프 클래스 (차이를 비교, 순서를 비교 하는데 유리)

 

시간 지정

now() - 현재 시간

of() - 인수로 지정

parse() - 문자열을 시간으로 지정

 

시간 가져오기

get...() - 지정 시간속성 가져오기

 

시간 조작

with...() - 특정 시간 변경

plus...() - 특정 시간 더하기

minus...() - 특정 시간 빼기

* 변경 후 대입 필요, 항상 새로운 객체를 반환하므로 메서드 체이닝이 가능하다.

 

시간 비교

isAfter() - 이후 날짜 인지 비교

isBefore() - 이전 날짜 인지 비교

isEqual() - 동일 날짜 인지 비교

 

LocalDate, LocalTime < - > LocalDateTime

LocalDate, LocalTime -> LocalDateTime 

* of(LocalDate, LocalTime)

LocalDate, LocalTime <- LocalDateTime

* toLocalDate()

* toLocalTime()

 

 

Period, Duration,ChronoUnit

Period - 년, 달, 일

Duration - 시, 분, 초, 나노초

ChronoUnit - 전체시간을 기준으로 차이를 리턴

 

between()을 사용하여 두 시간을 비교한다.

반환 시간은 get...()으로 확인한다.

 


 

형식화 클래스

 

DecimalFormat

✔ 일정한 형식에 맞게 표현할 수 있는 방법을 객체지향적으로 표준화

new DecimalFormat("패턴")

format(입력)

✔ 포맷을 되돌리는 것도 가능하다.

parse(패턴에 맞게 표기된 형태)

 

 

패턴

 

입력:12345.6789

 

✔ 0 - 값이 없을때도 0을 표기

0 -> 12345

0.0 -> 12345.6789

000000.00000 -> 012345.67890

 

 

✔ # - 값이 없을때는 표시안함

# -> 12345

#.# -> 12345.6789

######.##### -> 12345.6789

 

 

✔ E - 지수기호

#E0 -> .1E5 

* #과 E를 같이쓰면 소수점 첫째자리를 표기함.

#.#E0 -> 1.2E4

##.#E0 -> 1.2E4

* #.#과 E를 같이쓰면 정수는 한자리수만 표기함

 

0E0 -> 1E4

* 0과 E를 같이쓰면 소수점을 표기하지 않음.

0.0E0 -> 1.2E4

00.0E0 -> 12.3E3

* #과 다르게 0은 정수 자리수를 패턴에 맞게 맞춤

 

 

 

SimpleDateFormat

✔ 날짜를 출력할 때 사용한다. 사용방법이 간단하다.

new SimpleDateFormat("형식")

format(Date)

* Date 클래스를 인수로 받는다.

 

 

 

 

 

 

 

 

 

 

 

 

 


 

반응형
반응형

본 글은 책 자바의 정석을 ref 하여 요약한 글입니다.


 

컴파일 에러 - 컴파일할 때 발생하는 에러

런타임 에러 - 프로그램 실행 중 발생하는 에러

논리적 에러 - 논리적으로 발생한 에러

 

런타임 에러시 발생

에러 - 프로그램 중지를 막을 수 없다.

예외 - 예외로 프로그램이 중지될 수 있지만 미리 예방 코드를 작성해두었다면 중지되지 않는다.

코드를 통한 처리의 주된 관심사는 예외이다.

 

Exception 하위 (외부의 영향으로 발생하는 예외) ⁕⁕ checked 예외(예외 처리가 반드시 필요하다)

RuntimeException 하위 (프로그래머의 실수로 발생하는 예외) ⁕⁕ unchecked 예외(예외처리는 선택사항)

* checked보다 unchecked를 이용하는 것이 더 코드를 깔끔하게 만들 수 있으므로

* Exception보다 RuntimeException을 상속받고 unchecked를 사용하는 쪽으로 변화 중

 

try - catch

예외가 발생하면 예외에 해당되는 인스턴스가 생성

인스턴스로 catch블록의 타입을 이용하여 검사한다.

(발생한 예외 객체) instanceof (catch블록 타입)

 

finally

예외 발생여부와 관계없이 반드시 실행

 

try - with - resources

try(따로 close를 호출하지 않아도 try 블럭을 벗어나는 순간 close()호출 ){

    내부작업

}catch(Exception e){

}

 


 

예외 발생시키기

예외가 발생하면 예외 객체를 생성한다. 예외가 발생하지 않아도 프로그래머가 예외 객체를 직접 생성해줄 수 있다.

생성된 예외를 throw를 이용하여 예외를 발생시킬 수 있다.

 

메서드에 예외 선언(호출부에 예외 처리 전가)

메서드 선언부에 throws (메서드 내부에서 발생 가능성 있는 예외를 호출부에 알려주는 역할)

* checked 예외만 적어둔다.

내부에서 처리하지 않고, 호출부에서의 에러처리를 강요한다. 

 

사용자 정의 예외

Exception을 상속받아서 생성자에 msg

 

예외 되던지기

예외를 처리해준 후 catch문에서 다시 throw 한다.

 

연결된 예외

예외를 생성한 이후 initCause 메서드에 원인 예외를 등록한다.

- 여러가지 예외를 하나로 묶어서 처리해줄 수 있다. (사용부에서 하나의 예외만 처리해주면 되니 간편해짐)

- checked 예외를 unchecked로 만들 수 있다.

** 예외가 발생하면 원인 예외도 log를 볼 수 있다.

 

 


java.lang 패키지

import 없이 사용, 기본이 되는 클래스들을 포함(Object, System, String, Math ..)

 

Object클래스

equals - 오버라이딩하지 않으면 참조값 비교, 오버라이딩 후 프로그래머가 원하는 값으로 비교

hashCode - 객체 자신의 hashCode반환, equals를 오버라이딩하면 hashCode도 해야한다. (HashSet, HashMap에서 이용한다.)

toString - 인스턴스 정보의 문자열

clone - 단순히 인스턴스 값을 복사. 인스턴스가 참조값이라면 참조값도 복사하기때문에 원본에 영향

getClass - 클래스 객체를 반환. 객체의 모든 정보를 담고 있다. 

* Reflection

* 클래스 객체를 이용하면 객체 생성, 메소드 호출 등이 가능하다. 클래스당 1개만 존재

 

String클래스

변경 불가능. +연산자를 이용해서 결합하는 경우 변경되는 것이 아니라 새로 생성하는 것. 메모리에 악영향

문자가 이미 저장되어있다면 재사용

(Heap - String Constant Pool)

* constant pool - 클래스파일이 클래스 로더에 의해 메모리에 올라갈 때 문자열 리터럴들이 constant pool에 올라간다.

equals를 이용하여 비교해야한다.

 

StringBuffer, StringBuilder

내부적으로 버퍼를 갖고 크기를 변경한다.

변경할 땐 배열과 마찬가지로 버퍼를 키운 후 배열에 문자를 복사한다.

equals가 오버라이딩 되어있지 않다.

StringBuffer는 쓰레드 환경에서 안전하다.

 

Math클래스

abs - 절대값을 반환

ceil - 올림하여 반환

floor - 버림하고 반환

max, min - 두값을 비교 

round - 소수점 첫째자리를 반올림한다.

 

wrapper 클래스

기본형을 객체로 다룰 때 사용한다.

전부 equals가 값의 비교로 오버라이딩 되있다.

* 내부적으로 객체를 사용하는 컬렉션프레임워크를 사용하면 자동으로 객체로 오토박싱

* 기본형 타입에 대입하면 자동으로 언박싱

 

 


 

java.util.패키지

유용한 클래스들의 모음(컬렉션 프레임워크, Objects, Random, regex, Scanner, StringTokenizer ...)

대부분의 메서드가 static

 

Objects

isnull(Object) 널 체크

hash(values...) 해시코드를 만든 후 반환

 

regex

정규표현식 - 패턴을 지정하고 같은 패턴을 찾는다.

 

Scanner

nextLine 외에도 nextInt, nextLong으로 입력을 받을 수 있어서 추가적인 작업이 덜 필요하다.

 

StringTokenizer

문자열을 자르는데 사용한다. 구분자를 지정할 수 있고, 구분자를 버리거나 사용할 수 있다.

 

BigInteger

값의 표현을 기본형보다 많이 할 수 있다.

add, subtract, multiply, divide, remainder

 

BigDecimal

정확한 실수형을 다룰 때 사용한다. 생성자는 0.1보다는 "0.1" 로 표현하는것이 오차가 발생하지 않는다.

 

 

 


 

 

 

 

 

 

반응형
반응형

본 글은 책 자바의 정석을 ref 하여 요약한 글입니다.


 

책의 내용은 아니지만 가장 먼저 절차적 프로그래밍과 객체지향 프로그래밍의 차이를 비교하고자 한다.

절차적 프로그래밍의 경우 공유 데이터 하나를 여러 함수를 통해서 조작하게 된다.

객체지향 프로그래밍에서는 객체는 자신의 데이터(상태)를 갖고 있고 이를 메서드를 통해 다른 객체와 상호작용한다.

데이터를 어떻게 다루냐에 있어서 차이가 있다.

 

절차적 프로그래밍 - 데이터, 함수가 분리

객체지향 프로그래밍 - 데이터, 함수가 결합

 


 

클래스와 객체

클래스 - 설계도, 데이터와 함수의 결합

객체 - 설계도에 따라 heap 영역에 인스턴스가 생성된 상태

* 자신을 참조하는 참조 변수가 없는 경우 인스턴스는 garbage collector에 의해 메모리에서 제거된다.

 

구성요소

속성 - 객체의 상태 값

기능 - 메서드

 

변수

클래스 변수 - 클래스가 메모리에 올라갈 때 생성

인스턴스 변수 - 인스턴스가 생성되면 생성

지역 변수 - 메서드가 호출되면 생성되었다가 메서드가 종료되면 소멸

 

메서드 

중복된 코드를 재사용하며 구조화

인자로 주거나 결괏값을 받을 때 자동 형 변환이 되는 type으로 지정, 안된다면 형 변환 후 넘긴다.

 

JVM 메모리 구조

메서드 영역 - 클래스 변수, 클래스 정보

힙 영역 - 생성된 인스턴스 

스택 영역 - 메서드(stack frame) 스택에 생성되고 처리 후 비운다.

 

기본형 매개변수와 참조형 매개변수

자바는 call by reference가 없다. 전부 call by value이며, 참조형 매개변수는 메모리의 주소가 아닌 객체 참조값을 넘긴다.

 

클래스(static) 메서드

인스턴스를 생성하지 않아도 사용 가능

클래스 메서드에는 인스턴스 변수를 사용할 수 없다. (클래스 메서드가 먼저 메모리에 올라감)

 

오버 로딩

같은 이름의 메서드명으로 인자의 type, 개수를 다르게 하여 여러 개의 메서드를 정의(리턴 타입은 영향 없다)

 

오버 라이딩

부모에게 상속받은 메서드를 재정의하여 사용한다.

이름, 매개변수, 리턴 타입이 같아야 한다.

 

생성자

객체의 인스턴스 변수를 초기화한다.

클래스의 이름과 같아야 한다.

기본 생성자는 컴파일러가 추가한다. 생성자를 하나라도 정의했다면 개발자가 기본 생성자를 작성해주어야 한다.

this() - 생성자 내부에서 다른 생성자를 호출한다. 가장 첫 줄에 작성한다.

 


 

상속

부모의 생성자, 초기화 블록을 제외한 멤버(속성, 기능)를 물려받는다.

** private로 선언된 멤버는 상속되지 않는다.  (super로 접근하여 사용한다.)

** 부모 자식 클래스가 다른 패키지라면 default로 선언된 멤버는 상속되지 않는다.

** 자식 클래스 내부 - super.getter, super.setter || 외부 - getter, setter 

자바에서는 단일 상속만을 허용한다.

 

클래스 간의 관계

포함관계 (has) - 상속하여 사용하지 않고, 속성에 다른 객체를 포함하여 해당 객체의 멤버를 사용한다.

상속관계 (is) - 상속관계라고 하지만 소속 관계라고 이해하고 있다.

 

super

부모, 자식과의 변수명이 같을 때 super, this를 이용해서 구분해줄 수 있다.

변수뿐만 아니라 오버 라이딩한 메서드의 구분도 가능하다.

super() - 부모 생성자를 호출하여 상속받은 부모 속성을 초기화할 수 있다. this()와 마찬가지로 가장 첫 줄에 위치한다. 

 


 

패키지

클래스들의 묶음

클래스의 실제 이름은 패키지명을 포함

클래스 파일을 압축한 것이 jar

 

import

패키지가 다른 클래스를 사용할 때 패키 지명이 포함된 클래스를 작성하는 것이 불편해서 import를 이용한다.

import를 하게 되면 클래스명 만으로 사용 가능하다.

 

제어자

static - 클래스가 메서드 영역에 로드될 때 같이 로드된다. (속성, 메서드)

final - 변경될 수 없다는 의미 (클래스, 메서드, 변수)

abstract - 미완성의 의미 (클래스, 메서드)

 

접근제어자

public - 제한 없음

protected - 다른 패키지여도 상속한다면 사용이 가능하다. (클래스가 public 이어야 상속 후 protected 멤버 사용 가능)

default - 같은 패키지

private - 같은 클래스

 


 

다형성

하나의 참조타입로 여러 타입의 인스턴스를 사용 (클래스, 추상 클래스, 인터페이스)

업 캐스팅시 자식의 멤버는 사용할 수 없다. 오버 라이딩된 메서드는 사용 가능

참조 타입이 바뀌더라도 인스턴스는 바뀌지 않는다. (멤버 사용 범위가 달라질 뿐)

instanceof - 인스턴스를 이용해서 참조 타입으로 변환할 수 있는지 확인한다.

ex) 참조 변수(인스턴스) instanceof 참조 타입

 

다형성의 주의점

** 메서드를 오버 라이딩했다면 항상 자손의 오버 라이딩 메서드를 사용한다.

** 부모 메서드의 접근 제한자보다 오버 라이딩한 자식 메서드를 더 강한 접근 제한자를 설정할 수 없다.

** 오버 라이딩 메서드 내부에서 자신의 속성을 사용할 수 있다. (this)

** 같은 이름의 속성은 참조 타입에 의존한다.

 


 

추상 클래스

클래스들의 공통부분을 추상화해놓는다.

추상 클래스는 추상 메서드를 갖는다.

생성자를 가질 수 있다.

인스턴스를 생성할 수 없다.

* 동작이 동일한 부분은 일반 메서드로 구현해놓는다.

* 공통 부분이지만 인스턴스에 따라 달라지는 메서드는 추상 메서드로 선언한다.

 

인터페이스

추상 메서드와 상수만을 가질 수 있다. (static, default 메서드를 가질 수 있지만 복잡성을 줄이기 위해 일단 이렇게 이해)

 


 

** 추상 클래스와 인터페이스의 차이

추상 클래스는 클래스의 상속(소속) 관점 - (공통 기능을 구현해줄 수 있다.)

인터페이스는 단순히 기능 관점 - (필요 기능을 명시해줄 수 있다.)

 

추상 클래스는 재사용성의 관점에서 유용

인터페이스는 교체의 관점 유용

 

(추상클래스) 동물 - 사자, 독수리  소속 관점

(인터페이스) 독수리와 벌의 flyable  기능 관점(소속이 달라도 기능이 같다.)

 

추상 클래스는 상태 변수 필드를 갖고 있다.

인터페이스는 상태 값을 갖지 못하고 상수만 갖고 있다.

 

 

** 인터페이스의 이해

사용부(클라이언트 코드)에서는 내부를 알 필요가 없다. 메서드만 알면 된다.

인스턴스가 변경되더라도 메서드명은 같다. 유지보수가 편하다.

 


 

내부 클래스

가장 먼저 외부 클래스는 프로그램이 실행되면 메서드 영역에 올라간다는 점을 알면 이해하기 편하다.

* static이 인스턴스보다 먼저 로드된다.

 

인스턴스 클래스 - 외부 클래스 인스턴스가 생성되어야 사용 가능, 외부 클래스의 private 멤버도 접근 가능

스태틱 클래스 - 외부 클래스 인스턴스가 생성되지 않아도 사용 가능, 인스턴스 멤버에 접근 불가(static은 먼저 로드되기 때문)

지역 클래스 - 메서드가 종료되면 메서드 내부 지역변수지역 클래스가 알 수 없으므로 상수만 사용 가능하다. (지역 변수는 소멸될 가능성)

 

익명 클래스

하나의 객체만을 생성하는 일회용 클래스, 생성된 객체는 계속 사용할 수 있다. 설계도가 1회성

클래스를 상속받거나 인터페이스를 구현하여 사용한다.

람다식에 유용하게 사용된다.

 

 


 

 

 

 

 

 

 

 

 

반응형
반응형

본 글은 책 자바의 정석을 ref 하여 요약한 내용입니다.


연산자와 피연산자

연산자에 따라 피연산자의 필요 개수가 달라진다.

* 부호 연산자인 - 경우 피연산자가 1개 필요

* 뺄셈 연산자인 - 경우 피연산자가 2개 필요

 

연산자의 종류

산술 - 사칙연산과 나머지 연산자

비교 - 크기 비교 연산자 

논리 - true, false 결과가 나오는 연산자

대입 - 대입 연산자

기타 - 삼항 연산자

 

연산자 우선순위

우선순위는 산술, 비교, 논리, 대입 순서로 연산된다.

우선순위는 외우는 것 보다는 자연스럽게 생각해도 되며, 필요하다면 괄호를 사용한다.

단항 연산자는 우선순위가 가장 높다는 것을 기억하고 있으면 좋다.

단항, 대입을 제외한 나머지는 연산 순서가 왼쪽에서 오른쪽

 

산술 변환

이항 연산자에서 두 타입이 다르면 타입을 큰 타입으로 일치시킨다.

단, short + byte 같은 정수 연산의 경우 int 연산이 JVM 스택 연산에 가장 효율적이므로 int로 변환된다.

 


 

단항 연산자

전위형(++i), 후위형(i++) 이 있으며, 후위형은 세미콜론; 을 기준으로 실행이 된 이후에 증가시킨다고 생각

부호 표시 연산자

 

산술 연산자

기본적인 사칙연산 순서를 따르며, 나누기를 할 때 0으로 나누는 것을 주의

계산 후 오버플로우가 예상되면 미리 한쪽을 큰 타입으로 형 변환 후 연산한다.

 

비교 연산자

이항 연산자이므로 타입이 맞지 않을 경우 큰 타입으로 변환시킨다.

등가 연산자는 참조 변수를 비교할 경우 객체의 참조값을 비교한다.

 

논리 연산자

&& 가 || 보다 우선순위가 높다.

논리 연산자는 효율적인 연산을 한다. && 라면 좌측만 보고도 false라면 false로 취급한다.

 

대입 연산자

lvalue는 변수처럼 값을 변경할 수 있는 것이어야 한다. rvalue는 변수, 식, 상수 전부 가능하다.

복합 대입 연산자가 가능하다 *=, -= ...

 

 


 

if

조건식의 결과는 반드시 true, false 여야 한다.

* if문을 종료조건으로 사용하면 중첩 블록을 유지하지 않아도 되기 때문에 코드를 깔끔하게 짤 수 있다.

 

switch

조건식, case, break

case에 해당되지 않으면 default

break가 없으면 아래 case도 실행

* case - 변수, 실수 사용 불가능

 

for

초기화, 조건식, 증감식

 

향상된 for문

(타입 변수 : 배열 or 컬렉션)

 

while

조건식이 true이면 계속 실행

* 조건식을 생략할 수 없다.

 

do while

do 블럭을 무조건 1번 실행, 이후 조건문을 확인

 

break

자신이 포함된 가까운 반복문을 멈춘다

 

continue

아래 코드는 실행하지 않은 채 다음 반복으로 진행한다.

 

이름있는 반복문

loop1: for...

* break loop1, continue loop1 

 

 


 

배열

같은 타입의 묶음

저장공간이 연속적으로 배치

index는 0부터 length-1 까지

배열의 크기를 넘어서면 ArrayIndexOutOfBoundException 예외 발생

한번 지정된 배열의 크기는 변경할 수 없다. 새로운 배열을 생성 후 값을 복사해줘야한다.

참조형 배열일 경우 각 요소에 저장되는 값은 참조값이다.

 

다차원 배열

new int[row][col]

row는 수직, col은 수평으로 생각하면 이해하기 쉽다.

각 row는 col[배열]의 참조값을 갖고 있다.

 

 


 

 

 

반응형
반응형

본 글은 책 자바의 정석을 ref 하며, 요약한 내용입니다.


 

✔ 자바는 객체지향 언어이다. (상속, 추상화, 캡슐화, 다형성)

✔ 풍부한 JAVA API 라이브러리를 제공한다.

✔ 자바 app은 JVM과 상호작용한다. 

 

JVM

소프트웨어로 구현된 하드웨어

자바가 실행되기 위해선 JVM이 필수적

운영체제에 종속적이다. (Write once, Run everywhere)

 

JRE(java runtime environment)

JVM + 자바 프로그램을 실행하는 도구들

* JRE가 설치되어 있다면 어떤 환경에서든지 자바 소스 파일을 실행할 수 있다.

* 개발이 필요없는 단계라면 JRE만으로 프로그램을 실행할 수 있다.

 

JDK(java devlopment kit)

JRE(java runtime environment) + JAVA API + 컴파일러.. (개발에 필요한 도구)

 

자바 프로그램 실행 과정

자바 app은 실행할 때 main 메서드를 시작점으로 한다.

Sample.java -> (javac.exe)(컴파일러) -> Sample.class -> (java.exe)(인터프리터) -> 프로그램 실행

 

 


 

변수

메모리 공간에 이름을 붙여주는 것

변수 타입에 맞게 메모리를 확보

 

변수의 초기화

이전에 사용했던 garbage value가 남아 있을 수 있어서 사용하기 이전에 초기화해주는 것이 바람직

* 전역 변수는 초기화 생략 가능

* 지역 변수는 반드시 초기화

 

변수의 종류

기본형 - boolean, byte, short, int, long, float, double, char

참조형 - 배열, 열거, 클래스, 인터페이스

* boolean을 제외한 나머지 7개의 기본형 타입은 서로 변환이 가능

* char 은 유니코드 체계를 위해 2byte (유니코드 정수 값이 저장된다)

* char과 shrot는 같은 2byte이지만 범위가 다르다.

* JVM 스택 연산에 4byte를 사용하므로 byte, short보다 int 형이 유리하다.

* 정수형 타입 크기를 벗어나면 overflow가 발생한다.

* 실수형 타입 float - 정밀도 7자리, double - 15자리

 

String 결합

한쪽이 String 이고, 연산자가 + 로 연결되어있다면 다른 한쪽도 String으로 만든 후 결합

 

printf

%5d  -  5칸 오른쪽정렬

%-5d  -  5칸 왼쪽 정렬

%14.10f  -  14칸. 소수점 이하 10칸

 

word

cpu가 한 번에 처리할 수 있는 데이터의 크기 32bit, 64bit

 

2진법, 8진법, 16진법

2진법 - 컴퓨터는 전기가 흐르면 1 흐르지 않으면 0

2진법을 이용하여 10진법, 8진법, 16진법 변환

 

실수의 진법 변환

소수부에 2를 계속 곱하여 0이 될 때까지 반복, 결과의 정수부 나열

 

2의 보수

N의 보수: 자릿수를 한자리 증가시키는, 더해서 0으로 만드는 수

ex) 숫자 73의 10의 보수 = 37 (73과 37은 보수관계)

 

✔ 보수에서는 자릿수가 중요하다.

만약 10진수가 2자리를 표현한다면 73과 37은 보수관계가 맞다. (73+37 = 100) "1"00 표현 불가

하지만 10진수가 3자리를 표현한다면 73과 937이 보수관계이다. (73+937 = 1000) "1"000 표현 불가

 

2의 보수에서는 MSB가 0이면 양수, 1이면 음수로 구분한다.

4자리 이진수에서는 0011의 2의 보수는 1101 (0011과 1101은 보수관계)

4자리 2의 보수 체계에서 1101은 십진수 -3의 역할을 한다.

십진수로 3인 0011의 반대 값은 -3인 1101

 

-3일 때 3의 보수(1101)를 구하고 더하면 -3의 효과를 낸다.

* 2의 보수 구하기 = 1의 보수 +1

 

오버플로우

4 자릿수의 bit체계에서 0111과 0001을 더하면 1000이 된다. MSB가 1이므로 음수다. 1000은 -8이다.

7+1의 결과는 8인데, 결과가 -8이 나왔다. 이를 표현 숫자 범위를 벗어난 오버플로우라고 한다.

 

인코딩과 디코딩

인코딩 - 문자를 숫자(지정된 바이트)로 

디코딩 - 숫자(지정된  바이트)를 문자로

디코딩을 하기 위해선 어떻게 인코딩했는지 알아야 한다.

 

UTF-8 UTF-16

UTF-8 -> 가변크기 1~4 byte 표현 (웹문서에서 유리, 아스키 코드와 호환됨, 대부분 프로그램의 Default)

* 110XXXXX 10XXXXXX 10XXXXXX

* 한 문자를 표현할 때 3Byte를 써야하는 경우 -> 110을 시작으로하고, 나머지 Byte는 10으로 시작.

* 110으로 문자 시작을 알림

UTF-16 -> 고정크기 2byte 표현 (자바에서 사용)

 

형 변환

기본형과 참조형 간의 형 변환은 불가능

더 큰 타입으로 대입될 때는 묵시적 형 변환, 작은 타입으로 대입될 때는 값이 손실되며 명시적 형 변환

 

정수형 -> 실수형 : 정밀도 제한으로 오차 발생 

실수형 -> 정수형 : 정수부만 저장

* byte < short < int < long < float < double

 

 


 

 

 

 

반응형
반응형

 

 

JAVA SE 위에서 동작하는 기업형 응용 프로그램 (JAVA EE or SPRING)

현재는 EE가 유료이므로, SPRING을 주로 사용한다.

 

스프링의 대표 기능

MVC(DI), TRANSACTION(AOP), 인증과 권한(FILTER)

 

 


DI와 IOC컨테이너

객체를 생성해주고 인터페이스를 통해 조립해준다.

bean으로 생성하고, 인터페이스에 맞는 bean을 주입한다.

 

✔ IOC(inversion of control) 컨테이너라고 하는 이유

(1) 기존 프로그래밍

A -> B -> C -> D

A에서 B객체를 생성, B에서 C 객체를 생성, C에서 D객체를 생성

 

(2) 스프링 컨테이너

D -> C -> B -> A

D를 C에 주입, C를 B에 주입, B를 A에 주입

 

 

IOC 컨테이너의 사용

ApplicationContext - 스프링 설정 지시서를 읽는 인터페이스

구현체

ClassPathXmlApplicationContext ( " 스프링 bean 설정.xml ")  // 지시서가 xml로 설정되어있는 경우

AnnotationConfigApplicationContext ( ConfigClass.class ) // @Configuration 지정 클래스

 

 

컨테이너에서 Bean을 사용하기

(1) class로 꺼내기: 참조 인터페이스 타입 = context.getBean(클래스.class)

* 구현체.class 를 적으면 구현체를 가져오고, 인터페이스를 적으면 인터페이스에 지정된 구현체를 가져온다.

(2) id로 꺼내기: 참조 인터페이스 타입 = (bean 형변환 필요) context.getBean("bean name")

 

 

의존 객체로 Bean을 사용하기

@Autowierd  - 생성자 주입, 필드 주입, setter주입 

* 인터페이스에 맞는 구현체 Bean을 사용한다.

@Qualifier("id") 

* Configuration에서 bean 생성, class에 @Component도 달아준 경우 (인터페이스에 맞는 Bean이 여러 개 일 때)

id로 지정해서 하나의 Bean만 사용할 수 있게 한다.

id를 지정하지 않았다면 맨 앞 클래스명을 소문자로 사용

XML - 생성자 주입, 필드 주입, setter주입 설정 필요

 

 

컴포넌트 스캔을 통해 어노테이션 지정 객체 생성

xml에서 Bean으로 등록되지 않은 클래스는 사용할 수가 없다.

 

@Component는 xml에 Bean으로 등록되지 않아도 스프링 컨테이너에 Bean으로 등록시킬 수 있다.

대신 xml에 <context: component scan base-package=" 베이스 패키지 "> 컴포넌트 스캔으로 Bean의 생성이 필요하다.

<context:annotation-config> 도 필요 없어진다.

<context:annotation-config> : 등록된 Bean에 대해서 어노테이션(@Autowired, @Qualifier) 활성화

 

 

Xml사용 없이 스프링 컨테이너의 관리 

@ComponentScan(" {base-package 패키지명, 패키지명 } ")  // 컴포넌트 스캔으로 Bean을 생성

@Configuration  //  내, 외부 라이브러리 Bean을 생성, 주로 외부 라이브러리 클래스 Bean 생성

 

@Bean  // 함수명이 id로 사용

반환 타입 class

return new 구현체

@Configuration
@ComponentScan({"com.ky.test"})
class Config{
    @Bean
    public RClass rc() {
        return new RClass();
    }
}

RClass로 생성해놓고, RClass가 구현하고 있는 interface에 @Autowired를 지정하면 자동 바인딩된다.

 

 

@Bean과 @Component 차이

@Bean - 외부 라이브러리 클래스를 Bean으로 등록할 때

@Component - 직접 설계한 class를 Bean으로 등록할 때

 

 

 


AOP

주 업무 로직과 공통 관점 로직을 분리하여 유지보수성, 응집도를 높인다.

로그 처리, 트랜잭션 처리, 보안 처리

 

Advice : 공통 관점 로직 적용 시점 - Befor, After, Around.. (어느 위치에 끼어들건지)

JoinPoint : 주 업무 로직 

PointCut : 적용 대상 JoinPoint 선별(위빙)

Weaving : 주요 관점에 공통 관점을 엮는 행위 

Aspect (Advisor) : 객체, 공통 관점 사항, Advice + PointCut (어떤 대상에, 어느 위치에)

 

 "(주 업무1)JoinPoint"에 "(PointCut1)"을 "weaving"하겠다. 

 

 

프록시를 이용한 aop 구현

xml

<proxy bean class="...ProxyFactoryBean" >

    <property name="target" ref= " aop 적용할 객체 ">

    <property name="interceptorNames">

        <list> 공통 관점 로직 구현 객체 </list>

 

공통 관점 객체는 인터페이스 구현 

MethodInterceptor - invoke 메서드 

MethodBeforeAdvice - before 메서드 

AtferReturningAdvice - afterReturning 메서드 ThrowsAdvice - afterThrowing 메서드 (처리할 예외 지정)

 

 

 


 

intellij 환경설정

 

프로젝트 설정: gradle project, web

톰캣 설정: add configuration - tomcat server - local - artifact 

* 톰캣 설정 후 gradle 빌드 설정

 

 

Artifact : 서버에서 실행할 파일, 프로젝트 결과물

archive

압축된 채로 배포, was에 의해 해제

한 개의 파일만 전송

 

exploded

압축 해제된 디렉터리 상태로 배포

원본 소스를 건드리지 않은 채로 배포

 

 

war, jar

https://server-engineer.tistory.com/315

 

JAR와 WAR

# JAR와 WAR JAR와 WAR와 EAR은 압축파일의 한 유형(Format)이다. # 단위 class < jar < war < ear # 확장자 - 일반파일 압축 :  zip - 클래스파일을 압축 : jar - 웹어플리케이션을 통째로 압축 : war - j..

server-engineer.tistory.com

 


프로젝트 설정 xml

web.xml

dispatcher-servlet.xml

applicationContext.xml

 

https://mrgamza.tistory.com/729

 

IntelliJ. spring-webmvc + gradle + tomcat. web application 구조로 만들기

이전에 글을 남길때는 gradle을 선택하고 Java만 선택한 이후에 web은 선택하지 않고 프로젝트를 세팅하였습니다. web을 선택하여서 main아래에 webapp이 노출되는 방식으로 한번 설명해 보겠습니다. Sp

mrgamza.tistory.com

 


 

servlet/jsp와 스프링의 차이

(1) 톰캣.xml에는 dispatcher-servlet만 올리고, dispatcher-servlet.xml에서 servlet, service, mybatis, security 설정을 한다.

톰캣은 모든 URL을 dispatcher-servlet에게 전달한다.

 

(2) 기존 Dispatcher & Controller 기능이 합쳐진 여러 개의 HttpServlet을 구현한 Servlet 상태에서

하나의 Front Controller Servlet만 두고 jsp로 향하는 Dispatcher forward를 담당하게 하고,

Contoller는 POJO JAVA로 구성하여 Model 데이터 처리를 진행 후 Model, View를 Front Controller로 돌려주게 한다.

 


 

URL pattern

스프링에서는 모든 URL요청이 dispatcher-servlet을 통해 요청과 응답이 돼야 한다.

하지만, pattern을 " / "로 지정하고  "jsp 경로"로 요청하게 되면 jsp 화면을 바로 보여준다. view를 바로 보여주면 안 된다.

그래서 pattern을 " /* "로 지정하고 모든 요청이 dispatcher-servlet을 무조건 거치게 한다.

 

이 과정에서 WEB-INF 경로 안에 dispatcher-servlet.xml에 URL과 매핑된 bean 있어야 한다. (물론 어노테이션도 가능)

* <bean> - id /URL (실제 controller의 경로가 아닌 URL) , 클래스/implements Controller 

해당 빈은 URL이 요청되면 Controller 인터페이스 ModelAndView handlerRequest 메서드를 호출한다.

 

pattern을 " /* " 사용했을 때도 문제가 발생한다. ModelAndView에서 View를 보여줄 때 jsp파일을 한번 더 요청을 하게 되는데

이때는 jsp 파일 경로로 접근해야 되는데 모든 요청을 distpatcher-servlet을 타게 했으므로 문제가 발생한다.

 

그래서 pattern을 다시 " / "로 만들어주고, URL에 매핑되는 컨트롤러가 없다면 webapp 파일을 이용할 수 있게 한다.

URL 우선순위: URL은 매핑된 contoller가 있다면 contoller를 실행하고, 없다면 webapp 파일을 요청한다.

여기까지는 기존 " / " pattern과 같다.

 

view를 바로 보여줄 수 없도록 하는 방법으로 WEB-INF 경로가 등장했다.

 

WEB-INF

비공개 영역. URL 요청이 view로 바로 접근할 수 없도록 숨긴다.

숨기는 이유는 controller에서 요청을 받아 처리하고, 페이지를 보여줘야 한다. view 페이지로 바로 접근하면 안 된다.

클라이언트에서는 접근이 불가능하고, 서버 쪽에서는 접근이 가능하다.

 

View Resolver

view 파일들의 경로가 길어졌다. 이를 해결하기 위해 만들어짐. view 경로의 복잡성을 줄인다.

view를 찾을 때 절대 경로로 찾게끔 만들어둔다.

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

 

static 파일

정적 파일들은 servlet이 아니기 때문에 default pattern도 뚫지 못하여, 경로로 요청해도 막힌다. (jsp는 되는데, html은 안되는 이유)

이를 해결하기 위한 방법이 있다.

설정하게되면 정적 파일을 클라이언트에서 요청할 수 있다.

<mvc:resources mapping="/**" location="/static/" />

 

기본적인 프로젝트 환경 설정이 완료되었다.

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

ES5 와 ES6의 변화

 

템플릿 리터럴: console.log( ` 이름은 ${name} 나이는 ${age} `);   # 백틱

익명 함수 표현식 변경:  (a, b) => { console.log( a+b ); };   // 자바 람다식과 비슷

this: ES5에서는 window 객체를 말함, ES6에서는 자신을 둘러싸는 this를 말함

변수: let, const 추가

클래스: 클래스 키워드 추가, 생성자, 메서드, 상속, instanceof

 

 


 

 

 

https://github.com/newlecture/javascript-dom-programming-example

 

GitHub - newlecture/javascript-dom-programming-example

Contribute to newlecture/javascript-dom-programming-example development by creating an account on GitHub.

github.com

 

 

 


자바스크립트

 

✔ 데이터 타입

var과 let의 차이

var는 블록 스코프가 없다.   let은 있다.

var는 중복 변수 사용이 허용된다.(첫번째것 사용)    let은 허용되지 않는다.

var 사용은 자제

 

원시형 타입이 메서드를 사용할 때 순간적으로 Wrapper type이 되었다가

다시 원시형 타입으로 돌아온다.

 

Wrapper type: Boolean, Number(정수, 실수), String(문자, 문자열)

 

 

 

undefined & null

undefined: 선언만 하고 값이 할당되지 않은 상태

null: 빈 값이라고 명시

 

 

 

연산자

==  값의 비교  (타입 변경해서 비교)

===  값 & 타입의 비교

 

 

 

함수

자바스크립트에서는 함수도 객체의 일종

하나의 값으로 취급을 한다. 

함수가 다른 함수의 인수로도 넣어지고, 

함수를 리턴할 수도 있다.

 

(1) let f = new Function("매개 인자", "실행문;")

(2) let f = function (x, y) {  }      # 호이스팅 된다.

(3) function f(x, y){  }

(4) let f = (x, y) => {  }

 

함수의 매개 인자는 사실 큰 의미가없다. 전달 받아진 값은 전부 저장한다.

전달된 가변인자는 arguments[index]로 사용가능

 

특이한점

자바와는 다르게 변수를 전역으로 선언하고

함수 내부에서 매개변수로 넘겨주지 않아도, 해당 변수를 사용할 수 있다. (마치 Object처럼) 

변수를 전역으로 선언하면 어디서나 접근 가능 (while, if, else 뿐만 아니라 function에서도)

 

 

함수 즉시 실행 IIEF

(function( ){

})()

 

 

 

✔메서드

객체에 포함되어 있는 함수는 메서드라고 한다.

Math.floor()

 

 

 

배열

let arr = new Array()

let arr = []

한 배열에 여러 타입을 담을 수 있다.

 

메서드

length()

pop(), push(), shift(), unshift()

slice(start, end)

concat()

indexOf(), lastIndexOf(), includes()

 

for in 은 모든 프로퍼티를 순회하므로 성능 저하. 배열에서는 for of 사용 권장

 

 

 

Object (Map 형태)

let obj = new Object()

let obj = {}

객체는 key : value 프로퍼티를 저장한다.

 

let obj = {name: 'name'}

key: value  # 내부에서는 = 을 사용하지 않고 : 사용

 

다른 언어와 다르게 먼저 정의를 하지 않고 객체를 만든 이후 정의할 수 있다.

(1)   obj.math = 50; 

(2)   obj['math'] = 50 

 

Object의 프로퍼티 키는 항상 문자열이거나, 심볼형이어야 한다.

심볼은 유일성이 보장되는 자료형, 식별자로 사용된다.

함수도 프로퍼티로 저장할 수 있다.

 

this

자바스크립트 this는 런타임때 결정된다.

this가 있는 메서드를 사용하는 객체의 것을 사용한다.

** this 가 화살표 함수 안에서 사용되면 화살표 함수를 감싸는 함수의 this를 사용한다.

 

생성자 함수 

객체의 생성을 해주는 함수다.

규칙: 대문자로 시작, 생성할 땐 new Person()

 

 

 

Class

사용 방법은 자바와 굉장히 유사

 

캡슐화

getter & setter로 접근한다.

   get ---> instanceName.value1   set ---> instanceName.value1= 'value'

프로퍼티를 부르거나, 값을 할당할 때 get, set이 호출되어 사용하므로 캡슐화가 가능하다.

 

class test{
  constructor(value1) {
    this.value1 = value1;
  }

  get value1(){
    return this._value1;
  }

  set value1(value1){
    this._value1 = value1;
  }
}

주의점: get, set 함수 내부에서 this.value1를 사용하면 다시 get이 호출되고, 순환 참조가 발생하므로 this._value1를 사용

** 함수명은 필드 접근 방법이고, 내부적으로는 _value에 값을 저장

 

static

static 필드와 static 메서드가 있다.

 

상속

extends 키워드로 상속한다.

메서드 오버라이딩이 된다.  super() 키워드도 사용 가능

instanceof로 인스턴스 타입 검사도 가능

 

 

 

JSON(javascript object notation)

자바스크립트 오브젝트를 String으로 표현한 방식

표현식을 간단하게 할 수 있다. 사용 방법이 간단하여 다목적으로 사용됨.

 

문자열, 문자는 전부 ' ' 로 표기하는 것이 html " " 과의 충돌 방지가 된다.

 

object내부의 메서드, 심볼, undefined는 무시된다.

 

 

 

JSON 파서

JSON 데이터가 문자열로 왔을 때 사용한다.

 

eval()

eval("var aa = 50;")

eval("var bb =" + data + ";")

 

parse() 

json -> object

 

stringify()

JSON.stringify("{id : 50 , name = "cha" }") ==> {"id":50, "name" = "cha"}

object -> json

 

 

 

 


 

 

제어문

다른 언어와 제어문은 동일하다.

 

for Key in Object

[배열일 경우 index], [object일 경우 key]

 

for Element of Array

배열일 경우 사용 권장

 

 

 

 

호이스팅

<script> 지역내 모든 선언된 function은 상단에서 먼저 선언 된다. 

 

함수 표현식 - 값처럼 선언을 하면 먼저 선언되지 않고 실행 흐름에 맞게 선언된다.

블록 스코프 안에서 선언된 경우이다.

 

 

 

✔프로토타입

일종의 템플릿 객체

종류별로 해당되는 종류가 같이 공유하는 객체이다. 

따로 생성하지 않고, 하나의 프로토타입 메서드를 거치면 이용하면 효율적이기 때문이다.

Array.prototype.adddddd = () => "추가"

 

 

 


DOM을 다루기 전 준비

 

브라우저 객체(BOM)

window

window.history

window.location

window.document

 

DOM(Document Object Model)

BOM(Browser Object Model)의 하위

html 요소들을 객체화(js object)하여 js가 조작할 수 있게 함

 

요소 객체 정보 보기

console.dir(요소)

 


 

 

이벤트 조작

(1) html 속성에 이벤트 동작

html 태그에 속성 onclick = 함수() 

html에 스크립트 코드를 적어 사용하게 할 수 있다.

js 와 html 이 결합되어 좋은 방식은 아니다.

 

(2) id, class, name으로 접근하여 이벤트 동작

html과 js가 분리

 

 

 

JS 코드 초기화

(defer src 사용하면 쓰지않아도 된다.)

윈도우가 로드가 완료되었을 때 js를 로드 시킨다.

window.onload는 덮어씌우기 때문에 이전 js 파일을 동작시키지 않는다.

addEventListener는 중복으로 정의해도 누적되어 정상동작한다.

window.addEventListener("load", function(){ // load 이후 동작, 여러 load를 누적시킨다.
         
            };
});

 

 

JS 코드 분리

<script defer src =" js파일 경로 "  ></script>

 


노드

 

노드의 Type

document(노드의 최상위)

document type - 옛날에는 DOM type이 여러개였다.

element(태그) - attr(태그안 속성), entity(예약어 - lt, gt < >), entityReference(예약어 사용 보조 & ;), text

comment - 주석

cdata section(예약어를 많이 사용할 때 감싸서 편하게 사용)

notation(속성의 값 - #ffff,px)

 

 

 

✔ 노드 선택

querySelector()   첫번째 하나만 가져옴

querySelectorAll()   배열로 전부 가져옴

 

클래스 선택: document.querySelector(".class")

id 선택: document.querySelector("#id")

태그 선택: div1.querySelector("태그") 

태그 속성 선택: document.querySelector("input[name='x']") 

 - css 셀렉터 방식이 된다.

 

 

지역화 노드 선택

let qs = querySelector() 를 통해 (지역화를 시키고)

qs.querySelector()를 통해 자식 노드를 가져올 수 있다. (지역화 내에서 가져오기)

 

id - 유일

("#id")

class - 여러개 지정 가능

(".class")

name - 여러개 지정 가능

(input[name="name"]) 

 - id로 지역화 시키고, class, 태그를 사용하는 방식

 

 

 

노드의 부모, 자식

parentElement: 부모 노드로 이동할 수 있다. 자식 노드 전부 포함

childNode: Element, 공백, 주석, 텍스트도 모든 Node로 포함

children: Element만 자식으로 포함

배열로 사용된다.

 

 

 

 

노드 추가

노드 생성 기능은 document 객체가 갖고 있다.

태그, 텍스트를 주로 생성한다.

 

 

append(텍스트 or 노드 ...)

appendChild는 인자로 노드만 받는다.

 - 배열을 추가해도 자식 노드의 가장 아래에 붙기 때문에 array 순서가 맞는다.

 

 

 

innerHTML 이용 (사용 권장 x)

innerHTML += 은 가져온 후 수정한 후 돌려준다.  이 방식은 성능 이슈를 일으킨다.

 

매번 노드를 create하는 방식 보다 innerHTML을 이용해서 생성

let new1 =  '<a href="">' + data + '</a>';

var li2 = document.createElement("li");

li2.innerHTML = new1;

div.append(li2);

 - 가장 밖 태그를 document.create로 만든 후 innerHTML로 붙여주는 방식

 

 

 

insertAdjacentHMTL

append()와 같이 문자열을 html로 만들어 준다.

let str = '<li><p>text</p></li>';

ul1.insertAdjacentHTML("afterbegin", str);

 - append(), insertAdjacentHMTL()가 유용

 

 

 

✔ 노드 삭제

노드.remove()

부모를 통해 접근하지 않고 바로 지울 수 있다. 

하위 노드들도 모두 삭제

 

 

 

노드 복제

cloneNode(true) - 내부 태그까지 전부 복사한다.

cloneNode(false) - 껍데기만 복사한다.

 

template

복사할 태그가 없을 수도 있으므로 html <template></template> 태그를 이용해줄 수 있다.

template 태그는 화면에 보이지 않고, 복제를 위해 이용된다.

template 태그 하위를 querySelector를 쓰려면 .content를 사용해야 한다. 또는 importNode

 

 

 

노드 삽입 및 대체

모든 노드 선택              태그 노드만 선택

parentNode               parentElementNode

firstChild                     firstElementChild

lastChild                      lastElementChild

previousSibling        previousElementSibling

nextSibling                 nextElementSibling

 

부모노드.insertBefore(삽입 노드, 기준 노드) // 기준 노드 앞에 insert

 

 

기준노드.insertAdjacentElement(position, node)

position - beforbegin, <target> afterbegin, beforeend, </target> afterend

 

 

insertAdjacentElement, insertAdjacentHMTL

자주 사용되고 편하다.

 

 

 

HTML 태그 이용 & CSS스타일 변경

node.src = 경로

일반적으로 HTML의 속성과 노드 속성의 이름이 일치한다.

 

node.style.border = "100px"

css는 style을 명시해줘야함

 

카멜 케이스로 css style 변경 가능 (수치 단위도 같이 넣어줘야한다.)

img.style.borderColor = "#ffffff"


이벤트 객체

 

✔ 이벤트 객체에 따라서 갖고 있는 기능이 다르다.

keyboardEvent, inputEvent, mouseEvent, focusEvent, compositionEvent

상위 인터페이스인 Event를 전부 상속 받았다.

 

 

target (이벤트 발생 정보)

클릭이 발생하면 event 객체가 전달된다. 이벤트 객체에는 이벤트의 정보가 있다.

function(event){

    event.target.태그

}

 

 

이벤트 버블링

하위 태그를 클릭하면 상위 태그들에게도 이벤트가 전파된다.

상위 태그로 전파되므로 상위 태그에서 이벤트를 잡아서 처리하면 여러 하위 태그의 이벤트를 한번에 처리해줄 수 있다.

event 객체가 클릭된 하위 태그 정보를 갖고 있다.

 

 

e.target.classList.contains("사용할 class")

bookBinding.addEventListener("click", (event) => {
  if(!event.target.classList.contains("loanBtn"))
    return;

특히, 동적으로 생성된 HTML에 addEventListner는 동작하지 않는다.

이벤트 버블링으로 동적 생성 되지않은 태그에서 이벤트를 처리해주어야 한다.

 

 

버블링 멈추기 & 태그 기본행위 막기

event.stopPropagation() 

상위태그로의 전파를 차단한다.

 

event.preventDefault()

a태그는 page load가 기본 행위, 이를 막아줄 수 있다.

 

 

 

이벤트 트리거

<input type="file"> 인 경우 브라우저에 따라 모양이 다르게 나온다.

일관되게 보이도록 다른 UI버튼을 만들어 <input type="file"> 이 동작하게 만든다.

 

트리거버튼.onclick = function(){

    var event = new MouseEvent("click", {

        'view' : window,

        'bubbles' : true,

        'cancelable' : true

    });

    트리거대상.dispatcherEvent(event);

};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'프로그래밍 > 자바스크립트' 카테고리의 다른 글

[JS] 콜백 함수, Promise, async-await  (0) 2022.09.05
반응형

톰캣 (WAS)

tcp/ip 소켓 연결관리, http 프로토콜 해석 등 프로그래머가 웹 구현을 쉽게할 수 있도록 기능을 제공해준다.

또한 서블릿 컨테이너를 관리한다.

 

서블릿, 스레드를 관리한다.

스레드로 URL 요청에 맞는 서블릿을 실행시킨다.

URL를 보고 해당되는 서블릿의 service()를 호출 

* 스프링에서의 동작은 URL을 단순히 Dispatcher Servlet에게 전부 준다.


 

서블릿

 

톰캣은 HttpServlet 을 상속한 servlet들을 알아보고 관리한다. (HttpServletRequest, HttpServletResponse)도 생성해준다.

extends HttpServlet

service()

 

service()에서 get, post를 처리해주던지, service()이후에 doGet(), doPost()를 정의

service()를 정의하지않고, doGet(), doPost()만 해주어도 가능하다. (HttpServlet) 상위에서 실행된다.

 

 


 

필터

서블릿 이전에 동작

 

[before servlet]

chain.doFilter(req, res) // 서블릿 동작

[after servlet]

 

@WebFilter("/")

 

 

 


 

JSP(jasper)

 

서블릿에서 동적인 html 페이지를 만들기 어려워서 등장한 것이 jsp

jsp도 서블릿을 상속받은 서블릿 구현체이다.

 

서블릿에서 html을 만들어서 writer로 응답해줄 수 있다.

request.setCharacterEncoding("UTF-8"); // 톰캣 인코딩
response.setCharacterEncoding("UTF-8"); // 인코딩
response.setContentType("text/html; UTF-8"); // 브라우저 디코딩

 

PrintWriter pw = response.getWriter();

pw.println(" html문서 작성하기 <br> ");
pw.println(" html 문서 제목 : html ");

 

Servlet에서 html코드를 작성하면

pw.println을 라인마다 전부 작성해줘야 하기 때문에 불편하다.

 


 

 

<%@ %> - 지시 블럭 (가장 먼저 설정됨)

<%! %> - 전역

<% %> - service() 내부

<%= %> - 출력을 위해 사용

 

JSP 위치

web-inf (비공개로 클라이언트가 바로 요청 불가능)

 

매핑

web. xml ==>  servlet mapping으로 url 패턴에 맞게 servlet class 를 호출 [WAS가 URL에 맞는 매핑을 찾아서 호출]

어노테이션 ===>  @WebServlet()

 


 

model 1 (JSP 한페이지에서 MVC를 물리적으로 나누는 방식)

 

[Controller]  jsp 위쪽은 자바코드 입력과 제어를 처리, model에 데이터를 저장

         ▼

   [Model]  자바코드를 통해 동적으로 보일 데이터

         ▼

    [View]  jsp 아래쪽은 html + model 데이터를 출력

 

 

 

model 2 (MVC를 servlet, JSP 로 분리)

 

[Controller]  실질적인 매핑 servlet은 하나만 만들고 Contoller(데이터 제어)는 pojo로 구현 ===> dispatcherServlet

         ▼

   [Model]  request 객체를 이용하여 저장, 전달

         ▼

    [View]  jsp는 제어 코드가 없는 view에 집중

 

 


 

 

Forward Redirect

Servlet에서 Servlet으로 이동하는 방식

 

(1) forward ==> request, response 객체를 공유함

사용자가 요청한 정보가 응답페이지에서도 유효하다.

새로고침 시 같은 정보가 계속 생성될 위험. 데이터 생성 서블릿을 한번 더 수행함 

URL이 바뀌지 않는다.

* request.getRequestDispatcher("webapp 이하 경로").forward(request, response)

 

(2) redirect ==> request, response 객체가 새로 생성됨

request, response 객체가 새로 생성됐기 때문에 새로고침을 해도 최초의 생성하는 request가 소멸되어 동작하지 않음

URL를 redirect URL로 바꾼다. 서버에 여러번 요청하게 된다.

* request.sendRedirect("location") 

 

 

https://mangkyu.tistory.com/51

 

[Web] Forward와 Redirect 차이

웹은 현재 작업중인 페이지에서 다른 페이지로 이동하기 위해 2가지 페이지 전환 기능을 제공합니다. 오늘은 2가지의 페이지 전환 방법의 차이와 사용법에 대해 알아보도록 하겠습니다. 1. Forward

mangkyu.tistory.com

 


 

 

EL (EL 태그는 값과 연산자를 사용할 수 있지만, 반복문같은 작업은 불가능)

request.getAttribute("data") ===> ${data}

List, Array ===> ${data[0]}

Map ===> ${data.key}

 

EL 태그 내부에서 연산자도 사용할 수 있다.

 

데이터 저장 4가지 방법

EL 데이터 명에 맞는 데이터를  page --> request --> session --> application 순으로 찾는다.

데이터 명이 겹칠 때 데이터명이 존재하면 그 값을 사용, 더 이상 찾지 않는다.

겹치게 될 경우 ${pageScope.data} ... Scope 를 붙여서 사용

 

dto를 이용할 경우

dto 객체의 getXXX() 메서드를 이용해서 값을 가져온다.

${dto.xxx}

 


 

JSTL

반복문을 사용할 수 있게 한다.

HTML이 JSTL문법인 것을 인지하도록 태그를 써줘야 한다.

 

속성

forEach

var - items의 변수

items - servlet 통해 가져온 데이터

varStatus - 상대값을 활용할 수 있다. 

 

https://postitforhooney.tistory.com/entry/JSPJSTL-JSTL-foreach%EC%97%90%EC%84%9C%EC%9D%98-varStatus-%EC%86%8D%EC%84%B1-%EC%9D%B4%EC%9A%A9

 

[JSP/JSTL] JSTL, foreach에서의 varStatus 속성 이용

JSTL : foreach에서의 varStatus 속성 태그 상태 속성 입니다. 속성을 이용해서 제어하면 좀더 쉽게 제어할수있습니다. ${status.current}      <!– 현재 아이템 –> ${status.index}      <!– 0부터..

postitforhooney.tistory.com

 

 

forTokens

delim - 구분자를 넣어줄 수 있다.

 

 

format

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

LocalDateTime format

<fmt:parseDate value="${ time }" pattern="yyyy-MM-dd" var="parsedDateTime" type="both" />
<fmt:formatDate pattern="yyyy-MM-dd" value="${parsedDateTime}"></fmt:formatDate>

number format

<fmt:formatNumber pattern="###.0000##" value="123.33"/>

 

 

functions

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

${ fn:toUpperCase(value) }

 

 


 

비즈니스 레이어

 

Controller : URL 에 맞는 Service 매칭

Service : 업무서비스 Transaction

Repository : DB CRUD

 

 


 

POST 요청으로 여러값을 받을 때 배열로 받는다.

[] = request.getParameterValues(" name ");

 

하나의 form에 버튼이 여러개일때

request.getParameter(" btn name ");

button value로 분리해서 처리

 

 


파일업로드

 

html

인코딩 방식 변경 enctype = " multipart/form-data "  // 파트를 나눠서 받는다. 문자는 문자로, 파일은 파일로

 

Servlet도 멀티파트로 변경한다.

@MultipartConfig(

location = "/tmp",  // 임시 저장 디스크

fileSizeThreshold = 1024*1024,  // 1MB 이상이면 디스크 사용

maxFileSize = 1024*1024*5,  // 하나의 파일 사이즈 제한

maxRequestSize = 1024*1024*5*5   // 전체 파일 사이즈 제한

)

 

Part filePart = request.getPart(" file 지정 name ")  // 파일을 받는 Part를 얻는다.

InputStream is = filetPart.getInputStream() // 얻은 filePart를 InputStream에 담는다. 

 

저장할 경로 생성

상대경로로 물리경로 얻기request.getServletContext().getRealPath("/upload")

FileOutputStream fos = new FileOutputStream (경로);

 

byte[] buf = new byte(1024);

int size = 0;

while( (size = is.read(buf) ) != -1)   // 읽을게 없으면 -1 반환

   fos.write(buf , 0 , size);

 

is.close()

fos.clos()

 

 

 

 

 


JSP

${   }

4가지 영역

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=milkoon1&logNo=220860106284 

 

[IT지식] JSP 속성변수(pageContext, request, session, application)들의 참조 범위

JSP 영역이란? 한개 이상의 JSP가 모인 그룹을 뜻한다 영역의 종류는 [ PageContext / Request / ...

blog.naver.com

 

 

 

 

 

 

 

 

반응형

'프로그래밍 > Servlet \ JSP' 카테고리의 다른 글

WAS의 역할과 JSP, 서블릿 개념  (0) 2022.05.06
반응형

 

 

package singletoneTest;

public class Object1 {
    private static Object1 o; // 싱글톤
    private static int oNumber; // 상태 저장

    public static Object1 getInstance(){
        if(o == null)
            o = new Object1();
        return o;
    }

    public int func(int n){
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return n;
    }

    public int sfunc(int n){
        oNumber = n;
        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return oNumber;
    }
}

 

Object1 클래스는 싱글톤으로 사용

 

func()함수 - 입력받은 n을 return

sfunc()함수 - 입력받은 n을 oNumber 필드에 대입하고 oNumber를 return

 

 

 

 

public class MainClass1{
    public static void main(String[] args) {
        Thread t1 = new Thread1();
        Thread t2 = new Thread2();
        Thread t3 = new Thread3();

        t1.start();
        t2.start();
        t3.start();
    }
}

class Thread1 extends Thread{
    private int number = 1;
    @Override
    public void run() {
        while(true){
            Object1 o = Object1.getInstance();

            int n = o.func(number);
            System.out.println(n + " Thread1 의 넘버");
            int n1 = o.sfunc(number);
            System.out.println(n1 + " Thread1 의 넘버, 상태 공유 사용할 경우");

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Thread2 extends Thread{
    private int number = 2;
    @Override
    public void run(){
        while(true){
            Object1 o = Object1.getInstance();

            int n = o.func(number);
            System.out.println(n + " Thread2 의 넘버");
            int n1 = o.sfunc(number);
            System.out.println(n1 + " Thread2 의 넘버, 상태 공유 사용할 경우");

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Thread3 extends Thread{
    private int number = 3;
    @Override
    public void run(){
        while(true){
            Object1 o = Object1.getInstance();

            int n = o.func(number);
            System.out.println(n + " Thread3 의 넘버");
            int n1 = o.sfunc(number);
            System.out.println(n1 + " Thread3 의 넘버, 상태 공유 사용할 경우");

            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

 

3개의 쓰레드를 생성한 후 

각 쓰레드는 자신의 number 변수를 func(), sfunc() 메서드에 각각 넣은 후 출력

 

 

 

 

 

 

sfunc() - 자신의 번호를 출력하지 못하는 문제가 발생

이유는 공유 변수 oNumber가 스레드에 안전하지 않기 때문이다.

 

func() - 자신의 번호에 맞게 정확하게 출력한다.

 


 

스레드가 생성되면 스택이 새로 생성되고, 생성된 스택에서 메서드를 호출하여 사용한다.

각 스레드 스택의 스택 프레임은 지역 변수들이 사용된 후 소멸한다.

지역 변수가 Heap영역을 참조하여 사용한다면 공유 데이터 사용에 주의해야한다. (싱글톤은 공유 데이터를 갖지 않는 것이 원칙)

 

sfunc() - Object1의 상태 데이터(공유 데이터)를 사용하므로 스레드에 안전하지 못하다.

func() -  Object1의 메서드만 사용하고 지역 변수는 자신이 넘겨주므로, Heap의 상태 데이터(공유 데이터)는 사용하지 않아 스레드에 안전하다.

 

 

 

Thread Safe

 

(1) 인스턴스 데이터를 사용하지 않는다. (싱글톤)

싱글톤 객체를 여러 쓰레드에서 사용할 때는 Heap의 인스턴스 데이터(상태 데이터)를 사용하지 않게 설계해야한다.

데이터는 스레드가 넘겨주고, Heap의 인스턴스는 메서드만 사용한다.

 

(2) 스레드마다 인스턴스를 생성하여 사용한다. (프로토타입)

Heap의 인스턴스 데이터를 사용해야 하는 경우엔 스레드마다 사용하는 인스턴스를 새로 생성하여 사용한다.

사용자에 따라 상태 정보가 달라지는 DTO, Entity가 싱글톤이 아닌 이유이기도 하다.

 

(3) Lock을 걸어서 다른 스레드가 접근하지 못하게 한다.

 

 

 

 


 

반응형

+ Recent posts