[혼자공부하는JAVA] java.lang 패키지 정리

Hailey·2025년 2월 8일

JAVA

목록 보기
1/8

lang 패키지로 들어가기 전에 내가 항상 아쉬웠던게 있다.
계속 생각해보면 java에서 궁금한 게 자동 형변환이 자식객체가 부모타입으로 자동형변환되는 것인데

그렇다고해서 부모타입 참조변수가 부모타입객체를 가리키는건 아니더라고요? <<이게 진짜 헷갈릴 수 있음.

부모로 자동형변환이 되는데도 자식객체를 가리키는 이유가 뭔가?

어쨌든 이것도 이유는 다형성 때문인데

Parent p = new Child();

여기서 p는 Parent 타입 참조 변수지만, 실제 가리키는 객체는 Child 인스턴스.

왜 이렇게 동작할까? (다형성의 개념)

자바는 다형성(Polymorphism) 을 지원하기 때문에 "부모 타입으로 자식 객체를 다룰 수 있도록" 설계되어 있음.

이렇게 하면 Parent 타입을 기반으로 코드를 작성하면 다양한 자식 객체들을 다룰 수 있다.
하지만 자식만의 기능은 사용할 수 없도록 제한됨.
overriding(메소드 재정의)한 경우를 사용하기 위해...
다형성이란 타입 변환+메소드 재정의로 설명할 수 있다.

그래서 참조 변수의 타입만 parent가 되고 자식 객체는 그대로 자식타입인..
걍 갠적으로 자동타입변환이란 건...저런 코드가 문법적으로 이상하지 않도록 걍 다형성을 위해 만들어낸 개념처럼 느껴짐.. 쨌든 모든건 다형성을 위한 것...

이제 본론!!

1. Object 클래스

equals(),hashCode()

만약,객체가 논리적으로 동등한지 판단하려면,
equals메소드만 필요한 것이 아니다.
equals()는 안에 저장된 값만 판단하지만
hashCode() 객체 해시코드 메소드는 객체 메모리 번지를 이용하여 만드는데 이는 객체마다 다른 값을 가진다.

따라서 equals랑 hashCode둘다 필요 하다.

그래서 hashCode를 재정의하는 경우에 두 객체가 동등한지 비교할 때 필요하다
hashMap은 키와 값으로 이루어져있는데, 동일한 키를 재저장하지 않는다(중복 제거)
이 키는 키값이 같다고 해서 같은 정보라고 생각하지 않고, key숫자가 같아도 키의 주소(hashCode)가 다르면 다른 정보라고 생각하고 또 다른 배열로 저장해준다!

toString()

: Object클래스의 toString()메소드의 객체의 문자 정보 리턴
기본적으로 클래스이름@16진수해시코드 로 구성된 문자 정보

그런데 toString() 메소드 안써도 기본적으로 객체를 출력해보면
이게 생략된 것처럼 작동해서 자동으로 객체의 주소/문자 정보가 나옴....

이를 재정의해서 유익한 정보를 리턴하도록 바꿀수도 있다.
ex)

public String toString(){
return company + "," + os;
}

2. System Class

exit() 프로그램 종료

exit()메소드를 호출하여 JVM을 강제 종료
이 메소드가 지정하는 int 매개값을 종료 상태값이라고 함

currentTimeMillis(), nanoTime() 현재시각 읽기

currentTimeMillis() : 1/ 10^3
nanoTime() : 1/10^9
근데 쨌든 모두 long 값 리턴

2. Class 클래스

자바는 클래스와 인터페이스의 메타데이터를 Class 클래스로 관리
메타 데이터: 타입이름 및 파일 경로 정보, 필드 정보, 생성자 저옵, 메소드 정보

Class 객체 얻기( getClass(), forName() )

1. 클래스로부터 얻는 방법

 Class clazz = Car.class;
  • 첫번째 방법: car class의 클래스 객체가 생성이 되어서 번지가 clazz에 복사가 된다.
    Car.class는 Car 클래스 자체를 가리키는 Class 타입의 객체입니다. 정리하면,

    Car.class는 Class 타입이며, Car 클래스의 정보를 담은 객체.

Class clazz = Class.forName("패키지...클래스이름")
 //ex)Class clazz = Class.forName("sec01.exam08.Car")
  • 두번째 방법: Class 클래스의 정적메소드 호출해서 얻어오는 방법.

2. 객체로부터 얻는 방법

Class clazz = 참조변수.getClass();

이 때 Car 클래스가 하나이기 때문에 이들이 참조하는 객체는 모두 동일하다. 세 개의 메모리 번지가 다 똑같다

class 경로 활용하여 리소스 절대 경로 얻기

Class 객체는 파일 경로 정보를 가지고 있어 이 경로를 활용해 다른 리소스 파일의 경로를 얻을 수 있다.

Class clazz= Car.class;

String photo1Path = clazz.getResource("photo1.jpg").getPath();
  
System.out.println(photo1Path);
  

이렇게 하면 photo1Path변수에 photo1의 절대경로가 저장되어 출력된다.

3. String 클래스

String 생성자

: 직접 String 객체를 생성

