simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 컨트롤러
  • JVM메모리구조
  • 자바
  • scanner #next() #nextLine()
  • 404
  • 자바메모리구조
  • 자바프로그램
  • 자바프로그래밍
  • 참조변수
  • controllerTest
  • 참조타입
  • 스프링
  • null

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

Language/Java

JAVA 라이브러리 - Java.lang 패키지

2022. 8. 8. 04:03

|  Java.lang 패키지

- 가장 기본이 되는 클래스를 담고 있으며, import 없이 사용 가능하다.

- Oracle에서 제공하는 java.lang 패키지에 대한 상세 정보는 아래 링크에 (JDK8 기준)

   https://docs.oracle.com/javase/8/docs/api/java/lang/package-summary.html

- 아래 표는 위 링크에서 소개하는 java.lang의 인터페이스와 클래스 중 자주 사용할만한 것만 일부를 가져온 표이다.

Interface Class
Comparable Object
Cloneable Math
Runnable Process
Readable Thread
Thread.UncaughtExceptionHandler String
Iterable System
... Character, Integer, Long....

 

|  Object

메소드 내용
clone 현재 객체를 복사한 객체를 반환
equals 참조되는 주소값을 비교 (* 주의 : null값은 비교할 수 없다)
getClass 현재 객체타입의 런타임 객체를 반환
hashCode 객체의 해쉬코드를 반환
toString java.lang.Object@해쉬코드를 반환
오버라이딩하여 주로 사용

 

|  String

1. String은 힙에 저장되며, 두 가지 방식으로 저장된다.

종류 저장 영역
문자열 리터럴 Heap 영역 내 "String Constant Pool"에 생성
문자열 객체 Heap 영역 내 별도의 객체로 생성
// s1과 s2는 같은 곳을 가리킨다.
String s1 = "Spring";
String s2 = "Spring";

// s3와 s4는 다른 곳을 가리킨다.
String s3 = new String("Spring");
String s4 = new String("Spring");

 

2. String 메소드들

contains trim compareTo toString
indexOf
lastIndexOf
substring equals
equalsIgnoreCase
toLowerCase
toUpperCase
startsWith
endsWith
split valueOf toCharArray
length charAt replace
replaceAll
concat *

* concat : 문자열을 덧붙이는 메소드로 +를 사용하는 것과 동일하다.(자바에서는 잘 사용하지 않는다)

  pf. mariaDB, mysql에서 문자열을 조합할 때 concat('a', 'b', 'c')를 사용한다. (Oracle은 ||를 통해 문자열을 조합)

 

3. 자바는 기본적으로 UTF-16 인코딩 방식을 다른다.

더보기

※ EUC-KR과 UTF-8방식에 대하여 

> 확장된 아스키 코드와 유니코드의 역사
- 유니코드 이전에는 각 나라별로 확장된 아스키코드(Extended Ascii)를 사용했다.(아스키 코드의 문자는 1byte)

- 나라별로 인코딩 방식이 상이하다보니 전 세계의 데이터가 모두 다르게 읽히는 문제가 발생했다.
- 이를 해결하고자 유니코드를 만들었다. (유니코드의 문자는 2byte)
- 하지만 유니코드는 영문자의 경우 사용하는 메모리 공간이 1byte -> 2byte가 된다는 단점이 있어,
  영어권 같은 나라에서는 유니코드를 사용하는 것이 큰 메리트가 되지 않았다.
- 그래서 나온 것이 UTF-8. UTF-8은 가변 길이를 제공하여, 각 나라의 언어별로 최적화된 문자 크기를 할당한다.
  ex. 영문자의 경우 1byte, 한글의 경우 3byte

> EUC-KR과 UTF-8. 
- EUC-KR은 유니코드가 나오기 이전에 사용하던 한글 인코딩 방식(Extended Ascii)이다.
  * 자바의 KSC5601기법은 곧 EUC-KR 인코딩을 말하며, 윈도우OS에서 MS949와 동일한 기법을 사용한다.
  * 윈도우의 기본 인코딩 방식은 MS949다. 이클립스를 키면 늘 이 인코딩이 디폴트로 설정되어 있어 UTF-8로 바꾸는게 필요

- EUC-KR을 사용하면 온전한 한글을 만들기가 어렵다. (ex.'뷁' 이라는 문자가 없음)
- 당연한 얘기지만, 인코딩 방식이 EUC-KR일 때, 디코딩을 UTF-8로 하면 문자가 깨지게 된다. (제대로 인식을 못함)
- 그렇기에 항상 에디터를 쓸 때 사전에 인코딩 방식을 UTF-8로 설정을 해두는 것이다.

 

4. 자바에서 인코딩을 변환하는 메소드 getBytes()

import java.nio.charset.Charset;

public class StringTest {
    public static void main(String[] args) {
        String sample = "행복한개발자가되자"; // 설정에서 UTF-8 방식으로 바꾼 상태

        try {
            System.out.println("Default Encoding : " + Charset.defaultCharset());
            byte[] default_encoding = sample.getBytes();
            byte[] euc_kr = sample.getBytes("EUC-KR");
            System.out.println(">> default decoding : " + new String(default_encoding));
            System.out.println(">> EUC-KR decoding : " + new String(euc_kr));
        } catch (Exception e) {
            System.out.println("Encoding Error");
            System.out.println(e.getMessage());
        }
    }
}

