9.1 java.lang패키지

Jaeho Kim·2022년 3월 4일
0

자바의정석

목록 보기
5/7

🤔 java.lang패키지

  • import 없이 사용 가능
  • 교재를 함께 보면서 설명

✏️ Object클래스 450p

  • 최상위 클래스 ( 11개의 메서드 보유 )

  • equals ( Object obj )
    매개변수로 객체의 참조변수를 받아서 비교 => boolean
    // 참조변수 : 지난주 학습때 배운 내용(객체의 주소를 담고있다.)
    // 객체의 주소 : jvm의 stack(주소와 순서), heap(실제 값)
    예제 9-1) 다른 주소값의 객체는 다르게 판별.
    Q . 그럼 다 다른데 어떻게 판별?
    예제 9-2) 값을 비교하는 방법 (오버라이딩, instanceof)
    == String, Date, File, wrapper // != StringBuffer

  • hashCode()
    해싱(hashing)기법에 사용되는 '해시함수(hash function)' 구현
    hashing : 데이터 관리 기법, 다량 데이터 저장 검색 유용
    값 입력 -> 그 값의 저장위치를 알려주는 hashcode 반환

    예제 9-3) equals 처럼 객체의 주소값을 이용하여 hashcode를 반환 함을 확인함. 그래서 값이 같아도 hashcode() 인식
    // System.identifyHashCode(Object x)의 호출결과는 실행 할 때마다 달라질 수 있다.

  • toString()
    인스턴스에 대한 정보를 문자열 제공
    // vo에 tostring 오버라이딩 안하면, 16진수의 hash코드로 주소값 리턴
    예제 9-4) 16진수 hash코드 확인, 다른 인스턴스에서 호출 = 다른 hashcode()
    예제 9-5) toString을 오버라이딩 하여 사용하는 예시
    예제 9-6) toString을 오버라이딩 하여 사용하는 예시

  • clone()
    자신을 복제하여 새로운 인스턴스를 생성 (기존값 보존)
    Object 클래스에 정의된 clone()은 단순히 인스턴스 변수의 값만을 복사하기 때문에 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다.
    예제 9-7) 참조타입 인스턴스 변수를 복사하기 위해 Cloneable 인터페이스 구현
    --> a = b 와 같은 대입연산으로 값을 보존하는것과 뭐가 다른지 한동안 고민해봤는데, 대입 연산은 두 인스턴스가 같은 주소값을 바라보게되어, b를 변경할때 a값도 변경이 되지만 clone을 사용하면 다른 주소값의 같은 값이 생기는것이기 때문에 값이 보존된다의 개념인듯
    (Cloneable인터페이스 구현, 조상클래스의 clone을 호출하는 try chach 사용 , protected => public 상속에 구애받지 않음)
    Cloneable인터페이스 구현 : 클래스 작성자가 복제를 허용

  • 공변 반환타입 ( jdk1.5 )
    오버라이딩시 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경하는 것을 허용
    ==> 반환타입을 변경해서 번거로운 형변환을 안하도록
    예제 9-8) 공변 반환타입 예시 Object clone -> int[]

  • 얕은 복사와 깊은 복사
    clone은 값만 복제할 뿐, 객체가 참조하고 있는 객체까지 복제하지는 않는다.
    얕은복사 : 원본 변경 -> 복사본 영향
    깊은복사 : Cloneable 서로 다른 주소값이기 때문에 영향 x
    예제 9-9) 얕은복사 vs 깊은복사의 차이 , 주소값이 다르면 서로 영향을 끼칠 수 없다.

  • getClass()
    자신이 속한 클래스의 Class 객체 반환
    클래스 로더에 의해 메모리에 올라갈때, 자동 생성
    클래스 로더 : 실행 시에 필요한 클래스를 동적으로 메모리에 로드하는 역할, 먼저 기존에 생성된 클래스 객체가 메모리에 존재하는지 확인하고, 있으면 객체의 참조를 반환. 없으면 클래스 패스에 지정된 경로를 따라서 클래스 파일을 찾는다. 못찾으면 ClassNotFoundException 찾으면 Class 객체 변환.

  • Class 객체를 얻는 방법
    new Class().getClass(); => 생성된 객체를 통해
    Class.class; => 클래스 리터럴을 통해
    Class.forName("ClassName"); => 클래스 이름을 통해

리터럴은 변수의 값이 변하지 않는 데이터(메모리 위치안의 값)를 의미

예제 9-10) Class 객체 이용, 동적 객체 생성 예제


