- java.lang
- 자바 프로그램에서 가장 많이 사용하는 패키지
- import 하지 않아도 자동으로 포함됨
01. Object 클래스
- Object 클래스란?
- 모든 클래스의 최상위 클래스
- 명시적으로 extends java.lang.Object하지 않아도 자동으로 상속받게 된다
- Object 클래스
- toString( ): 객체의 정보를 문자열로 반환
- equals( )
- == : 참조변수값 비교
- equals( ) : 정의한 값 비교
- hashCode( )
- getClass.getName( )
- 복제
- 객체 복제 : 원본 객체의 값과 동일한 값을 가진 새로운 객체를 생성하는 것 (단순복제? 완전히 동일한 객체)
- 얕은 복제 : 단순히 필드 값을 복사하는 방식으로 객체를 복제하는 것
- Cloneable 인터페이스를 구현하여 clone 메서드를 사용 가능하게 해야 한다
- clone( )사용할거면 implements Cloneable해줘야 함
- 깊은 복제: 참조하고 있는 객체도 복사하는 것
- Cloneable 인터페이스를 구현한 후, clone 메서드를 오버라이드 하여 내부의 참조 객체도 복제해야 한다
객체가 분리된 것은 맞는데 참조필드가 같은 객체를 가르키고 있다 --> 얕은 복제
이 상황을 모면하기 위해서 clone( ) 메소드를 새로 오버라이드 해줘야한다 --> 깊은 복제
(예시)
package com.javaex.api.objectclass.v4;
// v3. 얕은 복제
// 객체의 필드데이터를 단순 복제하는 것
// Cloneable 인터페이스 구현
public class Point implements Cloneable {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public Point getClone() {
//복제본
Point clone = null;
try {
clone = (Point)clone();
}catch(CloneNotSupportedException e) {
//복제 실패
e.printStackTrace();
}
return clone;
}
@Override
public String toString() {
// 객체 문자열 포맷을 반환
return String.format("Point(%d, %d)", x, y);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Point) {
//변환
Point other = (Point)obj;
return x == other.x && y == other.y;
}
return super.equals(obj);
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
package com.javaex.api.objectclass.v4;
import java.util.Arrays;
//v4. 깊은 복제
public class Scoreboard implements Cloneable{
//참조 타입 필드
private int[] scores;
//생성자
public Scoreboard(int[] scores) {
this.scores = scores;
}
public Scoreboard getClone() {
Scoreboard clone = null;
try {
clone = (Scoreboard)clone();
}catch(CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
@Override
protected Object clone() throws CloneNotSupportedException {
//1. 얕은 복제를 시도
Scoreboard clone = (Scoreboard)super.clone(); //object가 가지고 있었던 clone()쓰기
//2. 내부 참조 객체를 복제
clone.scores = Arrays.copyOf(scores, scores.length);// scores를 length만큼 복사해주고
return clone;
}
public int[] getScores() {
return scores;
}
public void setScores(int[] scores) {
this.scores = scores;
}
@Override
public String toString() {
return "Scoreboard [scores=" + Arrays.toString(scores) + "]";
}
}
package com.javaex.api.objectclass.v4;
public class LangClassTest {
public static void main(String[] args) {
Scoreboard s1 = new Scoreboard(new int[] {10,20,30,40});
System.out.println("s1 = "+ s1);
Scoreboard s2 = s1.getClone();
System.out.println("s2 = "+ s2);
System.out.println("s1 == s2 ? "+ (s1 == s2));
s2.getScores()[2] = 100;
System.out.println("s1 = "+ s1);
System.out.println("s2 = "+ s2);
System.out.println("s1.scores == s2.scores ? "+ (s1.getScores() == s2.getScores()));//s1의 주소값과 s2의 주소값 비교
}
}
02. String Class
- 문자(Character)
- 기본 자료형 (char) : 부호가 없는 2바이트 정수
- 문자 선언 char letter;
- 문자 할당 letter = ‘A’;
- 문자 사용 System.out.println(letter); System.out.println((int)letter);
- 문자열(String) 클래스
- 연속된 문자 (character)들을 저장하고 다루기 위한 클래스
- 문자열 상수: “”로 둘러싸인 문자열 -> 한번 만들어진 String 객체는 변경 불가 (immutable)
- 문자열 선언 String greeting;
- 문자열 할당 greeting = “Hello Java!”;
- 문자열 사용 System.out.println(greetin);
- 특수 문자의 표현 (Escape characters)
- “+” 연산자 : 문자열의 연결. 문자열과 다른 타입의 연결은 문자열로 변환되어 연결
- index
- String 객체 내의 문자 인덱싱은 배열과 같이 0부터 시작됨
- charAt(position) : 해당 위지의 문자를 반환
- Substring(start, end) : start부터 end까지의 문자들을 새로운 문자열로 반환
- String Class 메소드들
(예시)
//유용한 메서드들
String str ="Java Programming JavaScript Programming";
System.out.println("str:"+ str);
System.out.println("LENGTH:"+ str.length());
// 변환 메서드
System.out.println("UPPER:"+ str.toUpperCase());
System.out.println("LOWER:"+ str.toLowerCase());
//검색 메서드
System.out.println("인덱스 5의 글자:"+ str.charAt(5));
int index = str.indexOf("Java"); //Java의 인덱스
System.out.println("1번째 Java 인덱스:"+ index);
index = str.indexOf("Java", 5); //5번 인덱스 이후의 Java
System.out.println("2번째 Java 인덱스:"+ index);
index = str.indexOf("Java", 21); //21번 인덱스 이후의 Java
System.out.println("3번째 Java 인덱스:"+ index);// 찾을 수 없는 검색은 -1이다
System.out.println("마지막 Java 인덱스 "+ str.lastIndexOf("Java"));
//문자열 추출
System.out.println("substring(5): "+ str.substring(5));
System.out.println("substring(5, 16):"+ str.substring(5, 16)); // 5~ 16 앞까지
// 문자열 변경
System.out.println("replace:"+ str.replace("Programming", "Coding"));
// 문자열은 변경되지 않음(immutable)
System.out.println("str:"+ str);
//화이트 스페이스 제거
String s2 = " Hello ";
String s3 = " Java ";
System.out.println(s2.trim() + " " + s3.trim());
//문자열 분리
String[] words = str.split(" ");
for (String word: words) {
System.out.println("WORD:" + word);
}
// 문자열의 비교: Unicode 비교
// 0: 순서가 같다
// 음수: 순서가 빠르다
// 양수: 순서가 늦다
System.out.println("ABC".compareTo("ABD"));
03. String Buffer 클래스
- String Buffer 클래스
- 가변 크기의 버퍼를 가짐
- String이 immutable 인 것에 비해, StringBuffer 객체는 수정이 가능함
- StringBuffer 와 StringBuilder의 차이점
StringBuffer -> thread - safe (동기화 ㅇ)
StringBuilder -> thread - not safe (동기화 x)
(예시)
// 버퍼의 생성
StringBuffer sb = new StringBuffer("This");
System.out.println(sb);
// 문자열 추가: append
sb.append(" is pencil");
System.out.println(sb);
// 문자열 삽입: insert
sb.insert(7, " my");
System.out.println(sb);
// 문자열 치환: replace
sb.replace(7, 10, " your");
System.out.println(sb);
//버퍼 사이즈 조정: setLength
sb.setLength(5);
System.out.println(sb);
StringBuffer sb2 = new StringBuffer("This")
.append(" is pencil")
.insert(7, " my")
.replace(7, 10, " your");
String s = sb2.toString();
System.out.println(s);
'Java' 카테고리의 다른 글
[회원 정보 입력하기] (0) | 2022.01.04 |
---|---|
[JAVA]Date와 SimpleDateFormat으로 간단하게 시간 표시하기 (0) | 2022.01.03 |
[Chapter08]객체지향 프로그래밍2 (0) | 2021.12.14 |
[chapter04] 제어문 (0) | 2021.12.10 |
[chapter 05 ] 배열 (0) | 2021.12.09 |