Thread

  • 선언: new Thread( run())
  • 실행: new Thread(run()).start(); run()함수 실행
  • 목적: 일을 더 빠르게 하기 위해
// Thread 생성과 동시에 실행
Thread thread = new Thread(() =>
    for(int i=0;i<4;i++){
        System.out.println("hellow world")
    }
).run();

synchronized

  • 동기화, 특정 객체에 lock이 걸려있는지 안 걸려있는지 체크 하여 작업
  • 구문: synchronized(객체)
  • 기능: 해당 객체에 lock이 걸려있는지 확인한다
    • 해당 객체에 lock이 안 걸려 있다면 걸고 실행
    • 해당 객체에 lock이 걸려 있다면 해제될때까지 기다린다.
  • 논 synchronized는 객체 lock이 걸려있든 걸려있지 않든 실행 시킨다.
// 두 함수는 동일한 기능
// 명시 되어 있지는 않지만 this 객체를 기준으로 lock을 검사함
public synchronized void print1(){
// to do
}

public void print2(){
    synchronized(this){
    // to do 
    }
}

Optional 객체

  • return null 을 통해 코드가 복잡해지는 걸 방지하기 위해 사용을 권장
  • .ifPresent(s→(System.out.println(”test”))): 해당 Optional 객체가 null이 아니라면 해당 내용을 실행해라

JVM

  • (Java Virtual Machine) runs Java bytecode
  • JVM은 자바 프로그램이 실행되는 플랫폼에 독립적인 방식으로 작동하도록 설계된 자바 바이트코드를 실행하는 런타임 환경이다
  • 이를 통해 개발자들은 한 번 작성한 코드를 다시 컴파일하거나 수정하지 않고 어떤 하드웨어에서나 운영체제에서도 실행 시킬 수 있다. 이를 WORA(Write Once Run Anywhere)이라고 한다.
  • 기능
    • 바이트코드 로딩: 자바 컴파일러로부터 생성된 자바 바이트코드를 로드
    • 바이트코드 검증: 로드된 바이트코드가 안전한지 검증
    • 바이트코드 해석 및 실행: 로드된 바이트코드를 해당 플랫폼의 기계어로 변환하고 실행 이 과정에서 JIT (Just-In-Time) 컴파일러를 활용하여 성능을 향상시킨다.
    • 메모리 관리: JVM은 자바 프로그램이 사용하는 메모리를 관리하며, 가비지 컬렉션을 수행하여 더 이상 사용되지 않는 객체를 메모리에서 제거한다.
    • 자바 라이브러리 지원: JVM은 자바 표준 라이브러리와 통합되어 다양한 기능을 제공한다.

JRE

  •  (Java Runtime Enviroment) JVM + Libraries + Other Components
  • JVM (Java Virtual Machine)과 필수 라이브러리 및 자바 응용프로그램이 실행될 때 필요한 소프트웨어들을 포함한다.
  • JRE는 자바 프로그램을 실행하는 데 필요한 최소한의 환경을 제공하며, 자바 애플리케이션을 개발하는 데 필요한 추가 도구 (컴파일러, 디버거 등)는 포함하지 않는다.

JDK

  • (Java Development Kit) JRE + Compliers + Debugger
  • JRE과 컴파일러(javac), 디버거, 배포 도구(jar), 자동 문서 생성 도구 등 다양한 개발도구를 포함하는 자바 개발자를 위한 상업용 소프트웨어이다.
  • 종류
    • Open JDK: 자유롭게 사용, 배포 및 수정이 가능한 GNU 일반 공중 사용 허가서(GPL) v2 라이선스를 가진 JDK
    • Oracle JDK: 무료로 사용할 수 있지만 상업적으로 사용하려면 유료 라이선스를 구입해야 하는 라이선스를 가진JDK

 

추천 하는 방법: Arrays.sort() 메서드 이용

// 오름차순
String arr[] = {"abcdef","a","abcd","abc","abcde"};
Arrays.sort(arr, (a, b)->{return a.length() - b.length();});

// 내림차순
String arr2[] = {"abcdef","a","abcd","abc","abcde"};
Arrays.sort(arr, (a, b)->{return b.length() - a.length();});

비추천 방법: Stream.sorted() 메서드 이용

// 오름차순
String arr[] = {"abcdef","a","abcd","abc","abcde"};
List<String> units = Arrays.asList(arr);
List<String> sortedUnits;
// 문자열 추가 작업 생략
sortedUnits=units.stream().sorted(Comparator.comparing(String::length)).collect(Collectors.toList());
arr = sortedUnits.toArray(new String[sortedUnits.size()]);

