//////
Search
🍇

[0929] Object 클래스와 메소드, 삽입 정렬

생성일
태그
TodayILearn
java
생성일 1

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
복사

시간 복잡도

지금까지 공부한 세 가지 단순 정렬(버블, 선택, 삽입)의 시간 복잡도는 모두 O(n2)O(n^2) 입니다.
효율이 좋지 않은 편에 속합니다.