자바(SE)
-
자바 프로그래밍에서 JSON 문자열을 처리하기 위해 일반적으로 Gson 또는 Jackson 라이브러리를 사용할 수 있다. 간단하게 이 둘의 사용법을 비교해보자. 여기서 처리해볼 JSON data는 영화진흥위원회의 오픈 API이다. API의 url은 아래와 같다. http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20120101 전체 데이터 중 관심있는 부분은 bookOfficeResult > dailyBoxOfficeList에 배열 형태로 들어있는 영화 정보이다. 다음은 영화 정보를 가지고 있을 자바 객체이다...
JSON 문자열 처리자바 프로그래밍에서 JSON 문자열을 처리하기 위해 일반적으로 Gson 또는 Jackson 라이브러리를 사용할 수 있다. 간단하게 이 둘의 사용법을 비교해보자. 여기서 처리해볼 JSON data는 영화진흥위원회의 오픈 API이다. API의 url은 아래와 같다. http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20120101 전체 데이터 중 관심있는 부분은 bookOfficeResult > dailyBoxOfficeList에 배열 형태로 들어있는 영화 정보이다. 다음은 영화 정보를 가지고 있을 자바 객체이다...
2019.08.07 -
소켓을 이용해서 원격지로 파일 전송하는 애플리케이션 작성 중 깜빡 잘못된 생각으로 오류에 빠졌던 내용을 정리하고 개선된 소스를 작성해본다. 처음 생각한 스트림의 구조는 아래와 같다. 서버의 파일을 FileInputStream으로 읽어와서 소켓에 기반한 BufferedOutputStream으로 클라이언트로 출력하고 클라이언트는 역시 소켓에 기반한 BufferedInputStream으로 읽은 후 FileOutputStream으로 로컬 파일에 출력한다. 이에 대한 서버와 클라이언트의 코드는 각각 아래와 같다. public class ServerFile { public static void main(String[] args) { try (ServerSocket ss = new ServerSocket(6547))..
Socket을 통한 binary 파일 전송. 잠깐의 잘못된 생각과 정리소켓을 이용해서 원격지로 파일 전송하는 애플리케이션 작성 중 깜빡 잘못된 생각으로 오류에 빠졌던 내용을 정리하고 개선된 소스를 작성해본다. 처음 생각한 스트림의 구조는 아래와 같다. 서버의 파일을 FileInputStream으로 읽어와서 소켓에 기반한 BufferedOutputStream으로 클라이언트로 출력하고 클라이언트는 역시 소켓에 기반한 BufferedInputStream으로 읽은 후 FileOutputStream으로 로컬 파일에 출력한다. 이에 대한 서버와 클라이언트의 코드는 각각 아래와 같다. public class ServerFile { public static void main(String[] args) { try (ServerSocket ss = new ServerSocket(6547))..
2019.08.05 -
다음의 무거운 작업을 수행해야한다고 생각해보자. public long heavyWork(int th) { long result = 1; for (int i = 0; i < Integer.MAX_VALUE; i++) { result += i; } System.out.printf("%d th done: %d\n", th, result); return result; } 위의 작업을 총 10번 해서 총 결과를 알고 싶다면 아래와 같이 작업할 수 있다. public void getSumByNormal() { long first = System.currentTimeMillis(); long result = 0; for (int i = 0; i < 10; i++) { result += heavyWork(i); } l..
Thread의 join 사용 예다음의 무거운 작업을 수행해야한다고 생각해보자. public long heavyWork(int th) { long result = 1; for (int i = 0; i < Integer.MAX_VALUE; i++) { result += i; } System.out.printf("%d th done: %d\n", th, result); return result; } 위의 작업을 총 10번 해서 총 결과를 알고 싶다면 아래와 같이 작업할 수 있다. public void getSumByNormal() { long first = System.currentTimeMillis(); long result = 0; for (int i = 0; i < 10; i++) { result += heavyWork(i); } l..
2019.08.03 -
instanceof 연산자는 runtime에 객체의 실제 타입을 확인하기 위한 연산자이다. instanceof 연산자를 사용하면서 compile error가 나는 경우를 정리해본다. 기본적으로 컴파일러는 클래스에 대한 정보만 관리한다. interface MyInterface{} class SuperClass{} class SubClass extends SuperClass{} class Some{} A instanceof B를 사용할 때 1. A와 B가 모두 클래스일 경우 A는 반드시 B의 조상 클래스 타입이어야 한다. // String은 Number의 하위 타입이 아니므로 오류 boolean b1 = "Hello" instanceof Number; // SubClass는 Some 타입이 아니므로 오류 b..
instanceof Class vs instanceof Interfaceinstanceof 연산자는 runtime에 객체의 실제 타입을 확인하기 위한 연산자이다. instanceof 연산자를 사용하면서 compile error가 나는 경우를 정리해본다. 기본적으로 컴파일러는 클래스에 대한 정보만 관리한다. interface MyInterface{} class SuperClass{} class SubClass extends SuperClass{} class Some{} A instanceof B를 사용할 때 1. A와 B가 모두 클래스일 경우 A는 반드시 B의 조상 클래스 타입이어야 한다. // String은 Number의 하위 타입이 아니므로 오류 boolean b1 = "Hello" instanceof Number; // SubClass는 Some 타입이 아니므로 오류 b..
2019.08.01 -
클래스간의 관계는 통상 4단계로 구별할 수 있다. 1. dependency: - 의존 관계( A ------> B: A는 B에 의존한다.) - 의존 관계로 모든 객체들은 대부분 의존 관계를 갖는다. - A 클래스에서 B 클래스를 사용하고 있다면 이것은 dependency 관계이다. - 왜냐하면 B를 변경하게 되면 A가 영향을 받기 때문이다. 2. association: - 의존 관계 중 member 변수 관계(A-B: A는 B를 포함한다.) - A 클래스가 B 클래스를 맴버변수로 포함해서 의존하는 관계 - 학생이 차를 소유한다: 학생 - 차 - 학생이 라디오를 소유한다. - 라디오 굳이 association을 세분화 한다면.. 3. aggregation: - association 중 whole - par..
클래스간의 관계클래스간의 관계는 통상 4단계로 구별할 수 있다. 1. dependency: - 의존 관계( A ------> B: A는 B에 의존한다.) - 의존 관계로 모든 객체들은 대부분 의존 관계를 갖는다. - A 클래스에서 B 클래스를 사용하고 있다면 이것은 dependency 관계이다. - 왜냐하면 B를 변경하게 되면 A가 영향을 받기 때문이다. 2. association: - 의존 관계 중 member 변수 관계(A-B: A는 B를 포함한다.) - A 클래스가 B 클래스를 맴버변수로 포함해서 의존하는 관계 - 학생이 차를 소유한다: 학생 - 차 - 학생이 라디오를 소유한다. - 라디오 굳이 association을 세분화 한다면.. 3. aggregation: - association 중 whole - par..
2019.07.23 -
junit을 이용해서 multi thread를 테스트하면 아무래도 main thread가 빨리 종료해버리기 때문에 원하는 테스트 결과를 얻기 어렵다. 다음은 @Async를 이용해서 비동기 호출을 구현하고있는 빈의 예이다. @Component @Slf4j public class HeavyWorkBean { @Async public void heavyWork(int i) throws InterruptedException { Thread.sleep(1000); log.trace("아주 무거운 작업을 {} 번째 진행중.", i); } } 위 코드를 아무 생각 없이 테스트 하면 아래와 같다. public class AsyncTest { @Autowired HeavyWorkBean hBean; @Test publi..
junit을 이용한 multi thread 단위테스트junit을 이용해서 multi thread를 테스트하면 아무래도 main thread가 빨리 종료해버리기 때문에 원하는 테스트 결과를 얻기 어렵다. 다음은 @Async를 이용해서 비동기 호출을 구현하고있는 빈의 예이다. @Component @Slf4j public class HeavyWorkBean { @Async public void heavyWork(int i) throws InterruptedException { Thread.sleep(1000); log.trace("아주 무거운 작업을 {} 번째 진행중.", i); } } 위 코드를 아무 생각 없이 테스트 하면 아래와 같다. public class AsyncTest { @Autowired HeavyWorkBean hBean; @Test publi..
2019.07.22 -
JGit을 이용해서 remote repository의 특정 경로만 checkout을 하기 위한 코드 private static String userId = "사용자 ID"; private static String userPass = "사용자 비번"; private static String hash = "origin/master"; private static String url = "https://lab.ssafy.com/user_id/repository_name.git"; private static void checkOut() throws Exception { Git gitRepo = Git.cloneRepository() .setURI(url) // remote 주소 .setDirectory(new F..
JGit을 이용해서 remote repository의 특정 경로만 checkoutJGit을 이용해서 remote repository의 특정 경로만 checkout을 하기 위한 코드 private static String userId = "사용자 ID"; private static String userPass = "사용자 비번"; private static String hash = "origin/master"; private static String url = "https://lab.ssafy.com/user_id/repository_name.git"; private static void checkOut() throws Exception { Git gitRepo = Git.cloneRepository() .setURI(url) // remote 주소 .setDirectory(new F..
2019.07.21