>> 결과

Default Encoding : UTF-8
>> default decoding : 행복한개발자가되자
>> EUC-KR decoding : �ູ�Ѱ����ڰ�����

 

|  StringBuffer

1. 문자열 불변 법칙

String 불변의 법칙이란?
- 문자열 할당 후 수정이 있을 때, 기존 메모리에서 데이터를 수정하지 않고,
- 새로운 메모리 공간을 할당하여 그곳의 주소를 가리키도록 하는 방식

>> 문자열의 변경(추가/삭제/수정)이 빈번한 경우, 단순 덧셈 시 시간/공간복잡도에 영향을 준다.

- 앞서 문자열 리터럴의 경우, 힙의 string constant pool에 저장되며,

  서로 다른 참조변수(ex. s1, s2)가 같은 메모리 공간을 참조한다고 했다.

- 문자열에 수정이 있어날 때마다 메모리 공간을 재설정해주지 않으면 s1에서 수정한게 s2에 영향을 미치기 때문에

  String에 수정사항이 발생할 때마다 매번 메모리를 재할당해준다. (문자열 불변 법칙)

- 문자열 불변 법칙의 특성 때문에 많은 문자열 데이터를 수정/삭제해야하는 경우, 단순 연산을 사용하면(ex. +) 시간복잡도/공간복잡도 면에서 효율성이 떨어질 수 있다.

- 그래서 사용하는 게, StringBuilder/StringBuffer다.

public class StringBufferTest {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("hello");
        sb.append(System.lineSeparator());
        sb.append("this is StringBuffer!");

        System.out.println(sb);
    }
}

>> 결과

hello
this is StringBuffer!

 

2. StringBuilder와 StringBuffer의 차이점

  StringBuilder StringBuffer
공통점 char[] 배열로 이루어진 버퍼로, String 추가/수정/삭제 연산시 시간/공간 사용을 절약

* 디폴트로 16의 사이즈를 가지며 추가적으로 늘릴 수 있다.
차이점 Thread-safe Thread-safe x
public synchronized StringBuffer append(String str) {
    /*생략*/
}

public AbstractStringBuilder append(Object obj) {
    /*생략*/
}

 

|  Math

- 수학 계산에 사용되는 클래스. 

- 아래는 Math를 사용하여 소수점 n번째까지 반올림/올림/버림을 하는 법과,

- 두 좌표 간의 거리를 구하는 법을 작성한 코드이다.

public class MathTest {
    public static void main(String[] args) {
    
    	// 1. 반올림, 올림, 버림
        double d = 123.2364;
        int n = 3; // 소수점 자릿수
        
        // 소수점 n번째까지 반올림
        double d1 = Math.round(d * Math.pow(10, n)) / Math.pow(10, n);
        System.out.println(d1);

        // 소수점 n번째까지 올림
        n = 2;
        double d2 = Math.ceil(d * Math.pow(10, n)) / Math.pow(10, n);
        System.out.println(d2);

        // 소수점 n번째까지 버림
        double d3 = Math.floor(d * Math.pow(10, n)) / Math.pow(10, n);
        System.out.println(d3);
        
        // -----------------------------------------------------------
        
        // 2. 피타고라스의 법칙을 활용하여 두 좌표의 거리 구하기 
        int[][] pos = {{2, 1}, {5, 5}};

        int xDistance = pos[1][0] - pos[0][0];
        int yDistance = pos[1][1] - pos[0][1];
        double distance = Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));

        System.out.println(distance);
    }
}

 

[ 참고 및 출처 ]

부트캠프 강의를 들은 후 여러 자료를 참고하여 정리하였습니다.

- 인코딩 관련 참조

https://codechacha.com/ko/java-convert-bytes-to-string/

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=pjok1122&logNo=221505713248 

https://corock.tistory.com/139

https://dogcowking.tistory.com/289

- 문자열 불변 법칙

https://starkying.tistory.com/entry/what-is-java-string-pool

https://readystory.tistory.com/139

'Language > Java' 카테고리의 다른 글

JAVA 라이브러리 - 제네릭 클래스  (0) 2022.08.10
JAVA 라이브러리 - 날짜, 시간 관련 클래스(java.util/java.time..)  (0) 2022.08.10
객체지향 언어의 특징 4_캡슐화 (정보 은닉)  (0) 2022.07.22
객체지향 언어의 특징 3_다형성 (사용 편의성)  (0) 2022.07.22
객체지향 언어의 특징 2_상속 (재사용 + 확장)  (0) 2022.07.20
    'Language/Java' 카테고리의 다른 글
    • JAVA 라이브러리 - 제네릭 클래스
    • JAVA 라이브러리 - 날짜, 시간 관련 클래스(java.util/java.time..)
    • 객체지향 언어의 특징 4_캡슐화 (정보 은닉)
    • 객체지향 언어의 특징 3_다형성 (사용 편의성)
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바