1. String 클래스에서 concat 메서드를 설명하시오.

: String의 Immutable 특성을 이용하여 두 String 객체의 값을 결합하는 메소드이다.

String str1 = "Hello"; 
String str2 = "World"; 

str1 = str1.concat(str2); // str1 += str2

 

 

2. str.substring(2, 4); substring 사용법에 대하여 설명하시오.

: substring 메소드는 String 객체의 문자열을 일부 추출하는 기능을 가졌다.

여기서 문제의 substring 파라미터가 2, 4가 입력되어 있는데 이는 str 인덱스 번호인 2번이상 4번미만의 문자열을 추출하라는 의미가 된다. (파이썬의 리스트 슬라이싱과 흡사)

String str1 = "Hello"; // str1의 문자열 Hello는 5글자이므로 이를 인덱스 번호로 환산하면, 0(H)-1(e)-2(l)-3(l)-4(o)가 된다. 
String str2 = str1.substring(2, 4); // str1의 문자열 인덱스 번호를 2번이상 4번미만까지 추출 

System.out.println(str2); // 추출된 문자열 ll을 출력한다.

 

 

3. st1.compareTo(st2); compareTo 사용법에 대하여 설명하시오.

: 두 String 객체의 문자열을 대소문자까지 비교하여 int 타입의 값을 리턴하는데 이때, 각각 -1, 0, 1을 반환한다.

-1의 경우 기준 값이 비교대상 보다 작다는 의미가 되고, 0의 경우 기준 값과 비교대상 둘이 같다는 의미가 되며, 1의 경우 기준 값이 비교대상 보다 크다는 의미가 된다.

그리하여 문자열로 보았을 때 -1은 정렬을 했을 때 st1이 st2보다 앞에 사전적으로 먼저 있다는 의미가 되고, 0은 해당 두 String 객체의 문자열이 같다는 의미가 되며, 1은 정렬을 했을 때 st2가 st1보다 앞에 사전적으로 먼저 있다는 의미가 된다.

String st1 = "aaa"; 
String st2 = "bbb";

if (st1.compareTo(st2)) {
	System.out.println("st1이 st2보다 사전적으로 먼저 있습니다."); // aaa가 bbb보다 사전적으로 먼저 나오므로(-1 반환) 해당 조건 출력 
} else { 
	System.out.println("st2가 st1보다 사전적으로 먼저 있습니다.");
}

 

 

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

: 기본 자료형(Primitive Type)의 값 문자열(String)로 바꾸는 메소드이다.

double e = 2.718281; // 기본 자료형 double 타입으로 값 초기화 String se = String.valueOf(e); // 해당 변수를 valueOf 메소드의 파라미터로 넣어서 문자열로 변환("2.718281")

double e = 2.718281; // 기본 자료형 double 타입으로 값 초기화 
String se = String.valueOf(e); // 해당 변수를 valueOf 메소드의 파라미터로 넣어서 문자열로 변환("2.718281")

 

 

5. 아래의 연산과정에서 호출되는 함수(원리)를 써서 표현해 보세요.

String str = "age: " + 17;

: 해당 과정은 정수 17를 문자열로 변환(valueOf)한 뒤, 기존의 문자열 “age:”와 결합(concat)하여 초기화 된다.

String str => "age: " + String.valueOf(17); // 정수 17은 문자열 "17"로 변환 
		   => "age: ".concat("17"); // 문자열 "age: "와 "17"을 결합 
           
System.out.println(str); // age: 17로 출력

 

 

6. StringBuilder 와 String 의 차이는?

: 5번과 같이 String 변수를 초기화 하는 과정에서 문자열 외 여타 다른 데이터 타입들과 연산하여 결합을 하는 경우, valueOf() 및 concat() 메소드를 호출하여 변환하는 과정을 보았다.

그로인해, 이러한 과정 속에서 더욱더 다양한 문자열외 데이터 타입들과 결합을 할 수록 호출이 되는 메소드가 많아져 그만큼 cost가 높아지게 되고 이는 실행속도가 느려지는 결과를 초래한다.

따라서 이를 해결하기위해 StringBuild를 이용하는데 append() 메소드를 호출하여 여러 타입들간 결합 한 뒤 문자열로 초기화 한다.

String birth = "<양>" + 7 + '.' + 16; // 문자열 "<양>" 이외에 여러 데이터 타입들끼리 복잡하게 결합을 하고자 하면 호출하는 메소드가 그만큼 많아진다. 
String birth = (new StringBuilder("<양>").append(7).append('.').append(16)).toString(); // StringBuilder.append를 통해 중간에 새로 생성되는 인스턴스를 최소화(1개) 한다.

 

 

