JAVA

Day 12 - JAVA(String 자르기, 개미수열, 기본배열, 중첩배열, Shallow Copy, Deep Copy)

SANGJIN-YU 2021. 2. 25. 23:36
반응형

 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);

첫번째 == 비교/ 두번째 equls 비교/ 세번째 equalsIgnoreCase비교

 

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);
	}

compareTo는 String을 char타입의 요소로 비교하여 codepoint의 차이를 반환

 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;
	 }
}

 

반응형