Java 76

[Java] ConcurrentModificationException 예외 해결 방법

오늘 Java로 MUD 게임을 개발하던 중 ConcurrentModificationException 이라는 예외를 만나게 되었다. 지금까지 개발하면서 이 예외를 처음 본 것 같다는 생각이 들었다 . 이전에 본 적이 있다면 조금이라도 기억이 날텐데 이 예외는 왠지 오늘 처음 발생한 예외라고 생각했다. 자료구조를 순회하면서 해서는 안되는 동작에 대해 알고 있다면 발생하지 않는 예외에 속한다. 왜 발생하는 지와 그 해결 방법에 대해서 간단하게 알아보고자 한다. 핵심은 간단하다. 자료구조를 순회하면서 우리는 특정 원소에 대해 Delete 연산을 수행하게 되는데 이때 자료구조를 for loop으로 순회하면서 .size() 혹은 len() 혹은 .legth를 통해 loop 횟수를 정해줬을 것이다. 그런데 순회하는 ..

Java 2022.12.08

[Java] 외부에서 스레드를 안전하게 종료하는 방법

프로젝트를 진행하면서 Thread를 활용해야 하는 작업을 진행하고 있었다. 그러면서 특정 조건에서 Thread를 죽여야만 하는 상황이 존재했는데 어떻게 하면 외부에서 Thread를 죽일 수 있는지에 대해 고민하고 있었다. Thread의 run 내부에서는 보통 while true를 활용해서 무한 루프를 돌기 마련인데 이걸 특정 Flag를 활용해서 while true 가 아니라 while !flag 와 같은 식으로 while 문을 돌면서 flag 를 검사해주는 방식으로 할 지에 대해 고민했다. 결국에는 외부에서 해당 Thread 내에 있는 boolean stop flag 변수에 접근해서 해당 변수의 값을 바꿔주었고 while로 무한 루프를 돌던 Thread는 해당 stop flag 값이 true가 되었음을 ..

Java 2022.11.30

[Java] 생성자에서는 getInstance호출에 신중하자.

오늘 코드를 작성하던 중 신기한 현상을 만났다. 게임 서버를 구동했는데 정상 작동하지 않았다. 신기하게도 아무런 에러도 찍히지 않았다. 분명 어딘가 문제가 있을 것이라고 생각하고 살펴보았지만 짐작가는 곳은 없어서 빠르게 해결하기 위해 출력문으로 찍어보고 문제의 핵심을 찾았다. 아래 두 코드 부분을 보자. 두 코드는 각각 Game과 RedisTemplate의 생성자에 관한 코드이다. 왼쪽에 존재하는 Game에서는 RedisTemplate의 객체를 getInstance를 통해 받아오려 하고 있다. 오른쪽의 RedisTemplate 또한 Game의 객체를 getInstance를 통해 받아오려 하고 있다. 참고로 Game와 RedisTemplate 모두 싱글톤으로 작성되어있다. 그렇다면 이렇게 생성자 내에서 서..

Java 2022.11.30

[Java] Java에서 Redis 를 사용해보자. Jedis 사용하기

Java에서 Redis 를 사용해보자. Java 에서 Redis 를 쓸 수 있도록 Jedis 가 이미 준비되어있다. Gradle 에는 다음과 같이 추가한다. // https://mvnrepository.com/artifact/redis.clients/jedis implementation group: 'redis.clients', name: 'jedis', version: '2.8.0' 이후 아래 코드와 같이 redisTemplate 을 작성할 수 있다. redisTemplate 이란 redis 의 기본적인 명령어들을 method를 호출함으로써 사용할 수 있게끔 래핑한 클래스라고 볼 수 있다. 아래 예시를 천천히 살펴보자. // redisTemplate 아래 블로그에서 많은 도움을 받았습니다. 감사합니다...

Java 2022.11.23

[Java] PrintWriter 의 AutoFlush 사용