7. String 을 이용하여 프로그래밍 하시오.

입력 : 990925-1012999 출력 : 990925 1012999

 

7-1. 메인 클래스

public class StringExtractionMain { 
    public static void main(String[] args) { 
        StringExtraction strext = new StringExtraction(); 
        strext.user(); 
    } 
}

 

7-2. 문자열 추출 클래스

import java.util.Scanner; 

public class StringExtraction { 
    private String rnum; 

    public StringExtraction() { } 

    public StringExtraction(String rnum) {
    	this.rnum = rnum; 
    } 

    public String getRnum() { 
    	return rnum;
    } 

    public void setRnum(String rnum) {
    	this.rnum = rnum;
    }

    private void inputRnum() { // 주민번호 입력
        Scanner scanner = new Scanner(System.in);

        System.out.println("당신의 주민등록번호 13자리를 -까지 포함하여 입력해주세요.");
        rnum = scanner.next();

        scanner.close();
    } 

    private String rnumFront() { 
    	return rnum.substring(0, 6); // 주민번호 앞자리 6개 추출 
    } 

    private String rnumBack() {
    	return rnum.substring(7, 14); // 주민번호 앞자리 6개 추출
    } 

    public void user() { 
    	inputRnum(); 
    	System.out.println("변환된 당신의 주민등록번호는 " + rnumFront() + " " + rnumBack() + "입니다.");
    }
}

 

 

8. 아래의 메모리 그림을 그리시오.

int[] ar1 = new int[5];

 

 

9. 아래를 프로그래밍 하시오.(단 클래스로 구성할것)

입력:lee sunkyo 출력:first name: lee second name:sunkyo아래를 프로그래밍 하시오.

 

9-1. 메인 클래스

public class NameExtractMain { 
    public static void main(String[] args) { 
    	NameExtract nameExtract = new NameExtract(); 
    	nameExtract.user();
    } 
}

 

9-2. 문자열 자르기 클래스

import java.util.Scanner; 

public class NameExtract { 
    private String name; 

    public NameExtract() { } 

    public NameExtract(String name) { 
    	this.name = name; 
    } 

    public String getName() { 
    	return name; 
    }

    public void setName(String name) {
    	this.name = name; 
    }

    private void inputName() { 
        Scanner scanner = new Scanner(System.in); 

        System.out.println("당신의 영문명을 띄어서 입력해주세요.");
        System.out.println("ex) Minwoo Na"); 
        System.out.print("입력: "); 
        name = scanner.nextLine(); 

        scanner.close(); 
    }

    private String firstName() { 
        String[] nmeSplt = name.split(" "); 
        return nmeSplt[0];
    } 

    private String lastName() { 
    	String[] nmeSplt = name.split(" ");
    	return nmeSplt[1]; 
    } 

    public void user() {
    	inputName();
    	System.out.println("First Name: " + firstName() + ", Last Name: " + lastName());
    }
}

 

 

10. 아래를 프로그래밍 하시오.

입력 : 홍 길동 출력 : 성 = 홍 이름 = 길동

입력 : 홍길동 출력 : 공백이 없군요. 다시 입력해주세요.

 

10-1. 메인 클래스

public class KorNameSplitMain { 
    public static void main(String[] args) { 
    	KorNameSplit kornamesplit = new KorNameSplit(); 
    	kornamesplit.user(); 
    } 
}

 

10-2. 문자열 결합 클래스

import java.util.Scanner; 

public class KorNameSplit {
    private String name;

    public KorNameSplit() { } 

    public KorNameSplit(String name) {
    	this.name = name;
    } 

    public String getName() {
    	return name;
    } 

    public void setName(String name) { 
    	this.name = name;
    } 

    private void inputName() {
        Scanner scanner = new Scanner(System.in); 

        System.out.println("당신의 한글명을 띄어서 입력해주세요.");
        System.out.println("ex) 홍 길동"); 
        System.out.print("입력: ");
        name = scanner.nextLine(); 

        scanner.close(); 
    } 

    private static boolean isBlank(String name) { // 문자열 공백여부 검사
        for (int i = 0; i < name.length(); i++) { 
        	if (name.charAt(i) == ' ') { 
        		return true;
        	} 
        } 
        
        return false; // 공백이 없으면 false로 리턴 
    }

