본문 바로가기

반응형

프로그래밍언어/JAVA

(59)
[JAVA] 람다식 (lambda expression) 자바의 람다식을 사용하던 중 "Local variable number defined in an enclosing scope must be final or effectively final" 라는 에러가 발생했다. 이 에러는 람다식에서 지역변수에 접근할때 발생하였는데, 찾아보니 메모리에서 람다식의 변수를 관리하는 방식과 관련된 문제였다. 해당 에러를 알아보면서 이번 기회에 람다식에 대해서도 한번 정리해보았다. 1. 람다식 (lambda expression) 람다식은 자바 1.8 버전부터 제공된 기능으로 함수를 하나의 식으로 표현한 것이다. 람다식은 메서드의 이름과 반환값이 필요없는 익명함수로 괄호와 화살표를 사용하여 식을 표현한다. (매개변수, ...) -> { 실행문 } 람다식을 사용하게 되면 보다 간결하..
[JAVA] 자바 Thread-safe 자바에서는 성능의 향상을 위하여 멀티 스레드 기능을 제공한다. 하지만 멀티 스레드 환경에서 개발을 하다보면 의도했던 결과가 나오지 않는 경우가 있다. 주로 여러 스레드가 하나의 자원에 동시에 접근하면서 발생하는 문제이다. 이러한 문제들을 해결하기 위하여 자바에서는 여러 기능들을 제공하는데, 이러한 기능들을 사용하여 멀티 스레드 환경에서의 실행에 문제가 없도록 프로그래밍한 프로그램을 thread-safe 하다고 한다. 1. synchronized (암시적 lock 사용) 자바에서 thread-safe 하게 구현하는 가장 간단한 방법은 synchronized 키워드를 사용하는 것이다. thread-safe 하게 동작하게 하고 싶은 메서드 또는 블럭을 지정하여서 synchronized 키워드와 함께 선언하여 ..
[JAVA] 메서드 참조 (::) 1. 자바 메서드 참조 (Java Method Reference) 자바 메서드 참조는 자바 8 버전부터 지원해주는 기능으로 람다식에서 메서드를 참조하여 사용하여 보다 간단하게 표현할 수 있도록 해준다. 사용 방법은 '::' 기호를 사용하여 [클래스명]::[메서드명] 과 같이 사용한다. 스태틱 메서드의 경우 인스턴스 대신 클래스 이름으로 사용할 수 있다. 2. 메서드 참조 형식 메서드 참조는 사용하는 패턴에 따라 다음의 3가지로 구분된다. - static method reference - instance method reference - constructor reference - static method reference static method reference는 클래스의 static method 를 메..
[JAVA] 쓰레드의 동기화 멀티 쓰레드 프로그램에서는 프로세스의 자원을 여러 쓰레드가 공유한다. 그렇기 때문에 각각의 작업이 다른 작업에게 영향을 끼치게 된다. 이러한 경우 공유 데이터의 변경으로 인해 개발자가 의도했던 결과가 나오지 않을 수 있다. 이러한 문제를 해결하기 위해서 임계영역 (critical section) 과 락 (lock) 개념을 도입하여 한 쓰레드가 작업을 종료할 때까지 다른 쓰레드에게 방해받지 않도록 한다. 공유 데이터를 임계영역으로 지정해놓고, 해당 영역의 lock 을 획득한 쓰레드만이 공유 데이터를 사용할 수 있도록 하여 문제를 해결한다. 이처럼 한 쓰레드가 진행 중인 다른 쓰레드를 방해하지 못하도록 막는 것을 쓰레드의 동기화 (synchronization) 이라고 한다. 자바에서는 synchronized..
[JAVA] 쓰레드 실행제어 1. 쓰레드 우선순위 쓰레드는 우선순위라는 속성을 가지고 있다. 이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다. 각 쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 지정하여 실행시간을 조절할 수 있다. - 쓰레드의 우선순위 지정 void setPriority(int newPriority) // 쓰레드의 우선순위를 지정한 값으로 변경한다. int getPriority() // 쓰레드의 우선순위를 반환한다. public static final int MAX_PRIORITY = 10; // 최대우선순위 public static final int MIN_PRIORITY = 1; // 최소우선순위 public static final int NORM_PRIORITY = 5; // 보통..
[JAVA] 쓰레드 구현 및 실행 (Thread, Runnable, start(), run()) 1. 쓰레드 구현 쓰레드를 구현하는 방법은 Thread 클래스를 상속받는 방법과 Runnable 인터페이스를 구현하는 방법, 두가지가 있다. 각각의 방식으로 구현은 다음과 같이 할 수 있다. // Thread 클래스 상속 class ThreadClass extends Thread { // Thread 클래스의 run() 을 오버라이딩 public void run() { ... } } // Runnable 인터페이스 구현 class RunnableClass implements Runnable { // Runnable 인터페이스의 추상메서드 run() 을 구현 public void run() { ... } } 둘 간의 큰 차이는 없지만 Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에 ..
[JAVA] 프로세스와 쓰레드 1. Process, Thread 프로세스란 간단히 말해서 실행중인 프로그램을 의미한다. 프로그램을 실행하면 OS 로부터 실행에 필요한 자원, 메모리를 할당받아 프로세스가 된다. 프로세스는 프로그램을 수행하는데 필요한 데이터와 메모리 등의 자원, 그리고 쓰레드로 구성되어 있다. 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드이다. 모든 프로세스는 하나 이상의 쓰레드를 가지고 있으며, 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스, multi-threaded process 라고 한다. 하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않으나, 쓰레드가 작업을 수행하는데 필요한 메모리가 한계에 다다르면 더이상 쓰레드를 만들 수 없다. - 멀티태스킹과 멀티쓰레딩 현재 ..
[JAVA] Annotation 1. annotation 애너테이션은 주석, 주해, 메모 라는 뜻을 가지고 있다. 자바에서 에너테이션은 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이다. '@' 기호를 붙여서 표현하며, 주석처럼 프로그램에 직접적인 영향을 미치지 않으면서 정보를 제공한다. 대표적인 애너테이션으로 @Override, @Test 등을 사용하곤 하는데, 각각 이후에 나오는 소스코드가 오버라이딩을 위한 메서드, 테스트를 위한 메서드임을 알려주는 역할을 한다. 이와같이 JDK 에서 미리 제공하는 애너테이션들을 표준 애너테이션이라고 하는데, 주로 컴파일러를 위한 것들이다. 이외에도 개발자가 직접 애너테이션을 정의할 수 있는데, 이때 메타 에너테이션을 사용하면된다. 2. 표준 애너테이션 자바에서 제공하..

반응형