티스토리 뷰

수업문제

[문제] 10월 19일 (String)

WhaleTREE 2021. 10. 19. 18:32

학습정리-10-19.txt
0.00MB

1. Stirng 에서 concat 메서드에 대해서 설명하시오.

.concat();은 .앞의 문자열과 ()안의 문자열을 붙여서 나열해 출력한다. "Coffee" + "Bread"와 같다.

public class StringConcat {
	
	public static void main(String[] args) {
		
		String st1 = "Coffee";
		String st2 = "Bread";
		
		String st3 = st1.concat(st2);
		System.out.println(st3);
		
		String st4 = "Fresh".concat(st3);
		System.out.println(st4);
	
	}	
}

// CoffeeBread
// FreshCoffeeBread

또한 문자열끼리 + 연산을 진행하면 내부적으로는 concat을 호출하는 것이다.

 

 

 


2. Stirng 에서 substring 메서드 사용법은?

subString은 문자열 일부를 추출할 때 사용한다.

		String str = "abcdefg";
		System.out.println(str.substring(2));
		// cdefg
		
		String str1 = "abcdefg";
		System.out.println(str1.substring(2, 4));
		// cd

인덱스첫번째 들어가는 숫자는 인덱스라고 한다. 인덱스는 0부터 시작한다.두번째는 인덱스가 아니라 기존에 수를 세는 것과 똑같이 1부터 시작한다.

(2, 4)는 인덱스로 2번째부터 시작해서 인덱스 4미만까지의 범위(4 - 1의 이하까지)를 출력한다.

 

 

 


3. Stirng  compareTo 사용법은?

  public static void main(String[] args) {
     String st1 = "Lexicographically";
     String st2 = "lexicographically";
     int cmp;

     cmp = st1.compareTo(st2);
     if(cmp == 0)
        System.out.println("두 문자열은 일치합니다.");
     else if (cmp < 0)
        System.out.println("사전의 앞에 위치하는 문자: " + st1);
     else
        System.out.println("사전의 앞에 위치하는 문자: " + st2);
        // 사전의 앞에 위치하는 문자 : Lexicographically

     if(st1.compareToIgnoreCase(st2) == 0)
        System.out.println("두 문자열은 같습니다.");
     else
        System.out.println("두 문자열은 다릅니다.");
        // 두 문자열은 같습니다.
  }

 

compareTo는 사전에 실려있는 순서를 기준으로 비교해 int형 값으로 반환하는데 앞에 실리는 순서대로 번호를 매긴다고 했을 때 먼저 실려있는 문자가 숫자가 더 작기 때문에 비교한 값이 음수가 나오면 st1이 더 앞에 있다.

ex) array가 100번째에 실리고, back이 200번째에 실린다고 할 때 두 값을 빼면 음수가 나온다.

 

compareToIgnoreCase는 문자열 수로만 비교한다.

 

 

 

 


4. String.valueOf 에 대하여 설명하시오.

    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

valueOf() 메소드는 ()괄호 안의 해당 객체를 String 객체로 변환시켜준다. 이 때 ()의 값이 null일 경우 문자열 "null" 을 반환한다.

toString()도 파라미터 값을 문자열로 바꿔주지만 파라미터 값이 null인 경우 valueOf와 다르게 컴파일 오류가 발생한다.

 

 

 

 


5. 아래가 실행되는 원리(함수)를 표현해 보세요.
String str = "age" + 17;

String str = "age" + 17; 
→ String str = "age".concat(String.valueOf(17))       숫자 17을 문자열 17로 변경한다.

문자열과 기본 자료형의 + 연산은 내부적으로 기본 자료형을 문자열로 변경한 뒤 문자열끼리 +연산을 진행한다.

 

 

 

 

 

6.StringBuilder 와 String 의 차이는?

String의 경우 불변 인스턴스이기 때문에 내부적으로는 메모리 소모가 많고 속도에 영향을 미친다.

(일일히 따로 메모리에 올리기 때문에)

class A{
	
	void a() {
		String s1 = "AAa";
		
    	for(int i = 0; i < 50000; i++) {
    		s1 = s1 + "BBB" + 19;
    	}
	}
	
}



public class Example {
    public static void main(String[] args) {
        
    	A a = new A();
    	a.a();
    			
    }
}

예를 들어 위의 코드를 실행한다고 하면 해당 코드는 실행은 되지만 속도에 양향을 미친다. 특히나 main 함수에 들어 있지 않고 위에 코드 처럼 객체 생성을 통해 함수를 돌리게 되면 속도가 느려진다. 실무에서는 상당히 큰 문제가 될 수 있다.

그래서 위 같은 코드에 속도에 문제가 생기지 않게 하거나 게임 같은 경우는 c언어를 사용한다.....

 

속도 저하나 메모리 용량 문제를 해결하기 위해 나온 것 StringBuffer, StringBuilder이다.

둘은 기능적으로는 완전히 동일하다. 다만 buffer는 쓰레드에 안전하다.

쓰레드 안전성이 불필요한 상황에서 buffer를 사용하면 성능 저하만 발생해 이때 builder를 사용한다.

