프로그래밍 언어/Java

    [Java] AtomicLong으로 동시성 문제 해결 (feat.비관적 락을 사용 하지 못한 이유)

    콘서트 예매 사이드 프로젝트를 진행하면서 대기열 관련해서 개발을 진행하면서 비관적 락을 사용해서 대기열 동시성을 풀어 나가려고 했습니다. 요구사항 중 멀티 스레드 환경에서 여러 번의 요청이 들어와도 내가 정한 대기열의 인원수(QUEUE_LIMIT)만 ONGOING 상태로 저장되어야 하며, 대기열 등록 시 ONGOING 상태가 QUEUE_LIMIT 보다 크거나 같은 경우 WAIT 상태로 추가되어야 합니다. (REDIS를 사용하지 않고 대기열 문제를 풀어보고 싶어서 RDB를 사용) 대기열 등록 서비스 호출시 DB에서 ONGOING상태인 유저의 COUNT(*)를 가져와서 위에 요구사항 대로 진행하도록 구현을 하였습니다. 대기열 도메인 구현을 마친 후 마지막으로 동시성 테스트 코드를 작성하여 테스트를 돌려봤지만..

    [JAVA] 추상클래스 abstract class

    추상[抽象]? 낱낱의 구체적 표상이나 개념에서 공통된 성질을 뽑아 이를 일반적인 개념으로 파악하는 정신 작용 상속은 자손 클래스를 만드는데 조상 클래스를 사용하는것이라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상 클래스를 만드는 것이라고 할 수 있다. 추상클래스? 클래스 = 설계도 추상클래스 = 미완성설계도 (완성되지 못한 채로 남겨진 설계도) 인스턴스 생성 불가능 상속을 통해서 자손클래스에 의해서만 완성될 수 있다. 일반 클래스와 차이점? 추상클래스는 추상메서드를 포함하고 있다는 것을 제외하고는 일반클래스와 전혀 다르지 않다. 추상클래스에도 생성자가 있으며, 멤버변수와 메서드도 가질 수있다. public class Main { public static void main(String..

    [JAVA] ArrayList CRUD 사용하기

    ArrayList 1)배열처럼 사용할 수 있는 목록. (배열은 index로 관리된다) 2)선형구조를 가지고 있다. 3)장점 : 검색속도가 빠르다. ArrayList 선언 ArrayList list = new ArrayList(); ArrayList list이름 = new ArrayList()(); 1.7버전부터는 뒷부분 생략 가능합니다. ArrayList 추가 list.add("비트코인"); list.add("이더리움"); list.add("코스모스"); for(String s : list) { System.out.println(s); } 결과 비트코인 이더리움 코스모스 ArrayList 내가 원하는 index에 추가 list.add(1,"도지코인"); for(String s : list) { Syste..

    [JAVA] 업캐스팅(up casting), 다운캐스팅(down casting) Casting을 하는 이유는? 다형성?

    기본적으로 캐스팅은 서로 관련 없는 데이터끼리는 변환되지 않는다. 예를 들어서boolean a = (int) 1; boolean 자료형과 int자료형은 서로 타입이 일치하지 않은 데이터 이기 때문에 되지 않는다. 참조형 데이터 역시 마찬가지이다. 자 그럼 참조형 데이터가 서로 관련이 있다는 것은? 1. 상속관계 2. 인터페이스를 사용해서 확장이 된 경우 이 글에서는 상속관계를 통해 캐스팅을 확인해보도록 하겠습니다. 상속관계의 경우 슈퍼클래스와 서브클래스가 있을 때 서브클래스는 슈퍼클래스보다 가지고 있는 많이 있습니다. 데이터의 양 : 서브클래스 > 슈퍼클래스 (서브클래스는 슈퍼클래스의 데이터를 전부 상속받았기 때문에) 이론적으로 쉽게 생각해보면 서브클래스는 슈퍼클래스의 데이터를 전부 사용할 수 있는데, ..

    [JAVA] 오버로딩 vs 오버라이딩

    오버로딩(Overloading) vs 오버라이딩(Overriding) 오버로딩(Overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new) 메소드의 이름은 동일하나 매개변수의 갯수나, 타입이 다르다. 즉, 타입이 다른 매개변수로 호출을 하기 때문에 새로운 메서드이다. 오버라이딩(Overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify) 상속받은 클래스에서 상속받은 메서드를 새로 재정의하여 사용. 상속을 받았는데 상속받은 메서드의 기능이 부족해서 자식 클래스에서 해당 메서드를 수정하여 새로운 기능을 추가하여 사용한다. 오버라이딩시 메모리영역에 새로 들어간다. 오버로딩과 오버라이딩 차이점 구분 오버로딩 오버라이딩 메서드 이름 동일 동일 매개변수, 변수타입 다름..

    [JAVA] 피보나치 수열 간단하게 구현

    public class Fibonacci { public static void main(String[] args) { /* * fibonacci : 수열 * 0 1 1 2 3 5 8 13 * a b c * a b c * a b c */ long a, b, c; long arr[] = new long[30]; a=0; b=1; arr[0] = a; arr[1] = b; int w = 0; while (w < 28 ) { c = a + b; arr[2 + w] = c; a = b; b = c; w++; } System.out.println(Arrays.toString(arr)); } } 수학에서, 피보나치 수(영어: Fibonacci numbers)는 첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 ..

    [JAVA] Calendar class 사용해서 날짜 가져오기

    package bitcamp3.day04; import java.util.*; public class Calendar1 { public static void main(String[] args) { /* * Calendar : 날씨, 시간 -> 일정관리 * Date : */ //Calendar cal = new GregorianCalendar(); Calendar cal = Calendar.getInstance(); //오늘 날짜 취득(getter) int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH); int day = cal.get(Calendar.DATE); System.out.println(year + "년" + month +..

    [JAVA] String class 자주사용하는 메서드

    public class StringClass { public static void main(String[] args) { char ch[] = {'h','e','l','l','o'}; //하나로 묶어서 사용할 수 있게 만든 것이 StringClass String str; str = "hello"; String str1 = new String("hello"); String str2 = "반갑습니다"; //String str3 = str1 + str2; String str3 = str1.concat(str2); System.out.println(str3); /* * function == 함수(process) * 구성요소 * 들어가는 값 : 인수, 인자, parameter * 나오는 값 : 돌아오는 값, re..

    [JAVA] 랜덤 숫자 중복제거 쉽게 이해하기!

    자바 초보분들이 많이 하시는 프로젝트인 숫자 맞추기, 야구게임, 로또 프로그램 등을 완성시키기 위해서 중복 숫자 값이 나오지 않도록 구현을 하실 텐데, 중복 숫자를 제거하기 위해 한 가지 쉬운 방법을 알려드리겠습니다. public class RandomNum { public static void main(String[] args) { int rNum[] = new int[9]; boolean room[] = new boolean[9]; int index = 0; int rnd; while(index < 9){ rnd = (int)(Math.random()*9); if(!room[rnd]){ room[rnd] = true; rNum[index] = rnd + 1; index++; } } for(int i=..

    [JAVA] 변수정리 #멤버변수? 지역변수? 기본형? 참조형?

    변수[Variable] (1) 기준 1: 유효 범위 멤버 변수 1. 객체(소유) 2. 클래스(소유) 지역변수 1. 선언 초기화 2. 파라미터 (2) 기준 2: static 여부 클래스(소유) == 정적 변수 == static 객체(소유) == 동적 변수 == 객체 == instance (3) 기준 3: final 여부 변수 상수 == final변수 객체, 인스턴스(즉석) => 찍어내는 것(객체) (4) 기준 4: 메모리 할당방식 기본형(primitve type) 8가지 1> 형 변환 방향(자동형 변환) byte(1) ▶ short(2) ▶int(4) ▶long(8) ▶ float(4) ▶ double(8) char(2) ▶ boolean(1) #Wrapper : Byte, Short, Char, Int,..