TCP 상에서 Client와 Server 상에서 문자열을 주고받는 것을 확인하려고 하는 와중에 문제가 발생했다. 아무리 client에서 입력을 하고 readLine으로 읽어들인 문자열을 server 쪽으로 보내려고 해도 server 상에서 받았다는 표시가 뜨지 않았다. 즉 아예 받지 못한 문제가 발생했다. 컴파일이나 런타임 에러도 아니고 그저 의도된 작동이 재현되지 않는 것이 문제였다. 문제의 원인은 금방 찾을 수 있었다. 원인은 PrintWriter에서 AuthFlush 를 사용하지 않았기 때문이다. 이제 문제가 발생한 배경에 대해서 알아보도록 하겠다. 우리는 통상 TCP 소켓 프로그래밍을 할때 server 쪽으로 전송하기 위해 client에 다음과 같은 코드를 작성하게 된다. in = new Buff..

Java 2022.11.23

[Java] Method Reference 사용법

Method reference 라는 기능이 있다. 알고보면 원래 눈에 익은 기능인데 그 이름이 Method Reference 라고 불리는지 몰랐을 뿐이다. 아래와 같이 표현할 수 있는 것을 Method Reference 라고 한다. 메소드 레퍼런스는 아래의 세가지 종류가 있다고 한다. 1. static 메소드 레퍼런스 2. instance 메소드 레퍼런스 3. Constructor 메소드 레퍼런스 메소드 레퍼런스는 ClassName::MethodName 형식으로 입력하면 된다. 메소드를 호출하는 것이지만 괄호가 생략되는 것이다. 그래서 사용하기 전에 메소드의 인자와 리턴 타입을 알고 있어야 한다고 한다. 또한 주로 람다실을 작성할때 많이 사용한다고 한다. static 메소드 레퍼런스는 역시 static ..

Java 2022.10.28

[Java] JIT 컴파일러란? (Just in time compiler)

Java에서 JIT 컴파일러라는 단어를 들어보았을 것이다. 들어보긴 했는데 시간이 지나면서 기억하고 있던 개념이 맞는지 희미해져서 이참에 내용 정리를 해보려고 한다. 기존 컴퓨터 프로그램을 만드는 방법은 두 가지가 있는데 그게 바로 인터프리트 방식과 정적 컴파일 방식이다. 인터프리트 방식은 실행 중에 언어를 읽으면서 대응되는 기계어 코드를 실행하는 것이고 정적 컴파일은 실행하기 전에 이미 프로그램 코드를 기계어로 번역을 마쳐놓는 방식이다. 우선 Just in time Compiler 라는 뜻이고 위에서 언급한 두 가지 방식을 혼합한 방식이라고 생각하면 된다. 실행 시점에 인터프리트 방식으로 기계어 코드를 생성하는데 그 코드를 캐싱해서 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한..

Java 2022.10.28

[Java] 함수형 인터페이스

함수형 인터페이스는 오직 1개의 추상 메소드를 갖는 인터페이스를 말한다. Java8 부터 인터페이스가 구현체는 물론 Default Method 까지 포함할 수 있다고 한다. 그런데 이러한 요소들이 얼마나 있는지와는 관계없이 추상 메서드가 딱 하나 있다면 그걸 함수형 인터페이스라고 부른다고 한다. @FunctionalInterface 어노테이션을 사용해서 조건에 맞는지 검사할 수 있다. 또한 Java에서 기본적으로 제공하는 Functional Interface가 있다고 한다. 사실 실제로 Functional Interface 를 직접 만들어서 사용하는 경우는 드물고 이미 만들어져있는걸 주로 사용한다고 한다. 어디선가 한번쯤은 들어밨을 법한 Functional Interface들은 아래와 같다. 1. Pre..

Java 2022.10.24

[Gradle] 일반 Java 프로젝트 진행 중 Gradle 로 프로젝트 변환하기

