[TIL] 221005 - 자바의 유용한 클래스들

yujamint·2022년 10월 7일
0

TIL

목록 보기
6/9

자바의 유용한 클래스들

Object 클래스

모든 클래스의 최상위 클래스, 클래스를 생성하면 자동으로 Object 클래스를 상속받는다.

  • 모든 클래스는 Object에 정의된 메서드를 사용/재정의할 수 있다.
  • 컴파일러가 extends Object 를 추가함

Object 클래스에 정의된 메서드

  • hashcode() : 인스턴스의 저장 주소 반환
  • equals() : 두 인스턴스의 주소 값을 비교하여 true/false 반환
    • 두 객체가 같다면, 반환하는 해시값도 같아야 된다. 즉, 두 인스턴스가 같은지 비교하는 equals()와 인스턴스의 저장 주소(해시값)를 반환하는 hashcode()는 한 쌍이므로, equals()를 재정의하면 hashcode() 또한 재정의해야 한다.
  • toString() : 객체의 정보를 String으로 바꾸어서 사용할 떄 쓰임
    • String str = "test"기본형이 아닌 String을 print했을 떄, 객체의 주소값이 아니라, 우리가 저장한 값(”test”)이 나오는 이유는 String 클래스에 이미 toString()이 오버라이딩되어 있기 때문이다.
  • clone() : 객체의 원본을 복제하는 데 사용하는 메서드
    • 객체지향프로그래밍의 정보 은닉화에 위배되는 부분이 있다. → 해당 클래스의 clone() 메서드 사용을 허용한다는 의미로 cloneable 인터페이스를 명시한다.
    • return type : Object
  • notify()와 wait()은 스레드 관련 메서드이다.

String, StringBuilder, StringBuffer 클래스

String

스트링 선언하는 두 가지 방법

String str1 = new String("abc");
String str2 = "abc";

str1은 인스턴스를 새로 생성하여 힙 메모리를 할당하고 있고,

str2는 상수 풀에 있는 주소를 가리키기만 하고 있는 것이다.

String은 final로 선언되어 있어 한 번 생성되면 변하지 않는다.

String java = new String{"java");
String android = new String("android");

java = java.concat(android);

위 코드와 같이 “java”와 “android”가 생성되어 있을 때, 이를 합치면 “java”가 “javaandroid”로 변하는 것이 아니라 “java”는 그대로 있고, “javaandroid”가 새로 생성되어 java 변수가 이를 가리키게 되는 것이다.

즉, String을 계속해서 위와 같이 사용하면 메모리 낭비가 발생하게 된다.

StringBuilder, StringBuffer

String과 다르게 StringBuilder와 StringBuffer는 final로 선언되어 있지 않기 때문에 변할 수 있다.

즉, 문자열을 변경하거나 연결하는 데에 있어서 String과 비교했을 때, 메모리 측면에서 자유롭다.

성능비교 : StringBuilder > StringBuffer > String

: StringBuffer는 동기화가 지원되기 때문에 속도 측면에서는 StringBuilder의 성능이 더 좋다.

  • StringBuffer는 멀티스레드 환경에서 안전하게 동작한다.

text block (java 13)

문자열을 “”” “”” 사이에 이어서 만들 수 있다.

String textBlock = """
										hi
										how are you
										i'm fine""";

위와 같이 작성하면 개행이 포함된 문자열을 사용할 수 있다.

Class 클래스

자바의 모든 클래스와 인터페이스는 컴파일 후에 .class 파일이 생성된다.

Class 클래스는 컴파일 된 .class 파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드를 제공한다.

Class 클래스의 메서드

  • forName(String className) : 클래스 이름을 통해 클래스를 동적으로 로드한다.
  • newInstance() : new 키워드를 사용하지 않고 객체 생성한다.
    • return type : Object

언제 new를 사용하지 않고 Class 클래스를 사용해서 객체를 생성하면 될까? → 생성하려는 객체 클래스가 로컬에 없을 때

