JavaScript String 문자열 자르기, 변경, 비교





결과

결과




코드

<script>
    let s = "Hello Wolrd!";

    console.log(s);
    console.log("변경한 문자열 :", s.replace("Hello", "Bye"));
    console.log("변경한 문자열 :", s.replace("He", "Bye"));
    console.log(s);

    console.log("문자열 자르기 : ", s.slice(2,4)); // index 2이상 4미만
    console.log("문자열 자르기 : ", s.slice(-6)); // 음수로 뒤에서부터 접근
    console.log("문자열 나누기 : ", s.substring(2,4));  // slice와 동일 음수 불가능
    console.log("문자열 나누기 : ", s.substr(2,1)); // a부터 b개의 문자열 자름
    
    console.log("특정 문자 기준으로 나누기 : ", s.split(' '));
    
    console.log(s);
    console.log("문자열 정렬 순 비교 : ", s.localeCompare("ABC"));
    console.log("문자열 정렬 순 비교 : ", s.localeCompare("good"));

    console.log("문자열 정렬 순 비교 : ", s.localeCompare("Hello Wolrd!"));
    console.log("문자열 정렬 순 비교 : ", s.localeCompare("mnm"));

</script>




- replace(a, b) : 문자열 a를 찾아서 b로 변경한다. 

a 문자열이 없다면 원래의 문자열을 반환한다.

JS에서는 문자열이 불변이므로 위 7라인 결과를 보면 원래 문자열은 변경되지 않을 것을 확인할 수 있다.




문자열 자르기

1. slice(a, b) : index a이상 b미만의 문자열을 자른다.

음수값을 사용하여서 뒤에서부터 접근할 수 있으며 맨 뒤가 -1이다.



2. substring(a, b) : slice와 동일한 동작을 한다.

단, 음수 값을 사용할 수 없다.



3. substr(a, b) : index a부터 b개의 문자열을 자를 수 있다.








- split(s) : s 문자(문자열)을 기준으로 문자열을 분리한 후 배열 형태로 반환해 준다.




- localeCompare(s) : 문자열을 사전순으로 비교하여 순서에 따라 1, 0, -1로 반환

비교 문자열이

s 보다 뒤에 있다면 = 1

s 와 동일하다면 = 0

s 보다 앞에 있다면 = -1

을 반환해 준다. 이를 이용하여서 정렬을 할 수 있다.






JavaScript String 문자열 문자 찾기, 유니코드 변환, 대문자 변환





결과





코드

<script>
    let s = "Hello Wolrd!";
    s[1] = 'E';  // 변경 X

    console.log(s);
    console.log("index n번 째 문자 : ", s.charAt(0), s[0]);
    console.log("index n번 째 문자의 유니코드 10진수값 : ", s.charCodeAt(0));
    console.log("유니코드 값을 다시 문자로 : ", String.fromCharCode(72) );

    console.log("시작 문자 검사 : ", s.startsWith("G"));
    console.log("마지막 문자 검사 : ", s.endsWith("!"));
    console.log("문자 포함 여부 검사 : ", s.includes("a","e")); // a,e 둘다 갖고있어야 true
    console.log("특정 문자 인덱스 찾기 : ", s.indexOf('l', 4));  // 'l'을 인덱스 4부터 찾는다.

    console.log("소문자 변환 : ", s.toLowerCase());
    console.log("대문자 변환 : ", s.toUpperCase());
    console.log("문자열 반복 : ", s.repeat(2));
    console.log("문자열 길이 : ", s.length);
</script>





- 문자열 객체는 불변이므로 s[1] = 'E'처럼 값을 변경하는 시도하여도 변경되지 않는다.

(소문자, 대문자 변환같은 것은 변환된 새로운 문자열을 반환해주는 것이다.)




- charCodeAt() 메소드 : 문자 -> 유니코드


- String.fromCharCode() : 유니코드 -> 문자




- includes() : 특정 문자, 문자열을 포함하고 있는지 여부를 검사할 수 있다.

인수로 여러 값을 주었을 경우 모두 포함하고 있어야만 true를 리턴해준다.




- indexOf() : 특정 문자, 문자열을 찾아 index를 리턴해준다.


2번 째 인수로는 검색을 시작할 index를 지정해 줄 수 있으며 생략 시 0부터다.


해당 문자, 문자열이 없을 경우 -1을 반환해준다.




- 문자열 길이를 구하기 위해서는 length 프로퍼티를 사용한다.





JavaScript Math 반올림, 제곱, 최대값, 제곱근




결과

결과





코드