✏️ String클래스 464p

  • 변경 불가능한(immutable) 클래스
    String 클래스는 문자열을 저장하기 위해서 문자형 배열 변수 char[] value를 인스턴스 변수로 정의해두고 있다. 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수에 문자형 배열로 저장되는것이다.
    문자열 그자체가 리터럴 데이터로 저장되기 떄문에 읽을수만 있고 변경 할 수 없다.
    문자열을 더하면 새로운 값으로 재생성 하는것이다.
    // 문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String클래스 대신 StringBuffer클래스를 사용하는 것이 좋다. ==> 문자열 변경 가능

  • 문자열의 비교
    문자열을 만드는 두가지 방법 ( = "abc" , new String("abc"))
    리터럴 : 클래스가 메모리에 로드될 때 자동적으로 미리 생성
    new : new연산자에 의해서 메모리 할당이 이루어질때 생성
    => 그래서 리터럴 인스턴스들은 주소값이 같을 수 있지만, new 인스턴스는 불가능하다
    예제 9-11) 리터럴 인스턴스와 new 인스턴스의 주소값 차이에 의한 값 비교 예시

  • 문자열 리터럴
    예제 9-12) 컴파일 시 클래스 파일에 저장. 같은값은 하나의 인스턴스 공유( 리터럴 데이터 )
    => 클래스 파일에는 소스파일에 포함된 모든 리터럴의 목록이 있다. 해당 클래스 파일이 클래스 로더에 의 해 메모리에 올라갈 때, 이 리터럴의 목록에 있는 리터럴들이 JVM내에 있는 '상수저장소'에 저장된다. 이 때, 이곳에 "AAA"와 같은 문자열 리터럴이 자동적으로 생성되어 있는것이다.

  • 빈 문자열 (empty string)
    길이가 0인배열은 존재 할 수 있다. ( 처음 배울때 "" != null 처럼 우리는 ""가 존재함을 알고 있다.)
    하지만 char 형 변수는 무조건 하나의 문자를 지정해야 한다.
    예제 9-13) char[]와 String 의 초기화값에 따른 차이
    => char = ' '; '\u0000'; // String = "";

  • String 클래스의 생성자와 메서드
    String Class 내에 정의된 생성자와 메서드의 목록
    ... 교재 참고! (죄송합니다..)

  • join()과 StringJoiner
    join() : 문자열 배열을 특정 문자로 구분해서 결합 (split 의 반대 개념)
    StringJoiner : 생성자에 넣는 값을 통해서 결합
    예제 9-14) join()과 StringJoiner 예제

  • 유니코드의 보충문자
    본래 유니코드는 2byte, 16비트 문자체계 인데, 20비트까지 확장하게 되어 char타입으로 하나의 문자를 다룰 수가 없게되었다.
    String클래스의 메서드 중에서 보충 문자를 지원하지 않는 것도 있다.
    ==>
    매개변수
    int ch : 보충문자 지원O
    char ch : 보충문자 지원X

  • 문자 인코딩 변환
    getBytes(String charsetName)를 사용하면, 문자열의 문자 인코딩을 다른 인코딩으로 변경 가능.
    예제 9-15) 인코딩 방식 차이에 따른 표기 차이 예제

  • String.format()
    형식화된 문자열을 만들어내는 간단한 방법.
    prinf()하고 사용법이 완전히 똑같으므로 별 어려움이 없음
    예시)
    String str = STring.format("%d 더하기 %d는 %d입니다.", 3,5,3+5);
    syso(str); // 3더하기 5는 8입니다.

  • 기본형 값을 String 으로 변환
    String이 아닌데 String 값으로 변환하는 방법이다.
    숫자 + 문자, String.valueOf(숫자)

  • String을 기본형 값으로 변환
    parseInt, parseDouble 등등, valueOf

  • Boolean, Byte와 같이 기본형 타입의 이름의 첫 글자가 대문자인 것은 래퍼 클래스이다.
    기본형 값을 감싸고 있는 클래스라는 뜻에서 붙여진 이름으로 기본 형을 클래스로 표현한 것이다.
    예제 9-16) 문자열과 기본형간의 변환의 예시
    // + , . , f 와 같은 부호, 소수점, 자료형 접미사는 허용. 단, 해당 형태의 메서드 사용
    예제 9-17) substring메서드를 이용하여 한 문자열에서 내용의 일부를 추출하는 예시

✏️ String클래스 476p

