ArrayList, HashMap
2018-11-14 00:00:00 +0000자료구조란?
데이터를 효율적으로 사용할 수 있도록 구조를 만들어서 저장해둔 것
자료구조 종류
- 리스트 (ArrayList, LinkedList)
- 스택 (LinkedList )
- 큐 (LinkedList)
- 해시 테이블 (HashMap)
- 집합(HashSet, key와 value가 한 쌍)
ArrayList
- 순서가 있는 자료구조
- 배열의 길이가 제한이 없다
- ArrayList
list = new ArrayList (); - ArrayList는 내부에 있는 배열에 데이터를 저장. 전체를 순회할 때 사용하면 좋다
- ArrayList는 데이터 삭제하면 자동으로 정렬해준다. 하지만 수정, 삭제가 많으면 성능이 떨어진다
- LinkedList는 인접한 데이터가 서로 메모리를 가르키는 식으로 저장. 수정, 삭제힐 떼 가르키는 주소만 바꾸면 되므로 성능이 좋다
- 보통 web은 view에 list를 뿌려주는 일을 많이 한다=>ArrayList(수정,삭제는 db에서 많이 하므로)
import java.util.ArrayList;
public class ListEx {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("one"); // 값 추가
list.add("two");
list.add(2,"three"); // 값 인덱스로 추가
list.remove(2); // 값 삭제
list.add(1,"four");
int index = list.indexOf("one"); // 값으로 index 찾기
System.out.println("index:"+index);
int num = list.size();
for(int cnt = 0; cnt < num; ++cnt){
System.out.println(list.get(cnt)); // 값 index로 가져와서 출력하기
}
}
}
iterator
- 자바의 컬렉션클래스 데이터를 읽어오는 방법 중 하나
- 만약 iterator가 없다면 각 컬렉션 클래스의 값 얻어오는 함수를 알고 있어야 한다. 하지만 iterator를 사용하면 어떤 컬렉션 객체이든간에 iterator로 쉽게 값을 가져올 수 있다
public static void Show(ArrayList<Integer> list){
Iterator<Integer> itr = list.iterator();
while(itr.hasNext()){
System.out.print(itr.next()+",");
}
}
스택
- 맨 마지막에 넣은 데이터를 먼저 꺼낸다
import java.util.LinkedList;
public class LinkedListEx {
public static void main(String[] args) {
LinkedList<Integer> stack = new LinkedList<Integer>();
stack.addLast(1);
stack.addLast(30);
stack.addLast(33);
while(!stack.isEmpty()){
Integer num = stack.removeLast();
System.out.print(num+","); // 출력결과는 33,30,1 최근 넣은 것 부터 출력
}
}
}
해쉬테이블
- 데이터가 key, value로 쌍이 이루어진다
- key를 연산을 거쳐 해시값으로 만든다. 예를들어 String 값 “111’을 넣는다면 연산을 통해 해시값이 된다. String을 검색하는 것보다 빠르게 찾을 수 있기 때문에 검색 선능이 향상된다
- key 값은 중복 불가능하다
- 멀티쓰레드에서 문제가 될 수 있으므로 HashTable을 쓴다
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashEx {
public static void main(String[] args) {
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "one"); // 값 넣기
map.put(2, "two");
map.put(3, "three");
String str = map.get(1); // 값 가져오기
System.out.println(str);
if(true == map.containsKey(1)) // 값 체크
System.out.println("값 1은 있다");
else
System.out.println("값 1은 없다");
// map은 iterator을 사용할 수 없으므로 map.keyset, map.entryset을 사용한다
System.out.println("=== entryset ===");
Set set = map.entrySet();
Iterator iter = set.iterator();
while(iter.hasNext()){
Map.Entry<Integer, String> mapTemp = (Map.Entry<Integer, String>)iter.next();
System.out.println("key:"+mapTemp.getKey()+"value:"+mapTemp.getValue());
}
// keyset
System.out.println("=== keyset ===");
Set<Integer> set2 = map.keySet();
Iterator<Integer> iter2 = set2.iterator();
while(iter2.hasNext()){
int key2 = iter2.next();
String str2 = map.get(key2);
System.out.println("key:"+key2+" value:"+str2);
}
// map.values(); 를 사용해서 Collection으로 Iterator 하는 방법도 있다
// Collections.max(values); // 가장 큰 값
// Collections.min(values) // 가장 작은 값
}
}
Regular(정규표현식)
2018-11-13 00:00:00 +0000정규표현식
- 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 표현식 언어이다 . : ‘.’가 위치한 곳에는 반드시 임의의 한글자가 위치하여야 한다는 의미
- ‘*‘가 바로 앞의 문자가 없거나 하나 이상 반복한다는 의미
- ’+’: ‘*‘과 흡사하지만 ‘+’는 반드시 하나 이상의 문자가 반복된다는 의미
- ’?’: 바로 앞의 문자가 없거나 하나임을 의미
- ’^’: 문장의 처음을 나타내며 ‘^’가 있는 단어로 문장이 시작됨을 의미
- ’$’ : 문장의 끝을 나타내며, $가 있는 단어로 문장이 끝남을 의미
- []괄호 안의 문자 중 일치하는 것을 검색할 경우 사용
- [abc] : a, b, c, abc 등 문자열에 a, b, c등이 있어야 한다
- [0-9] : 숫자가 포함된 모든 문자열
- [a-z] : 알파벳 소문자가 포함된 모든 문자열(범위)
- ^[a-zA-z0-0] : 영문대소문자 또는 숫자로 시작되는 모든 문자열 검색
- [] 안에서의 ‘^’ 특수문자(부정)
- [] 특수문자 안에 있는 문자를 포함하고 있지 않는 모든 문자열을 찾고자 할 경우
- {} 특수문자 앞의 문자가 반복되는 횟수 의미, {n,m}이면 최소 n, 최대 m 만큼 반복, \d{1,2}는 숫자 1~2자리 숫자가 포함되어있는지, 8\d{1}는 8로 시작하는 2자리 숫자를 나타냄
- () 안에 문자열을 하나의 문자로 취급, (x){n} 는 하위 항목이 됨 즉 x의 내용이 n번 반복되어야 한다
-
or 연산 수행 - [a-zA-Z] 모든 영문자
- 특수문자를 문자 그래도 사용하고 싶다면 특수 문자 앞에는 역슬레시를 써야 한다
- w : [a-zA-Z0-0] 알파벳이나 숫자
- W : [^a-zA-Z0-9] 알파벳이나 숫자를 제외한 문자
- .+(?=:) : 전방탐색 기호 ?=, 다음에 오는 문자가 일치하는 영역에서 제외됨. 예를들어 .+(?=살) 이라면 17살, 18살은 17, 18만 찾음
- ?<= : 뒤에 있는 문자를 탐색
자바 정규 표현식 처리
- java.util.regex 패키지
- Pattern 클래스
Source
import java.util.Scanner;
public class ReqularExam {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("문자열 입력:");
String str = sc.nextLine();
// abc문자 포함
// . : 앞, 뒤로 데이터가 있다
// * : 몇 개 반복될 지 모른다
/*if(str.matches(".*abc.*")){ // 정규표현식 체크
System.out.println("매칭");
}else{
System.out.println("비매칭");
}*/
/*// 숫자만 3자리 입력
//[0-9] : 숫자만 입력
//{} : 앞의 문자가 반복되는 횟수
if(str.matches("[0-9]{3}")){
System.out.println("매칭");
}else{
System.out.println("비매칭");
}*/
//
// 알파벳, 숫자만 5자 이상 입력
// [//w]{5,}
/* if(str.matches("^[a-bA-Z0-9]*${6}")){
System.out.println("매칭");
}else{
System.out.println("비매칭");
}
*/
// 한글만 3자리에서 5자리
if(str.matches("[가-힣]{3,5}"))
System.out.println("매칭");
else
System.out.println("매칭");
}
}
Enum Class
2018-11-13 00:00:00 +0000enum class 사용하기
- enum은 관련있는 상수의 모음
- 필드와 메소드 추가가 가능하다
- final 로써 사용한다
- class 처럼 함수선언, 오버라이드가 가능하다
- 숫자 뿐 아니라 실제 Type 비교 가능
그 외 enum 정리
- enum 첫번째 요소는 0이고 순서대로 번호가 부여된다
- enum이름.요소이름.ordinal() 함수를 사용해서 번호를 확인할 수 있다
Source
public class Main {
enum SHAPE{
CICLE{
@Override
public void draw() {
System.out.println("Cicle draw");
}
@Override
public void getName() {
System.out.println(this.getClass().getSimpleName());
}
},
RECTANGLE{
@Override
public void draw() {
System.out.println("Rectangle draw");
}
@Override
public void getName() {
System.out.println(this.getClass().getSimpleName());
}
},
TRIANGLE{
@Override
public void draw() {
System.out.println("triangle draw");
}
@Override
public void getName() {
System.out.println(this.getClass().getSimpleName());
}
};
public abstract void draw();
public abstract void getName();
}
public static void main(String[] args) {
SHAPE shape = SHAPE.CICLE;
shape.draw();
shape = SHAPE.RECTANGLE;
shape.draw();
shape = SHAPE.TRIANGLE;
shape.draw();
}
}
결과
Cicle draw
Rectangle draw
Triangle draw
String Function
2018-11-12 00:00:00 +0000String 생성
- 문자열이 등록되었다면 참조, 등록 안 되었다면 새로 생성
String str = "ABC"
- 무조건 새로 생성
String str = new String("ABC");
String 불변성
- 문자열은 불변하기 때문에 문자열 변경 시 새로운 문자열을 다시 생성함=>비효율적
- 문자열 붙이기
String str3 = str.concat("DEF");
- 또 다른 문자열 붙이기
String sql = "select*from board";
int0 num = 10;
if(num == 10){
sql +="where num = 10";
}
- StringBuffer, StringBuilder 가변성
StringBuffer sb = new StringBuffer("가나다");
sb.append("라마바");
System.out.println(sb);
- 해당 문자열 위치 파악 IndexOf=>0시작, 없으면 -1
System.out.println(sql.indexOf("*"));
- 문자열 길이 length()
System.out.println(sql.length());
- 문자열 부분 추출
System.out.println(sql.substring(0, 12));
- .을 기준으로 kosta, jpg를 나누는 예제
String fileName = "kosta.jpg";
String head = ""; // kosta
String pattern = ""; // jpg
int spotIndex = fileName.indexOf(".");
head = fileName.substring(0, spotIndex);
pattern = fileName.substring(spotIndex+1);
System.out.println("head:"+head);
System.out.println("pattern:"+pattern);
- 공백 제거 trim
- 같은 글자인지 체크 equals
String id = "kosta";
String m_id = "kosta "; // 띄어쓰기가 있는 경우 trim함수로 공백제거를 할 수 있다
if(id.trim().equals(m_id.trim())){
System.out.println("같다");
}else{
System.out.println("다르다");
}
- 문자열=>배열변환
- 콤마로 나누고 싶다
String fruits = "사과,배,포도,수박";
String arr[] = fruits.split(",");
for(String name : arr)
System.out.println(name);
- 정수형에서 문자열로 변환
int n = 100;
String s = new String("100"); // 너무 길다
int n2 = 100;
String s2 = n+""; // 간단
- 문자 끝의 글자를 알아낼 때 endsWith
String[] arrString = {"abcd.jpg", "abb.gif", "iiii.jpg", "kkkk.gif", "pppp.ini"};
for(String fileName1:arrString){
if(true == fileName1.endsWith("jpg")){
System.out.println("jpg 파일 입니다");
}else if(true == fileName1.endsWith("gif")){
System.out.println("gif 파일 입니다");
}else{
System.out.println("그 외 파일 입니다");
}
}
- 문자열 치환 replace(찾을문자열, 바꿀문자열)
String str = "가,나,다,라,마";
String result = str.replace(",", " ");
System.out.println("result:"+result);
- 그 외 getBytes ( 네트워크로 전달할 때 바이트로 변환),toCharArray()(Char형으로 변환) 등의 String 함수가 있다
refactoring 이란(상수,제어플래그,assert)
2018-11-12 00:00:00 +0000리팩토링(refactoring) 이란?
- 외부에서 보는 프로그램 동작은 바꾸지 않고 프로그램의 내부 구조를 개선하는 것
동작이 변하지 않은 걸 확인하는 테스트
- unit 테스트 반드시 필요
- 리팩토링 전에 테스트->리팩토링->리팩토링 후 다시 테스트
- 입문자라면 junit 테스트 프레임워크 사용해볼 것
리팩토링이 필요한 코드들
- 같은 코드 중복, 사양 변경이 있을 때 수정 내용이 곳곳에 흩어져 있다, 언제나 다른 클래스 내용을 수정하는 클래스가 있다
- 합쳐서 다뤄야 할 데이터가 한 클래스에 모여있지 않다, 메서드 호출 연쇄가 너무 많다 등..
리팩토리 방법
- 한번에 하나의 수정만 한다(ex 함수 옮기기, 함수 이름바꾸기가 있다면 함수 옮기기->테스트->이름바꾸기->테스트 한번에 하나만 수정하고 따로 테스트 해야한다)
- 되돌리게 쉽게 하기: 코드가 섞여 있으면 되돌리기 어렵다
- 단계마다 확인: 새로운 클래스 생성 후 빌드 테스트, 빌드 성공 후 새로운 클래스를 사용하면서 버그 테스트
- 오래된걸 바꿈: 동작하는 상태를 유지하면서 새로운 코드를 추가하고 잘 동작하면 오래된 것을 제거한다
리팩토링 상황
- 상수인 숫자가 있다면 기호 상수로 바꾸어라(100 -> MAX_COUNT)
- 상수의 의미를 파악하기 어렵고, 상수가 바뀐다면 관련 상수가 맞는지 확인하면서 일일이 바꿔줘야 한다
- JAVA에서 상수를 만드는 방법은 static final 클래스 필드 사용, enum 사용이 있다
- static final 을 사용할 수 있지만 상수 대신 숫자 0을 적어도 문제 없이 작동한다
- 인자를 int에서 클래스로 치환하거나 enum을 사용해서 잘못된 사용을 막을 수 있다 수정 전
if(command == 0) {
System.out.println(name+"works");
}else if(command == 1){
System.out.println(name+"stops");
}
수정 후
if(command == Command.WALK) {
System.out.println(name+"works");
}else if(command == Command.STOP){
System.out.println(name+"stops");
}
- 기호 상수가 적합하지 않은 경우 배열에는 length라는 필드가 있다
for(int i = 0; i < ARR_COUNT; ++i){
}
- 제어 플래그 삭제
- 처리 흐름을 제어하는 플래그를 지나치게 사용하면 가독성이 떨어진다
- 아래 예제에서 flag가 정확히 어떤의미인지 불분명하므로 found로 변수명을 수정한다
- 복잡한 이중 체크 대신 찾은 시점에서 바로 break를 시킵니다
- 찾은 시점에서 바로 return 합니다. 그러면 found 변수가 필요없다는 걸 알 수 있습니다
FindInt.java
public class FindInt {
public static boolean find(int[] data, int target) {
boolean flag = false;
for(int i = 0; i < data.length && !flag; ++i) {
if(data[i] == target) {
flag = true;
}
}
return flag;
}
}
Main.java
public class Main {
public static void main(String[] args) {
int[] data = {
1, 9, 0, 2, 8, 5, 6, 3, 4, 7,
};
if(FindInt.find(data, 5)) {
System.out.println("Found!");
}else {
System.out.println("Not found!...");
}
}
}
변경 후 FindInt.java
public class FindInt {
public static boolean find(int[] data, int target) {
for(int i = 0; i < data.length; ++i) {
if(data[i] == target)
return true;
}
return false;
}
}
- assert 도입
- 주석으로 이 상황에 알맞은 값을 적어도 프로그램 실행 시 다른 값이 올 경우 처리 방법이 없다
- assert 도입 시 잘못된 값이 들어올 경우 에러를 발생시킨다
- assert 도입으로 인해 변경되는 내용이 없어야 한다
- 이클립스에서 assert를 사용하려면 메뉴 Run-Run Configurations-Argments의 VM arguments에서 -ea를 추가한다
- 아래 소스코드 주석에서 체크하는 함수를 만든 뒤 원하는 결과인지 assert로 체크한다
SortSample.java
public class SortSample {
private final int[] data;
public SortSample(int[] data) {
this.data = new int[data.length];
System.arraycopy(data, 0, this.data, 0, data.length);
}
public void sort() {
for(int x = 0; x < this.data.length - 1; ++x) {
int m = x;
for(int y = x+1; y < data.length; ++y) {
if(this.data[m] > this.data[y]) {
m = y;
}
}
// 여기서 data[m]은 data[x]~data[data.length - 1]의 최솟값이어야 함
int v = data[m];
data[m] = data[x];
data[x] = v;
// 여기서 datat[0]~data[x+1]은 이미 정렬되어 있어야 함
}
}
public String toString() {
StringBuilder buffer = new StringBuilder();
buffer.append("[ ");
for(int i = 0; i < data.length; ++i) {
buffer.append(data[i]);
buffer.append(", ");
}
buffer.append("]");
return buffer.toString();
}
}
Main.java
import java.util.Random;
public class Main {
private static final Random random = new Random(1234);
private static void execute(int length) {
// 난수로 데이터 작성
int[] data = new int[length];
for(int i = 0; i < data.length; ++i) {
data[i] = random.nextInt(data.length);
}
// 데이터 표시
SortSample sorter = new SortSample(data);
System.out.println("BEFORE:"+sorter);
// 정렬해서 표시
sorter.sort();
System.out.println("AFTER:"+sorter);
System.out.println();
}
public static void main(String[] args) {
execute(10);
execute(10);
execute(10);
execute(10);
execute(10);
}
}
Posts
Interceptor(인터셉터)
Android Studio Install
계층형 게시판
VirtualBox Ubuntu 18.04.2 LTS
TransactionAwareDataSourceProxy Error
Java Coding Conventions
Java Long과 long의 차이
Mybatis 객체 안에 객체 매핑
JavaConfig mariadb 연결
DataTable
관리자 페이지
MappingJackson2JsonView
Spring Javaconfig
게시판 만들기-제품 등록
게시판 만들기-제품 페이지 제작
게시판 만들기-회원탈퇴 및 게시판 삭제 플래그 추가
footer 하단에 고정시키기
bootstrap4 사용법
Spring 데이터 검증 @Valid, BindingResult
brackets 실시간 미리보기
Spring 기본설정(pom.xml, web.xml, encoding)
Vue.js computed, methods, watch
javascript onkeyup
Maria DB Incorrect string value Error
javascript 암호화(md5, base64)
Vue.js template
Vue.js 소개
Nexacro 설명
ControllerAdvice
Batch
html 페이지 로딩 순서
소수구하기(PrimeNumber)
최소공배수,최대공약수
Stream
Lambda(람다식)
inner class(내부 클래스)
final 키워드
file upload
파이썬 빅 데이터 K-평균(K-means)
아나콘다(Anaconda), 주피터 개발환경 세팅
텐서플로우(TensorFlow) 아키텍쳐 및 Session
텐서플로우(TensorFlow)상수, 변수, 함수
머신러닝 기초
한글 리스트 오름차순, 내림차순
연속된 글자의 갯수 출력
java spring5 프로젝트 설정
restController
spring 세팅 및 기본설정
mybatis trim
jquery datepicker
ajax로 데이터 전달/응답 받는법
mybatis error
mybatis 게시판 만들기 순서
Java Jsp Mybatis Dynamic Query
mybatis
git 소개
node.js 개발환경 구축
node.js 기본 내장 모듈
node.js의 전역 객체
node.js http module
node.js event
jdbc
자바빈
jsp, servlet 정리
java null object pattern
다음지도 key 등록(kakao map)
공공 데이터 open api
facebook login api
sourcetree 사용법
JavaScript event3
JavaScript jquery
JavaScript dom
JavaScript ajax
JavaScript 이벤트2
JavaScript 캡슐화
JavaScript Array,내장객체
JavaScript var
JavaScript 객체,생성자
JavaScript 함수,클로저
JavaScript Event
javascript eclipse 자동완성(with tern)
CSS position
HTML5,CSS 선택자
자바 시간 측정
git,eclipse 연동
HTML 기초 정리
Eclipse Web 환경세팅
피보나치의 수
Oracle 반복문,커서,예외,저장 서브프로그램
Oracle PL/SQL
Oracle 다중쿼리(Multiple row query)
Oracle 인덱스, 뷰, 시퀀스, 트랜잭션, 세션 정리
Oracle JOIN 정리
Oracle DDL, DML 정리
Oracle 문자열 함수 정리
Oracle 숫자,날짜,자료형 변환 함수 정리
Oracle 제약조건 정리
Oracle 기초 쿼리 정리
문제2775
DFS
junit
json
algorithmus basic
circular queue(원형큐)
binary search(이진탐색)
port forwarding(포트포워딩)
kakao chatbot(카카오 챗봇)
java io
sort comparable, comparator
Unresolved compilation problem
ArrayList, HashMap
Regular(정규표현식)
Enum Class
String Function
refactoring 이란(상수,제어플래그,assert)
reference,abstract 정리
FileNotFoundException Solve
static
Thread Synchronization(스레드동기화,원자성)
Java Exception(예외처리)
Java 생성자, this, super
roomnum
BeeHouse
Git Reset, Revert
Git Log
Array
stack
pyramid draw
Star Draw(별 그리기4)
Star Draw(별 그리기3)
Star Draw(별 그리기2)
Star Draw(별 그리기1)
Loop(While, For)
자바 데이터 타입, 데이터 연산
시계방향 달팽이 그리기
정수값의 짝수,홀수 갯수 구하기
java, Scanner 정리
draw dog
subscribe via RSS