<script>
    console.log("PI : ", Math.PI);
    console.log("절대값 : ", Math.abs(-5));

    console.log("올림 : ", Math.ceil(5.5));
    console.log("내림 : ", Math.floor(4.5));
    console.log("반올림 : ", Math.round(5.456));
    console.log("소수점 아래 3번째 자리 반올림 : ", Math.round(5.456*100)/100);
    console.log("정수값 : ", Math.trunc(6.53242));

    console.log("2의 4제곱 : ", Math.pow(2,4));
    console.log("16 제곱근 : ", Math.sqrt(16));
    console.log("밑이 2인 로그 : ", Math.log2(7));  // log₂7

    console.log("최대값 : ", Math.max(5, 3, 2, 7));
    console.log("최초값 : ", Math.min(5, 3, 2, 7));

    console.log("부호 검사(양수:1, 0:0, 음수:-1) : ", Math.sign(-5));
    console.log("랜덤 수(0이상 1미만) : ", Math.random());
    console.log("랜덤 수(10이상 15미만) : ", Math.random()*5+10);
</script>




- 반올림 값을 구하는 round() 메소드에는 따로 반올림할 자리수를 지정해 줄 수 없다.

(따라서 8라인처럼 연산을 통하여 반올림할 자리를 지정할 수 있다.)

( pow(10,n-1)처럼 pow메소드를 사용하여 연산해줌으로써 더욱 직관적으로 구현할 수도 있다. )



- trunc() 메소드를 사용하면 정수부분만을 가져올 수 있다.



- pow(a, n) 메소드는 a의 n제곱 값을 구할 수 있다.



- random() 메소드는 0이상~1미만의 무작위 값을 반환해준다. 

이 값의 특정 값을 곱하고 더해줌으로써 20라인처럼 특정 범위의 랜덤한 수를 구할 수 





JavaScript Date(날짜, 시간) 구하기





결과

결과




코드

<script>
    let date = new Date();
    console.log(date);
    console.log("현재 년도 : ", date.getFullYear());
    console.log("현재 월(0~11) : ", date.getMonth());
    console.log("현재 일 : ", date.getDate());
    console.log("현재 요일(일:0 ~ 토:6) : ", date.getDay());
    console.log("현재 시 : ", date.getHours());
    console.log("현재 날짜 : ", date.toLocaleDateString());
    console.log("현재 시간 : ", date.toLocaleTimeString());

    let date2 = new Date(2020, 4, 1);   // 20.05.01
    console.log(date2.getDay());    // 금요일=5
    console.log( (date2-date)/1000/60 + "분 차이");
</script>




- Date() 객체를 생성하면 현재 시점의 날짜와 시간을 갖는 객체가 생성된다.



- 12라인처럼 인수를 주어서 날짜를 지정해 줄 수도 있다.

(단, 주의할점은 '월'은 -1의 값을 주어야 한다. )



- getMonth() 메서드는 월을 반환해주는데 이는 우리가 사용하는 1부터 시작하는 1~12의 값이 아니라 0부터 시작하는 0~11 값을 반환한다. (0 = 1월)



- getDay() 메서드는 요일 값(0~6)을 반환해주며 0=일요일 ~ 6=토요일 이다.



- Date() 객체간 차이를 구하면 시간차를 구할 수 있다.

이는 ms단위로서 1000ms = 1초 이다.

따라서 위 예에서는 /1000/60 을 해줌으로써 두 객체간 시간차를 분단위로 구하였다.





JavaScript var, let, const 차이




1. var

- 자바스크립트에서 변수를 선언하기 위한 선언자이다.


- 변수의 유효 범위의 대한 문제가 존재한다.

ex) 기존의 존재하는 변수 a를 재선언하여도 에러가 발생하지 않는다.

<script>
    var a = 5;
    console.log(a);
    var a = "e";
    console.log(a);
</script>





2. let

- 위 같은 var의 문제점을 보완하기 위해 ECMAScript 6부터 추가된 변수 선언자다.


ex) 위 var과는 다르게 이미 존재한다는 에러 메시지를 보여준다.

<script>
    let a = 5;
    console.log(a);
    let a = "e";
    console.log(a);
</script>

※ var보단 let을 사용해주는 것이 더욱 에러 발생을 대비할 수 있다.





3. const

- let과 마찬가지로 ECMAScript 6부터 추가된 선언자 이다.


- let과는 다르게 선언 시 한번만 초기화 할 수 있는 상수 이다.


- 단, 배열이나 객체와 같은 참조타입일 경우 값(프로퍼티)을 수정할 수 있다.








'JavaScript > 기초' 카테고리의 다른 글

JavaScript Math 반올림, 제곱, 최대값, 제곱근  (0) 2020.05.01
JavaScript Date(날짜, 시간) 구하기  (0) 2020.04.30
JavaScript eval 함수  (0) 2020.03.14
JavaScript 함수  (0) 2020.03.14
JavaScript 예외 처리  (0) 2020.03.13

Java TreeSet 이진 트리 구조





