Object 클래스
toString() 메소드
String toString()
•
객체를 문자열로 표현하여 반환하는 메소드이다. 다른 클래스에서 재정의하여 객체에 대한 설명이나 특정 멤버 변수 값을 반환하도록 만들 수 있다.
기본 사용 - 참조 변수
class Book {
String title;
String author;
Book (String title, String author){
this.title = title;
this.author = author;
}
}
public class ToStringEx {
public static void main(String[] args) {
Book book = new Book("자바의 정석" ,"남궁성");
System.out.println(book);
System.out.println(book.toString());
}
}
Java
복사
•
출력화면
•
toString() 메소드는 인스턴스 정보를 문자열로 반환하는 메소드이다.
•
toString() 메소드의 원형은 생성된 인스턴스의 클래스 이름과 주소값을 반환한다.
•
System.out.println(book); 과 같이 출력문에 참조 변수를 넣으면 인스턴스 정보가 출력되는데, 이때 자동으로 toString() 메소드가 호출된다.
기본 사용 - String, Integer 클래스
public class ToStringEx {
public static void main(String[] args) {
String str = new String("test");
System.out.println(str);
System.out.println(str.toString());
}
}
Java
복사
•
출력화면
•
String, Integer 등의 클래스는 toString() 메소드를 미리 재정의해 두었기 때문에, 인스턴스 정보가 아닌 다른 값이 반환된다.
재정의해서 사용
class Book {
String title;
String author;
Book (String title, String author){
this.title = title;
this.author = author;
}
@Override //
public String toString() {
return title + ", " + author;
}
}
public class ToStringEx {
public static void main(String[] args) {
Book book1 = new Book("자바의 정석" ,"남궁성");
System.out.println(book1);
}
}
Java
복사
•
출력화면
•
자바 최상위 클래스인 Object 클래스에서 toString() 메소드를 오버라이드하여, 메소드를 재정의하여 사용할 수 있다.
equals() 메소드
•
실제 값을 비교하지 않고 위치값(참조값, 주소값)을 비교
•
매개변수로 객체의 참조변수를 받아 비교
•
오버라이딩을 통해 원하는 내용 비교
•
결과를 boolean 값으로 나타냄
equals()메소드
예제_ 주소값 비교
equals() 메소드 오버라이딩
•
참조변수가 가지고 있는 값(Value) 비교
예제_ 객체 내용 비교
String 클래스
String 클래스는 문자열을 구성하는 문자들을 내부에 저장한다
String 객체 생성
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
String s4 = new String("Java");
Java
복사
String 클래스의 경우 위와 같이 객체 생성이 가능하다.
이렇게 생성된 객체들을 비교할 때에 equals() 메소드를 활용하여야 하며
일방적인 == 비교를 할 시 주소를 비교하기에 오류가 발생 가능하다.
String 메서드
Method | Explain | Example code | Example Value |
char charAt(int index) | 지정된 인덱스에 있는 문자 리턴 | String s = “abcde”;
char c = s.charAt(4); | c = 'e' |
int compareTo(String str) | 문자열과 사전순서로 비교하여 이전이면 음수, 이후면 양수 리턴 | int i = "aaa".compareTo("aaa"); int ii = "aaa".compareTo("bbb"); int iii = "bbb".compareTo("aaa"); | i = 0
ii = -1
iii = 1 |
String concat(String str) | 문자열을 뒤에 덧붙여서 리턴 | String s = "Hello"; String s2 = s.concat(" !"); | s2 = "Hello !" |
boolean contains(CharSequence c) | 지정된 문자열이 포함돼 있는지 리턴 | String s = "abcd"; boolean b = s.contains("bc"); | b = true |
boolean endsWith(Stringsuffix) | 지정된 문자열로 끝나는지 리턴 | String s = "abcd"; boolean b = s.endsWith("d"); | b = true |
boolean equals(Object obj) | 문자열 비교 결과 리턴 | String s = new String("abc");
String s1 = new String("abc");
boolean b = s.equals(s1); | b = true |
boolean equalsIgnoreCase(String str) | 문자열과 String 객체의 문자열을 대소문자 구분없이 비교하여 리턴 | String s = new String("abc");
String s1 = new String("ABC");
boolean b = s.equalsIgnoreCase(s1); | b = true |
int indexOf(int ch) | 주어진 문자가 문자열에 존재하는지 확인하여 인덱스 리턴 | String s = "Hello";
int idx1 = s.indexOf('o');
int idx2 = s.indexOf('q'); | idx1 = 4
idx2 = -1 |
int indexOf(int ch, int pos) | 주어진 문자가 문자열에 존재하는지 정된 위치부터 확인하여 인덱스 리턴 | String s = "Hello";
int idx1 = s.indexOf('e', 0);
int idx2 = s.indexOf('e', 2); | idx1 = 1
idx2 = -1 |
int indexOf(String str) | 주어진 문자열이 존재하는지 확인하여 인덱스 반환 | String s = "ABCDE";
int idx = s.indexOf("BC); | idx = 1 |
String intern( ) | 문자열을 상수풀에 등록 | String s1 = new String("abc");
String s2 = new String("abc");
boolean b = (s1.intern( ) == s2.intern( );) | b = true |
int lastIndexof(char ch) | 지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 인덱스 리턴 | String s = "Hello";
int idx = s.lastIndexOf('l'); | idx = 3 |
int lastIndexOf(String str) | 지정된 문자열을 객체의 문자열 끝에서 부터 찾아서 인덱스 리턴 | String s = "Hello";
int idx = s.lastIndexOf("ll"); | idx = 2 |
int length( ) | 문자열의 길이 리턴 | String s = "Hello";
int len = s.length(); | len = 5 |
String replace(char old, char new) | old를 new로 바꾸어 리턴 | String s = "Hello";
String rs = s.replace('e', 'a'); | rs = "Hallo" |
String replace(CharSequence old, CharSequence new) | 문자열 중 old를 new로 바꾸어 리턴 | String s = "Hellollo"; String rs = s.replace("ll", "LL"); | re = "HeLLoLLo" |
String replaceAll(String regex, String replacement) | 문자열 중 지정된 문자열과 일치하는 것을 새로운 문자열로 모두 변경하여 리턴 | String ab = "AABBAABB"; String s1 = ab.replaceAll("BB", "bb"); | r = "AAbbAAbb" |
String replaceFirst(String regex, String replacement) | 문자열 중 지정된 문자열과 일치한 것 중, 첫번째 것만 새로운 문자열로 변경하여 리턴 | String ab = "AABBAABB"; String s1 = ab.replaceFirst("BB", "bb"); | r = "AAbbAABB" |
String\[\] split(String regex) | 문자열을 지정된 분리자로 나누어 문자열 배열에 담아 리턴 | String s = "010,1234,5678" String[] arr = s.split(","); | arr[0] = "010" arr[1] = "1234" arr[2] = "5678" |
String\[\] split(String regex, int limit) | 문자열을 지정된 분리자로 나누어 문자열 배열에 담아 리턴하는데, 문자열 전체를 지정된 수로 자름 | String s = "010,1234,5678" String[] arr = s.split(",", 2); | arr[0] = "010" arr[1] = "1234, 5678" |
static String join(String r, String\[\] s) | 여러 문자열 사이에 구분자를 넣어서 결합 후 리턴 | String s = "010,1234,5678";
String[] arr = s.split(",");
String str = String.join("-", arr) | str = “010-1234-5678” |
boolean startsWith(String prefix) | 주어진 문자열로 시작하는지 리턴 | String s = "abcd"; boolean b = s.endsWith("a"); | b = true |
String substring(int begin) String substring(int begin, int end) | 시작 위치부터 끝 위치 범위에 포함된 문자열 리턴 | String s = "I like Java"; String c = s.substring(3, 6); | c = "ike " |
String toLowerCase( ) String toUpperCase( ) | String 객체에 저장된 문자열을 소문자(또는 대문자)로 변환하여 반환 | String s = "abCdE"; String l = s.toLowerCase(); String u = s.toUpperCase(); | l = "abcde" u = "ABCDE" |
String toString( ) | String 객체에 저장돼 있는 문자열 반환 | String s = "Hello";
String s1 = s.toString(); | s1 = "Hello" |
String trim( ) | 문자열 양쪽 끝에 있는 공백을 제거하여 리턴 | String s = " Hi "; String rs = s.trim(); | rs = "Hi" |
static String valueOf(type t) | 지정된 값을 문자열로 변환하여 반환 | String s = String.valueOf(true); java.util.Date dd = new java.util.Date(); String s2 = String.valueOf(dd); | s1 = "true" s2 = "Mon Jul 19 01: 50:30 KST 2021" |
삽입 정렬
정상희
개념 설명
1 10 5 8 7 6 4 3 2 9
Java
복사
•
삽입 정렬은 위 배열을 정렬할 때 적절한 위치에 삽입하는 방법으로 문제를 해결합니다.
•
버블 정렬, 선택 정렬은 무조건 위치를 바꾸는 방식이었다면 삽입 정렬은 ‘필요할 때만’ 위치를 바꾸게 됩니다.
코드 분석
1:for (int i = 1; i < n; i++) {
2: int j;
3: int tmp = arr[i];
4:
5: // j>0 && arr[j-1] > tmp일 경우 for문 실행
6: for (j = i; j > 0 && arr[j - 1] > tmp; j--) {
7: arr[j] = arr[j - 1];
8:
9: arr[j] = tmp;
}
}
Java
복사
첫 번째 실행 시뮬레이션
두 번째 실행 시뮬레이션
•
이렇듯 내부 for문에선 j - -를 시키며 하나씩 비교하다가 자신이 들어가야 할 위치를 찾고
•
외부의 for문에선 그 위치에 tmp를 대입함으로써 값을 삽입합니다.
•
i < n일 때까지 반복
전체 코드
import java.util.Arrays;
import java.util.Scanner;
public class InsertionSort {
static void InsertSort(int[] arr, int n) {
for (int i = 1; i < n; i++) {
int j;
int tmp = arr[i];
for (j = i; j > 0 && arr[j - 1] > tmp; j--) {
arr[j] = arr[j - 1];
}
arr[j] = tmp;
System.out.println(Arrays.toString(arr));
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("삽입 정렬");
System.out.println("요소 개수 : ");
int n = 5;
int[] x = { 3, 6, 2, 5, 4 };
for (int i = 0; i < n; i++) {
System.out.print("X[" + i + "] =");
x[i] = sc.nextInt();
}
System.out.println("정렬 과정");
InsertSort(x, n);
System.out.println("오름차순으로 정렬했습니다.");
for (int i = 0; i < n; i++)
System.out.print("X[" + i + "] :" + x[i] + " ");
}
}
Java
복사
시간 복잡도
지금까지 공부한 세 가지 단순 정렬(버블, 선택, 삽입)의 시간 복잡도는 모두 입니다.
효율이 좋지 않은 편에 속합니다.