java.lang
패키지System
클래스, String
클래스import
없이 사용가능최상위
Object
중간
String, StringBuffer, Number, Boolean, Character
Number 의 하위
Byte, Short, Integer, Long, Float, Double
Object
가 가지고 있음hashCode()
생성된 객체의 메모리 주소정보를 리턴
equals()
의 반환 값이 true
hashCode()
값을 반환객체에 같은 값을 할당하더라도, 주소 값은 다를 수 있음
❗ 실행 결과는 동적으로 생성된 해시코드 정보이기 때문 ❗
아래 출력결과는 서로 다른 객체 주소 값을 출력
Fruit apple1 = new Fruit("사과", 11);
System.out.println(apple1.hashCode());
Fruit apple2 = new Fruit("사과", 11);
System.out.println(apple2.hashCode());
Objec
t 클래스의 hashCode()
메서드가 상속되지 않도록 ⇒ 메서드 오버라이딩hashCode()
매개변수 값이 동일한 경우? 동일한 해시코드 return
public class Fruit extends java.lang.Object {
. . .
public int hashCode() {
return Objects.hash(name, number); // 사과, 11
}
}
equals()
객체의 내용을 비교
==
👉 물리적으로 다르지만, 논리적으로 같은 경우
==
연산자와 유사한 동작equals()
와 같은 명령어라 볼 수 있음hashCode()
처럼, 객체의 내용을 비교하기 위해 메서드 오버라이딩 해야 함hashCode()
, equals()
가 있는 Fruit
클래스public class Fruit {
private String name;
private int number;
public Fruit(String name, int number) {
super();
this.name = name;
this.number = number;
}
@Override
public int hashCode() {
return Objects.hash(name, number);
}
@Override
public boolean equals(Object obj) {
Fruit other = (Fruit) obj;
return name.equals(other.name) && number == other.number;
}
public String getName() {
return name;
}
public int getScore() {
return number;
}
}
Fruit apple1 = new Fruit("사과", 11);
Fruit apple2 = new Fruit("사과", 11);
if(apple1==apple2) {
System.out.println("객체의 주소는 동일");
} else {
System.out.println("객체의 주소는 다름");
}
if(apple1.equals(apple2)) {
System.out.println("객체의 내용은 동일");
} else {
System.out.println("객체의 내용은 다름");
}
출력결과
객체의 주소는 다름
객체의 내용은 동일
hashCode()
, equals()
의 true
, false
@Override
public int hashCode() {
return studentNum;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
Student std = (Student) obj; // 다운캐스팅
if(this.studentNum == std.studentNum) {
return true;
}
else return false;
}
return false;
}
Student std1 = new Student(100, "Lee");
Student std2 = new Student(100, "Lee");
// 다른 객체이기 때문에 false
System.out.println(std1 == std2);
// equals() 오버라이딩 해주면, 논리적으로 같기 때문에 true
System.out.println(std1.equals(std2));
// hashCode() 오버라이딩 해주면, 논리적으로 같기 때문에 같은 주소 값 출력
System.out.println(std1.hashCode());
System.out.println(std2.hashCode());
// 실제 가상 메모리 주소 값 출력
System.out.println(System.identityHashCode(std1));
System.out.println(System.identityHashCode(std2));
// Integer, String도 마찬가지 같은 주소 값 출력
출력결과
false
true
100
100
1131316523
852687460
toString()
"클래스 이름 + 객체의 메모리 주소" 의 문자열 리턴
객체의 멤버변수에 할당된 값을, 하나의 문자열로 리턴
위 메서드들과 마찬가지로, 실제 객체의 값을 리턴하기 위해서는?
⇒ 메서드 오버라이딩
hashCode()
, equals()
가 있는 Fruit
클래스public class Fruit {
. . .
@Override
public String toString() {
return "과일의 종류는 " + name + ", 개수는 " + number + "개";
}
}
Fruit apple1 = new Fruit("사과", 11);
System.out.println(apple1.toString()); // 명시적 호출
System.out.println(apple1); // 묵시적 호출
출력결과
과일의 종류는 사과, 개수는 11개
과일의 종류는 사과, 개수는 11개
clone()
객체의 원복을 복제
clone ()
하위 클래스까지 변한 값을 그대로 복제clone()
메서드를 사용하면?👉 해당 클래스의 clone()
메서드의 사용을 허용한다는 의미로, cloneable 인터페이스를 명시해 줌
public class Student implements Cloneable
public class Student implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
throws CloneNotSupportedException
std1.setStudentName("KIM");
Student copyStudent = (Student) std1.clone(); // 100, KIM
System.out.println(copyStudent); // 출력 100, KIM
hashCode()
, equals()
, toString()
등 메서드 오버라이딩 단축키hashCode()
equals()
toString()
메소드를 오버라이딩 해두자!가장 많이 사용해서 중요
new
를 사용사과
생성String apple1 = new String("사과");
String apple2 = "사과";
메소드 | 기능 |
---|---|
charAt(int idx) : char | 인덱스(idx)에 위치한 문자(char) |
concat(String str) : String | 새로운 문자열(str)을 연결 |
endsWith(String suffix) : boolean | 특정 문자열(suffix)로 끝나는지 |
equalsIgnoreCase(String str) : boolean | 대소문자를 무시했을 때, 비교 문자열(str)과 내용이 같은지 |
indexOf(int ch) : int | 특정 문자(ch)의 인덱스 위치 |
indexOf(String str) : int | 특정 문자열(str)의 인덱스 위치 |
length() : int | 문자열의 길이 |
startsWith(Strng prefix) : boolean | 특정 문자(prefix)로 시작하는지 |
substring(int beginIdx) : String | 특정 인덱스(beginIdx)이후의 문자열 |
substring(int start, int end) : String | start 인덱스부터 다른 end 인데스까지의 문자열 |
toLowerCase() : String | 문자열을 소문자로 변환 |
toUpperCase() : String | 문자열을 대문자로 변환 |
trim() : String | 문자열 앞 뒤의 공백을 제거 |
split(String regex) : String[] | 특정 문자열(regex)을 구분자로 문자열을 분해 문자열 배열(String[])로 리턴 |
split(" ");
→ 문자열을 공백 기준으로 분리한 단어length()
→ 문자열 길이indexOf('o')
→ 문자열에서 첫 번째 o의 위치startsWith("kim")
→ 문자열이 kim으로 시작하나?substring(10, 26)
→ 문자열 10~26인덱스 사이의 문자열String
은 불변(immutable)new
, 상수 둘 다 불변이다String
을 연결하면 기존의 String
에 연결되는 것이 아닌String str = "11" + "22" + "33" + "44";
String
연결 시 새로운 문자열 생성 String java = new String("java");
String android = new String("android");
System.out.println(System.identityHashCode(java)); // 263025902 출력
java = java.concat(android); // java와 android 연결 => 새로운 문자열 생성
System.out.println(System.identityHashCode(java)); // 438135304 출력
// android와 연결된 java는 기존 java와 다른 주솟값을 가리킨다.
출력결과
1651191114
javaandroid
1586600255
char[]
를 멤버 변수로 가짐char[]
를 변경함StringBuffer
멀티 쓰레드 프로그래밍에서 동기화(synchronization)을 보장
⇒ 두 개 이상의 스레드가 같은 메모리 엑세스할때 순서 정해짐
단일 쓰레드 프로그램에서는 StringBuilder 사용을 권장
메소드 | 기능 |
---|---|
length() : int | 문자열의 길이 |
charAt(int index) : char | 특정 인덱스에 위치한 문자 |
toStirng() : String | StringBuffer 저장된 문자열 |
delete(int start, int end) : StringBuffer | start부터 end까지의 문자 제거 |
indexOf(String str) : int | 문자열(str)의 인덱스 위치 |
insert(int offset, String str) : StringBuffer | offset 인덱스 위치에 문자열(str) 삽입 |
substring(int start) : String | start 위치에서부터 문자열 잘라서 리턴 |
StringBuilder
, StringBuffer
활용toString()
메서드로 String
반환 String java = new String("java");
String android = new String("android");
StringBuilder buffer = new StringBuilder(java);
System.out.println(System.identityHashCode(buffer)); // 1651191114 출력
buffer.append(android); // append()로 buffer에 값 넣기
System.out.println(System.identityHashCode(buffer)); // 1651191114 출력
// buffer는 가변적이므로, 주소값이 동일
String test = buffer.toString(); // toString()으로 buffer 사용하기
System.out.println(test);
출력결과
1651191114
1651191114
javaandroid
Boolean, Character
Byte, Short, Integer, Long, Float, Double
char
와 Integer-int
제외,Integer.parseInt
int a = Integer.parseInt(args[0]);
System.out.println("정수 값 : " + a);
기본타입의 데이터 → 래퍼 객체로 변환
래퍼 객체 → 기본 타입으로 변환
int num1 = 11;
// 정상적 boxing
Integer baseBox = Integer.valueOf(num1);
// 정상적 unboxing
int baseUnbox = baseBox.intValue();
System.out.println(baseUnbox);
int num2 = 22;
// 오토 boxing
Integer autoBox = num2;
// 오토 unboxing
int autoUnbox = autoBox;
System.out.println(autoUnbox);
출력 결과
11
22
""" """
사이에 이어서 만들 수 있음html
, json
문자열을 만드는데 유용하게 사용 // text block 사용하기, java 13버전부터
public static void main(String[] args) {
String textBlocks = """
Hello,
hi,
how r u""";
System.out.println(textBlocks);
System.out.println(getBlockOfHtml());
}
public static String getBlockOfHtml() {
return """
<html>
<body>
<span>example text</span>
</body>
</html>""";
}
출력결과
Hello,
hi,
how r u
<html>
<body>
<span>example text</span>
</body>
</html>