아래 블로그에서 도움을 받았다. 감사합니다. 는 아니고 임의로 gradle 파일들 설정하다가 완전 꼬여버렸다. 그냥 Gradle 프로젝트 새로 파서 거기로 옮겨주자. https://pmandocom.tistory.com/102 [JAVA] IntelliJ - 일반 JAVA 프로젝트를 Gradle 프로젝트로 변환하기 & Java file out of source root 오류 해결 공식 홈페이지를 참고했다. 1. 프로젝트 폴더에 build.gradle을 생성한다. 2. build.gradle에 다음의 내용을 넣는다. plugins{ id 'java' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCen.. pmandocom.tistory..

Java 2022.09.29

[Java] Java Future란 무엇일까?

Java의 개념 중 Future에 대해 알아보자. 아래 블로그에서 도움을 받았습니다. 감사합니다. https://codechacha.com/ko/java-future/ Java - Future 사용 방법 Future는 비동기적인 연산의 결과를 표현하는 클래스입니다. 즉, 멀티쓰레드 환경에서 처리된 어떤 데이터를 다른 쓰레드에게 전달하는 역할을 합니다. Future 내부적으로 Thread-Safe 하도록 구현되 codechacha.com

Java 2022.05.06

[Java] Future of JVM - 자바, 코틀린, 스칼라 그리고 JVM의 미래

인터넷에서 이곳저곳 탐방하다가 꽤 흥미로운 아티클들을 발견했다.  읽어보면 재밌을거다.  결론: 그냥 하던거 열심히 공부하자. '_^  https://medium.com/@frietziek/the-future-of-the-jvm-java-scala-and-kotlin-846c6f2f2491 The future of the JVM: Java, Scala and KotlinI’ve been working with many different programming languages throughout my software engineer career, but Java was always there in the mix.medium.comhttps://betterprogramming.pub/a-new-future-..

Java 2021.08.28

[Java] Java의 Throwable에 대해서

1. Error클래스를 상속하는 예외 클래스 개발자가 해결할 수 없는 심각한 오류를 의미한다. 하드디스크에 물리적 오류가 생기거나, 혹은 가상머신이 오류가 발생했을 경우가 해당된다. 2. RuntimeException 클래스를 상속하는 예외 클래스 우리가 자주보는 예외클래스들이다. NPE라거나, ArrayIndexOutOfBoundsException같은 것들이 속한다. 3. Exception클래스만 상속하는 예외 클래스 가장 많은 것이 이곳에 속한다. 반드시 try catch로 잡아줘야 한다. 추가 팁: 직접정의하는 예외클래스는 모두 Exception클래스를 상속받아야만 한다.

Java 2021.07.24

[Java] Java의 가변인자? 함수에 파라미터 여러개 전달하기

파이썬에서 가변인자를 사용해서 정말 편했었는데 자바에도 이 기능이 있는지 오늘 처음알았다. 쓸일이 없어서인지 모르겠는데, 여타 다른 블로그들을 돌아다니면서도 가변인자를 쓰는 것을 한번도 못봤는데, 왜인지 모르겠다. 안쓰는 이유가 있는건지 아니면 내가 아직 많은 코드를 보지 못해서인지. 그래서 이제서야 알게된 자바 가변인자는 아주 간단하다. ... 을 사용하면 바로 사용가능하다. 바로 이런 식으로 타입뒤에 ...을 적어주면 내부에서 포이치구문으로도 처리할 수 있고, 배열처럼 사용할 수 있다. (기본적으로 배열로 처리된다고 한다. ) 생각보다 재밌는 기능들이 많네.

Java 2021.07.24

[Java] Java - Properties 컬렉션 매핑

Java 에서 properties 파일을 사용하는 경우가 있다. 설정값들은 properties 파일로 빼서 관리하는 경우가있다. 그때 쓸 수 있는 컬렉션이 Properties 컬렌션이다. HashTable을 상속받아서 구현한 컬렉션의 한 종류라고 한다. HashMap 같은 경우는 키 값 형태로 Object, Object 형태로 저장하는데 Properties 는 오브젝트가 아니라 String 형태로 저장하는 간단한 컬렉션 클래스라고 한다. 일단은 *.properties 형식의 파일이 있다고 가정하자. 그러면 Java 코드 상에서 실제로 그 파일을 불러와서 그 파일에 있는 속성값을 불러다가 사용할 수 있다는 의미이다. pro.load 를 통해서 FileInputStream으로 읽어들인 파일을 열어주고 이후에..

