알고리즘 문제를 푸는데, for문 안에서 정규식을 처리하고 특정한 로직을 수행하는데 정규식의 어떤 케이스에서 에러가 나는지 몰라 함수 여러군데에 print문을 찍어 확인하였다.

코드도 지저분해지는 것 같고, 다 찾아서 주석처리해주는 것도 번거로워서 이참에 디버거를 써보기로 함.

중단점을 생성해주고 디버깅 실행하면, 중단점에서 코드를 멈춰준다.

이런식으로 멈춰있는 동안에 변수들의 상태를 확인할 수 있고, 다음 코드를 한 줄씩 실행하면서 이들의 변화를 볼수있다.

하지만, 나에게 발생한 문제는 for문이 한참 돌다가 발생한 것이기 때문에 손으로 한줄씩 넘겨주면서 Exception이 발생한 곳을 찾아줄 수 없었다.

이럴땐, Exception이 발생할 때 멈춰주도록 설정을 하면 된다.

중단점 우클릭하면 나오는 창

 

원하는 BreakPoint에만 체크

이렇게 NullPointerException이 발생했을 경우 멈춰주게되고, 왼쪽 탭에서 한 줄씩 이전으로 돌릴 수도 있다.

한줄 뒤로 돌아왔더니, 정규식을 처리한 이후 strip을 해주면 ""만 남는 케이스가 있어 이것을 넘겨받은 함수에서 해당하는 값을 찾지 못 해 에러가 발생한 것이었다.

 

 

'공부 > 잡다' 카테고리의 다른 글

IntelliJ 콘솔창 한글 깨질때  (0) 2023.04.15
웹 동작 간략개괄  (0) 2023.04.14
Twitter recommendation system code revealed  (0) 2023.04.06
Open-AI ChatGPT plugin  (0) 2023.04.06
ajax async // 웹관련 몇가지  (0) 2023.04.01

<Java 개요>

A언어 : 입,출력 // 문맥

==> B언어 : A언어기능 + 기계식 데이터 타입, 연산기능, methods 

==> C언어 : B언어기능 + 자료형 데이터 타입, 자료구조(분류통)

 

이후에 등장한 것이 Java. C언어의 많은 특징들을 가지고왔다

1990년대에 등장, 어디서나 마시는 커피(Java)처럼 어디서나 동작 가능한 언어

==> 공통 실행환경 필요 : JVM (Java Virtual Machine) -> 운영체제 위에 올리는 토퍼같은것

==> C언어기능 + JVM, 클래스, 객체

 

Java 장점 : 공통 실행환경의 존재로, 쓰임이 많다. 대표적인 객체지향 언어

                   안정성이 높다, 보안성이 좋다 컴파일러가 오류를 체크하고, 각종 보안이 들어가있음

                   커뮤니티가 크다 -> 다양한 개발 도구와 라이브러리 존재

 

<JVM>

JVM : 자바가 구동될 수 있는 가상의 기기

byte code : Java코드를 운영체제가 읽을 수 있게 .class 코드로 바꾼 코드

compiler : 변환기

interpreter : 운영체제가 읽은 바이트코드를 기계가 실행할 수 있는 기계어로 번역

JIT컴파일러(Just In Time) : 빠른 Java .class 코드 해석기 -> 인터프리터의 효율을 높여준다?

메모리영역 : Java의 데이터를 저장하는 영역 -> 운영체제로부터 JVM이 할당받은 메모리 영역

클래스 로더 : .class 바이트코드를 메모리영역에 담는 운반기

가비지컬렉터(GC) : 메모리영역에서 안쓰는 데이터를 주기적으로 청소

Runtime : 프로그램이 실행중인 상태

--------JRE, JDK-------

JRE: Java Runtime Environment  ==> 자바를 "실행"할 수 있는 환경

JDK: Java Development Kit  ==> JRE를 포함하고, .java파일을 .class파일로 변환해주는 Java compiler(javac) 기능이 있음

                                                      ==> 코드를 디버깅하는 jdb 등의 기능이 있음

 

지금으로서는 JDK만 알아두고, JDK와 IntelliJ(IDE) 를 설치할 것.

class : .class파일을 만드는 영역. Main 클래스의 이름은 .java파일의 이름과 일치시켜줘야함

public : 제어자. Main class를 public으로 만들어놓으면 어디서든 접근 가능

static : 이 프로그램이 시작될 때, 무조건 실행되는 상태가 된다? (추가공부 필요)

void : output의 타입이 void인 것을 선언. 자바에서는 input과 output의 타입을 선언해줘야한다.

          ==>void는 출력이 없다는 것을 말함

(String[] args)  :  input의 타입과 변수명을 선언하고있음

System.out.println("~~") : System이라는 클래스의 out 객체의 println이란 메소드를 실행

 

<변수와 상수>

--------변수----------

int num;    :  num이라는 이름의 integer type 저장공간을 선언

String name;    :   name이라는 이름의 String type 저장공간을 선언

 

