Java 18

[Java] 문자열 나누기(파싱) 방법 - StringTokenizer, String, Scanner

자바에는 특정 문자 또는 문자열을 이용해 문자열을 파싱하는 여러 가지 방법이 있다. 여러 방법 중 StringTokenizer, String, Scanner를 이용하여 문자열을 파싱하는 방법을 다룬다. StringTokenizer StringTokenizer는 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰이라는 여러 개의 문자열로 자르는 데 사용한다. String과 Scanner를 이용한 방법보다 문자 그 자체를 구분자로 사용하기 때문에 사용이 간단하다는 장점이 있으나 단 하나의 문자만 구분자로 사용할 수 있기 때문에 2자 이상으로 된 구분자를 사용해야 하는 경우에는 적합하지 않다. 사용 시에는 java.util.StringTokenizer 클래스를 import 해줘야 한다. 위 코드를 ..

Java 2022.09.08

[Java] 자바의 정규식 - Pattern, Matcher 클래스 메소드/ matches(), find() 비교

API를 개발하다 보면 정규식을 이용해서 입력받은 문자열의 패턴을 확인해야 하는 경우가 자주 있다. 회원가입 API를 만들 때, 핸드폰 번호나 이메일 등을 입력받고, 입력받은 내용들의 형식이 올바른지 확인할 때 정규식이 사용된다. 그렇다면 정규식을 자바에서는 어떻게 사용하는지 알아본다. 정규식(Regular Expression)이란? 정규식이란 텍스트 데이터 중에서 원하는 조건인 패턴과 일치하는 문자열을 찾기 위해 사용하는 것으로 미리 정의된 기호와 문자를 이용해서 작성한 문자열을 말한다. 정규식을 이용하면 많은 양의 텍스트 중 원하는 데이터를 손 쉽게 뽑아낼 수 도 있고 입력된 데이터가 형식에 맞는지 체크할 수도 있다. java.util.regex 패키지 java.util.regex 패키지에는 아래 사..

Java 2022.09.08

[Java] 다차원 배열 비교 메서드 Objects.deepEquals()

문자열을 비교할 때 equals()를 사용한다. 그렇다면 2차원 이상인 다차원 배열의 경우는 어떻게 비교할까? 아마 대부분 반복문을 이용하여 비교할 것이다. enhanced for를 사용하면 쉽게 비교할 수 있다. 하지만 반복문 조차도 귀찮다면 deepEquals() 사용을 고려해 볼 수 있다. deepEquals() java.util.Objects 클래스에 위치한 메서드이다. java.util.Objects는 Oject 클래스의 보조 클래스로 모든 메서드가 static으로 이루어져 있다. 다차원 배열의 경우 equals()를 사용하면 정확한 내용을 비교할 수 없는데, deepEquals()는 객체를 재귀적으로 비교하기 때문에 다차원 배열의 비교를 가능하게 해 준다. 아래 코드를 통해 확인할 수 있다. ..

Java 2022.09.07

[Java] JVM 메모리 구조

클래스는 method 영역에 저장되며, 클래스에 대한 참조변수는 stack 영역에 저장된다. method영역은 static 영역으로도 불린다. 참조 변수는 실제 데이터 값을 저장하고 있는 것이 아니라 실제 데이터가 위치해 있는 heap 메모리 영역의 주소를 저장하는 변수이다. 생성자로 만들어진 인스턴스는 heap 메모리 영역에 들어가며 객체 내부에는 클래스의 멤버들이 위치하게 된다. 메서드는 특이하게 method 영역에 저장이 되고 힙 메모리 영역의 인스턴스의 메서드 영역에서는 클래스 영역의 주소만 저장하고 있다. 멤버 변수(필드)에 해당하는 인스턴스 변수는 힙 메모리 영역에 올라가므로 직접 초기화를 하지 않아도 된다. ⇒ 각 자료형의 기본으로 자동 초기화한다. 지역 변수는 stack 영역에 올라가서 선..

Java 2022.09.05