Java 2021.01.21

[Java] Java Map 타입 매핑하기

Map 컬렉션을 사용하는 예제를 작성하던 중 Map 객체에 이터레이터를 쓰는 둥 다양한 방법이 나와있어서 올려둔다. package com.springbook.ioc.injection; import java.util.Iterator; import java.util.Map; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; public class CollectionBeanClient { public static void main(String[] args) { AbstractApplicationContex..

Java 2021.01.21

[Java] 자바 클래스 로딩 절차

클래스 로딩 절차 1) JRE 라이브러리 폴더에서 클래스를 찾는다. 2) 없으면, CLASSPATH 환경 변수에 지정된 폴더에서 클래스를 찾는다. 3) 찾았으면, 그 클래스 파일이 올바른 바이트코드인지 검증한다. 4) 올바른 바이트코드라면, Method Area 영역으로 파일을 로딩한다. 5) 클래스 블록이 있으면 순서대로 그 블록을 실행한다. 6) 클래스 안에 static block (스태틱 블록)들이 있으면 순서대로 그 블록을 실행한다.

Java 2021.01.06

[Java] 자바 static 블록, 인스턴스 블록이란 무엇인가?

uoonleen.tistory.com/6 [Java] 스태틱 블록 (static block), 인스턴스 블록 (instance block), 생성자 [Java] 자바 스태틱 블록 (static block), 인스턴스 블록 (instance block), 생성자 1. static block (스태틱 블록) -클래스가 로딩되고 클래스 변수가 준비된 후 자동으로 실행되는 블록 - 한 클래스 안에 여러.. uoonleen.tistory.com easy16.tistory.com/161 static 블록의 활용 static 블록은 객체가 생성되거나, 클래스 참조가 발생하는 경우 한번 호출 된다. (static 메소드 또는 static변수 참조) 초기화 블럭(initialization block) 1, 클래스 초기화..

Java 2021.01.06

[Java] 제너릭 메소드의 선언부에 대해

제너릭 메소드의 선언부에 대해 https://devlog-wjdrbs96.tistory.com/201 [Java] 제너릭 메소드(Generic Method)란? 제너릭 메소드 제네릭 메소드는 메소드의 선언 부에 적은 제네릭으로 리턴 타입, 파라미터의 타입이 정해지는 메소드이다. 제너릭에 대한 예시를 보면서 이해해보자. public class Student { static T nam devlog-wjdrbs96.tistory.com https://atoz-develop.tistory.com/entry/JAVA-%EC%A0%9C%EB%84%A4%EB%A6%ADGenerics-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%99%80-%EB%A9%94%EC%86%8C%EB%93%9C JAVA 제네릭(G..

Java 2021.01.06

[Java] 유틸리티 클래스란 무엇인가?

유틸리티 클래스란 무엇인가? 어려운 개념은 없고 그냥 용어이다. 유틸리티 클래스는 인스턴스 메서드와 인스턴스 변수를 일절 제공하지 않고 정적 메서드와 변수만을 제공하는 클래스를 뜻한다. 클래스 본래의 목적인 '데이터와 데이터 처리를 위한 로직의 캡슐화' 를 실행하는 것이 아니라 '비슷한 기능의 메서드와 상수를 모아서 캡슐화' 한 것이 유틸리티 클래스이다. 설명이 너무 짧아서 static에 대해서 조금 더 언급하겠다. static을 사용하는 이유는 공유 때문이다. static 을 사용하면 새로 생성되는게 아니라 항상 같은 곳의 메모리 주소를 향하기 때문에 static 변수의 경우는 그 값이 공유가 가능하다. static method는 어떤 개념일까? static method는 메서드의 앞부분에 static..

Java 2021.01.06
반응형