예시 코드 :

  byte[] bytes = new byte[100];
  
  System.out.print("입력: ");
  int readByteNo = System.in.read(bytes);
  
  String str = new String(bytes, 0, readByteNo -2);
  System.out.println(str);

-2한 이유는 문자열이 끝난 걸 알려주는 /와 엔터 이런거 2개를 빼야해서

charAt() 메소드

: 매개값으로 주어진 인덱스의 문자를 리턴

String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);

인덱스는 0부터 시작하므로, '프'가 리턴된다.

equals() 메소드

: 만약 == 연산자 사용할 경우 원하지 않는 결과 나올 수 있음

new로 생성한 객체는 항상 별개의 객체로 만들어 진다.
그러나,문자열 리터럴로 대입한 문자열은 같은 객체다.
그래서 서로 주소가 다르다...

== 를 쓰면, 참조 번지 주소를 비교하기 때문에 다르다고 나올 수있다.
그러나 내가, 참조 주소가 아니라 그 주소 안에 들어있는 값(문자열)이 같은지를 비교하고 싶다면!

String 클래스가 내부에서 Object클래스의 equals() 메소드를 재정의해서 서로 문자열이 같은지를 비교하기 때문에, 이걸 사용하면 된다.

따라서, 일반적으로 우리가 문자열을 비교할 때
==를 쓰면 안되고 equals()를 사용해야한다! 매우중요!!

getBytes() 메소드 : 바이트 배열로 변환

  • 바이트 배열이란?
    메모리를 1바이트( = 8비트 / -128 ~ 127) 단위로 저장
    (8비트 중 1비트는 부호비트이므로 2의 7승! 그래서 128)
  String str = "Hello";
byte[] byteArray = str.getBytes(); // 문자열을 바이트 배열로 변환

for (byte b : byteArray) {
    System.out.print(b + " "); // 72 101 108 108 111 (ASCII 값)가 나온다.
}

또한 아래 코드처럼 어떤방식으로 변환할지 지정도 가능


getBytes("UTF-8");

indexOf() 메소드 : 매개값으로 주어진 문자열이 시작되는 인덱스 리턴

주어진 문자열 포함되어 있지 않으면 -1 리턴

비슷하게, contains()메소드도 같은 기능으로 사용가능

length() 메소드 : 문자열 길이 리턴

replace()

: 첫 번째 매개값인 문자열을 찾아 두번째 매개값인 문자열로 대치한 대치한 새로운 문자열 생성 및 리턴 (원본 문자열은 안바뀜)

substring() : 문자열 잘라내기

주어진 인덱스에서 문자열을 추출한다.

toLowerCawe(). toUpperCase()

:알파벳 소, 대문자 변경

trim()

:문자열 앞뒤 공백 제거해서 새로운 문자열 생성 및 리턴

valueOf()

: 기본타입의 값을 문자열로 변환

String str1 = String.vaueof(10);
String str2 = String.valueof(true);

System.out.println(str1); //문자열로 출력됨.
System.out.println(str2);

4. Wrapper 클래스

Wrapper(포장) 객체

  • 기본 타입의 값을 내부에 두고 포장
  • 포장하고 있는 기본 타입 값은 외부에서 변경할 수 없음
  • byte,char,short,int,long,float,double,boolean 기본 타입 값 갖는 객체

박싱: 기본 타입의 값을 포장객체로 만드는 과정
언박싱: 포장 객체에서 기본타입의 값을 얻어내는 과정


--박싱, 또한 new없이도 박싱 가능
생성자를 이용하지 않고 각 포장 클래스마다 가진 정적 valueOf()메소드 활용
--언박싱
기본 타입 이름 + Value() 메소드 호출하여 언박싱

자동박싱과 언박싱

문자열을 기본 타입 값으로 변환

-포장 클래스로 문자열을 기본타입 값으로 변환
-'parse + 기본 타입 이름' 정적 메소드
ex.
문자열을 정수로:

  Integer.parseInt("1000")

문자열을 실수로:

Integer.parseLong("10000")

포장 값(내부값) 비교시 equals() 사용!

객체==객체는
객체의 번지(주소)를 비교하기 때문에
객체 내부의 값을 비교하고 싶다면.., ==나 != 사용하지 말기.

ex

Integer obj1 = 300;
Integer obj2 = 300;
System.out.prinln(obj == obj2);

대신 equals() 사용

obj1.equals(obj2);

그러나, 작은 범위의 값인 경우 ==는 쓸 수 있다...
자바에서 같은 객체에 알아서 저장해주기 떄문에ㅣ..

5. Math 클래스

int v1 = Math.abs(-5);

int v2 = Math.ceil(5.3); //올림값
int v2 = Math.floor(5.3); //내림값
int v2 = Math.round(5.3); //반올림값

Math.random() 메소드는 0.0 이상 1.0 미만 범위에 속하는 하나의 double 타입 값을 리턴하므로

예를들어.. 1~10까지의 임의의 정수 난수를 얻고 싶다면!

(int) (Math.random() * 10) + 1

random함수가 1.0미만을 리턴하므로 +1을 해줘도 11까지 생성되는게 아니다!!

끗:)

profile
럭키헤일리

0개의 댓글