    private String firstName() {
        String[] nmeSplt = name.split(" ");
        return nmeSplt[1]; 
    } 

    private String lastName() {
    	String[] nmeSplt = name.split(" "); 
    	return nmeSplt[0];
    } 

    public void user() { 
        inputName();

        if ((isBlank(name)) == false) { 
        	System.out.println("공백이 없군요. 다시 입력해주세요."); 
        } else { 
        	System.out.println("성 = " + lastName() + ", 이름 = " + firstName()); 
        } 
    }
}

 

 

11. 아래를 프로그래밍 하시오.

“Hello.java” 문자열에서 파일명과 확장자인 java를 분리시키는 프로그램을 짜시오.

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

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

 

11-1. 메인 클래스

public class FileExtensionSplitMain { 
    public static void main(String[] args) { 
   		FileExtensionSplit exeSplit = new FileExtensionSplit();
    	exeSplit.user();
    } 
}

 

11-2. 파일명, 확장자간 문자열 분리 클래스

import java.util.Scanner;

public class FileExtensionSplit { 
    String exe; 

    public FileExtensionSplit() { } 

    public FileExtensionSplit(String exe) { 
    	this.exe = exe; 
    } 

    public String getExe() { 
    	return exe; 
    } 

    public void setExe(String exe) {
    	this.exe = exe; 
    } 

    private void inputExe() {
        Scanner scanner = new Scanner(System.in); 
        
        System.out.println("파일명 및 확장자를 입력해주세요."); 
        System.out.println("ex) Hello.java"); 
        System.out.print("입력: "); 
        exe = scanner.nextLine(); 

        scanner.close(); 
    } 

    private String fileName() { 
        String[] nmeSplt = exe.split("\\."); 
        return nmeSplt[0]; 
    } 

    private String extensionName() { 
        String[] nmeSplt = exe.split("\\."); 
        return nmeSplt[1]; 
    } 

    public void user() { 
    	inputExe(); 
    	System.out.println("파일 이름은: " + fileName() + " 이며 확장자는 " + extensionName() + " 입니다.");
    } 
}

 

 

12. Scanner 클래스를 이용해서 한 줄 읽고, 공백으로 분리된 “단어”가 몇 개 들어 있는지 확인해보자.

“그만”을 입력할 때까지 반복하는 프로그램이다.힌트(split 함수를 이용해 볼것)

예) 입력 : Java Programming 출력 : 단어의 개수는 2 입력 : 자바 수업은 2층 C클래스 출력 : 단어의 개수는 4 입력 : 그만 > 출력 : 프로그램 종료

 

12-1. 메인 클래스

public class WordCounterMain { 
    public static void main(String[] args) { 
    	WordCounter wrdcnt = new WordCounter();
    	wrdcnt.user();
    } 
}

 

12-2. 단어 개수 세기 클래스

import java.util.Scanner;

public class WordCounter { 
    private String sentence; 

    public WordCounter() { }

    public WordCounter(String sentence) {
    	this.sentence = sentence; 
    }

    public String getSentence() {
    	return sentence;
    } 

    public void setSentence(String sentence) {
    	this.sentence = sentence; 
    } 

    private void inputSentence() { 
        Scanner scanner = new Scanner(System.in);

        System.out.println("문장을 입력해주시거나, 프로그램을 종료하고 싶으시면 \"그만\"을 입력해주세요."); System.out.println("ex) Java Programming"); 
        System.out.println("ex) 그만");
        System.out.print("입력: ");
        
        sentence = scanner.nextLine(); 
    } 

    private boolean iQuit() { 
        if (sentence.equals("그만")) { 
        	return false; // 프로그램 종료 희망시 false로 리턴 
        } else {
        	return true; 
        }
    }

    private int wrdCnt() {
        if (iQuit() == true) { 
        	String[] spltStnce = sentence.split(" "); 
        	return spltStnce.length; 
        } else {
        	return 0;
        }
    }

    public void user() {
        while (true) {
            inputSentence();
            
            if (iQuit() == false) { 
                System.out.println("프로그램 종료");
                break; 
            } else { 
            	System.out.println("단어의 개수는 " + wrdCnt() + "\n");
            	continue; 
            }
        } 
    }
}

'WebDev > 본과정' 카테고리의 다른 글

정렬 심화와 상속  (0) 2021.05.12
배열의 탐색 및 정렬  (0) 2021.05.12
오버로딩과 String  (0) 2021.05.11
캡슐화와 static 키워드  (0) 2021.05.11
패키지와 접근제한자  (0) 2021.05.11