문자열을 자르는 함수에 대해서 정리해보자

프로그래밍 언어마다 문자열을 자르는 함수의 사용방법이 조금씩 다른경우가 많다.

string 의 멤버 함수로 substring()과 split() 두가지가 가장 흔하게 쓰이는 방식이다.

 

첫번째로 substring() 함수는 시작지점과 끝지점을 파라미터로 전달받아서 문자열을 자르게 된다.

substring(시작지점, 끝지점) 이런식으로 사용하면 된다. 

아래이미지를 보도록 하자.

 

 

substring(1, 3) 을 입력하면 인덱스가 1부터 3까지의 글자를 자르게 되는데 B부터 C까지 잘라서 "BC"가 리턴이 된다.

substring(5) 를 입력하면 인덱스 5부터 문자열 끝까지 잘라서 "3de"가 리턴된다.

 

아래 사용 예제를 보도록 하자.

public static void main(String[] args) {		
	String str = "abcdefg12345";
	System.out.println("substring(5) : " + str.substring(5));
	System.out.println("substring(0,1) : " + str.substring(0,1));
	System.out.println("substring(1,2) : " + str.substring(1,2));
	System.out.println("substring(2,3) : " + str.substring(2,3));
	System.out.println("substring(2,10) : " + str.substring(2,10));
}

출력 :

substring(5) : fg12345
substring(0,1) : a
substring(1,2) : b
substring(2,3) : c
substring(2,10) : cdefg123

 

 

만약 문자열 끝에서부터 3글자만 출력하고 싶다면 아래 예제와 같이 사용하면 된다.

public static void main(String[] args) {		
	String str = "abc123def";
	System.out.println(str.substring(str.length()-3, str.length()));
}

출력 :

def

 

그리고 아래예제와 같이 indexOf() 함수를 사용하면 특정 글자 두개를 포함하여 그사이에 글자를 모두 출력하게 된다.

 

public static void main(String[] args) {		
	String str = "abc123def";
    System.out.println(str.substring(str.indexOf("1"), str.indexOf("3") + 1));
}

출력 :

123

 

그런데 substring() 함수를 사용하다가 문자열의 길이보다 긴 값을 substring의 인자로 전달하게 되면 아래 예제와 같이 StringIndexOutOfBoundsException 에러가 발생하게 된다. 총 글자수는 12개이지만 10부터 20을 출력하라고 했기때문에 에러가 발생하였다.

 

public static void main(String[] args) {		
	String str = "abcdefg12345";
	System.out.println("substring(10,20) : " + str.substring(10,20));
}

에러 메시지 :

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: Range [10, 20) out of bounds for length 12
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:55)
at java.base/jdk.internal.util.Preconditions$1.apply(Preconditions.java:52)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:213)
at java.base/jdk.internal.util.Preconditions$4.apply(Preconditions.java:210)
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:98)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckFromToIndex(Preconditions.java:112)
at java.base/jdk.internal.util.Preconditions.checkFromToIndex(Preconditions.java:349)
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4589)
at java.base/java.lang.String.substring(String.java:2703)
at TestSubString.main(TestSubString.java:5)

 

 

 

이것을 방지하기 위해서는 아래예제와 같이 StringIndexOutOfBoundsException 에러를 예외처리해주면 된다.

 

public static void main(String[] args) {		
	String str = "abcdefg12345";
	try {
		System.out.println("substring(10,20) : " + str.substring(10,20));
	} catch(StringIndexOutOfBoundsException e) {
		System.out.println("Error : "+e.getMessage());
	}		
}

출력 : 

Error : Range [10, 20) out of bounds for length 12

 


 

두번째로 split() 함수는 특정 문자열을 파라미터로 받아서 해당 문자열을 기준으로 문자열을 잘라서 배열에 넣어주는 기능을 한다. String 의 멤버함수이다. 

 

아래이미지를 보면 이해하기 쉬울 것이다.

 

 

위에 이미지를 아래는 코드화 한것이다.

 

public static void main(String[] args) {		
	String str = "ABC,EE,QQ1,5112";
	String arr[] = str.split(",");
	for(String cut : arr) {
		System.out.println(cut);
	}		
}

출력 :

ABC
EE
QQ1
5112

 

 

Posted by 꿈만은공돌
,

 

프로그래밍을 하다보면 특히 게임쪽에서 랜덤(random) 또는 난수 를 생성할 일이 있다.
난수는 무작위 숫자를 뜻하지만 컴퓨터 쪽에선 100% 무작위(랜덤)은 아니다.
정해진 난수표에서 숫자를 가저오는 방식이기 때문이다.


