JE_:) 2023. 4. 14. 13:45
728x90

버그(Bug) - 벌레, 

디버그(Debug) - 벌레를 잡다. 

... 그렇다면 디버깅(Debugging)은?

 

 

※ 디버깅(Debugging)이란?

 

디버그(Debug) 또는 디버깅(Debugging)은 프로그램에서 발생하는 문법 오류나 논리 오류를 찾아 바로잡는 과정이다.

* 디버거(Debugger) : 디버깅 작업을 손쉽게 할 수 있도록 돕는 소프트웨어(SoftWare)

 

 

이때, 문법 오류는 컴파일러(Compiler)가 자동으로 찾아주기에 문제가 되지 않으나,
논리 오류는 코드가 사용자의 의도와는 다르게 동작하고 또 다양한 형태로 발생하기에 해결이 필요하다.

 

 

※ 디버깅(Debugging) 하는 법

 

코드에서 디버깅하고자 하는 줄에 중단점(Break Point)을 설정하고,

IDE(Intergrated Development Environment, 통합 개발 환경)의 디버깅 기능을 실행한다.

(대부분의 IDE이 비슷한 방식의 디버거를 제공한다.)

 

구체적인 방법
  1.  중단점(Break Point)은 여러개 설정할 수 있다.
  2.  코드를 한줄씩 실행하거나 다음 중단점까지 실행할 수 있다. 또한 해당 과정에서 추적할 변숫값도 지정할 수 있다.
  3. 변숫값 이외에도 원하는 수식을 입력해 논리 오류를  파악할 수 있다.

 

 


 

IDE 중, Eclipse를 통해 사용법을 확인해보자.

 

 

① 원하는 위치에 중단점을 찍는다. (여러개 가능)

중단점 찍기 전
중단점 찍은 후

* 중단점의 경우, 원하는 위치의 줄(숫자)을 더블 클릭하거나 우클릭 > Toggle Breakpoint를 선택한다.

우클릭시, 활성화 창

 

제거하고자 할땐 같은 방법으로 더블 클릭하거나 우클릭 > Disable Breakpoint 를 선택한다.

 

 

② 상단에서 'Debug' (벌레모양) 아이콘을 누른다. 

디버깅

이때 주의할 점으로 코드 내에서 데이터를 받아와야 하는 경우, Console창에 추가로 입력해주어야 한다.

input값을 지정하여 준다.

 

③ 디버깅 결과를 확인한다.

Debug창
Variables창

위처럼 Debug창과 Variables창을 통해 확인할 수 있다.

 

* Debug / Variables창을 찾을 수 없어요!

더보기

 * 위처럼 view가 나오지 않는 경우(또는 활성화가 안되어 있는 경우)에는 직접 view를 띄울 수 있다. 

 

Window > Show View > 원하는 view 클릭, 또는 other를 통해 검색 

view 활성화

 

 


 

※ 디버깅 활용 사례

 

하단의 코드는 구간합에 관련된 코드이다.  

이 예제를 통해 실수하기 쉬운 4가지의 오류를 확인할 수 있다.

package test;

import java.util.Scanner;

public class hello {
	public static void main(String[] args) {
		
		 // 선언 - 값 읽기
        Scanner scan = new Scanner(System.in);

        //값설정 
        int testcase = scan.nextInt();
        int answer = 0;
        int A[] = new int[100001];
        int S[] = new int[100001];

        for(int i=1; i < 10000; i++) {
        	A[i] = (int) (Math.random() * Integer.MAX_VALUE);
        	S[i] = S[i-1] + A[i];
        }
        

        for (int t=1; t < testcase; t++) {
        
			int query = scan.nextInt();
            
            for(int i=0; i < query; i++){
            	int start = scan.nextInt();
                int end = scan.nextInt();
                
          		answer += S[end] - S[start-1];
                
                System.out.println(testcase + " " + answer);
             
            }
        }
        
        scan.close();
	}
}

 

* 실수하기 쉬운 4가지 오류

더보기

오류 1. 변수 초기화(Variable Initialize) 오류

디버깅 결과

디버깅을 돌려 확인된 Variables 값에서 이상한 점을 찾을 수 있다. 

testcase(총 실행될 횟수)는 50번으로, 현재 t는 2 즉, 두번째 반복을 수행하고 있음을 볼 수 있다. 