int num = 10;    :  선언과 동시에 10이라는 값으로 "초기화"

int num;   이후  num = 10       :   선언을 해놓고 나중에 값을 대입

 

--------상수----------

final int num = 10;         :      final이라는 키워드를 추가하여 상수로 선언

num = 20;                : 상수는 값 변경이 안되기 때문에 에러가 난다.

 

--------변수의 타입----------

1.기본형

=> int, char, string, boolean etc....

=> string은 "쌍따옴표로 감싸고"  //  char은 '작'은 따옴표로 감싼다

=> 정수형 변수

byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.

short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다.

int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다.

long longNumber = 2147483647L; // long 은 숫자뒤에 알파벳 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다.

 

=> 실수형 변수는 float(4byte), double(8byte)

float (4byte) : 3.4 * -10^38 ~ 3.4 * 10^38(long 보다 큼)범위의 숫자 저장이 가능합니다.

double (8byte) : 1.7 * -10^308 ~ 1.7 * 10^308(long 보다 큼)범위의 숫자 저장이 가능합니다.

 

 

2.참조형 : 레퍼런스가 있음. 어떤 공간의 주소값을 바라보고 있는 녀석

 

String, Object, Array, List .... 등 단일공간에 담을 수 없는 값을 저장

 

배열 선언 방식 :    int[ ] arr = {1, 2, 3}

참조형 변수는 주소값을 가진다고 했다. 이상한 값이 나오는 이유는 arr 배열이 시작되는 메모리 주소값을 주기 때문.

 

따라서 값을 출력하려면 Java에서 제공하는 Arrays 유틸리티의 toString 메소드를 사용해야한다.

 

*참고 : Stack영역은 주소값을 저장, Heap 영역은 원본 값을 저장. 참조형 변수의 경우 Stack에 주소값이 있고, 이를 참조하여 Heap의 저장공간에 접근함. Heap은 동적으로 할당된 메모리 영역이기 때문에 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장함. Stack은 정적으로 할당된 메모리 영역이므로 크기가 몇 byte인지 정해져있는 기본형 변수를 저장. 참조형변수의 주소값은 크기가 정해져있기 때문에 Stack에 저장된다.

 

숫자형 변수타입의 크기 순서 :  byte(1) -> short(2) -> int(4) -> long(8) -> float(4) -> double(8)

 

3.Wrapper Class : 기본형 변수를 클래스로 한번 wrapping(감싸다) 하는 변수

 

클래스는 Java와 같은 객체지향 언어의 꽃이다. 클래스로 변수를 관리하면 객체지향의 많은 이점을 챙길 수 있다.

----boxing----  

==> num.methods()    : 다양한 메소드를 사용할 수 있다.

 

----unboxing----

int n = num.intValue() ;

 

============= 변수 입력받기 ============

import java.util.Scanner ;

Scanner sc = new Scanner(System.in);

int asciiNumber = sc.nextInt();      //입력받는 부분, 변수이름에 대입

char ch = (char)asciiNumber;       //입력받은 아스키코드를 문자로 형변환

 

nextLine().charAt(0);  :  Line을 입력받고 0번째 char 가져옴

 

** 형변환 하는 방법 : (char)변수이름   //  (int)변수이름  등등

 

============= 문자, 문자열 ============

문자 : 기본형 변수, 홑따옴표,  문자 뒤에 \0  (Null문자)가 없다.

문자열 : 참조형 변수(), 쌍따옴표, 문자 뒤에 \0 (Null문자)가 있다. (끝을 알려주기위해)

 

============= 입력, 출력 ============

Java 프로그램은 기본적으로 Scanner.in 객체의 next~~ 메소드를 이용해서 입력을 받음

Java프로그램은 기본적으로 System.out 객체의 print~~ 메소드를 이용해서 출력함

 

<형 변환>

float, double -> int : 소수점 버려짐

int -> double, float : 소수점 생김

 

eg)

double doubleNumber = 10.5

int intNumber = (int)(doubleNumber)          ===> intNumber : 10

 

위처럼 (int)같은 타입을 명시해서 typecasting하는 것을 명시적 형 변환이라고 한다.

But, 자동으로 바꿔주는 케이스도 있다.

 

===========자동으로 형변환되는 경우==========

- int형으로 선언된 변수에 byte자료형을 넣어주면 int로 자동 형변환되어 저장됨

- char타입 값을 미리 선언해놓은 int형 변수에 할당하면 자동으로 아스키코드로 바꿔서 할당됨

- int타입 값을 long 변수에 넣으면 long으로 형변환되어 저장됨

- int타입 값을 double 변수에 넣으면 double로 형변환

 

===> 작은 크기의 타입에서 큰 크기의 타입으로 할당될 때 자동 형변환이 일어남

===> 마찬가지로, 작은 크기의 type과 큰 크기의 type이 계산이 될 때, 자동으로 큰 크기의 type에 맞춰 형변환되어 계산됨

eg) int + double = double    근데이걸 int에 할당하면 소수점 버려짐

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts