본 게시글은 대학 전공수업을 들으며 노션에 정리한 내용을 블로그로 옮긴 것으로, 노션 웹을 통해 최적화된 형태로 읽으시길 권장드립니다.(➡️ 노션 링크)
8강 - java.lang 패키지: Object, String, StringBuffer
Java.lang 패키지
필수적인 기본 클래스 제공하는 패키지로, import문이 필요없음!
- Object, String, StringBuffer, Process, Thread, Exception, Throwable, Error, System, Package, Class, Math, 포장클래스(Number, Integer, Double, Character, Boolean 등)
Object 클래스
- 모든 클래스의 조상으로 이 클래스를 상속받음.
- 계층구조에서 루트가 되는 클래스.
toString()
객체를 문자열로 표현하여 반환함
클래스이름@16진수해시코드
로 표현
문자열의 +연산, sout에서 필요함.
자식 클래스에서 재정의할 수 있음.(String / Integer)
코드
class MyClass1 { } class MyClass2 extends Object { //재정의 public String toString() { return "This MyClass2 class"; } } public class ToString { public static void main(String[] args) { MyClass1 my_class1 = new MyClass1(); MyClass2 my_class2 = new MyClass2(); System.out.println(my_class1.toString()); System.out.println(my_class2.toString()); System.out.println(my_class1); System.out.println(my_class2); } }
equals()
두 객체변수를 비교해, 객체의 ‘참조값’이 같을 때 True를 반환
자식 클래스에서 재정의할 수 있음.
코드
public class Equals { public static void main(String[] args) { Integer x = Integer.valueOf(5); Integer y = Integer.valueOf(10); Integer a = 5; Short b = 5; System.out.println(x.equals(y)); //false System.out.println(x.equals(a)); //true System.out.println(x.equals(b)); //false System.out.println(x == y); //false System.out.println(x == a); //true //System.out.println(x == b); //컴파일 오류 : incomparable types //cf. Integer Cashing } }
clone()
객체를 복제하여 리턴
‘Cloneable 인터페이스를 구현한 클래스’의 객체만 clone() 메소드를 호출할 수 있음.
- 단, 예외처리(CloneNotSupported)해줘야함.
코드
package lecture08; //복제가능한 Box 클래스 class Box implements Cloneable { private int width, height; public Box(int w, int h) { width = w; height = h; } public int width() { return width; } public int height() { return height; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { return null; } } } public class Clone { public static void main(String args[]) { Box b1 = new Box(20, 30); Box b2 = (Box) b1.clone(); //복제 System.out.println(b2.width()); System.out.println(b2.height());// b1과 값은 같다. System.out.println(b1); System.out.println(b2); //b1과의 식별값은 다르다. } }
getClass()
현재 객체의 유형/정보를 가진 Class객체 리턴.
Class 클래스는 정보 확인을 위한 메소드 제공
메소드 코드
package lecture08; public class GetClass { public static void main(String[] args) { Box box = new Box(50, 50); System.out.println("클래스 이름 : " + box.getClass()); System.out.println("슈퍼클래스 이름 : " + box.getClass().getSuperclass().getName()); System.out.println("필드 목록"); for (int i = 0; i < box.getClass().getDeclaredFields().length; i++) { System.out.println(box.getClass().getDeclaredFields()[i]); } System.out.println("메소드목록"); for (int i = 0; i < box.getClass().getDeclaredMethods().length; i++) { System.out.println(box.getClass().getDeclaredMethods()[i]); } } }
String 클래스
문자열을 표현/처리하기 위한 클래스
String s1 = new String(”Java”); //객체 생성
String 클래스는 기본 자료형 처럼 사용 가능.
String s2 = “Java”; // 리터럴 대입
한번 만들어지면 내용이 변하지 않는(immutable) 상수 객체.
String 클래스의 메소드
문자열 비교 메소드
int compareTo(String anotherString)
- 두 문자열이 같으면 0을 리턴, 다르면 0이 아닌 정수 리턴
int compareToIgnoreCase(String aS)
- 대소문자 무시하고 비교
boolean equals(Object anObject)
- 두 ‘문자열’을 비교 → 같으면 true
boolean equalsIgnoreCase(String aS)
- 대소문자 무시하고 비교
문자열 검색 메소드
int indexOf(String str)
- 처음 위치부터 문자열을 찾아 처음 등장하는 위치를 리턴.
- 없으면 -1 리턴
int indexOf(String str, int fromIndex)
- fromIndex위치부터 str을 찾음, 처음 등장하는 위치를 리턴. 없으면 -1
int lastIndexOf(String str) / int lastIndexOf(String str, int fromIndex)
- 마지막 위치부터 앞 방향으로 찾음
문자열 추출 메소드
char charAt(int index)
- index 위치에 있는 문자를 리턴
String substring(int beginIndex)
- beginIndex위치부터 마지막까지 문자열 리턴
String substring(int beginIndex, int endIndex)
- begin 부터 endIndex-1 까지의 문자열 리턴
문자열 변환 메소드
***원본 문자열은 변환되지 않음! 새로운 객체가 만들어짐.
String replace(char oldChar, char newChar)
- oldChar문자를 newChar문자로 변환하여 리턴
String trim()
- 문자열의 앞뒤 공백 제거한 새 문자열 반환
String toUpperCase()
- 문자열의 모든 문자 대문자로 변환한 새 문자열 반환
String toLowerCase()
- 문자열의 모든 문자 소문자로 변환한 새 문자열 반환
String concat(String str)
- 현재 문자열에 다른 문자열 연결한 새 문자열 반환
기타
boolean startsWith(String prefix)
- prefix로 시작하면 true로 리턴
boolean endsWith(String suffix)
- suffix로 끝나면 true리턴
char[] toCharArray()
- 문자 배열로 변환하여 리턴함.
String 클래스의 문제점
문자열이 빈번하게 변경될 때, String은 immutable클래스이기 때문에 기존 String은 놔둔 채 새로운 String 객체가 계속 생성된다. → 메모리 낭비, 실행 속도 저하.
따라서! StringBuffer, StringBuilder클래스를 사용.
String, StringBuffer, StringBuilder 클래스의 시간비교
package lecture08; public class StringCompare { public static void main(String[] args) { final String tmp = "abcde"; long start, end; String str = new String(); StringBuffer sb1 = new StringBuffer(); StringBuilder sb2 = new StringBuilder(); start = System.nanoTime(); for (int i = 0; i < 10000; i++) { str = str + tmp; } end = System.nanoTime(); System.out.println("String" + (end - start) / 1000000.0 + " msecs"); start = System.nanoTime(); for (int i = 0; i < 10000; i++) { sb1.append(tmp); } end = System.nanoTime(); System.out.println("String 버퍼" + (end - start) / 1000000.0 + " msecs"); start = System.nanoTime(); for (int i = 0; i < 10000; i++) { sb2.append(tmp); } end = System.nanoTime(); System.out.println("String 빌더" + (end - start) / 1000000.0 + " msecs"); } }
실행결과
빠른 순서 : String < StringBuffer < StringBuilder
StringBuffer
는 동기화 기능 지원 → 더 많은 오버헤드가 발생→ StringBuilder
보다 성능이 떨어질 수 있다.
StringBuffer 클래스
: 객체 생성 이후 문자열을 ‘변경’할 수 있는 클래스
- 내용 변경이 가능한 mutable 클래스!
내부적으로 문자열을 저장하기 위해, 크기가 조절되는 buffer를 사용함.
메소드
int capacity()
- 버퍼의 크기를 리턴
int length()
- 문자열의 길이를 반환
char charAt(int index)
- 인덱스 위치의의 문자를 반환
int indexOf(String str)
- str로 시작하는 위치의 인덱스를 반환
String substring(int beginIndex, int endIndex)
- start부터 end-1 까지의 문자열을 반환
StringBuffer append(char c)
- 문자열 끝에 문자 c 추가한 후 StringBuilder 반환
StringBuffer delete(int start, int end)
- start부터 end-1 까지의 문자를 삭제
StringBuffer insert(int offset, String str)
- offset위치에 문자열을 삽입
StringBuffer replace(int start, int end, String str)
- start부터 end-1 까지의 문자열을 str로 대체
StringBuffer reverse()
- 문자열을 역순으로 변환
포장 클래스
: 기본형을 참조형으로 표현하기 위한 클래스
기본형과 상응하는 객체(ex. int와 Integer)사이의 형변환 기능
- int → Integer 를 박싱, Integer를 int는 언박싱!
종류
Byte, Short, Integer, Long, Float, Double, Charachter, Boolean
언제 사용하나?
- 메소드 인자로 객체가 필요할 때
- Number의 자식 포장 클래스가 제공하는 상수를 사용할 때
- 상수? → Integer.MIN_VALUE, Integer.MAX_VALUE 등.
- 기타 클래스가 제공하는 다양한 메소드를 사용할 때
Number 클래스
숫자를 표현하는 클래스, Byte, Short, Integer, Long, Float, Double의 추상 부모 클래스
각각의 자식클래스에서는 아래 종류와 같은 메소드를 구현해놓음.
-박싱, 언박싱, String 변환/역변환(valueOf/parse**), 기본형과의 비교(compareTo), 형태까지 비교(equals) 등.
Integer 클래스의 경우
Integer, String, int사이의 변환기능
- int parseInt(String s) : String을 int로
- String toString(int i) : int를 String으로
- Integer valueOf(int i) : int를 Integer로
- String toString() : Integer를 String으로
- Integer valueOf(String s) : String을 Integer로.
자동 박싱 / 언박싱
인자에 전달되거나 / 변수에 대입될 때 기본형→포장형 (박싱) / 포장형→ 기본형(언박싱)으로 자동 변환됨
System 클래스
: Java 플랫폼, 시스템과 관련된 기능 제공.(클래스필드/메소드)
- 모든 멤버는 static ⇒ 사용시 객체 생성할 필요 없음.
종류
- 표준 입/출력
- JVM또는, 운영체제 속성과 환경변수의 사용/제어
- 배열 복사, 시간조회 등
Scanner에서 그토록 많이 봤던…
System.in 의 정체는?
표준 입력 스트림으로, InputStream유형이다.
키보드로 부터 입력을 받을 때 사용!
*System.Out은 표준 출력 / 화면에 데이터를 출력할 때 사용.(PrintStream)
System.err : ‘표준 에러 출력 스트림’ / 오류메시지를 화면에 출력.
'Back-End > Java' 카테고리의 다른 글
(전공 정리) 12강 - 스트림 : 중간연산(필터링,매핑,정렬,루핑), 종료연산(집계, 매칭) (0) | 2024.06.22 |
---|---|
(전공 정리) 11강 - 컬렉션 : JCF, Iterator, 자료구조, HashSet, ArrayList, LinkedList, HashMap (0) | 2024.06.22 |
(전공 정리) 9강 - Java.io : 입출력스트림, 파일 입출력 (0) | 2024.06.22 |
(전공 정리) 7강 - 패키지와 예외처리 (0) | 2024.06.22 |
(전공 정리) 6강 - 제네릭, 람다식 (0) | 2024.06.22 |
(전공정리) 5강 - 추상 클래스, 인터페이스, 다형성, enum, 익명클래스, 중첩클래스 (0) | 2024.06.22 |