public class StringBuilderTest {
    public static void main(String[] args) {
        // 문자열 "123"이 저장된 인스턴스 생성
    	StringBuilder stbuf = new StringBuilder("123");
    	
    	// 문자열 덧붙이기
    	stbuf.append(45678);
    	System.out.println(stbuf.toString());
    	// 12345678
    	
    	
    	// 문자열 일부 삭제
    	stbuf.delete(0, 2); // 0이 시작 위치, 2에 -1한 위치 이하(2위치 미만?)
    	System.out.println(stbuf.toString());
    	// 345678
    	
    	
    	// 문자열 일부 교체
    	stbuf.replace(0, 3, "AB"); 
    	System.out.println(stbuf.toString());
    	// AB678
    	
    	
    	// 문자열 내용 뒤집기
    	stbuf.reverse();
    	System.out.println(stbuf.toString());
    	// 876BA
    	
    	
    	// 일부만 문자열로 반환
    	String sub = stbuf.substring(2, 4);
    	System.out.println(sub);
    	// 6B
    
    }
}

 

 

 

 


7.아래의 메모리 그림을 그리시오. (1차원 배열)
int[] ar1 = new int[5];

new int[5]에서 5는 방의 개수를 의미한다.

int[]로 5개의 방을 생성할 때 []안의 번호는 인덱스로 0부터 시작한다.

 

 

 

 



8.아래의 메모리 그림을 그리시오. (1차원 배열)
Box[] ar = new Box[5];

 

 

 

 



9. 아래를 프로그래밍 하시오.(scanner 사용, 전체 while문 사용)
"Hello.java" 문자열에서 파일명과 확장자인 java를 분리시키는 프로그램을 짜시오.

입력: Hello.java 
출력: 파일이름은: Hello 이며 확장자는 java 입니다.

입력: Java.avi
출력: 파일 이름은: Java 이며 확장자는 avi 입니다.

package edu.kosmo.ex.practices;

import java.util.Scanner;

class FileName{
	private String file;
	
	public FileName(String file) {
		this.file = file;
	}
	
	public void resultName() {
		String name = "";
		String extension = "";
		
		for(int i = 0; i < file.length(); i++) {
			if(file.charAt(i) == '.') {
				name = file.substring(0, i);
				extension = file.substring(i + 1, file.length());
			}
		}
		
		System.out.println("파일 이름은 " + name + "이며 확장자는 " + extension + "입니다.");
		
	}
	
	
	
	
}



public class ArrayPractice2 {
    public static void main(String[] args) {
        
    	while(true) {
	    	Scanner sc = new Scanner(System.in);
	    	
	    	System.out.println("파일명을 입력하세요.");
	    	String file = sc.next();
	    	
	    	FileName fn = new FileName(file);
	    	
	    	fn.resultName();
	    	
	    	System.out.println("계속 하시겠습니까? Y   or   N");
	    	String yesNo = sc.next();
	    	
	    	if(yesNo.charAt(0) == 'n' || yesNo.charAt(0) == 'N') {
	    		break;
	    	}
	    		    	
    	}
    	
    	
    	System.out.println("종료합니다.");
    	
    }
}

 

import java.util.Scanner;


public class FileNameTest {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		String word = sc.next();
		
		int dot = 0;
		
		for(int i = 0; i < word.length(); i++) {
			if(word.charAt(i) == '.') {
				dot = i;
			}
		}
		
		/*
		 * int index = word.indexOf('.'); System.out.println(index);
		 * 
		 * String fileName = word.substring(0, index); String extension =
		 * word.substring(index + 1, word.length());
		 */
		
		String fileName = word.substring(0, dot);
		String extension = word.substring(dot + 1, word.length());
		
		System.out.println(fileName);
		System.out.println(extension);
		
	}

}

→  .indexOf를 사용하면 좀 더 쉽게 할 수 있다!

 

 

 

 


10.아래를 배열을 활용하여 프로그램을 짜시오.
화폐매수 구하기
- 1원 부터 5000 원 까지 랜덤으로 생성.
- 500원 100 원 50 원 10원은 배열로 선언 하여 저장 

해당 랜덤생성된 화폐 매수를 아래와 같이 출력

2860원 
출력
500원 : 5개 
100원 : 3개 
50원 : 1개 
10원 : 1개

package edu.kosmo.ex.practices;

import java.util.Scanner;


public class ArrayPractice3 {
    public static void main(String[] args) {
          	
    	int money = (int)(Math.random() * 5000 + 1);
    	
    	System.out.println(money + "원");
    	
    	int count[] = new int[4];
    	count[0] = 500;
    	count[1] = 100;
    	count[2] = 50;
    	count[3] = 10;
    	
    	for(int i = 0; i < 4; i++) {
    		System.out.println(String.valueOf(count[i]) + "원 : " + (money / count[i]) + "개");
    		money = money % count[i];
    	}
    	
    }
}

 

class MoneyArr{
	private int money;
	private int[] coin = new int[4];
	
	public MoneyArr(int money) {
		this.money = money;
		coin[0] = 500;
		coin[1] = 100;
		coin[2] = 50;
		coin[3] = 10;
	}
	
	public void show() {
		for(int i = 0; i < coin.length; i++) {
			System.out.println(coin[i] + "원 : " + (money / coin[i]) + "개");
			money = money % coin[i];
		}
	}
	
}


public class MoneyArrTest {

	public static void main(String[] args) {
		
		int money = (int)(Math.random() * 5000 + 1);
		
		MoneyArr moneyArr = new MoneyArr(money);
		
		System.out.println(money + "원");
		moneyArr.show();
		
	}

}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함