결과

결과






코드

package pk;

import java.util.Iterator;
import java.util.NavigableSet;
import java.util.TreeSet;

public class Test {

	public static void main(String[] args) {
		TreeSet<Integer> ts = new TreeSet<Integer>();
		
		ts.add(8); ts.add(8); ts.add(3);
		ts.add(6); ts.add(7); ts.add(2);
		ts.add(9); ts.add(1); ts.add(5);
		
		// 이진 트리 : 부모보다 작은것은 왼쪽, 큰 것은 오른쪽에 저장 
		System.out.println("가장 작음 : " + ts.first());	// 가장 왼쪽
		System.out.println("가장 큼 : " + ts.last());	// 가장 오른쪽
		System.out.println("10이하 가장 가까움 : " + ts.floor(10));	// 미만은 lower 메소드
		System.out.println("10이상 가장 가까움 : " + ts.ceiling(10)); // 초과는 higher 메소드
		
		System.out.println("가장 작은 값 삭제 : " + ts.pollFirst());
		System.out.println("가장 큰 값 삭제 : " + ts.pollLast());
		
		
		Iterator<Integer> it = ts.iterator();
		System.out.print("\n오름차순 정렬 : ");
		while(it.hasNext()) System.out.print(it.next() + " ");
		
		it = ts.descendingIterator();
		System.out.print("\n내림차순 정렬 : ");
		while(it.hasNext()) System.out.print(it.next() + " ");
		
		
		System.out.print("\n\n=== 특정 범위 값들 가져오기 ===");
		NavigableSet<Integer> nav = ts.headSet(5, true); // true : 이하, false : 미만
		it = nav.iterator();
		System.out.print("\n5 이하 값들 : ");
		while(it.hasNext()) System.out.print(it.next() + " ");
		
		
		nav = ts.tailSet(5, false); // true : 이상, false : 초과
		it = nav.iterator();
		System.out.print("\n5 초과 값들 : ");
		while(it.hasNext()) System.out.print(it.next() + " ");
		
		
		nav = ts.subSet(3, true, 7, true); // true : 범위값도 포함, false = 미포함
		it = nav.iterator();
		System.out.print("\n3이상 7이하 값들 : ");
		while(it.hasNext()) System.out.print(it.next() + " ");
	}

}




TreeSet : 이진 트리 구조를 갖는다.

(부모 노드보다 작으면 왼쪽, 크면 오른쪽 자식 노드의 위치)


ㄴ 따라서 [왼쪽 자식 노드 -> 부모 노드 -> 오른쪽 자식 노드 ] 순으로 값을 읽기만 하여도 오름차순으로 정렬된 값들을 얻어올 수 있게 된다.

이와 같은 구조 때문에 검색을 빠르게 할 수 있다.


ㄴ TreeSet은 Set이 들어가 있어 알수 있듯이 이진 트리 구조의 Set 컬렉션으로 중복된 값을 가질 수 없다.





메소드



삽입, 삭제 등 : Set 컬렉션으로 동일한 메소드를 사용한다.

링크

[JAVA/심화] - Java HashSet - 집합 삽입, 삭제, 탐색





E first() : 가장 작은 값

- 가장 작은 값, 즉 이진트리에서 가장 왼쪽의 값이다.





E last() : 가장 큰 값

- 가장 큰 값, 즉 이진트리에서 가장 오른쪽 값이다.





E floor(E e) : 인수보다 이하의 객체(값)

- 인수의 해당하는 값이 없다면 그보다 이하의 값들 중 가장 가까운 값을 리턴한다.


- 미만의 값을 구하고자 한다면 lower() 메소드를 사용하면 된다.





E ceiling(E e) : 인수보다 이상의 객체(값)

- 인수의 해당하는 값이 없다면 그보다 이상의 값들 중 가장 가까운 값을 리턴한다.


- 단, 존재하지 않을 경우 null을 리턴한다.


- 초과의 값을 구하고자 한다면 higher() 메소드를 사용하면 된다.





E pollFirst() / E pollLast = First 값 제거 / Last 값 제거

- 해당하는 값을 리턴해준 후 제거한다.






정렬



- 오름차순 : 이진 트리 구조상 이미 정렬이 되어져 있으므로 iterator() 메소드로 가져오면 오름차순으로 정렬되어 있다.




- 내림차순 : descendingIterator() 메소드를 사용하여서 Iterator<E>의 가져오면 내림차순으로 정렬된다.





범위 검색



NavigableSet<E> headSet(E e, boolean b) : 인수 값보다 작은 값들 검색

- 위 예시에서는 5를 주어서 5이하의 값들을 검색하였다.


- 2번 째 인자인 b가 

true일 경우 e 이하를 검

false일 경우 e 미만을 검색

한다.





