본문 바로가기

Java/기초

(33)
[Java] 쓰레드(Thread) - 2/2 (동기화) 동기화(synchronization) 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것이다. 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않게 해주는 개념이 임계 영역(critical section, synchronized 구간), 잠금(락, lock) 이다. 자바의 모든 객체(인스턴스, 클래스)는 락을 가지고 있다. synchronized 블록은 객체 단위로 락을 다룬다. Lock : 공유 자원에 한번에 한 쓰레드만 read, write를 수행 가능하도록 한다. 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 '쓰레드의 동기화(synchronization)'이라고 한다. 쓰레드 실행(main) Class public class Th..
[Java] JVM메모리 구조 JVM 응용프로그램이 실행되면, 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 이 메모리를 용도에 따라 여러 영역으로 나누어 관리 Stack 차곡차곡 쌓인다. LIFO(Last In, First Out) JVM의 메모리 구조 메소드 영역(Method Area) 클래스 정보와 클래스 변수가 저장되는 곳 호출 스택(Call Stack) 메소드의 작업공간 메소드가 호출되면 호출 스택에 메모리 할당 종료되면 사용하던 메모리 반환함 힙(Heap) 인스턴스가 생성되는 공간 new연산자에 의해서 생성되는 배열과 객체는 모두 여기에 생성됨 호출 스택의 특징 메소드가 호출되면 수행에 필요한 메모리를 스택에 할당받는다. 메소드가 수행을 마치면 사용했던 메모리를 반환 호출 스택의 제일 위에 있는 메소드가 현재..
[Java] 쓰레드(Thread) - 1/2 (프로세스, 쓰레드, 데몬쓰레드) 프로세스(process) 실행 중인 프로그램 프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다. 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원, 쓰레드로 구성되어 있다. 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 한다. 멀티 쓰레딩의 장단점 장점 CPU의 사용률을 향상시킨다. 자원을 보다 효율적으로 사용할 수 있다. 사용자에 대한 응답성이 향상된다. 작업이 분리되어 코드가 간결해진다. 단점 동기화(synchronization), 교착상태(deadlock)와 같은 문제들이 발생할 수 있다. 구현방법 2가지 Thread 클래스 상속 Runnable 인터페이스 구현 Runnable 인터페이스를 구현하는 방법이 더 좋다. 재사용성(reusabilit..
[Java] 애너테이션(Annotation) 자바를 개발한 사람들은 소스코드에 대한 문서를 따로 만들기보다 소스코드과 문서를 하나의 파일로 관리하는 것이 낫다고 생각했다. 그래서 소스코드의 주석'/** ~ */'에 정보를 저장하고, 주석으로부터 HTML문서를 생성해내는 프로그램(javadoc.exe)을 만들어서 사용했다. (메타 데이터) 소스코드에서 비즈니스 로직에는 영향을 주지는 않지만 해당 타겟의 연결 방법이나 소스코드의 구조를 변경할 수 있다. 용도 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공 SW 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공 런타임시 특정 기능을 실행하도록 정보를 제공
[Java] 지네릭스(Generics) 컴파일 시간에 더 많은 버그를 감지할 수 있도록 하여 코드에 안정성을 추가한다. 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입체크(compile-time type check)를 해주는 기능이다. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안정성을 높이고 형변환의 번거로움이 줄어든다. 장점 컴파일에서 더 강력한 유형 검사 케스트 제거 프로그래머가 일반 알고리즘을 구현할 수 있도록 지원 제한 제네릭 형식의 변수는 참조 타입(Reference Types)만 인스턴스를 생성할 수 있다. 기본 타입(Primitive Types) 생성 불가 참조 : Object는 사용 가능한 가장 일반적인 유형이고 기본 유형으로 확장되지 않기 때문에 제네릭이 참조 유형에 대해서만 작동할 수 ..
[Java] 인터페이스 vs 추상클래스 1. 추상클래스란? 추상 메서드를 선언하여 상속을 통해서 자손 클래스에게 완성하도록 유도하는 클래스이다. 미완성 설계도라고 표현을 하며, 상속을 위한 클래스이기 때문에 객체를 생성할 수 없다. class 앞에 abstract 예약어를 사용하여 상속을 통해서 구현해야한다. 2. 인터페이스란? 인터페이스는 기본 설계도라고 할 수 있다. 다른 클래스를 작성하는데 도움을 주는 목적이고 추상클래스와 다르게 다중상속(구현)이 가능하다. 3. 공통점, 차이점 3.1공통점 추상메서드를 사용할 수 있다. 3.2 차이점 1) 사용의도 추상클래스는 IS - A "~이다" 인터페이스는 HAS - A "~을 할 수 있는" 다중상속의 가능 여부에 따라 용도 구분 2) 공통된 기능 사용 여부 모든 클래스를 인터페이스를 사용해서 기..
[Java] BigInteger, BigDecimal 클래스 1. BigInteger 정수형으로 표현할 수 있는 값의 한계가 있다. 가장 큰 정수형 타입인 long으로 표현할 수 있는 값은 10진수 19자리 정도이다. 이 값 보다 더 큰 값을 다뤄야 할 때 사용하면 좋은 것이 BigInteger이다. 내부적으로 int배열을 사용해서 값을 다룬다. 그래서 long타입보다 훨씬 큰 값을 다룰 수 있지만 성능은 떨어진다. docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html BigInteger (Java Platform SE 7 ) Immutable arbitrary-precision integers. All operations behave as if BigIntegers were represented in two'..
[Java] StringTokenizer 클래스 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는 데 사용된다. 예를 들어 "100,20,300,400"라는 문자열이 있을 때 ','를 구분자로 잘라내면 "100","200","300","400"이라는 4개의 문자열(토큰)을 얻을 수 있다. 물론 String의 split(String regex), Scanner의 useDelimiter(String pattern)를 사용할 수도 있다. 이 두가지 방법은 정규식 표현(Regular expression)을 사용해야하므로 정규식 표현에 익숙하지 않은 경우 StirngTokenizer를 사용하는 것이 간단하면서도 명확한 결과를 얻을 수 있을 것이다. docs.oracle.com/javase/7/docs/..