java

반응형

보통 파일 삭제 및 폴더 삭제를 각각 file.delete() 함수나 cleanDirectroy() 함수로 폴더 비우고 파일 삭제하는 경우가 있는데

deleteQuietly 이 함수는 파일 및 폴더 삭제(하위 파일과 폴더를 모두 삭제하는 강력한 함수이다.

deleteQuietly 함수 내부를 살펴보자면 먼저 file.isDirectory() 함수로 폴더 체크 후

cleanDirectory() 함수로 폴더를 비워주고 delete 함수로 삭제해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public static boolean deleteQuietly(final File file) {
        if (file == null) {
            return false;
        }
        try {
            if (file.isDirectory()) {
                cleanDirectory(file);
            }
        } catch (final Exception ignored) {
            // ignore
        }
 
        try {
            return file.delete();
        } catch (final Exception ignored) {
            return false;
        }
    }
 
FileUtils.deleteQuietly(targetFile);
cs

deleteQuietly 사용법

FileUtils 클래스에 속해 있어서 Apache Commons IO 라이브러리 없다면 maven 추가해줘야 된다.

https://mvnrepository.com/artifact/commons-io/commons-io

0. 위 링크로 이동해 최신 버전인 maven 태그를 복사하거나 아래 2.8 버전을 복사해서

pom.xml <dependencies> 태그 내부에 복사해준다.

1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>
 
cs

1. 저장 후 Project 메뉴 > Update Maven Project 후 maven 추가한 프로젝트를 업데이트 해준다.

2. 아래 메소드처럼 파일경로 String으로 매개변수로 읽어와서 삭제하거나 

 FileUtils.deleteQuietly(targetFile); 

deleteQuietly 함수를 이용하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
    /**
     * 파일 삭제
     * @param String
     */
    public void FileDelete(String filePath) {
        try {
            File targetFile = new File(filePath);
            FileUtils.deleteQuietly(targetFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
cs

 

반응형
반응형

1. 문제 1550번 16진수 단위 테스크 코드

문제 풀이

 

[BOJ/백준] 1550번 16진수 문제 풀이 (JAVA/자바)

1. 문제 1550번 16진수 : 16진수의 개념을 알아야 되는 문제 이 문제를 풀면서 문제에 단위 테스트 코드를 적용해보았던 문제였다. 난이도 : 브론즈 V (solved.ac 티어) 문제 링크 : https://www.acmicpc.net/pro.

programming-enjoy.tistory.com


2. 단위 테스트 설명

먼저 단위 테스트 간략하게 설명하면 

단위 테스트 : 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트 , 하나의 기능 또는 메소드

백준 16진수 문제를 풀면서 내가 푼 소스 코드가 어디가 틀렸는지 알 수 없어서 하나하나 테스트하기에 까다로워서 단위 테스트 코드를 한번 만들어 보았다.


3. 소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class x16 {
    
    // 16진수 단위 테스트
    static int my16(String x16){
        // x16 : 입력값, result : 출력값
        
        // .. 내가 만든 소스코드 넣는 곳
        
        return result;
        
    }
    
    public static void main(String[] args) {
        for (int i = 0; i < 16777216; i++) {
            if(my16(Integer.toHexString(i)) != 
                    Integer.parseInt(Integer.toHexString(i), 16) ) {
                System.out.println("i : "+i);
                System.out.println("my16 : "+ my16(Integer.toHexString(i)));
                System.out.println("공식 16진수 변환 : "+Integer.toHexString(i)+" "
                    +"16>10진수 변환 "+Integer.parseInt(Integer.toHexString(i), 16));
                break;
            }
        }
        System.out.println("suscess");
    }
}
cs

my16 함수에 자기가 만든 소스를 넣어서 테스트 해볼 수 있는데 이전에 정답으로 풀었던 제 소스 코드를 넣으면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class x16 {
    
    // 16진수 단위 테스트  
    static int my16(String y){
        int yChar;
        int sum = 0;
        int tenMultiply;
        for (int i = 0; i < y.length(); i++) {
            yChar = y.charAt(i)-0;
            tenMultiply=1;
 
            for (int j = y.length()-1; j > i; j--) {
                tenMultiply *= 16;
            }
            
            if(48 < yChar && yChar < 58) {
                sum += (yChar-48* tenMultiply;
            }
            else if(64 < yChar && yChar < 71) {
                sum += (yChar-55* tenMultiply;
            }
        }
        
        return sum;
        
    }
    
    public static void main(String[] args) {
        for (int i = 0; i < 16777216; i++) {
            if(my16(Integer.toHexString(i).toUpperCase()) != 
                    Integer.parseInt(Integer.toHexString(i).toUpperCase(), 16) ) {
                System.out.println("index : "+i);
                
                System.out.println("내가 만든 16진수 변환값 : "+ my16(Integer.toHexString(i).toUpperCase()));
                System.out.println("공식 16진수 변환값 : "+Integer.toHexString(i).toUpperCase()+", "
                    +"공식 10진수 변환값 "+Integer.parseInt(Integer.toHexString(i).toUpperCase(), 16));
                break;
            }
            
        }
        System.out.println("suscess");
        
    }
 
}
cs

결과값 : 내가 정답으로 제출한 소스 코드로 함수에 넣어서 테스트해봤는데 정상적으로 if문에 걸리지 않아 테스트 완료되었다. 

이처럼 sum 을 출력값 y를 입력값으로 두었는데 그값을 위처럼 바꿔주기만 하면 테스트 할 수 있다.

하지만 이게 틀린 소스 코드라면?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class x16 {
    
    // 16진수 단위 테스트  
    static int my16(String y){
        int yChar;
        int sum = 0;
        int tenMultiply;
        for (int i = 0; i < y.length(); i++) {
            yChar = y.charAt(i)-0;
            tenMultiply=1;
 
            for (int j = y.length()-1; j > i; j--) {
                tenMultiply *= 16;
            }
            
            if(48 < yChar && yChar < 58) {
                sum += (yChar-48* tenMultiply;
            }
            else if(64 < yChar && yChar < 71) {
                sum += (yChar-56* tenMultiply; // error
            }
        }
        
        return sum;
        
    }
    
    public static void main(String[] args) {
        for (int i = 0; i < 16777216; i++) {
            if(my16(Integer.toHexString(i).toUpperCase()) != 
                    Integer.parseInt(Integer.toHexString(i).toUpperCase(), 16) ) {
                System.out.println("index : "+i);
                
                System.out.println("내가 만든 16진수 변환값 : "+ my16(Integer.toHexString(i).toUpperCase()));
                System.out.println("공식 16진수 변환값 : "+Integer.toHexString(i).toUpperCase()+", "
                    +"공식 10진수 변환값 "+Integer.parseInt(Integer.toHexString(i).toUpperCase(), 16));
                break;
            }
            
        }
        System.out.println("suscess");
        
    }
 
}
cs

16진수 값에 -55 값에서 -56으로 바꿔주었다. 그 결과 A를 입력했을때 10으로 나오는게 아닌 9로 나온다

결과값


4. 단위 테스트 코드 설명

먼저 for문을 16777216번 돌리는 이유 : 백준 입력값 6글자로 제한되어 있어 16진수 최대값인 FFFFFF 변환하면 16777215이 최대값이기 때문이다.

Integer.toHexString(i) : 16진수 > 10진수 변환

toUpperCase() : toHexString 함수를 이용하면 16진수 문자열이 소문자로 나오는 값을 대문자로 변환

(백준에서는 대문자로 풀이)

Integer.parsInt(Integer.toHexString(i).toUpperCase(), 16) : pareInt(String, 16) ; 16진수 문자열을 10진수 값으로 변환


5. 결론

사실 16진수 문제는 Integer.pareInt로 간단하게 풀 수 있지만

이 문제의 자기가 풀어본 소스 코드가 틀리다면 어떤게 틀렸는지 확인하는것도 중요하다.

반응형
반응형

1. 문제 1550번 16진수 : 16진수의 개념을 알아야 되는 문제

이 문제를 풀면서 문제에 단위 테스트 코드를 적용해보았던 문제였다. 

난이도 : 브론즈 V (solved.ac 티어)

16진수 단위 테스트 코드가 궁금하시면 아래 링크를 참조해주세요.

 

[BOJ/백준] 1550번 16진수 단위 테스크 코드 (JAVA/자바)

1. 문제 1550번 16진수 단위 테스크 코드 문제 풀이 [BOJ/백준] 1550번 16진수 문제 풀이 (JAVA/자바) 1. 문제 1550번 16진수 : 16진수의 개념을 알아야 되는 문제 이 문제를 풀면서 문제에 단위 테스트 코드

programming-enjoy.tistory.com


문제 링크 : https://www.acmicpc.net/problem/1550


2. 문제 풀이

제 풀이는 BufferedReader(입력)와 BufferedWriter(출력), 16진수 개념, 아스키 코드(char) 를 이해해야 됩니다. 

BufferedReader(입력)와 BufferedWriter(출력)는 백준에서 풀이할때 Scanner와 System.out 보다 더 빠르게 입출력하기 위해 사용했습니다. 이 글에선 따로 설명하진 않겠습니다.

tenMultiply16진수 지수로 곱하기 위한 수이며 

String.charAt(index) 는 index 별로 아스키코드값을 얻을 수 있습니다.

아스키코드 표를 보시면 49~57는 1~9 숫자값을 나타냅니다. 0은 따로 계산할 필요 없어서 포함시키지 않았습니다.

또한 문제에 나오는 65~70는 A~F 값을 나타냅니다. 

이를 이용하여 yChar-48  = 1~9 , yChar-55 = 10~15 값을 나타냅니다.


3. 소스 코드 및 풀이 인증

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main { 
    
    public static void main(String[] args) throws IOException{ 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String y = br.readLine();
        int yChar;
        long sum = 0;
        int tenMultiply;
        for (int i = 0; i < y.length(); i++) {
            yChar = y.charAt(i)-0;
            tenMultiply=1;
 
            for (int j = y.length()-1; j > i; j--) {
                tenMultiply *= 16;
            }
            
            if(48 < yChar && yChar < 58) {
                sum += (yChar-48* tenMultiply;
            }
            else if(64 < yChar && yChar < 71) {
                sum += (yChar-55* tenMultiply;
            }
        }
        
        bw.write(sum+"\n");
        bw.flush();  
        bw.close();
    }
}
cs

반응형
반응형

결과값 : 1 몫 : 1 나머지 : 4

1. 개요

The method divide(BigDecimal, int) from the type BigDecimal is deprecated since version 9

The field BigDecimal.ROUND_DOWN is deprecated since version 9

이 두가지 경고는 위 사진과 같이 BigDecimal에서 divide 함수를 이용하려고 했는데

divide(BigDecimal, int) 와 BigDecimal.ROUND_DOWN (소수점 버림) 가 자바 9부터 사용하지 않는다고

경고가 나와 그걸 대체하기 위해서 알려주는 글이다.

2. 해결

BigDecimal[] divideAndRemainder 함수를 이용하여 선언하면 되는데

위 사진과 같이 첫번째 인덱스는 몫과 두번째 인덱스는 나머지를 가리킨다. 

반응형
반응형

1. 람다 함수 : 프로그래밍 언어 사용되는 개념으로 익명 함수를 지칭하는 용어

 

2. 람다식 예제 (스레드 예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class test {
 
    public static void main(String[] args) {
        // 기초 자바 문법
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello1");
            }
        });
        
        thread.run();
        
        // 람다식 문법
        Thread thread2 = new Thread(()-> {
            System.out.println("hello2");
        });
        thread2.run();
        
    }
 
}
cs

 

반응형
반응형

1. 구현 및 예제 소스 코드

멀티 스레드의 핵심적인 부분만 보여주도록 간단하게 구현했습니다. 

총 3개의 java 파일로 구현했습니다. 2개의 스레드 클래스와 1개의 실행 클래스로 나뉘어집니다.

1) 메인 실행 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
package Main;
 
public class Main {
 
    public static void main(String[] args) {
        
        Thread subTask1 = new run1();
        Thread subTask2 = new run2();
        subTask1.start();
        subTask2.start();
        
    }
}
cs

2) 스레드 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
package Main;
 
public class run1 extends Thread {
 
    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            System.out.println("첫번째 스레드 i : "+ i);
        }
        
    }
 
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Main;
 
public class run2 extends Thread {
 
    @Override
    public void run() {
        for (int j = 0; j < 10000; j++) {
            System.out.println("두번째 스레드 j : "+ j);
        }
        
    }
 
}
 
cs

결과 화면

동시에 출력되고 있음을 볼 수 있다. 끄읏 !

반응형
반응형

1. 문제 : 2557번 Hello World : 출력의 기초가 되는 문제

많은 프로그래밍 언어 서적에서 맨 처음 소개하는 예제입니다. 

난이도 : 브론즈 V (solved.ac 티어)


문제 링크 : https://www.acmicpc.net/problem/2557


2. 문제 풀이

이 문제는 출력하는 방법을 알면 풀 수 있는 문제이다. 


3. 소스 코드 및 풀이 인증

 
1
2
3
4
5
6
7
8
public class Main{
 
    public static void main(String[] args) {
        System.out.print("Hello World!");
 
    }
 
}
cs

반응형
반응형

1. 문제 : 1000번 A+B : 두 숫자를 입력받아 더하고 출력하는 문제

난이도 : 브론즈 V (solved.ac 티어)


문제 링크 : https://www.acmicpc.net/problem/1000

 

1000번: A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net


2. 문제 풀이

이 문제는 키보드를 이용해 숫자를 입력하는 방법과 출력하는 방법만 알면 풀 수 있는 문제이다.

Scanner(입력)에 더 자세한 설명 : https://programming-enjoy.tistory.com/7


3. 소스 코드 및 풀이 인증

1
2
3
4
5
6
7
8
public class Main{
    public static void main(String[] args) {
        java.util.Scanner in=new java.util.Scanner(System.in);
        int a=in.nextInt(); int b=in.nextInt();
        System.out.println(a+b);
        
    }
}
cs

 

반응형
반응형

1. 문제 : 1001번 A-B : 두 숫자를 입력받아 빼고 출력하는 문제

난이도 : 브론즈 V (solved.ac 티어)


문제 링크 : https://www.acmicpc.net/problem/1001


2. 문제 풀이

이 문제는 키보드를 이용해 숫자를 입력하는 방법과 출력하는 방법만 알면 풀 수 있는 문제이다.

Scanner(입력)에 더 자세한 설명 : https://programming-enjoy.tistory.com/7


3. 소스 코드 및 풀이 인증

1
2
3
4
5
6
7
8
public class Main{
    public static void main(String[] args) {
        java.util.Scanner in=new java.util.Scanner(System.in);
        int a=in.nextInt(); int b=in.nextInt();
        System.out.println(a-b);
        
    }
}
cs

 

반응형
반응형

1. Scanner (스캐너) : 읽은 바이트를 다양한 타입으로 변환하여 리턴하는 클래스이다.

- 입력되는 키 값을 공백으로 구분되는 토큰 단위로 읽는다.


2. Scanner 주요 메소드

1) String next() : 입력값을 문자열로 리턴 

2) int nextInt() : 입력값을 int 타입으로 리턴

3) double nextDouble() : 입력값을 double 타입으로 리턴 

4) String nextLine() :  ' \n '(띄어쓰기) 을 포함하는 한 라인을 읽고 ' \n '(띄어쓰기) 을 버린 나머지만 리턴 

5) void close() : Scanner 사용 종료 