// 내림 차순
String arr2[] = {"abcdef","a","abcd","abc","abcde"};
List<String> units2 = Arrays.asList(arr);
List<String> sortedUnits2;
sortedUnits2=units2.stream().sorted(Comparator.comparing(String::length).reversed()).collect(Collectors.toList());
arr2 = sortedUnits2.toArray(new String[sortedUnits.size()]);

 

 

<테스트> currentTimeMillis() 함수는 현재의 밀리초를 반환 함

public class Test{
    static String useFormat(int test){
        return String.format("%s",test);
    }
    static String useDoubleQuotes(int test){
        return test+"";
    }
    static String useValueOf(int test){
        return String.valueOf(test);
    }
    public static void main(String[] args) {
        int test = 50;
        long startTime;
        long endTime;


        startTime = System.currentTimeMillis();

        for (int i=0;i<200000000;i++){
            useFormat(test);
        }

        endTime = System.currentTimeMillis();
        System.out.println((endTime - startTime));



        startTime = System.currentTimeMillis();

        for (int i=0;i<200000000;i++){
            useDoubleQuotes(test);
        }

        endTime = System.currentTimeMillis();
        System.out.println((endTime - startTime));



        startTime = System.currentTimeMillis();

        for (int i=0;i<200000000;i++){
            useValueOf(test);
        }

        endTime = System.currentTimeMillis();
        System.out.println((endTime - startTime));

    }
}

 <결과>

12393
1032
1027

<결론>

String.valueOf(50) or 50+"" 둘 중 하나를 사용하자

public class Main {
    public static void main(String[] args) {
        int tmp = 32; // 100000
        int tmp2 = 1; // 000001
        String fometTmp = String.format("%6s",Integer.toBinaryString(tmp));
        //fometTmp = fometTmp.replaceAll("1", "#");
        //fometTmp = fometTmp.replaceAll("0", " ");
        System.out.println(fometTmp);

        String fometTmp2 = String.format("%6s",Integer.toBinaryString(tmp2));
        //fometTmp2 = fometTmp2.replaceAll("1", "#");
        fometTmp2 = fometTmp2.replaceAll(" ", "0");
        System.out.println(fometTmp2);


    }
}

<결과 창>

100000
000001

정규 표현식: 프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 말한다. 정규식이라고도 부르며,보통 regex 혹은 regexp라 많이 쓴다. 출처: <나무위키>

 

[^] 사용시 ^다음에 오는 문자들을 제외한 나머지를 선택함을 의미한다.

[a-c] a~c까지의 문자들을 의미한다.

    public static void main(String[] args) {
        String tmp = "aBD9559-1.13_1-";
        System.out.println(tmp);
        // .이 반복으로 들어간 경우를 제거
        tmp = tmp.replaceAll("[.]{2,}",".");
        System.out.println(tmp);
        // 알파벳 소문자 a~z 와 숫자 0~9와 -._을 제외하고 제거
        tmp=tmp.replaceAll("[^[a-z][0-9]-._]","");
        System.out.println(tmp);
        // 알파벳 소문자 a~z 와 -._을 제외하고 제거
        tmp=tmp.replaceAll("[^[a-z]-._]","");
        System.out.println(tmp);
        // -._ 문자 제거
        tmp=tmp.replaceAll("[-._]","");
        System.out.println(tmp);
    }

실행 결과

aBD9559-1....13_1-
aBD9559-1.13_1-
a9559-1.13_1-
a-._-
a
public class Main {
    public static void main(String[] args) {
        String array[] = {"apple","apple","banana","apple","kiwi","banana"};
        List<String> tmp;
        // stream().distinct() 는 반환 값이 stream 타입이기 때문에 toList로 변환 
        tmp = Arrays.stream(array).distinct().collect(Collectors.toList());
        for (String string: tmp) {
            System.out.println(string);
        }
    }
}

실행 결과

apple
banana
kiwi

 

상황: 문제에서 길이가 고정된 배열을 반환 하기를 요구하는데 

풀이 중에는 길이가 유동적인 자료구조가 필요할 때

int [][]intervals={{1,2},{3,5},{6,7},{8,10},{12,16}};
// 해당 코드를 통해 배열정보를 list에 저장 할 수 있고
List<int[]> list = new ArrayList<>(Arrays.asList(intervals));
// 해당 코드를 통해 List 를 다시 인트형 배열로 바꾸어서 내보낼 수 있다.
list.toArray(new int[list.size()][2]);

// ArrayList<Integer> ans -> int[] ans
ans.stream().mapToInt(Integer::intValue).toArray()

메모: List 를 활용하여 배열 정보를 저장하고 내보낼 수 있다.

만약 배열을 새로 만들어 반환해야 할 때 사용 한다면 효율적이라 생각한다.

 

+ 정수형 배열 변환 방법: https://velog.io/@deannn/Java-int%ED%98%95-ArrayList-%EB%B0%B0%EC%97%B4-%EB%B3%80%ED%99%98

+ Recent posts