동적 로딩

  • 컴파일 시에 데이터 타입이 binding되는 것이 아닌, 런타임 중에 데이터 타입을 binidng하는 방법
  • 프로그래밍 시에는 문자열 변수로 처리했다가 런타임시에 원하는 클래스로 로딩하여 binding할 수 있다.
  • 컴파일 시에 타입이 정해지지 않기 때문에 오류가 발생할 수 있다.(프로그램이 죽을 수 있다.)

java.lang

System

자바 프로그램은 OS에서 바로 실행되지 않고, JVM위에서 실행되는데 System 클래스를 통해 OS에 접근할 수 있다.

  • OS에 접근하다보니 속도가 느리다.

System.gc() 는 시스템 성능에 매우 큰 영향을 미칠 수 있다.

  • 자바는 개발자가 메모리를 직접 코드로 관리하지 않고 JVM이 알아서 관리한다.

Wrapper Class

Byte / Short / Integer / Long / Character 등의 기초 자료형을 감싸고 있는 클래스

  • 기초 자료형에 필요한 메서드 정의를 위한 클래스이다.

Integer integer1 = 10; Wrapper 클래스 객체에 기본 자료형을 바로 넣는 것을 ‘Boxing 한다’고 한다.

  • Boxing : int → Integer
  • integer1 변수를 위한 새로운 주소를 할당하지 않고 원래 있던 10 의 주소를 가리킨다.
    • -128 ~ 127은 많이 쓰이는 값이기 때문에 메모리에 저장해놓고 공유한다.
      • 숫자, 문자, 문자열 모두 byte 단위로 저장하여 JVM에게 전달하기 때문이다.
  • Unboxing : Integer → int // Boxing되어 있는 Integer 값을 int로 바꾸는 것

java.math

BigInteger : 매우 큰 숫자를 표현하기 위함

BigDecimal : 매우 큰 실수를 정수로 표현하며 오차를 없앤다.

  • 생성자를 double형으로 주면 double형 자체가 오차가 있기 때문에 오차가 생긴다.

java.util

StringTokenizer

문자열을 우리가 지정한 구분자로 쪼개주는 클래스

vs String.split()

  • split()은 빈 문자열도 토큰으로 인식하고, StringTokenizer는 빈 문자열을 토큰으로 인식하지 않는다.
  • 성능 : split()은 배열에 담아주는 시간이 있기 때문에 StringTokenizer의 성능이 더 좋다.

Random

Math.random과 다르게 seed 설정이 가능하다.

Calendar

현재 날짜와 시간 설정하거나 날짜 산술 수행해야하는 경우 사용한다.

Calendar.getInstance()를 통해 인스턴스 생성

특징

  • 월(month)을 나타낼 때, 1~12월을 0~11로 표현하는 불안함이 있다.
  • 지역 설정 가능
  • 요일이 일월화수목금토를 1~7로 표현한다.
  • roll() 메서드를 통해 60초를 더해도 분(minute)에는 영향을 주지 않는다.→ add() 사용하면 가능하다.

Locale

지역의 [언어][나라] 등의 정보를 담고 있는 클래스

  • 타국어 지원 페이지 개발에 사용!

java.util.regex

정규표현식 만들 떄 사용한다.

온라인 컴파일러 통해서 편리하게 테스트할 수 있다.

java.time

날짜와 시간을 표현한다.

Instant: TimeStamp를 찍기 위해 사용한다.

  • UTC 타임 라인에 있는 순간을 의미한다.
  • 다른 나라에서 하는 이벤트 시간을 맞추기 위해서는 OffsetDateTime, ZonedDateTime 사용

LocalDate / LocalTime / LocalDateTime : 컴퓨터가 현재 저장하고 있는 날짜를 토대로 정보 알 수 있다.

profile
개발 기록

0개의 댓글