공변 반환타입 (JDK1.5 추가)
오버라이딩할 때 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경을 허용하는 것이다.
Point copy = (Point)original.clone(); ---> Point copy= original.clone();
clone()을 이용한 배열 복사
int[] arr = {1,2,3,4,5}; int[] arrClone = arr.clone(); |
int[] arr = {1,2,3,4,5}; int[] arrClone = new int{arr.length}; System.arraycopy(arr, 0, arrClone, 0, arr.length); |
두 코드는 같은 결과를 얻는다
java.util 패키지의 다른 클래스들도 이와 같은 방식으로 복제가 가능하다
(Vector, ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, Calendar, Date)
ArrayList list = new ArrayList();
ArrayList list2 = (ArrayList)list.clone();
clone()의 얕은 복사와 깊은 복사
얕은 복사 : 객체에 저장된 값을 복제(참조하고 있는 객체 복제X)
깊은 복사 : 원본이 참조하고 있는 객체까지 복제
getClass()
자신이 속한 클래스의 Class객체를 반환하는 메서드
파일형태로 저장되어 있는 클래스를 읽어서 Class클래스에 정의된 형식으로 변환하는 것
String 클래스
기존의 다른 언어에서는 문자열을 char형으로 다뤘지만 자바에서는 String클래스를 제공한다
문자열을 읽을수는 있지만, 내용변경이 불가능한 불변클래스이다
덧셈 연산자(+)를 이용한 문자열 결합은 성능이 떨어지기 때문에,
문자열의 결합이나 변경이 잦다면, 내용을 변경가능한 StringBuffer를 사용해야한다
문자열의 비교
String str = “abc”;와 String str = new String(“abc”)의 비교
문자열 리터럴을 만들면 하나의 생성자를 공유하지만, new String();을 사용하면
항상 새로운 문자열이 만들어진다
등가비교 연산자는 주소비교이기 떄문에 String클래스에서는 equals를 이용해야 한다
문자열 리터럴
문자열 리터럴은 프로그램 실행 시 자동으로 생성된다
같은 내용의 문자열 리터럴은 하나만 만들어진다.
빈 문자열("", empty string)
내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
String str = “”;
**크기가 0인 배열을 생성하는것은 어느 타입이나 가능하다
문자(char)와 문자열(String)의 초기화
String s = “”; //빈 문자열로 초기화
char c = ‘ ’;//공백으로 초기화
좋은 코드 | 나쁜 코드 |
String str1 = “”; String str2 = “”; String str3 = “”; |
String str4 = new string(“”); String str5 = new string(“”); String str6 = new string(“”); |
join()과 Stringjoiner
join()은 여러 문자열 사이에 구분자를 넣어서 결합한다
구분자로 문자열을 자르는 split()와 반대의 작업을 한다
String animals = “dog,cat,bear”;
String[] arr = animals.split(“,”); //문자열을 ‘,’구분자로 나눠서 배열에 저장
String str = String.join(“-”,arr); //배열의 문자열을 '-'로 구분해서 결함
String.format
format()은 형식화된 문자열을 만들어내는 간단한 방법이다
String str = String.format();
System.out.println(str);