Java/Java 25

스레드의 동기화

프로세스는 자원, 데이터, 그리고 스레드로 구성된다. 프로세스는 스레드가 운영 체제로부터 자원을 할당 받아 소스 코드를 실행하여 데이터를 처리하는데 이 때, 싱글 스레드 프로세스는 데이터에 단 하나의 스레드만 접근하므로, 문제될 사항이 없지만 멀티 스레드 프로세스의 경우, 두 스레드가 동일한 데이터를 공유하게 되어 문제가 발생할 수 있다. 아래의 코드는 하나의 객체 enemy의 두명의 플레이어(두개의 스레드)가 공격하여 쓰러트리게 되는 코드이다. public class Main { public static void main(String[] args) { // 하나의 Enemy 객체를 공유하는 두개의 스레드 생성 Runnable enemyGetAttacked = new ThreadTask3(); Threa..

Java/Java 2023.03.12

스레드 (Thread)

프로세스(Process)와 스레드(Thread) 프로세스는 실행 중인 애플리케이션을 의미한다. 즉, 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 만큼의 메모리를 할당 받아 프로세스가 됩니다. 프로세스는 데이터, 컴퓨터 자원, 그리고 스레드로 구성되는데, 스레드는 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행한다. 즉, 스레드는 하나의 코드 실행 흐름이라고 볼 수 있다. 메인 스레드(Main thread) 자바 애플리케이션을 실행하면 가장 먼저 실행되는 메서드는 main 메서드이며, 메인 스레드가 main 메서드를 실행시켜준다. 메인 스레드는 main 메서드의 코드를 처음부터 끝까지 순차적으로 실행시키며, 코드의 끝을 만나거나 return문을 만나면 실행을 종료한다. 만약, 어떤 ..

Java/Java 2023.03.12

자바 가상 머신(Java Virtual Machine)

자바가 탄생하기 이전에 객체지향 프로그램으로 자주 사용되었던 C++에는 큰 문제가 하나 있었다. 바로 운영체제로부터 독립적이지 못하다는 점이다. 쉽게 말해, Windows를 위해 만든 프로그램은 Windows에서만 작동이 가능했고, Mac OS에서 그 프로그램을 실행시키려면 Mac OS에 맞게 새로 프로그램을 만들고 컴파일해야 했다. 즉, 프로그래밍 언어가 운영체제에 종속적이기 때문에, 어떤 프로그램을 만들 때 각 운영체제 별로 따로 만들어주어야 했었다. 자바는 이러한 문제점을 해결하고자 탄생한 언어이다. 자바는 C++처럼 객체지향 프로그래밍이 가능하면서도, 운영체제로부터 독립되어있기 때문에, 자바로 소스 코드를 한 번만 작성하면 어떤 운영체제에서도 코드를 수정할 필요 없이 프로그램을 실행시킬 수 있다...

Java/Java 2023.03.11

스트림의 메서드

스트림에 대해 공부하던중 몇몇 유용해보이는 메서드들이 있어 이에대해 포스팅하게 됬다. orElse() List list = Arrays.asList(); // 컴파일 오류 발생 Double value = list.stream() .mapToDouble((a)->a) .average(); // 런타임 오류 발생 Double value = list.stream() .mapToDouble((a)->a) .average() .getAsDouble(); 위와 같은 코드를 작성하면 컴파일 에러가 발생한다. 이유는 average()를 이용해 평균값을 구할때 입력값이 아예 없으면 즉 빈 리스트를 불러와 평균값을 구할수가 없기 때문이다. 해당 리스트에 숫자형 데이터 "0"이라도 존재 한다면 "0"을 리턴하지만 빈 리스트..

Java/Java 2023.03.11

스트림 (Stream)

스트림 스트림(Stream)은 배열, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다. 스트림을 사용하면 List, Set, Map, 배열 등 다양한 데이터 소스로부터 스트림을 만들 수 있고, 이를 표준화된 방법으로 다룰 수 있으며 스트림은 제공하는 다양한 메서드들을 이용하여 데이터 소스를 다룰수 있다. 어떠한 집합의 데이터들에 접근하는데 반복문으로 처리가 가능하다. 하지만 for문이나 Itorator를 사용할경우 코드가 길고 가독성이 떨어질수 있으나 스트림을 통해 구현한다면 코드를 좀더 직관적으로 작성이 가능하다. 선언형과 명령형 프로그래밍 비교 // List에 있는 숫자들 중에서 4보다 큰 짝수의 합계 구하기 // ------------------------반복문 ..

Java/Java 2023.03.10

파일 입출력 (InputStream, OuputStream, FileReader, FileWriter, File)

InputStream, OutputStream 자바에서는 입출력을 다루기 위한 InputStream, OutputStream을 제공한다. 스트림은 단방향으로만 데이터를 전송할 수 있기에, 입력과 출력을 동시에 처리하기 위해서는 각각의 스트림이 필요하다. 입출력 스트림은 어떤 대상을 다루느냐에 따라 종류가 나뉜다. 예를 들면, File을 다룰 때는 FileInputStream / FileOutputStream을 사용하고, 프로세스를 다룰 때는 PipedInputStream / PipedOutputStream을 사용한다. FileInputStream echo code >> helloWorld.txt 아무 파일이나 생성, 이후 FileInputStream으로 파일의 내용을 읽을수 있다. import java...

Java/Java 2023.03.09

람다(Lambda)

람다(Lambda) 람다식(Lambda Expression)은 함수형 프로그래밍 기법을 지원하는 자바의 문법요소이다. 간단히 말해서 메서드를 하나의 ‘식(expression)’으로 표현한 것으로, 코드를 매우 간결하면서 명확하게 표현할 수 있다는 큰 장점이 있다. (공부하면서 느낀것은 자바스크립트의 콜백(callback)함수와 굉장히 비슷했지만 자바에서는 함수형 인터페이스를 만들어주는 등 별도의 작업이 더 필요했다.) 비교 예제 함수형 인터페이스를 사용한 람다식 표현 public class Main { public static void main(String[] args) { int firstNum = 1; int secNum = 2; ExampleFunction example = (a, b) -> a -..

Java/Java 2023.03.09

컬렉션 프레임워크 (Collection Framework)

컬렉션 프레임워크 자바에서의 컬렉션이란 여러 데이터들의 집합을 의미한다. 여러 데이터들을 그룹으로 묶어 놓은것이 컬렉션이며 이 컬렉션을 다루는 기능의 메서드들을 미리 정의해 놓은것을 컬렉션 프레임워크라한다. 컬렉션 프레임워크는 특정 자료구조를 이용하여 데이터의 접근, 삽입, 검색, 삭제 등의 동작을 수행하는 메서드들을 제공해준다. List List인터페이스는 배열과 같이 객체를 일렬로 정렬해놓은 구조이며 각 요소들은 객체로 이루어저 있고 인덱스로 각 객체들을 관리한다. List의 큰 특징으로는 인덱스로 데이터의 순서를 관리하기 때문에 데이터의 순서가 유지되며 데이터값이 중복되더라도 저장이 가능하다. List 인터페이스의 공통 메서드 기능 리턴타입 메서드 설명 객체 추가 void add(int index,..

Java/Java 2023.03.08

try(), catch() - 예외 처리(Exception Handling)

컴파일 에러 컴파일 에러란 이름 그대로 컴파일 할때 발생하는 에러이다. 주로 문법적인 문제로 인한 신택스(syntax)오류로 발생하며 신텍스 에러(Syntax Errors)라고도 한다. 컴파일 에러는 자바 컴파일러가 오류를 감지하여 사용자에게 알려준다. 흔히 에디터(IDE)에서 나타나는 에러가 이에 해당된다. 런타임 에러 런타임, 즉 코드가 실행되며 발생하는 에러이며 컴퓨터가 수행할 수 없는 특정한 작업을 요청할 때 발생한다. 런타임 에러는 현재 실행중인 코드가 잘못되었다면 자바 가상 머신(JVM)이 감지하여 해당 코드부터 실행을 중단한다. 예외 클래스 자바에서는 오류를 발견하면 예외 클래스로부터 인스턴스를 생성하며 그 인스턴스를 통해 예외처리를 한다. 모든 예외클래스의 최고 상위 클래스는 Excepti..

Java/Java 2023.03.07

제네릭 (Generic)

제네릭(Generic) 제네릭은 임시적인 타입을 정해주는 문법적 요소로 제네릭을 사용하면 클래스내의 필드(클래스변수 제외), 매개변수, 메서드에 구체적인 타입(String, int, char등)을 지정해 주지 않아도 되며 해당 클래스의 인스턴스를 생성할때 구체적인 타입을 정해준다. 즉 이를 이용하여 작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둘수 있다. 기본 사용 방법 public class Main { public static void main(String[] args) { Generic genericDouble = new Generic(1.0); // Double 래퍼클래스(wrapper class) Generic genericInt = new Generic(1); // ..

Java/Java 2023.03.07