[Java] Thread 동기화가 필요해.
·
BackEnd/JAVA
쓰레드 동기화쓰레드 동기화란?애플리케이션 내에서 멀티스레드로 동작을 하게 되면 스레드끼리 자원을 공유하며 작업하게 됩니다.이때, 공유 자원의 안정성을 위하여 하나의 쓰레드 작업 시 다른 쓰레드는 접근하지 못하도록 막는 것을 쓰레드 동기화 라고 합니다.동기화를 위해서는 임계영역과 잠금이 사용됩니다.임계영역 (critical section) : 오직 한 스레드만 접근을 보장하는 영역잠금 (Lock) : 임계 영역에 접근 시 락을 획득하고, 작업 완료 후 락을 반납하며 임계영역을 벗어납니다. 동기화를 사용하는 이유간단히 입출금으로 비교했볼 수 있습니다.통장에 10만원이 있다고 가정할 때, A가 통장에서 3만원을 출금하려고 시도하던 중 B가 동일한 통장에 들어와 2만원을 출금을 하고, A의 출금 작업을 완료했습..
[Java] Socket 통신 구현해보기(ServerSocket, Socket)
·
BackEnd/JAVA
SocketTCP/IP 기반 네트워크 통신에서 데이터 송수신의 마지막 접점을 의미합니다.프로토콜과 IP주소, 포트 넘버로 구성되며 클라이언트/서버 구조로 동작합니다. Socket 통신의 흐름서버 흐름소켓 생성IP와 Port번호를 설정하는 바인딩 작업 수행listen으로 클라이언트 요청 대기accept로 클라이언트와 연결데이터 송수신소켓 닫기클라이언트 흐름소켓 생성서버에 설정된 ip와 port로 연결데이터 송수신소켓 닫기 ServerSocket서버측에서 클라이언트의 접속을 대기하며 클라이언트 접속 시 접속을 허용하고 통신하기 위한 클래스입니다.실제 모든 작업은 SocketImpl 인스턴스가 수행하게 되며 생성자 호출 시 인스턴스를 생성합니다.내부 bind와 accept함수를 보면 모든 작업 수행 시 soc..
[JAVA] 함수형 인터페이스라는게 있더라구요..(feat.Lambda)
·
BackEnd/JAVA
오늘 교육 도중 함수형 인터페이스라는 것을 배웠습니다.계속해서 자바를 해왔지만 처음 보는 것이라 매우 신기하고 당황스러웠는데요..여전히 공부할게 많고 더욱 더 노력해야겠구나 싶었습니다..흑..이 생소한 듯 익숙했던 함수형 인터페이스에 대해서 알아보겠습니다.  함수형 인터페이스란?함수형 인터페이스는 인터페이스 내에 추상메서드가 하나인 인터페이스를 의미합니다. 단일 메서드 작성 테스트간단한 예시를 작성해보겠습니다.@FunctionalInterfacepublic interface FcInterface { String printStr(String str);}@FunctionalInterface 어노테이션을 명시해주면 함수형 인터페이스임을 명시하는 것입니다.새로 생성한 FcInterface 내에 입력한 St..
[JAVA] 빈 생명주기 콜백
·
BackEnd/JAVA
스프링 컨테이너는 Bean을 관리해준다고 했습니다.여기서 관리란 객체를 초기화하고 종료하는 것을 컨테이너가 대신 해주는 것입니다. 스프링 컨테이너가 관리를 해준다는 것은 객체 관리의 주체가 프레임워크가 되므로 개발자는 객체 관리를 제외한 객체를 이용한 로직에만 집중할 수 있다는 장점이 있습니다.빈의 생명주기스프링 빈은 초기화 작업과 종료 작업이 나누어 진행됩니다. 초기화 시 객체 생성 후 의존관계 주입이라는 라이프사이클을 가지며, 의존관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있습니다. 스프링 빈의 이벤트 라이프 사이클은 위 순서대로 수행됩니다. 스프링은 모든 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주며 스프링 컨테이너가 종료되기 직전에는 소멸 전 콜백..
[JAVA] ThreadLocal에 대해 알아보자
·
BackEnd/JAVA
ThreadLocal 일반적인 변수 필드 사용 시 문제점 여러 쓰레드가 같은 인스턴스의 필드에 값을 접근하면 처음 쓰레드가 보관한 데이터가 사라질 수 있다. ThreadLocal이란 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다. ex) 여러 사람이 같은 물건 보관 창구를 사용하더라도 창구 직원은 사용자를 인식해서 사용자별로 확실하게 물건을 구분해준다. 각 쓰레드마다 별도의 내부 저장소를 제공한다. 같은 인스턴스의 쓰레드 로컬 필드에 접근해도 문제 없다. 쓰레드마다 다른 저장소를 사용하기 때문데 데이터 무결성이 보장된다. ThreadLocal 사용법 저장 : ThreadLoca.set(xxx); 조회 : ThreadLocal.get() 제거 : ThreadLocal.remove() 사용해보기 문제..
[JAVA] Char type to Integer type 주의할 점!
·
BackEnd/JAVA
코딩테스트 공부를 하던 도중 Character타입을 Integer로 변환할 때 원했던 숫자가 아닌 아스키 코드로 출력된다는 것을 발견했다!! 평소에 Character타입을 많이 사용할 일이 없다보니 새롭게 알게 된 사실! (기억해둡시다.) String to Integer Integer.valueOf(s); Integer.parseInt(s); String을 Integer로 바꿀 때는 Integer에서 지원하는 함수로 쉽게 String 내의 숫자를 얻을 수 있다. Char to Integer - Ascii code?? 그러나 Char타입을 Integer로 변환 할 때는 Ascii code로 결과값이 반환된다. 왜일까? (보충) 이처럼 아래 방법을 사용하여 변환하면 Char타입 c의 숫자 값을 아스키코드로 ..
[JAVA] main함수의 String[] args에 값을 주입해보자.
·
BackEnd/JAVA
main함수를 실행하면 String배열의 args의 수는 당연하게도 0이 나온다. 실행 시 위 args에 값을 주입하여 시작하고 싶다면 어떻게 해야 할까? 실행하려는 클래스의 Run Configuration을 수정해주면 된다. 1. 아래 메뉴 중 Modify Run Configuration...을 눌러 Run Configuration에 들어간다. 2. 아래 Program arguments에 띄어쓰기로 구분하여 값을 입력해주면 main함수 실행시 args의 값을 출력할 수 있다. one two three를 입력해준 후 3. 아래 코드를 실행하면 다음과 같은 결과를 확인할 수 있다.