StudyServer
web, server, java, spring 등.. 공부한 것을 기록하는 장소 입니다. 공부하면서 정리하였기 때문에 틀린 내용이 있을 수 있습니다. 이야기 해주시면 수정하겠습니다.

html 페이지 로딩 순서

2019-03-31 00:00:00 +0000

HTML 페이지 로딩 순서

  • html, Javascript, jsp 등.. 은 인터프리터 언어이다. 그러므로 위에서부터 아래로 순서대로 실행된다
  • import -> head 태그 - > <body>태그 -> body onload -> window.onload
  • jsp 파일 일 때는 jsp 사용 부분부터 먼저 실행되고 html 부분이 실행된다
  • 아래 예제를 실행하면 콘솔창에 head, body, 아래 스크립트, onLoad 순으로 출력되는 것을 확인할 수 있다

<script>
console.log('head');
</script>
</head>
<body>
<script>
console.log('body');
</script>

</body>
<script>
$(function(){
console.log('onLoad');
});
console.log('아래 스크립트');
</script>

CSS, JavaScript 위치

  • CSS는 <head>태그 안에 있어야 한다. 왜냐하면 스타일 규칙이 있어야 랜더링을 할 수 있기 때문에 빠르게 알기 위해서이다.
  • JavaScript는 <body> 태그 맨 아래에 넣는다. <head>태그 안에 있다면 랜더링을 멈추고 JavaScript를 읽기 때문에 화면 랜더링이 오래걸릴 수 있다.

소수구하기(PrimeNumber)

2019-03-31 00:00:00 +0000

문제

https://www.acmicpc.net/problem/1978

풀이

  • 소수와 합성수로 나뉜다.
  • 소수란 1과 자기 자신의 수만 약수로 가진 자연수.(즉 1은 소수가 아니다)
  • 합성수는 약수의 개수가 3개 이상인 수.
  • 예를들어 2, 3, 5, 7 은 소수이다.
  • 에라토스테네스의 체 알고리즘은 추후 정리

소스코드 풀이

  • value를 1부터 value 까지의 자연수로 계속 나눈다. 그 중 나누어지면 복합수. 나누어지지 않으면 소수
import java.util.Scanner;
public class Main{
       public static boolean isPrimeNumber(final int value) {
              if(1 == value)
                     return false;
              
              int val = value;
              for(int i = 2; i < value; ++i) {
                     int mod = val%i;
                     if(0 == mod) {
                           System.out.println("value:"+value+" i:"+i);
                           return false;
                     }
              }
              return true;
       }
       
       public static void main(String[] args) {
              
        Scanner sc = new Scanner(System.in);
        int length = sc.nextInt();
        int[] arr = new int[length];
        int count = 0;
        for(int i = 0; i < length; ++i) {
              arr[i] = sc.nextInt();
              if(true == isPrimeNumber(arr[i])) {
                     ++count;
              }
        }
        
        System.out.println(count);
       }
}

최소공배수,최대공약수

2019-03-28 00:00:00 +0000

문제

https://www.acmicpc.net/problem/1934 https://www.acmicpc.net/problem/2609

풀이

  • 유클리드 호제법으로 풀어야 한다
  • 유클리드 호제법이란 두 수 사이에 존재하는 최대공약수를 구하는 알고리즘
  • a를 b로 나눈 나머지가 r이라면 GDC(a, b) = GDC(b, r) r = 0 이면 b가 최대 공약수
  • 예를 들어 GCD(16, 4) = GCD(4, 0) = 최대공약수는 4
  • 최소 공배수는 a * b / 최소공배수
  • GDC의 공식은 작은 수가 0이 될 때 까지 큰수를 작은수로 나누고 몫을 작은 수에 넣고, 기존 작은 수는 큰수에 넣는다

최소공배수, 최대공약수 구하기

import java.util.Scanner;

public class Test{
	
	public static int gcd(int big, int small) {
		while(small != 0) {
			int r = big%small;
			big = small;
			small = r;
		}
		
		return big;
	}
	
	public static void main(String[] args) {
		
        Scanner sc = new Scanner(System.in);
        int arr = 0;				// 최소공배수
        int arr2 = 0;				// 최대공약수

       	int small = sc.nextInt();
        int big = sc.nextInt();
            
        if(big < small) {
        	int temp = small;
        	small = big;
        	big = temp;
        }
           
        arr = gcd(big, small);
        arr2 = big*small / gcd(big, small);
        
        System.out.println(arr);
        System.out.println(arr2);
	}
}

처음 작성한 소스

  • 아래 소스는 2와 3으로 나누어지지 않는 정수( 7, 7 )를 대입할 시 잘못된 값 출력(49)
import java.util.Scanner;

public class Test{
	
	public static void main(String[] args) {
		
		// 최소공배수 구하기
		Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        int[] arr = new int[count];
        
		for(int i = 0; i < count; ++i) {
			int small = sc.nextInt();
			int big = sc.nextInt();
			int value = 1;		// 나누는 수
			
		    while(true) {
	        	if(small <= 1 || big <= 1) {
	        		break;
	        	}
	      
	        	if(0 == small%2 && 0 == big%2) {
	        		small *= small/2;
	        		big *= big/2;
	        		value *= 2;
	        	
	        	}else if(0 == small%3 && 0 == big%3){
	        		// 홀수
	        		small *= small/3;
	        		big *= big/3;
	        		value *= 3;
	        		
	        	}else {
	        		break;
	        	}
	        
	        }
		    
		    
	        int result = 1;
	        if(small != 0) result *= small;
	        if(big != 0) result *= big;
	        if(value != 0) result *= value;
	        //System.out.println("small:"+small+" big:"+big+" value:"+value);
	        
	        arr[i] = result;
		}
		
		for(int i = 0; i < count; ++i ) {
			System.out.println(arr[i]);
		}
	}
}

