본문 바로가기

Old Posts/Java108

[Java] 정규표현식 사용법 및 예제 - Pattern, Matcher 자바에서 정규표현식(Regular Expression)'을 사용해보자. 1. 정규표현식(Regular Expression) 정규표현식 혹은 정규식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용되는 언어다. 정규 표현식은 텍스트 편집기나 스크립트 언어에서 문자열의 검색과 치환을 위해 지원하고 있다. 특히 Perl 같은 스크립트 언어는 언어 자체에서 강력한 정규표현식을 구현하고 있어, 문자열, 텍스트 처리에 특화된 스크립트를 작성할 수 있다. 자바 역시 프로그래머가 정규표현식을 사용할 수 있도록 여러가지 유틸을 제공하고 있다. 2. 자바 정규표현식 자바 프로그래밍에서 정규표현식을 작성하기 위해서 java.util.regex 패키지에 있는 클래스들을 사용하면 된다. 주로 Pattern 클래스와 Matc.. 2021. 6. 28.
[Java] JVM on-heap 메모리와 off-heap 메모리 자바 프로그램에서 생성된 객체는 '힙(Heap)'이라는 메모리 영역에 생성된다. 힙 영역에 생성된 객체는 'GC(Garbage Collector)'의 관리를 받으며 사용되지 않는 경우 GC에 의해 다시 회수된다. 1. on-heap 메모리 우리가 일반적으로 알고 있는 '힙(Heap)' 메모리 영역이 on-heap 영역에 해당된다. 자바 프로그램에서 'new' 연산 등을 이용해 생성된 객체는 힙 영역에 생성된다. C, C++의 경우라면 객체의 생성과 소멸을 프로그래머가 관리해줘야한다. 반면 자바의 경우 GC(Garbage Collection) 알고리즘에 의해 자연스럽게 회수된다. 프로그래머는 객체의 메모리 회수, 메모리 릭(Memory Leak) 등을 걱정하지 않아도 된다는 장점이 있다. 하지만 GC 알고.. 2021. 6. 28.
[Java] final 키워드의 의미와 예제 자바 코드에서 자주 볼 수 있는 final 키워드에 대해서 정리해보자. final은 '최종적'이라는 의미를 갖고 있는 단어다. 자바에서는 final 키워드를 멤버 변수와 클래스, 메소드 그리고 메소드 인자에 붙일 수 있다. 각각이 의미하는 바에 대해서 알아보자. 1. final 멤버변수 클래스를 선언할 때 멤버 변수의 앞에 final 키워드를 붙일 수 있다. private final int number = 0; 이 경우 변수에 값 할당을 딱 한번 할 수 있다. final 멤버 변수에 값을 할당하는 방법에는 필드 선언시하는 것과 생성자를 통해서 할당하는 것이 있다. 만약 멤버 변수를 final로 선언하고, 선언부와 생성자에서 초기화하지 않으면 컴파일 에러가 발생한다. 이렇게 값이 할당된 멤버변수의 값은 다.. 2021. 6. 27.
[Java] this 키워드의 의미 및 사용법 자바에서 'this'라는 키워드는 '객체 자기자신'을 의미한다. 주로 3가지 패턴으로 사용된다. 1. 생성자 혹은 메소드의 인자(parameter)와 객체의 속성이 같은 경우 다음 자바 코드를 보자. public class Person { private int age; void setAge(int age) { this.age = age; } } Person 클래스에 setAge()라는 메소드를 정의하는 코드다. setAge() 메소드의 인자 이름이 'age'인데 이는 Person 클래스의 멤버 변수인 age와 동일하다. 이 경우 어떤 것이 멤버 변수이고 어떤것이 인자인지 구별하기 위해 this 키워드를 앞에 붙여준다. this는 현재 객체를 의미하고, this.age는 현재 객체의 멤버 변수를 의미한다... 2021. 6. 26.
[Java] 입력 스트림(InputStream)과 출력 스트림(OutputStream) - java.io 패키지 자바 프로그램은 외부에서 데이터를 읽거나 외부로 데이터를 쓰는 작업을 할 수 있다. 예를 들어 콘솔 입력을 받거나 모니터에 결과를 출력한다던가, 네트워크나 파일에서 데이터를 읽거나 쓰는 경우는 매우 흔하다. 이런 데이터의 입출력은 '스트림(Stream)'이라는 개념을 통해 수행된다. (Java8부터 도입된 스트림 기능과 혼동하지말자. 여기서 말하는 스트림은 입력 스트림(InputStream)과 출력 스트림(OutputStream)에 대한 내용이다) 1. 자바의 입출력 스트림(IOStream) 스트림(Stream)은 개울, 시내라는 명사와 '흐르다'라는 동사의 의미를 가지고 있는 단어다. 데이터의 입출력 관점에서보면 소스에서 타겟으로 데이터가 흘러가는 모양을 생각하면 편하다. 소스(Source)에서 생성된.. 2021. 6. 25.
[Java] 오버플로우 없이 정수 다루기 - BigInteger 사용법 및 예제 Java 혹은 C를 이용해서 프로그래밍하다보면 '오버플로우(Overflow)'라는 개념을 기억하고 있어야한다. 정수형 타입의 데이터를 저장하기 위해서 4바이트의 int 변수를 선언하게 된다. 문제는 int 타입의 변수는 -2,147,483,648 ~ 2,147,483,647 사이의 값만 저장할 수 있다는 점이다. 좀 더 큰 수를 저장하기 위해서 long 타입으로 선언하더라도 그 범위가 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807로 늘어날 뿐 모든 범위의 숫자를 정확하게 저장할 수 있는 것은 아니다 일반적인 경우라면 이 정도 범위의 숫자만으로도 문제가 없겠지만 과학 데이터를 다루는 프로그램이나 데이터의 숫자가 대륙의 스케일로 넘어가버리면 문제가 생기는 .. 2021. 6. 23.
[Java] 오버플로우 없이 실수 다루기 - BigInteger 사용법 및 예제 Java 혹은 C를 이용해서 프로그래밍하다보면 '오버플로우(Overflow)'라는 개념을 기억하고 있어야한다. 소수점을 가지고 있는 실수 타입의 데이터를 저장하기 위해서 double 혹은 float 타입의 변수를 선언하게 된다. 문제는 float 타입의 변수는 1.4E-45 ~ 3.4028235E38 사이의 값만 저장할 수 있다는 점이다. double 타입으로 선언하더라도 그 범위가 4.9E-324 ~ 1.7976931348623157E308 로 늘어날 뿐 모든 범위의 숫자를 정확하게 저장할 수 있는 것은 아니다. 게다가 부동 소수점 데이터의 경우 2진수로 데이터를 다루는 기본형 타입에서는 부정확한 결과가 나올 수도 있다. 따라서 정밀한 소수점 계산이 필요한 과학 데이터의 경우 double, float .. 2021. 6. 23.
[Java] 문자열 생성 클래스 - String, StringBuffer, StringBuilder 차이점 자바에서 문자열은 독특한 특성을 가지고 있다. 바로 불변(Immutable)이라는 특성이다. String 타입의 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다. '+' 연산이나 concat 등의 메소드를 이용해서 문자열을 수정할 때, 기존에 존재하는 String 객체의 데이터가 수정되는 것이 아닌 연산의 결과로 만들어지는 문자열을 이용해 새로운 String 객체를 생성하는 형태로 동작한다. 문제는 '+' 연산이나 concat() 등의 메소드를 이용해 문자열을 수정할 때마다 새로운 String 객체가 생성된다는 점이다. 예를 들어 다음과 같은 코드가 있다고 생각해보자. String str = "String"; for (int i = 0; i < 100; i++) { str = str + i; }.. 2021. 6. 17.
[Java] LinkedHashMap 사용법 및 예제 - HashMap과 차이점 LinkedHashMap Map 인터페이스를 구현한 클래스 중에 TreeMap과 HashMap은 매우 단순해서 많이 사용된다. 그 외에 조금 특이한 Map 클래스들이 있는데 LinkedHashMap이 그 중 하나다. LinkedHashMap은 Map에 입력된 순서를 기억하는 자료구조다. LinkedHashMap에 저장되는 키와 값은 Map.Entry 클래스를 구현한 Node 클래스에 저장된다. Node 클래스에는 before, after 멤버가 있는데, LinkedHashMap에 입력된 순서에 따라 연결 리스트 구조를 형성한다. LinkedHashMap 사용법 LinkedHashMap은 기본적으로 HashMap이다. 사용법은 HashMap과 동일하다. HashMap에 대해서 정리해 놓은 포스트를 참고하자.. 2021. 6. 16.