그런데도 answer는 두번째에 들어섰음에도 초기화되지 않고 큰 값을 유지하는 것을 확인할 수 있다.

 

 


 

오류 2. 반복문(iteration statements)에서의 인덱스(index) 범위 지정 오류

 

작성된 코드 중, 해당 부분을 보자.

범위가 잘못 지정된 인덱스 예시

 미리 선언된 배열들은 모두 100,001로, 대략 십만정도의 크기를 가지고 있음에도, 하단 for문(반복문)에는

10,000, 만정도의 크기만을 사용하고 있다. 이는 나머지의 빈칸은 사용되지 않은 채 비어 있음을 뜻한다.

 

 


 

오류 3. 잘못된 변수(variable) 사용 오류

 

출력하고자 하는 내용을 알맞게 작성하는 것이 오류를 줄일 수 있다.

 

예를 들어보자.

testcase라는 변수를 받아와 진행하는 test의 횟수를 출력하면서, 해당 테스트에 대한 결과값도 함께 출력하려 한다.

int testcase = scan.nextInt(); // ex> 5 입력

for (int i=0; i < testcase; int ++) {
	// 결과값
    int result = testcase + i;
    
    // 출력
    System.out.println(testcase + " : " + result);
}

위 코드의 결과값은 하단과 같다.

5 : 5
5 : 6
5 : 7
5 : 8
5 : 9

 우리가 출력하고자 하는 결과는 각 테스트 (1~5까지) 의 번호와 결과값인데, 잘못된 변수의 사용으로 인해 

결과값이 바뀌어버린 것을 확인할 수 있다.

 

    // 출력 (변경 전)
    //System.out.println(testcase + " : " + result);
    
    // 출력 (변경 후)
    System.out.println(i+1 + " : " + result);
    // 또는 testcase-(5-i)

즉, 원하는 결과값을 얻기 위해선 변수의 사용에도 유의하여야 한다.

 


 

오류 4. 자료형(Data Type) 범위 오류

데이터 계산 도중,  ① 변수에 값을 지정할 때 해당 자료형의 범위를 넘어버리거나,

② 출력하고자 하는 결과를 표현할 수 없는 자료형이 사용되는 경우도 있다.

 

 

 ① 변수에 값을 지정할 때 해당 자료형의 범위를 넘어버리거나,

숫자형을 받아 계산하기 위해 int로 선언하여 작업하였으나 결과가 제대로 나오지 않거나 중단되는 문제가 발생했다.
대부분 이러한 경우, int에 저장할 수 없는 범위의 값이 계산된 것으로,  자료형을 long형으로 변경해야 한다.

 

정수형 데이터 타입 값의 범위 (최소 ~ 최대)
int -2147483648 ~ 2147483647
long  -9223372036854775808 ~ 9223372036854775807

 

② 출력하고자 하는 결과를 표현할 수 없는 자료형이 사용되는 경우 또한,

출력 조건이 소수점 자리를 나타내야 하는 경우라면 정수형 타입이 아닌 실수형 타입을 사용하는 등,

목적에 맞는 자료형 사용이 중요하다. 

 

해당 문제의 예제로는 [백준 1008번 - A/B]를 참고하면 좋을 듯 하다.

2023.04.13 - [Algorithm&BAEKJOON(백준)/1단계) 입출력과 사칙연산] - [1008번] 5단계) A/B - JAVA 풀이

 

[1008번] 5단계) A/B - JAVA 풀이

백준 [1008번] - A/B https://www.acmicpc.net/problem/1008 1008번: A/B 두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오. www.acmicpc.net # 문제 해설 A와 B를 입력받아 A/B를 하여 결과를 내는

01-study-for-me.tistory.com

 

 

※ 결론

log를 통해 직접 수정하여 잘못된 부분을 수정할 수 있지만(대부분은 이처럼 작업하게 됨.), 정확히 잘못된 부분을 찾아내기가 어렵고 작업을 진행하면서 점차적으로 범위가 넓어지기 때문에 시간 효율에 있어 매우 비효율적이다.

 

그렇기에 디버그를 통한 에러 검출은 속도적인 면에 이점이 커질 수 밖에 없으므로, 사용에 익숙해지는 것이 좋다. 

 

 

 

* 해당 포스팅은 Infrean의 [ 하루코딩 - Do it! 알고리즘 코딩테스트 with java ]를 참고해 작성하였습니다.

728x90