본문 바로가기

프로그래밍 언어

(41)
동기화 처리 Synchronized Java의 동기화 Synchronized 필요성 대두 Java에서 MultiThread Programming을 하게 될시, 공유자원에 Thread들이 접근을 하는 경우가 생깁니다. 그럴때, Thread가 공유자원에 접근할때, 동기화를 해줘야 하는 필요성이 있고 그때 사용하는 키워드가 Synchronized입니다. 고유 락과 Synchronized block 자바의 모든 객체는 고유 lock을 가지고 있다. 자바의 Synchronized block은 동시성 문제를 해결하는 가장 간편한 방법으로, 고유 락을 이용하여 여러 스레드의 접근을 제어한다. public class Counter { private int count; public int increase() { return ++count; // 스레드 안..
Stream 확실히 알기 필요성 대두 기존 Java에서는 컬렉션 데이터를 처리할때는, for문 혹은 foreach문을 사용하여 Collection내의 요소들을 하나하나 다루었습니다. 간단한 처리나 Collection의 크기가 작으면, 큰 문제가 아니었지만, 복잡한 처리가 필요하거나 Collection크기가 커지면 루프문의 성능은 사용저하를 일으켰습니다. 스트림의 등장 스트림은 Java8에서 추가된 기능으로, Collection데이터를 선언형으로 쉽게 처리할수 있습니다. 복잡한 루프문을 사용하지 않아도 되며, 루프문을 중첩해서 사용해야 하는 최악의 경우도 더이상 없어졌습니다. 또한 스트림은 병렬처리를 별도의 멀티쓰레드 구현없이도 쉽게 구현할수 있습니다. 다음 예제로 스트림을 사용한 경우와 사용하지 않는 경우를 살펴보겠습니다. [스..
Stream vs List Stream 스트림은 데이터 처리 연산을 위해 자바에서 제공하는 인터페이스이다. 내부적으로 어떻게 작동하는지 궁금해서 살펴보았는데, spliterator를 인자로 받아, 다음과 같이 RefrenecePipleLine.HEAD를 반환한다. HEAD는 Spliterator source부터 상위 클래스로 인자를 전달한다. 인자 중 Spliterator는 Collection이라면 Collection Source에서 요소를 탐색하고 분할하여 반환하기 위해 사용하는 Java8 제공 인터페이스이다. 상위 클래스 ReferencePipleline은 그 상위 클래스 AbstractPipleline에 인자를 전달하고, 다음과 같이 전달받은 source를 sourceSupplier에 전달하고 함수형 인터페이스인 Suppli..
제네릭(Generic) 제네릭이란? 요구사항의 변화 자료구조를 만들어 배포하고자 할때, String, Integer등 많은 type을 지원하려고 한다. 그럼 각각의 case들에 대해서 자료구조를 만들것인가. 예를들어, 그렇다면 다음과 같이 무수히 많은 클래스들이 생겨날수 있다. public class ArrayList; public class ArrayList; public class ArrayList; public class ArrayList; 이를 해결하기 위해서 나온 방식이 Generic이다. 제네릭의 등장 제네릭은 직역하면, '일반적인'이라는 뜻이고 데이터 형식에 의존하지 않고, 하나의 값이 여러개의 데이터 타입들을 가질수 있게 하는 방법이다. 우리가 사용하고 있는 ArrayList나 LinkedList역시 제네릭을 사..
for문 정리 1. 내장함수 enumerate 일단 기본적으로 파이썬에서 for문을 돌리는 방식에 대해서 알아보고자 한다. >>> for letter in ['A', 'B', 'C']: ... print(letter) ... A B C 파이썬에서는 for 루프는 기본적으로 for in : 형태로 작성이 되는데요. 여기서 부분에는 리스트(list), 터플(tuple), 문자열(string), 반복자(iterator), 제너레이터(generator) 등 순회가 가능한 왠만한 모든 데이터 타입을 사용할 수 있습니다. 부분은 흔히 순회 변수(loop variable)라고 하는데, 부분에 넘긴 객체가 담고 있는 원소들이 루프가 도는 동안 하나씩 차례로 할당됩니다. 여기서 원소뿐만 아니라 index도 출력하고 싶을때 사용하는것이..
Java Tomcat OutOfMemoryError : PermGen space 개발을 한후 서버에 올리고 톰캣을 실행하다 보면 발생할수 있는 볼수 있는 에러이다. PermGen space 는 Class, Method 등이 저장되는 영역으로 JVM에 의해 사용된다. 즉, OutOfMemory 에러는 설정된 메모리가 부족하여 발생하는 에러이다. 간단히 톰캣의 메모리를 설정해주면 해결된다. 이를 해결하기 위해 톰캣의 메모리를 늘려보자. OS는 window server2012, 톰캣은 7.0(무설치), JDK는 1.7 기준이다. 우선 자바가 설치된 폴더의 bin 폴더로 이동해 Jconsole.exe 파일을 실행한다. 그럼 위와 같은 Monitoring 창이 뜨고 현재 설정된 메모리를 확인할 수 있다. 톰캣의 bin 폴더로 이동하자. catalina.bat 파일을 편집으로 열어 setloc..
JVM 메모리 구조 JVM이란 JVM은 Java Virtual Machine의 약자로, 자바 가상머신이라고 부릅니다. 자바가 지금처럼 대중화 될수 있도록 한 원인 중 하나가 JVM이며, 자바와 운영체제 사이에서 중개자 역할을 수행합니다. 이 JVM은 C언어나 C++과 같은 레지스터 기반으로 작동하지 않으며, 스택 기반으로 작동합니다. JVM의 가장 큰 특징인 운영체제에 종속적이지 않은 특징은, 다음과 같은 형식으로 프로그램을 실행할 경우 잘 나타납니다. 1. 자바 컴파일러에 의해 자바 소스 파일을 바이트 코드 파일로 변환한다. 2. 변환된 바이트 코드 파일을 JVM이 읽어 각 운영체제에 맞는 실행 파일로 변환한다. 3. 변환된 실행파일을 운영체제가 읽어 이를 실행한다. 따라서 만약 리눅스위에서 Java파일을 만들고 이를 다..
싱클톤 패턴(Singleton Pattern) 1. Singleton Pattern 싱글톤 패턴이란 어플리케이션이 시작될때 최초 한번 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 변화되여서는 안되는 설정값등을 위해 주로 사용되며 여러 객체에서 접근이 가능하므로 동시성 문제를 잘 해결해야만 한다. // 일반적인 class문 public class Factory { private boolean isOperating = false; public Factory() {}; public void operationFactory() { isOperating = true; System.out.println("start Opertion!"); } public void shutDownFactory() { isOperating = false..