본문 바로가기
{Java}

21.07.26{코딩일기} java String대신 StringBuffer를 사용하면 좋은점

by Davey 2021. 7. 26.
728x90
java String을 배열 타입으로
객체에 담아서 데이터를 넣으려고 하면
여간 인덱스가 헷갈리고 불편할 수 가 없다..
이렇게 안하는 방법이 있나?
YEEEEEEEES

있고말고!


우선 이전에 나는 아래 처럼 지저분하게 코드를 짰다.

		// TODO Auto-generated method stub
//		Scanner inputSize = new Scanner (System.in);
		
//		System.out.println("Type your figure's wish size(limit 1~5) : ");
//		int wishSize = inputSize.nextInt();
//		
//		inputSize.close();
		
//		String[][] rhombus = {{" ","*"," "}, {"*","*","*"}, {" ", "*", " "}};
//		String[][] circle = {{"   **********   "}, {"  ************  "}, {" ************** "},
//				{" ************** "}, {" **************"}, {" **************"}, {" ************** "},
//				{"  ************  "}, {"   **********  "} };
//		String[][] star = {{"☆"}, {"*","*","*"}, {" ", "*", " "}};
//        
//		String 
//	
//		String stars = "**";
//		String emptySpace = " ";
//		
//		for (int i=0;i<sect.length; i++) {
//			for(int j=0; j<)
//		}
//		
//		
//		for (int i=0; i<rhombus.length; i++) {
//				String[] rhombusResult = rhombus[i];
//				for (int j=0; j<rhombusResult.length; j++) {
//					System.out.print(rhombusResult[j] + "");
//				}
//				System.out.println();
//			}
//		
//		for (int i=0; i<circle.length; i++) {
//			String[] circleResult = circle[i];
//			for (int j=0; j<circleResult.length; j++) {
//				System.out.print(circleResult[j] + "");
//			}
//			System.out.println(); 
			// 이 FOR문은 제대로 짠 코드가 아니니 대략 이런느낌으로 짰구나 감만 익히길..
//		}
//	}
//

음 다시봐두 지저분해..
Array문자열처럼 메소드를 다루지만 좀 더 빠르고 편하게 문자열을 출력하고 다룰 수 있는 방법을 찾다가
은규님을 통해 StringBuffer를 알게되었다.
이 메소드를 사용해서 아래와 같이 코드를 짰더니,

package threeFigure;

import java.util.Scanner;

public class ThreeFigure {
		
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		                                                                                                                                                                                              
		System.out.println("사이즈를 10단위로 입력하시오 : ");
		Scanner sc = new Scanner(System.in);
		
		int size = sc.nextInt();
		
		int space = size;
		int starLen = 1;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
		
		for (int i =0; i < size + 1; i++) {
			for (int j = 0; j < space; j++) {
				sb.append(" ");
			}
			
			for (int j = 0; j < starLen * 2; j++) {
				sb.append("*");
			}
			
			if (i < Math.floor(size /2)) {
				space--;
				starLen++;
			} else {
				space++;
				starLen--;
			}
			
			sb.append("\n");
		}
		
		System.out.println(sb.toString());
	}
}

내가 원하는 사이즈별로 문자열(배열)이 출력되는 것을 확인했다.


이거 어떻게 가능한가?
순서도를 대략 그려보니
아래와 같았다.

만약 size = 10이라면?

i = 0 일때
j = 0 < 11 참
StringBuffer[] = " "
j = j + 1 
j = 1 < 11 참
StringBuffer[] = "  "
..
j = 10 < 11 참
StringBuffer[] = "          "
..
j = 11 < 11 거짓
for문종료
--------------------------------- 

그다음 for문
j = 0 < 2 참
StringBuffer[] = "          *"
j = j + 1
j = 1 < 2 참
StringBuffer[] = "          **"
j = j + 1
j = 2 < 2 거짓
for문 종료

---------------------------------

현재 i=1, space = size = 10이므로
i = 1 < 5.0 = (10/2) 참이므로
space - 1 = 10 - 1 = 9로 값을 바꿔주고,  //여기서 주의할꺼 size가 9가아니라 space가 9가된다.
starkLen + 1 = 1 + 1 = 2로 값을 바꿔준다.

---------------------------------

그리고 \n을 아래 버퍼스트링에 추가해주면 출력시 자동 줄바꿈이된다.
StringBuffer[] = "          **\n"

---------------------------------

그다음 i = 1 < 9+1 참이므로 //여기서 주의할꺼 size가 9가아니라 space가 9가된다.
i = i + 1 = 1 + 1 = 2,
j = 0 < 11 참
StringBuffer[] = "          **\n " //결국 하나의 긴 1차원배열이다.
j = j + 1 
j = 1 < 11 참
StringBuffer[] = "          **\n  "
..
j = 9< 10  참
StringBuffer[] = "          **\n          " //공백문자는 총 9개가 들어간다.
..
j = 10 < 10 거짓
for문종료

---------------------------------

그다음 for문 이때 starLen = 2라는점 유의

j = 0 < 4 = (2 * 2) = (starLen * 2) 참
StringBuffer[] = "          **\n          *"
j = j + 1
j = 1 < 4 참
StringBuffer[] = "          **\n          **"
j = j + 1
j = 2 < 4 참
StringBuffer[] = "          **\n          ***"
j = j + 1
j = 3 < 4 참
StringBuffer[] = "          **\n          ****"
j = j + 1
j = 4 < 4 거짓
for문 종료

---------------------------------

그리고 또 다시 \n을 아래 버퍼스트링에 추가해주면 출력시 자동 줄바꿈이된다.
StringBuffer[] = "          **\n          ****\n"
---------------------------------

현재 i=2, size = 9이므로
i = 2 < 4.0 = Math.floor(9/2 = 4.5) 참이므로
size - 1 = 9 - 1 = 8로 값을 바꿔주고,
starLen + 1 = 2 + 1 = 3로 값을 바꿔준다.
....

---------------------------------

그럼 언제? if 조건문이 거짓이 될까?
계산해보자
for문과 조건문 기준으로 size와 starLen 값의 변화를 살펴보자

size = 10
starLen = 1 
i = 0 ** 2*1=2
size = 10 // 앗 잠시만.. space만 바뀌는거지 size는 바뀌지 않는다.
starLen = 2
---------------------------------

i = 1 **** 2*2=4
size = 10
starLen = 3

---------------------------------

i = 2 ****** 2*3=6
size = 10
starLen = 4

---------------------------------

i = 3 ******** 2*4=8
size = 10
starLen = 5

---------------------------------

i = 4 ********** 2*5=10
size = 10
starLen = 6
  // i = 4 < 5 = (Math.floor(10/2))

---------------------------------

i = 5 ************ 2*6=12
  // i = 5 < 5 = (Math.floor(10/2)) 거짓이므로
size = 10
다시 starLen = 5이되고,

---------------------------------

i = 6부턴
다시 space = 7이된다.

 

위지점이 바로 아래 그림에 표시된 부분이다.

빈문자열도 결과값임을 주의하자:)

Copyright ⓒ 2021 by bluevulpe All Contents cannot be copied without permission.

728x90

댓글