NavigableSet<E> tailSet(E e, boolean b) : 인수 값보다 큰 값들 검색

- 위 예시에서는 5와, false를 주어서 5를 초과하는 값들을 검색하였다.


- 2번 째 인자인 b가 

true일 경우 e 이상을 검색

false일 경우 e 초과를 검색

한다.





NavigableSet<E> subSet(E start, boolean b, E end, boolean b2) 

- 시작 값과 끝 값을 인수로 주어 그 사이 범위의 값들을 리턴한다.


- 2, 4번 째 인자는 동일하게 true면 해당값도 포함이며 false면 미포함이다.









Java Set , ArrayList 내림차순 오름차순 정렬






결과

결과






코드

package pk;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class Test {

	public static void main(String[] args) {
		Set<String> s = new HashSet<>() ;
		s.add("abc"); s.add("54c"); s.add("zsd");
		s.add("yx3"); s.add("abcd"); s.add("fds");
		s.add("543"); s.add("a1c"); s.add("bdef");
		
		Iterator<String> it = s.iterator();
		System.out.print("기존 데이터 : ");
		while(it.hasNext()) {
			System.out.print(it.next() + " ");
		}
		
		
		List<String> list = new ArrayList<>(s);
		
		Collections.sort(list);
		System.out.print("\n오름차순 : ");
		for(String a : list) System.out.print(a + " ");
		
		System.out.print("\n내림차순 : ");
		Collections.sort(list, Collections.reverseOrder());
		for(String a : list) System.out.print(a + " ");
	}

}




- 기존 데이터를 보면 Set은 삽입 순서나 글자 순서같은 것과 무관하게 출력하는 것을 볼 수 있다.




- Set의 있는 데이터들을 정렬하기 위해서는 우선 Set -> List 변환하여야 한다.




- 변환한 후 Collections.sort() 를 사용하여서 정렬을 할 수 있다.


ㄴ 첫번째 인수 : 정렬 하고자하는 List

ㄴ 두번째 인수 : Collections.reverseOrder()을 줌으로써 내림차순으로 정렬할 수 있다.

( 생략 시 기본적으로 오름차순으로 정렬한다. )



해당 방법은 List를 정렬하는 방법이므로 ArrayList도 같은 방법으로 정렬을 할 수 있다.








Java Key, Value - HashMap, Hashtable






결과

결과







코드

package pk;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Test {

	public static void main(String[] args) {
		Map<Integer, String> m = new HashMap<>();
		
		m.put(5, "E");	
		m.put(3, "C");	
		m.put(1, "A");	
		m.put(2, "B");	
		m.put(1, "X");	// 동일한 키 존재 시 해당 값 변경
		
		System.out.println("Key 4 존재 ? " + m.containsKey(4) );
		System.out.println("Value C 존재 ? " + m.containsValue("C") );
		System.out.println();
		
		System.out.println("Key 3의 Value : " + m.get(3));
		System.out.println("Key 4의 Value : " + m.get(4));	// 해당 키가 없다면 null 리턴
		System.out.println("길이 : " + m.size());
		
		m.remove(3);	// 삭제
		
		System.out.println();
		// Key
		Iterator<Integer> it = m.keySet().iterator();	// 모든 키를 Set의 넣어 리턴 + iterator
		while(it.hasNext()) {
			System.out.print(it.next() + " ");
		}
		
		System.out.println();
		// Value
		Iterator<String> it2 = m.values().iterator();	// 모든 값을 Collection에 넣어 리턴 + iterator
		while(it2.hasNext()) {
			System.out.print(it2.next() + " ");
		}
	}

}




HashMap : <Key, Value> 쌍의 값을 저장하는 구조이다.

값은 중복될 수도 있지만, 키는 중복 저장이 불가능하다.

만약 기존의 존재하는 키로 추가하였을 때는 해당 키의 값이 변경된다.



HashTable : HashMap과 동일한 구조, 사용방법을 갖는다.

단, HashTable은 스레드의 안전(Thread Safe) 하다.








put(K k, V v) : 추가

- 기존의 존재하는 키를 추가하였을 시 값이 변경된다.





V remove(K k) : 삭제

- 인수로 준 키의 해당하는 쌍을 삭제한다.


- 존재하지 않을 경우 null을 리턴한다.





boolean containsKey(K k) : 키 존재 여부

- 해당 키가 존재하는지 확인한다.





boolean containsValue(V v) : 값 존재 여부

- 해당 값이 존재하는지 확인한다.





V get(K k) : 값 얻기

- 인수로 준 키의 해당하는 값을 리턴한다.


- 존재하지 않는 키일 경우 null을 리턴한다.




int size() : 길이(개수) 리턴




Set<K k> keySet() : 키 Set 리턴





Collection<V v> values() : 값 Collection 리턴










+ Recent posts