[Java] StringBuffer - 생성자, 비교 vs StringBuilder (동기화 여부 차이)

String 클래스는 변경 불가능한(immutable) 클래스로 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없다. 정확히 말하자면 문자열에 수정이 발생할 때마다 새로운 문자열을 가진 String 인스턴스가 생성되어 메모리 공간을 차지하게 되는 것이다. 그러므로 성능이 좋지 않아 수정을 최소한으로 하는 것이 좋다. 이러한 문제를 해결하는 방법으로 StringBuffer와 StringBuilder가 있다. StirngBuffer StringBuffer는 string과 달리 문자열을 수정할 수 있다. StringBuffer 클래스는 String 클래스와 같이 문자열을 저장하기 위한 char형 배열의 참조 변수를 인스턴스 변수로 선언해 두었다.StringBuffer 인스턴스가 생성될 때, char형 배열이..

Java 2022.08.30

[Java] 가변인자(varargs)

가변인자(variable arguments) 기존에는 매개변수의 개수가 고정이었는데, JDK 1.5부터 동적으로 자유롭게 개수를 지정할 수 있는 기능이다.즉, 인자의 개수를 가변적으로 지정할 수 있다는 의미이다. 가변인자는 ''타입... 변수명' 과 같은 형식으로 사용한다.가변인자 외에도 매개변수가 더 존재한다면 가변인자를 매개변수 중 맨 마지막에 선언해야 한다.그렇지 않으면 컴파일 에러가 발생한다. 코드로 보는 가변인자 concatenate 메서드에 args로 가변인자가 사용된 것을 볼 수 있다. 가변인자의 경우, 인자의 개수를 가변적으로 할 수 있기 때문에 인자가 아예 없어도 된다. 그 경우는 9번째 줄 코드를 참고하면 된다. 위 코드를 보고 알 수 있는 점은 가변 인자가 내부적으로 배열을 이용한다는..

Java 2022.08.27

[Java] 인터페이스(interface) - 특징, 구현 방법, 상속, 다형성, 장점, 디폴트 메서드

인터페이스(interface)란? 인터페이스는 일종의 추상 클래스이다. 그러나 일반 추상클래스는 멤버 변수와 일반 메서드를 가질 수 있는 반면 인터페이스는 추상 클래스보다 추상화 정도가 높아 일반 메서드와 일반적인 멤버 변수를 가질 수 없다는 특징이 있다. 즉, 인터페이스는 상수와 추상메서드만 가질 수 있다. 인터페이스 작성 방법 class 키워드 대신 interface 사용 interface도 class와 같이 접근제어자로 public과 default를 사용할 수 있다. 모든 멤버변수는 상수로 제어자가 'public static final' 이어야만 한다. => 제어자 생략 가능 모든 메서드의 제어자는 'public abstract' 이어야 한다. => 제어자 생략 가능 JDK 1.8 버전부터 stat..

Java 2022.08.26

[Java] 오버라이딩(overriding) 조건 & 주의 사항

요즘 자바를 빠르게 복습하고 있다. 그래도 학교를 열심히 다니긴 했는지 아직까진 대부분 기억이 난다! '자바의 정석'으로 공부하고 있는데 나중에 다 읽으면 후에 후기도 써봐야겠다. 공부하면서 앞으로 헷갈리는 내용이나 알고 있으면 좋은 부분들은 틈틈이 짧게라도 정리해두어야 할 것 같아서 시작한 자바 로그 이번 내용은 오버라이딩이다. 오버라이딩의 조건도 정확히 알고 있어야 하기 때문에 간단히 정리해보았다. 오버라이딩이란? 오버라이딩이란 상위 클래스로부터 상속받은 메서드의 내용을 하위 클래스에서 변경하는 것을 의미한다. 오버라이딩 주의 사항 하위 클래스에서 오버라이딩하는 메서드는 상위 클래스의 메서드와 - 메서드 명이 같아야 한다. - 매개변수가 같아야 한다. - 반환 타입이 같아야 한다. 즉, 메서드의 선언..

Java 2022.08.24