Stream

2019-03-27 00:00:00 +0000

Stream

  • 자바 8에서 람다와 함께 추가됨
  • Collection을 for, foreach로 다루면 코드가 복잡해지므로 사용
  • 함수형 프로그래밍(동작하는 코드를 간단하체 처리. 상태관리x)
  • 병렬처리 가능(그러나 ThreadPool을 사용하여 성능저하를 일으킬 수 있음)

예제

  • reduece 함수를 이용하여 list에 있는 모든 값을 더하고 첫번째 인자인 1을 더해준다,
  • 기존 방식보다 소스코드가 줄어들었고 한눈에 코드를 파악할 수 있다.
public class Test{
       
       public static void main(String[] args) {
              {
              // 기존방식
              int sum = 1;
              List<Integer> list = Arrays.asList(1,2,3);
              for (Integer value : list) {
                     sum += value;                     
              }
                     
              System.out.println("기존방식:"+sum);
       
              }
       
              // 스트림 방식
              List<Integer> list = Arrays.asList(1,2,3);
              int result = list.stream().reduce(1, (a, b) -> a+b );
              System.out.println("스트림방식:"+result);
    }
}

Stream 객체 생성

  • array이나 Collection을 이용하여 Stream 생성
public class Test{
       
       public static void main(String[] args) {
              // Array
              int[] arr = new int[]{1,2,3};
              Arrays.stream(arr);
              
              // Collection List, Set..
              List<Integer> list = new ArrayList<Integer>();
              list.add(1);
              list.add(2);
              list.add(3);
              Stream stream = list.stream();
    }
}

Stream builder 함수

  • Stream의 값을 차례대로 넣는 함수
public class Test{
       public static void main(String[] args) {
              // Array
              Stream<Integer> arr =  Stream.<Integer>builder().add(1).add(2).add(3).build();
              arr.forEach((x)->System.out.println("value="+x));
       }
}

Stream Filter 함수

  • b가 포함된 문자열만 Stream에 추가하는 필터링 기능
public class Test{
       
       public static void main(String[] args) {
              // Array
              List<String> list = Arrays.asList("ab", "bc", "cd", "de");
              Stream<String> str = list.stream().filter(x->x.contains("b"));
              str.forEach((x)->System.out.println("value="+x));
       }
}

Stream generate 함수

  • Stream에 값을 무한으로 생성하는 함수. 무한으로 생성하기 때문에 limit 함수로 크기를 제한 해야한다
public class Test{
       
       public static void main(String[] args) {
              // Array
              Stream<String> stream = Stream.generate(() -> "test").limit(10);
              stream.forEach((x)->System.out.println("value="+x));
       }
}

Stream distinct 함수

  • 요소의 중복값을 제거하는 함수
public class Test {
	public static void main(String[] args) {
		List<String> fruit = Arrays.asList("사과", "오렌지", "배", "배", "오렌지");
		fruit.stream().distinct().forEach(System.out::println);
	}
}

Stream sorted 함수

  • 정렬을 하는 함수. 인자 없이 그냥 호출하면 오름차순이고 Comparator.reverseOrder()함수를 호출하면 내림차순이다.
public class Test {
	public static void main(String[] args) {
		List<Integer> fruit = Arrays.asList(40, 100, -20, 4, 10);
		fruit.stream().sorted().forEach(System.out::println);
		fruit.stream().sorted(Comparator.reverseOrder() ).forEach(System.out::println);
	}
}

Lambda(람다식)

2019-03-26 00:00:00 +0000

람다식(Lambda)

  • 자바8에서 추가
  • cmd 창에서 java -version 명령어를 사용하면 java 버전을 확인할 수 있다(1.8.0_66 라면 두번째 숫자가 8이므로 java 8)
  • 함수를 만들지 않고 코드로 실행하는 방식
  • 코드를 간단하게 만들 수 있고, 함수를 만들지 않기 때문에 빠르게 개발할 수 있다.
  • 익명함수는 재사용이 불가능하고, 디버깅이 어렵다
(매개변수, ...)->{실행문...}
  • 인터페이스가 하나의 함수만 가지고 있을 때, 함수형 인터페이스라고 한다.(ex Runnable interface)
  • 아래 예제에서 Thread 생성 시 Runnable 객체를 매번 생성하고 함수를 정의해야한다.
  • 람다표현식을 사용하면 직접 객체를 만들 필요가 없다. JVM이 Thread 생성자를 보고 Runnable을 구현하는 객체로 자동으로 만들어준다.
public class Test{
       public static void main(String[] args) {
       new Thread(new Runnable() {
                     @Override
                     public void run() {
                           for(int i = 0; i < 10; ++i) {
                                  System.out.println("hello");
                           }
                     }
                     
              }).start();

              new Thread(()-> {
                     for(int i = 0; i < 10; ++i) {
                           System.out.println("hello");
                     }
              }).start();
    }
}

Posts

subscribe via RSS