String 클래스 => 지정된 문자열 변경 불가
StringBuffer 클래스 => 변경 가능
StringBuffer 클래스는 버퍼의 길이를 충분히 잡아주는 것이 좋다.


  • StringBuffer의 생성자
    인스턴스 생성시 -> 적절한 길이의 char형 배열 생성 -> 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)로 사용한다.
    만약 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.
    477p 예시 참조.

  • StringBuffer의 변경
    append를 사용해서 문자열을 붙힌다.
    478p 예시 참조.

  • StringBuffer의 비교
    String 클래스와 달리 equals 메서드를 오버라이딩 하지 않기때문에, equals를 써도 등가비교연산자 == 로 비교한 것과 같은 결과를 얻는다.
    479p예시 참조.
    예제 9-18) StringBuffer 클래스는 equals와 == 의 결과가 같음을 보여주는 예시

  • StringBuffer클래스의 생성자와 메서드
    480p 참조
    예제 9-19) StringBuffer 메서드 사용 예시

  • StringBulider란?
    StringBuffer는 멀티쓰레드에 안전하도록 동기화 되어있지만 동기화가 성능을 떨어뜨리기 때문에, StringBuffer에서 동기화만 뺀 StringBulider가 새로 추가되었다.

✏️ Math클래스 483p

  • 기본적인 수학계산에 유용한 메서드로 구성되어 있음.
  • Math클래스의 생성자는 접근 제어자가 private이기 때문에 다른 클래스에서 Math 인스턴스를 생성할 수 없도록 되어있다.

  • 올림, 버림, 반올림
    올림 : ceil
    버림 : floor
    반올림 : round, rint
    예제 9-20) 올림, 버림, 반올림의 예시
    => round와 rint의 차이점
    rint의 반환값은 double이다.
    rint는 가장 가까운 정수값을 반환한다.
    그래서 -일때) -1.5 가 -2가된다.

  • 예외를 발생시키는 메서드
    메서드의 이름에 Exact가 포함된 메서드들이 JDK1.8부터 새로 추가되었다. 이들은 정수형간의 연산에서 발생할 수 있는 오버플로우를 감지하기 위한 것이다.
    485p 참고
    예시 9-21) Integer.MIN_VALUE의 부호를 바꿨을때 값이 그대로인 이유 ( 자료구조 예시, 게임버그 돈 일정이상이면 -최솟값으로 이동 )

  • 삼각함수와 지수, 로그
    예제 9-22) 삼각함수와 지수, 로그를 구하는 수학관련 메서드 예시
    sqrt : 제곱근구하기 ( Math.sqrt(25) = 5 )
    pow : 거듭제곱근구하기 ( Math.pow(5, 2) = 25 )

  • StrickMath 클래스
    Math클래스는 최대한의 성능을 얻기 위해 JVM이 설치된 OS의 메서드를 호출해서 사용한다. 즉, OS에 의존적인 계산을 하고 있는것이다. 예를들어 부동수소점 계산의 경우, 반올림의 처리방법 설정이 OS마다 다를 수 있기 때문에 자바로 작성된 프로그램임에도 불구하고 컴퓨터마다 결과가 다를 수 있다.
    이러한 차이를 없애기 위해 성능은 다소 포기하는 대신, 어떤 OS에서 실행되어도 항상 같은 결과를 얻도록 Math클래스를 새로 작성한 것이 StrickMath 클래스이다.

  • Math클래스의 메서드
    489p 참고

✏️ 래퍼(wrapper)클래스 490p

  • 자바에서는 8개의 기본형을 객체로 다루지 않는다.
  • 때로는 기본형 변수도 어쩔 수 없이 객체로 다뤄야 하는 경우가 있는데 이 때 래퍼클래스를 사용한다.
  • char형과 int형을 제외한 나머지는 자료형 이름의 첫 글자를 대문자로 한 것이 각 래퍼 클래스의 이름이다.
    490p 표 참고
    예제 9-23) 래퍼클래스의 특징 예시
    래퍼클래스들은 모두 equals() 오버라이딩 => 주소값이 아닌 객체가 가지고 있는 값을 비교

  • Number클래스
    추상클래스
    오브젝트 > Number > 숫자클래스

  • 문자열을 숫자로 변환하기
    문자열 -> 기본형 // parse 클래스
    문자열 -> 래퍼 클래스 // valueOf
    // Integer.parseInt("100", 숫자) // n 진수 표현
    예제 9-24) 진수변환의 예시 (16진법은 Integer 10진법이라 에러발생)

  • 오토박싱 & 언박싱
    기본형과 참조형 간의 덧셈이 가능한 것
    오토박싱 : 기본형 값을 래퍼 클래스의 객체로 자동 변환해주는 것
    언박싱 : 래퍼 클래스 => 기본형 값
    예제 9-25) 오토박싱을 이용한 기본형과 참조형 간의 형변환과 연산 수행 예시
profile
Hello, World!

0개의 댓글