3. Scanner 사용 방법 및 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int number = in.nextInt();
        String name = in.next();
        
        System.out.println("숫자 : "+ number + " 이름 : "+name);
        
        in.close();
        
    }
 
}
cs

출력 결과 


3. 코드 분석

1) 자바 라이브러리 클래스 java.util.Scanner 를 사용하기 위해 import 한다.

import 자세한 내용 :  https://programming-enjoy.tistory.com/5

 

[Java/자바] import(임포트) 및 사용 예제

1. Java import (임포트) : 자바의 라이브러리 패키지의 클래스를 사용하거나 사용자의 다른 패키지 안의 클래스를 사용할 때 import 명령어를 사용하면 클래스 이름으로 사용할 수 있게 해주는 명령

programming-enjoy.tistory.com

2) Scanner 클래스인 in이라는 객체를 만들어 준다. 

System.in : 키보드와 연결된 자바의 표준 입력 스트림이다.

3) in.close : Scnnaer 객체를 닫아준다. 

close를 꼭 사용해야 하는 이유 : I/O 사용시에는 연결을 맺고 끊음을 확실히 해줘야 한다. 리소스에 접근이 불가능하거나 connection pool이 꽉 차서 더이상 접근 할 수 없는 경우도 있다.  

Scanner 관련 문서 : https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

반응형

+ Recent posts