lang 패키지로 들어가기 전에 내가 항상 아쉬웠던게 있다.
계속 생각해보면 java에서 궁금한 게 자동 형변환이 자식객체가 부모타입으로 자동형변환되는 것인데
부모로 자동형변환이 되는데도 자식객체를 가리키는 이유가 뭔가?
어쨌든 이것도 이유는 다형성 때문인데
Parent p = new Child();
여기서 p는 Parent 타입 참조 변수지만, 실제 가리키는 객체는 Child 인스턴스.
자바는 다형성(Polymorphism) 을 지원하기 때문에 "부모 타입으로 자식 객체를 다룰 수 있도록" 설계되어 있음.
이렇게 하면 Parent 타입을 기반으로 코드를 작성하면 다양한 자식 객체들을 다룰 수 있다.
하지만 자식만의 기능은 사용할 수 없도록 제한됨.
overriding(메소드 재정의)한 경우를 사용하기 위해...
다형성이란 타입 변환+메소드 재정의로 설명할 수 있다.
그래서 참조 변수의 타입만 parent가 되고 자식 객체는 그대로 자식타입인..
걍 갠적으로 자동타입변환이란 건...저런 코드가 문법적으로 이상하지 않도록 걍 다형성을 위해 만들어낸 개념처럼 느껴짐.. 쨌든 모든건 다형성을 위한 것...
이제 본론!!
만약,객체가 논리적으로 동등한지 판단하려면,
equals메소드만 필요한 것이 아니다.
equals()는 안에 저장된 값만 판단하지만
hashCode() 객체 해시코드 메소드는 객체 메모리 번지를 이용하여 만드는데 이는 객체마다 다른 값을 가진다.
따라서 equals랑 hashCode둘다 필요 하다.
그래서 hashCode를 재정의하는 경우에 두 객체가 동등한지 비교할 때 필요하다
hashMap은 키와 값으로 이루어져있는데, 동일한 키를 재저장하지 않는다(중복 제거)
이 키는 키값이 같다고 해서 같은 정보라고 생각하지 않고, key숫자가 같아도 키의 주소(hashCode)가 다르면 다른 정보라고 생각하고 또 다른 배열로 저장해준다!
: Object클래스의 toString()메소드의 객체의 문자 정보 리턴
기본적으로 클래스이름@16진수해시코드 로 구성된 문자 정보
그런데 toString() 메소드 안써도 기본적으로 객체를 출력해보면
이게 생략된 것처럼 작동해서 자동으로 객체의 주소/문자 정보가 나옴....
이를 재정의해서 유익한 정보를 리턴하도록 바꿀수도 있다.
ex)
public String toString(){
return company + "," + os;
}
exit()메소드를 호출하여 JVM을 강제 종료
이 메소드가 지정하는 int 매개값을 종료 상태값이라고 함
currentTimeMillis() : 1/ 10^3
nanoTime() : 1/10^9
근데 쨌든 모두 long 값 리턴
자바는 클래스와 인터페이스의 메타데이터를 Class 클래스로 관리
메타 데이터: 타입이름 및 파일 경로 정보, 필드 정보, 생성자 저옵, 메소드 정보
Class clazz = Car.class;
Car.class는 Class 타입이며, Car 클래스의 정보를 담은 객체.
Class clazz = Class.forName("패키지...클래스이름")
//ex)Class clazz = Class.forName("sec01.exam08.Car")
Class clazz = 참조변수.getClass();
이 때 Car 클래스가 하나이기 때문에 이들이 참조하는 객체는 모두 동일하다. 세 개의 메모리 번지가 다 똑같다
Class 객체는 파일 경로 정보를 가지고 있어 이 경로를 활용해 다른 리소스 파일의 경로를 얻을 수 있다.
Class clazz= Car.class;
String photo1Path = clazz.getResource("photo1.jpg").getPath();
System.out.println(photo1Path);
이렇게 하면 photo1Path변수에 photo1의 절대경로가 저장되어 출력된다.
: 직접 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개를 빼야해서
: 매개값으로 주어진 인덱스의 문자를 리턴
String subject = "자바 프로그래밍";
char charValue = subject.charAt(3);
인덱스는 0부터 시작하므로, '프'가 리턴된다.
: 만약 == 연산자 사용할 경우 원하지 않는 결과 나올 수 있음

new로 생성한 객체는 항상 별개의 객체로 만들어 진다.
그러나,문자열 리터럴로 대입한 문자열은 같은 객체다.
그래서 서로 주소가 다르다...
== 를 쓰면, 참조 번지 주소를 비교하기 때문에 다르다고 나올 수있다.
그러나 내가, 참조 주소가 아니라 그 주소 안에 들어있는 값(문자열)이 같은지를 비교하고 싶다면!
String 클래스가 내부에서 Object클래스의 equals() 메소드를 재정의해서 서로 문자열이 같은지를 비교하기 때문에, 이걸 사용하면 된다.
따라서, 일반적으로 우리가 문자열을 비교할 때
==를 쓰면 안되고 equals()를 사용해야한다! 매우중요!!
String str = "Hello";
byte[] byteArray = str.getBytes(); // 문자열을 바이트 배열로 변환
for (byte b : byteArray) {
System.out.print(b + " "); // 72 101 108 108 111 (ASCII 값)가 나온다.
}
또한 아래 코드처럼 어떤방식으로 변환할지 지정도 가능
getBytes("UTF-8");
주어진 문자열 포함되어 있지 않으면 -1 리턴

비슷하게, contains()메소드도 같은 기능으로 사용가능
: 첫 번째 매개값인 문자열을 찾아 두번째 매개값인 문자열로 대치한 대치한 새로운 문자열 생성 및 리턴 (원본 문자열은 안바뀜)

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

:알파벳 소, 대문자 변경
:문자열 앞뒤 공백 제거해서 새로운 문자열 생성 및 리턴
: 기본타입의 값을 문자열로 변환
String str1 = String.vaueof(10);
String str2 = String.valueof(true);
System.out.println(str1); //문자열로 출력됨.
System.out.println(str2);

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

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


-포장 클래스로 문자열을 기본타입 값으로 변환
-'parse + 기본 타입 이름' 정적 메소드
ex.
문자열을 정수로:
Integer.parseInt("1000")
문자열을 실수로:
Integer.parseLong("10000")

객체==객체는
객체의 번지(주소)를 비교하기 때문에
객체 내부의 값을 비교하고 싶다면.., ==나 != 사용하지 말기.
ex
Integer obj1 = 300;
Integer obj2 = 300;
System.out.prinln(obj == obj2);
대신 equals() 사용
obj1.equals(obj2);
그러나, 작은 범위의 값인 경우 ==는 쓸 수 있다...
자바에서 같은 객체에 알아서 저장해주기 떄문에ㅣ..
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까지 생성되는게 아니다!!
끗:)