Day 12 - JAVA(String 자르기, 개미수열, 기본배열, 중첩배열, Shallow Copy, Deep Copy)
25. String 비교하기
메소드 | API | 소스 |
*.equals(String) | compares this String hashcode using | |
*.equalsIgnoreCase(String) | compares this String hashcode using (대소문자 구분X) |
|
*.compareTo(String) | compares two Strings lexicograhically | |
*.compareToIgnoreCase(String) | compares two Strings lexicograhically (대소문자 구분X) |
*.equals
public class Equals_Explain {
/**
* equals는 부모의 메소드(java.lang.Object) 객체가 생성이 되면 hashcode가 만들어짐 hashcode는 Object가 가지고 있음
* String은 객체가 만들어질 때 사용되는 객체의 codepoint를 사용하여 Object가 부여한 hashcode를 재정의
* => equals and hashcode override 라고 함
*/
public void StringEquals() {
String str1 = "Happy";
String str2 = "happy";
System.out.println(str1 == str2); //값이 틀려서
boolean isc = str1.equals(str2);
System.out.println(isc);
boolean isc2 = str1.equalsIgnoreCase(str2);
System.out.println(isc2);
public class CompareTo_Explain {
/*
* 비교 대상이 heap의 객체를 비교 하지만 compareTo는 String을 char의 요소로 비교하는 방법 반환타입이 비교대상끼리의
* 차이(code point)를 반환
*/
public void compareToMethod() {
String str1 = "vacation";
String str2 = "vacaTion"; // 전체값을 비교하는 것이 아니라 하나씩 비교하다가 다르면 멈추고 반환
char t = 't';
char T = 'T';
System.out.println("t :" + (int) t);
System.out.println("T :" + (int) T);
// letter는 대문자와 소문자의 차이는 32로 확인할 수 있다
int c = str1.compareTo(str2);
int ci = str1.compareToIgnoreCase(str2);
System.out.println(c);
System.out.println(ci);
}
26. String 자르기
메소드 | 설명 |
String java.lang.subString(int) | |
String[] java.lang.String.split(String) | |
StringTokenizer java.util.StringTokenizer(객체,"token") |
27. Array 배열(기본배열)
- 같은 타입의 객체를 담고 있는 객체다
- class가 존재하지 않기 때문에 생성자가 없다
- Array의 기능을 부여하는 java.util.Arrays 클래스를 이용해 기능을 동작시킨다.
- 작성방법
String[] arr = null; String arr[] = null;
1) 값을 넣으면서 생성 : String[] arr = {"a","b","c"};
2) 공간을 만들면서 해당 타입으로 초기화
String[] arr = new String[3]; // 공간만 생성도기 때문에 생성된 공간에는 초기값이 모두 입력이 된다.
3) 객체를 생성하면서 값을 입력 String[] arr = new String[]{"a","b","c"};
A[] a = null;
A a1 = new A();
A a2 = new A();
A a3 = new A();
A[] arr = {a1, a2, a3}
import java.util.Arrays;
public class Array_Explain {
public static void main(String[] args) {
//값으로 공간을 만든다
int[] arr1 = {1,2,3,4,};
//공간을 만들고 공간의 값은 타입으로 자동 초기화
int[] arr2 = new int[4];
//new를 통해 객체를 생성하고 연산자블럭을 통해 값을 생성
int[] arr3 = new int[] {5,6,7,8};
int [][] arrMulti = new int[3][3];
int[] [] arrMulti2 = {{1,2,3,},{4,5,6}};
String strArr= Arrays.toString(arrMulti);
String strArr2= Arrays.toString(arrMulti2);
System.out.println(strArr);
System.out.println(strArr2);
int n = arrMulti2.length; // 이차원 배열의 설명 row의 갯수가 나옴 중첩이 처음된 배열의 갯수
int m = arrMulti2[0].length; // 중첩 배열의 안에 길이
for (int i = 0; i < arrMulti2.length; i++) {
System.out.println(arrMulti2[i]);
System.out.println(Arrays.toString(arrMulti2[i]));
}
}
}
Arrays.toString으로 중첩 배열을 출력한다면 중첩된 상태인 배열의 각각 hashcode가 출력
중첩된 상태인 내부 배열의 값을 출력한다면 각각의 [1,2,3]과 같이 출력
Shallow copy와 Deep copy
import java.util.Arrays;
public class Reference_Copy {
//참조 주소를 전달하는 것
// 주소를 전달하면 주소를 가지고 있는 모든 곳에서 변경이 가능하다.
// 이 변경은 주소를 가지고 있는 모든 곳에서 영향을 받는다.
public void shallowCopy() {
int[] array원본 = {1,2,3,4};
int[] array전달 = array원본; //주소를 전달
System.out.println(Arrays.toString(array원본));
array원본[0] = 99;
System.out.println(Arrays.toString(array원본));
System.out.println(Arrays.toString(array전달));
System.out.println(array원본 == array전달);
}
//참조 주소를 전달하는 것이 아니라
//가지고 있는 멤버필드를 복제하여 새로운 객체를 생성하고
//생성된 객체의 주소를 전달
public void deepCopy() {
int[] array원본 = {1,2,3,4};
//3가지 방법
//최종적으로 사용할 방법은 Clone Pattern을 사용하여 작성할
//사용자 클래스를 복제하는 방법을 사용
//1) 배열과 같은 크기를 생성하고 -> heap에서 stack으로 값을 꺼내고 새로운 배열에 넣어줌
int[] arrayStack = new int[array원본.length];
System.out.println(Arrays.toString(arrayStack));
for (int i = 0; i < array원본.length; i++) {
arrayStack[i] = array원본[i];
}
System.out.println(Arrays.toString(arrayStack));
//2) int의 메소드 중 clone() java.lang.Object
int[] arrayClone = array원본.clone();
System.out.println(Arrays.toString(arrayClone));
//3) System 클래스를 사용해서 메모리를 복제하는 방법
int[] arraySystem = new int[8];
Arrays.fill(arraySystem, -1);
System.out.println(Arrays.toString(arraySystem));
System.arraycopy(array원본, 0, arraySystem, 2, 3);
System.out.println(Arrays.toString(arraySystem));
}
}
27 -1. java에서의 자료형
인터페이스 | 설명 |
<<set>> | 순서가 없고, 객체가 중복되지 않을 때 사용함 |
<<list>> | 순서가 있고, index가 있고, index를 통해서 값을 찾을 수 있음 값이 중복이 됨 |
<<map>> | key와 value로 구성, key 알고 있으면 value 찾을 수 있음 key는 중복이 불가능함, value는 중복이 됨 |
28. String을 통한 알고리즘
- 누적, Concatenation, 문자열 자르기, for, if
- 개미수열....
public class Ant_Sequence {
public void AntIteration(int stage) {
String init = "11";
System.out.println(init);
for (int i = 0; i < stage; i++) {
init= antMake(init);
System.out.println(init);
}
}
/**
* 베르나르 베르베르의 개미수열 로직
* @param init 입력받은 초기값
*/
public String antMake(String init) {
//최종 결과를 누적하는 변수 concatenation
String result = "";
//모든 요소는 자신의 값 1회를 가지고 있음
int cnt = 1;
//처음의 비교대상의 기준이 되는 요소는 초기값으로 설정
char ch = init.charAt(0);// '1'
for (int i = 1; i < init.length(); i++) {
if (ch == init.charAt(i)) {
cnt++;
} else {
result = result + ch + cnt;
ch = init.charAt(i);
cnt = 1;
}
}//for문 끝
result = result + ch +cnt;
// System.out.println(result);
return result;
}
}