자바(JAVA) 에서 난수를 생성하는 방식은 크게 두가지 이다.


첫번째로 Math.random() 이용하는 방식이다.
Math Class의 random 함수는 double 형 타입으로 0.0 이상 1.0 미만 사이의 값을 반환한다.

 

public class TestRandom {
    public static void main(String[] args) {        
        for(int i =0; i < 10; i++) {
            System.out.print(Math.random()+" ");
        }
        System.out.println("");
    }
}

 

* 결과 값 :

0.1652487713090327 0.286398184817342 0.4336343206580924 0.4295581874855847 0.44636521032290466 0.8715008193305886 0.93917325018134 0.5647002564584279 0.7323427296788428 0.8295767550811228

 

보통은 자연수의 난수가 필요한 경우가 많기 때문에 아래 예제 처럼 0부터 9까지의 난수가 필요하다면 x10을 한 이후에 int형으로 강제 형변환을 시켜주면 된다.

 

public class TestRandom {
    public static void main(String[] args) {        
        for(int i =0; i < 10; i++) {
            System.out.print((int)(Math.random()*10) + " ");
        }
        System.out.println("");
    }
}

 

* 결과 값 :

2 6 3 7 6 9 8 7 9 7 


하지만 이 방식은 직관적이지 않고 형변환등을 하면서 익셉션(Exception) 처리등을 해주어야 하기 때문에 두번째 방식을 추천한다.

 


 

 

 

 

두번째로 Random Class를 이용하는 방식이다.
난수를 생성하는데 필요한 기능 등을 묶어놓은 클레스 이다.
Random Class를 사용하려면 import java.util.Random; 를 해주어야 한다.
Random Class의 맴버변수중에 setSeed를 이용하거나 생성자에 매개변수로 시스템시간을 매개로 전달하면 난수표의 시드값을 초기화 할 수 있다.
아래는 0부터 9까지의 정수를 출력하는 예제이다.

 

import java.util.Random;
 
public class TestRandom {
    public static void main(String[] args) {        
        Random random = new Random(System.nanoTime());
        for(int i =0; i < 10; i++) {
            System.out.print((int)(random.nextInt(10)) + " ");
        }
        System.out.println("");
    }
}


* 결과 값 :


1 3 3 7 6 9 5 7 2 4


아래는 1부터 45까지의 숫자를 출력하는 로또 번호 추첨 예제이다. 랜덤으로 숫자를 추첨하는데 기존에 나왔던 숫자가 있을 경우 다시 재추첨하도록 하였다.

 

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
public class TestRandom {
    public static void main(String[] args) {        
        Random random = new Random(System.nanoTime());
        List<Integer> result = new ArrayList<Integer>();
        int num;
        for (int i = 0; i < 6; i++) {
            while (true) {
                num = random.nextInt(45) + 1;
                if (result.contains(num)) {
                    continue;
                } else {
                    result.add(num);
                    System.out.print(num+" ");
                    break;
                }
            }
        }    
        System.out.println("");
    }
}

 

* 결과 값 :

 

12 38 33 29 4 17 

 

 

아래 테이블은 다양한 Random class의 멤버함수 들이다. 이외에도 다양한 함수들이 많이 존재하니 라이브러리를 참고하도록 하자.

함수 설명
nextInt(int i) 0부터 i 까지의 랜덤한 숫자를 리턴
nextInt() Int 타입의 최소 ~ 최대범위 안에서 랜덤한 숫자를 리턴
nextLong() Long 타입의 최소 ~ 최대범위 안에서 랜덤한 숫자를 리턴
nextDouble() Double 타입의 0.0 – 1.0까지의 랜덤한 숫자를 리턴
nextBoolean() boolean타입의 true, false 중 랜덤한 값을 리턴

 

참고 자료 : https://docs.oracle.com/javase/8/docs/api/java/util/Random.html

Posted by 꿈만은공돌
,

 마이크로소프트 윈도우10에서 Visual Studio 2017로 개발할 때 여러 앱을 개발할때 원활한 개발환경을 제공받기 위해서는 윈도우 개발자 모드를 켜야 한다.

특히 UWP 앱을 개발하려면 반드시 활성화를 해야 한다. 윈도우 마켓에서 허가되지 않은 앱도 실행이 가능하기 때문이다.


개발자 모드를 활성화 하기 위한 방법이다.


1. Windows 설정에 들어가 업데이트 및 보안을 선택한다.

 



2. 왼쪽 택에서 개발자용을 선택한다.




3. 개발자 모드를 선택한다.


Posted by 꿈만은공돌
,