본문 바로가기

전체 글70

[Java] 멀티쓰레드 동기화 - synchronized 쓰레드의 동기화 씽글쓰레드의 경우에는 하나의 프로세스 내에서 하나의 쓰레드만 작업하기 때문에 프로세스의 자원에 대한 문제가 딱히 없다. 하지만 멀티쓰레드의 경우 여러개의 쓰레드가 하나의 프로세스 내의 자원을 공유하기 때문에 서로의 작업이 프로세스 내에서 공유하는 공유자원에 영향을 끼칠 수 있다. 예를들어, A 쓰레드가 공유자원을 가져다 작업을 하던 도중 B 쓰레드에게 제어권이 넘어가게 될 경우 다시 A 쓰레드가 제어권을 가지고 작업을 마무리 했을 때 원하는 결과가 도출되지 않을 가능성이 있다. 이러한 일이 발생하지 않도록 하기 위해서는 A 쓰레드가 작업이 끝나기 전까지 다른 쓰레드에게 제어권이 넘어가지 않도록 하는 것이 필요하다. 그래서 도입된 개념이 '임계영역'과 '잠금(lock)'이다. '임계영역'이.. 2021. 9. 11.
[Java]Java 에서의 I/O(입출력)-Stream File과 Files 자바에서는 java.io 패키지에 File이라는 클래스가 존재한다. 이 패키지는 파일뿐만 아니라 파일의 경로(path)의 정보도 포함하는 클래스이다. 때문에 유닉스 계열의 파일에서 사용하는 몇몇 기능을 제대로 제공하지 못한다. 이러한 문제를 해결하기 위해 Java 7부터 Files라는 클래스가 등장했다. Files 클래스는 기존에 있던 File 클래스에 있던 메소드를 대체하여 제공하며 모든 메소드가 static으로 선언되어 있어 객체를 따로 생성하지 않아도 된다는 장점이 있다. I/O I/O이란 Input과 Output의 약자로서 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것을 말한다. 예를 들면, 키보드로부터 데이터를 입력받는다던가 System.out.print.. 2021. 9. 11.
[Java]Serializable(직렬화)란? Serializable(직렬화)란? 직렬화(Serialization)란 자바 시스템 내에서 사용하는 객체 또는 데이터를 자바시스템 외에서도 사용할 수 있도록 Byte 형태로 데이터를 변환하는 기술이다. Byte로 변환된 데이터를 다시 자바의 객체로 변환하는 기술을 역직렬화(Deserialization)라고 한다. 말로 풀어서 설명하면 Serializable란 컴퓨터의 메모리 상에 존재하는 데이터를 파일로서 저장하거나, 통신하는 다른 컴퓨터에게 알맞은 형식으로 맞추어 전달하기 위해 byte Stream형태로 만드는 것을 의미한다. 프로그램에서 사용되는 데이터들은 연속적으로 위치해 있지 않고 내부적으로 포인터에 의해 참조되고 있는데, 이는 실행중인 컴퓨터에서만 인식이 가능하기 때문에 다른 컴퓨터와 통신하기 .. 2021. 9. 5.
[Java] 불변객체(Immutable Object)에 대해 알아보자 📚 이번주 멘토링 시간에 책을 꼼꼼히 읽었다고 생각했는데 막상 질문 주신 것에 대해 답변을 못했다. 그 이유는 온전히 내 것으로 만들지 못했기 때문에라고 생각한다. 이번주부터는 읽은 내용과 이해한 내용을 모두 블로그에 정리하며 "~~가 뭔가요?"라는 질문에 대답할 수 있게끔 공부한 내용을 머릿속에 집어넣을 예정이다. 불변 객체(immutable object) 란? 객체 지향 프로그래밍에 있어서 불변객체(immutable object)는 생성 후 그 상태를 바꿀 수 없는 객체를 말한다. 그렇기 때문에 한 번 생성이 되면 신뢰할 수 있는 객체가 된다. 가장 대표적인 불변객체로는 String, Integer, Boolean, BigDecimal ...이 있다. 아래의 예제는 String을 예로 들었다. Str.. 2021. 8. 29.
[Java]equals()와 hashCode()에 대해서 알아보자(동등성 동일성) 이번엔 Object 클래스의 equals()와 hashCode()에 대해서 알아보려 한다. 그 전에 제목에 적어놓은 동등성과 동일성의 개념부터 짚고 넘어가자 동등성 객체의 내부값을 비교하는 것을 말한다. 동등성은 equals()로 비교하며 주로 참조자료형을 비교할 때 사용한다. 동일성 객체 인스턴스의 주소값을 비교하는 것을 말한다. 동일성은 == 로 비교하며 기본자료형은 == 연산자를 통해 값 비교가 가능하다. 기본 자료형을 비교할 때 == 연산자를 사용한다. 참조 자료형을 비교할 땐 ==를 사용하면 참조값(메모리 주소)을 비교하기 때문에 객체의 내부값이 같더라도 비교할 수가 없다. Object의 equals() equals()를 사용하면 객체의 내부값을 비교할 수 있다는 것은 위에서 언급을 했으니 알 .. 2021. 8. 29.
[Java] ConcurrentHashMap에 대해 알아보자 멀티스레드 환경에서 고려해야 할 사항은 바로 동시성이다. 동시성이란, 하나의 CPU에서 여러개의 작업이 일어나는 것처럼 보이는 것이다. 동시성을 고려하지 않으면 멀티쓰레드 환경에서 하나의 변수에 여러개의 쓰레드가 동시에 접근할 경우 그 변수의 값은 원하는 값으로 반환되지 않는다. 자바에서는 이런 멀티스레드 환경에서의 동시성을 위해 다양한 방법을 제공하는데 대표적인 것이 Atomic Type, volatile, synchronyzed 이렇게 세가지이다. 각기 다른 CPU1, CPU2에서 쓰레드를 실행시키고 공유자원인 변수를 연산할 때 메인메모리의 값을 읽어오는 것이 아니라 각 CPU내 캐시메모리에 값을 옮기고 그 값으로 연산을 한 뒤 메인메모리에 반영을 한다. 서로 다른 CPU내 캐시메모리는 다른 CPU내.. 2021. 8. 28.
[Java] String literal 과 new String() 의 차이 String literal & new String() 자바에서는 String 문자열 생성 방식은 두가지가 있다. 1, String literal 2. new String() 두개는 어떤 차이가 있을까? 둘의 차이는 저장되는 저장공간(메모리)의 차이이다. new 연산자를 사용하여 String을 생성하게 되면 객체로 생성이 되어 Heap메모리 영역에 저장이 되고, 리터럴(literal)을 사용하여 String을 생성할 경우 String constant pool이라는 영역에 생성이 된다. 리터럴을 사용하여 생성할 때 constant pool에 같은 값이 존재한다면 생성되는 객체는 이미 존재하고 있는 값을 참조하게 된다. 아래의 예제와 그림을 통해서 이해를 도와보자. String str1 = new String.. 2021. 8. 22.
[Java] final 을 알아보자 final이란? final은 클래스, 메소드 , 변수에 선언할 수 있는 예약어로 불변처리를 할 때 사용한다. final예약어를 사용하면 대상에 대한 변경 또는 확장을 금지할 수 있다. 아래의 예제를 통해서 이해해보자. 클래스에 final을 선언한 예제 public class Animal{} // (1) public final class Dog extends Animal{} // (2) public class poodle extends Dog{} // (3) 에러 상속 불가 (1) Animal이라는 클래스를 (2)의 Dog가 상속받았다. (2) Dog클래스는 final로 선언하였다. (3) (2)가 final로 선언하였기 때문에 불변의 상태가 되어 상속이 이루어지지 않는다. 메소드를 final로 선언한 예.. 2021. 8. 22.
[Java]추상클래스와 인터페이스(차이,공통점) 추상클래스란? 추상클래스(abstract class)란 클래스 내부에 추상적인 기능을 가질 수 있는 클래스를 말한다. 추상적으로 메소드를 선언하여 상속을 통해서 자식클래스에서 완성하도록 유도하는 클래스이다. 상속을 위한 클래스이기 때문에 객체를 따로 생성할 수 없다. 추상클래스의 특징 객체(인스턴스) 생성이 불가능하다. class 앞에 "abstract" 예약어를 사용하여 추상클래스라는 것을 명시해야 한다. 추상메소드를 가질 수 있다. abstract으로 선언된 메소드가 하나라도 존재한다면, 그 클래스는 반드시 abstract으로 선언되어야 한다. 추상클래스는 단일상속만 가능하며 일반 변수, 메소드를 가질 수 있다. 추상메소드의 특징 추상클래스 내부에서만 구현할 수 있다. 메소드에 "abstract" 키.. 2021. 8. 21.
[프로그래머스] 완주하지 못한 선수 - Java 문제유형 : 해시 문제 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 제한사항 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 participant의 길이보다 1 작습니다. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 참가자 중에는 동명이인이 있을 수 있습니다. 입출력 예 participant completion return ["leo", "kiki", "eden"] ["eden", "kiki"] "leo" ["marina", "josipa", "n.. 2021. 8. 21.