안녕하세요. 제임스 입니다. 


연말이 다가오니 실적때문인지... 업무가 몰리고 있습니다. 

덕분에 오랜만에 포스팅을 하게 되네요. 


오늘은 자바에서 valueOf 와 parseInt 의 차이점에 대해 정리 해보겠습니다. 


int a = Integer.valueOf("1234");
int b = Integer.parseInt("1234");
System.out.println("a = ["+a+"]");
System.out.println("b = ["+b+"]");

위와 같이 "1234" 라는 String 값을 하나는 Integer.valueOf() 로 다른 하나는 Integer.parseInt() 를 사용하여 출력 해봤습니다. 

결과는 아래와 같습니다. 


a = [1234]

b = [1234]


결과 상으로 봤을때 동일한 값을 리턴시켜주고 있습니다. 


하지만 이 둘은 약간 다릅니다. 

그 차이점을 알아 보겠습니다 .



■ valueOf


API 에서는 아래와 같이 설명하고 있습니다. 

public static Integer valueOf(String s)
                       throws NumberFormatException
Returns an Integer object holding the value of the specified String. The argument is interpreted as representing a signed decimal integer, exactly as if the argument were given to the parseInt(java.lang.String) method. The result is an Integer object that represents the integer value specified by the string.

In other words, this method returns an Integer object equal to the value of:

new Integer(Integer.parseInt(s))
Parameters:
s - the string to be parsed.
Returns:
an Integer object holding the value represented by the string argument.
Throws:
NumberFormatException - if the string cannot be parsed as an integer.


간단히 요약하자면 valueOf 의 리턴되는 결과값은 new Integer() 로 객체입니다. 



pareseInt

public static int parseInt(String s)
                    throws NumberFormatException
Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign '-' ('\u002D') to indicate a negative value or an ASCII plus sign '+' ('\u002B') to indicate a positive value. The resulting integer value is returned, exactly as if the argument and the radix 10 were given as arguments to the parseInt(java.lang.String, int) method.
Parameters:
s - a String containing the int representation to be parsed
Returns:
the integer value represented by the argument in decimal.
Throws:
NumberFormatException - if the string does not contain a parsable integer.


요약하면 parseInt 의 리턴되는 결과값은 int 로 기본 자료형 (primitive type) 입니다. 



문자열을 변환할 경우 기본 자료형(primitive type) 으로 받아 오고 싶을때는 parseInt 를 사용하고 new Integer() 형으로 반환하고 싶으면 valueOf 를 사용하면 됩니다. 




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번에는 자바에서 문자열 비교방법에 대해 알아보고 차이점에 대해서도 알아 보겠습니다. 



■ Primitive Type(기본형) 비교


String a = "test";
String b = "test";

위와 같이 기본형 문자열이 두개 있습니다. 

모두 test 라는 값을 가지고 있습니다. 


이를 비교 하는 방법은 "==" 연산자 와 "equals()" 함수 두가지 정도 있습니다. 


사용방법은 아래와 같습니다. 

if(a == b){
System.out.println("a == b");
}else {
System.out.println("a != b");
}

if(a.equals(b)){
System.out.println("a equals to b");
}else {
System.out.println("a not equals to b");
}

변수 a, b 모두 primitive type (기본형) 으로 정의 되어 "==" 연산자를 사용하거나 "equals()" 함수를 사용하더라도 동일한 결과를 리턴받습니다. 위의 코드를 실행 시키면 아래와 같은 결과를 리턴 받습니다. 


a == b

a equals to b



■ Reference Type(참조형) 비교


만약 변수를 reference type (참조형) 으로 정의 하면 어떻게 될까요? 

String c = new String("test");
String d = new String("test");

변수 c, d 모두 "test" 라는 값을 가지는 reference type 으로 정의를 했습니다. 


단순히 c 와 d 값을 찍어 보겠습니다. 

System.out.println("c = ["+c+"]");
System.out.println("d = ["+d+"]");

결과를 보면 아와 같이 동일하게 test 라는 값을 리턴 시켰습니다. 


c = [test]

d = [test]


하지만 "==" 와 "equals()" 를 이용하여 비교 하였을때 결과는 어떨까요? 

if(c == d){
System.out.println("c == d");
}else {
System.out.println("c != d");
}

if(c.equals(d)){
System.out.println("c.equals(d)");
}else {
System.out.println("!c.equals(d)");
}

c != d

c.equals(d)


if(c == d) 라는 조건식의 결과가 c != d 라고 나왔습니다. 

왜 다르다는 걸까요? 

가지고 있는 value 값은 "test"로 동일하게 보이지만 c 와 d 의 경우 서로 다른 메모리 값을 가지고 있으며 이 메모리 주소값이 다르기 때문에 다른 값이라는 결과를 리턴 시켜 줍니다. 


즉, Reference Type 의 경우  c == d 라는 의미는 값이 같은가를 비교하는 수식이 아니라 c 와 d 의 주소가 같은지를 비교하는 수식입니다

반대로 primitive type 은 값의 비교를 하는 것이 맞습니다. 


if(c == "test"){
System.out.println("c == \"test\"");
}else {
System.out.println("c != \"test\"");
}

이제 위의 결과 값이 어떻게 될지는 충분히 유추 가능하시겠죠? 


c != "test"

네 위와 같이 다른 값이라는 결과 값을 리턴 합니다. ^^




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅은 자바 String 관련 함수 중 영문자를 전부 대문자로 또는 소문자로 변경 하는 함수와 인자값으로 입력된 문자열의 앞뒤 공백을 제거 하는 함수에 대해 정리해 보겠습니다. 



■ String toUpperCase()

대상 문자열을 모두 대문자로 변환합니다. 

String str1 = "hello java";

System.out.println(str1.toUpperCase());

hello java 라는 문자열이 모두 소문자로 되어 있습니다. 

이를 toUpperCase() 함수를 이용하여 대문자로 변환 하겠습니다. 


실제 코드는 아래와 같습니다. 

"hello java".toUpperCase();


모든 문자열을 대문자로 변환하기 때문에 결과는 아래와 같습니다. 

HELLO JAVA



■ String toLowerCase()

대상 문자열을 모두 소문자로 변환합니다. 

String str2 = "UPPER CASE TO LOWER CASE";

System.out.println(str2.toLowerCase());

"UPPER CASE TO LOWER CASE" 라는 문자열을 소문자로 변환합니다. 


"UPPER CASE TO LOWER CASE".toLowerCase();

위와 같은 코드로 작성 되었다고 생각 하시면 됩니다. 


결과는 예상 하시는 데로 upper case to lower case 로 리턴 됩니다. 




이번에는 문자열에 대소문자가 모두 들어 있는 예를 보겠습니다. 

String str3 = "James Dreaming";

변수 str3 의 값이 대소문자 섞여 있습니다. 


이를 toUpperCase() 또는 toLowerCase() 해보겠습니다. 

System.out.println(str3.toLowerCase());

toLowerCase() 를 하여 모든 대문자를 소문자로 변환 합니다. 

결과는 james dreaming 으로 리턴 됩니다. 


System.out.println(str3.toUpperCase());

이번에는 toUpperCase() 를 했습니다. 모든 소문자를 대문자로 변환 합니다. 

결과는 JAMES DREAMING  으로 리턴 됩니다. 



■ String trim()

대상 문자열의 앞 / 뒤 공백문자를 모두 제거하여 리턴해줍니다. 

String str4 = "   공백 제거   ";

System.out.println("["+str4+"]");

str4 변수를 위와 같이 출력 하면 아래와 같은 결과 값이 나옵니다. 

앞뒤로 " [ " 와 " ] " 를 붙인 이유는 결과 값 앞뒤로 공문 문자가 있을을 확인하기 위함입니다.

[   공백 제거   ]


System.out.println("["+str4.trim()+"]");

위와 같이 str4.trim() 을 하고 결과 값을 확인하면 아래과 같습니다. 

[공백 제거]


앞뒤 공백이 제거 되었습니다. 여기서 유의 할 점은 문자열 중간에 있는 공백 문자는 제거 되지 않았습니다. 


trim() 함수도 정말 많이 사용하게 되는 함수 입니다. 잘 기억해 두시고 유용하게 사용하시길 바랍니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번 포스팅도 역시 자바의 String 관련 함수를 정리 하고자 합니다. 


이번에는 대상 문자열이 특정 문자 또는 문자열로 시작 하거나 끝나는지에 대해 체크 할 수 있는 함수를 알아 보겠습니다. 


■ boolean startsWith(String prefix)


비교 대상 문자열이 입력된 문자열 (prefix) 값으로 시작되는지 여부를 확인하고 boolean (true / false) 값으로 리턴 합니다. 

String str1 = "자바 코딩";

System.out.println(str1.startsWith("자바"));

위 예제는 "자바 코딩" 이라는 문자열이 "자바" 로 시작되는지를 체크 해보는 코드 입니다. 


비교대상문자열.startsWith("체크할문자열")

>>> str1.startsWith("자바")


위 코드를 다시 쓰면 아래와 같습니다. 

"자바 코딩".startsWith("자바");


str1 이라는 문자열이 "자바" 라는 문자열로 시작하고 있습니다. 

결과는 true 입니다. 



다른 예제 하나 더 보시겠습니다. 

String str2 = "자바코딩";

System.out.println(str2.startsWith("자바 "));

이번에 비교대상문자열이 "자바코딩" 으로 첫번째 예제와 다르게 공백문자가 빠졌습니다.

그리고 체크할문자열(prefix) 는 "자바 " 로 자바뒤에 공백 문자가 한칸 들어 갔습니다. 


위 코드는 아래와 같이 쓸수 있습니다. 

"자바코딩".startsWith("자바 ");


결과는 당연히 false 입니다. 


만약 비교대상문자열이 "자바 코딩" 이었다면 true 가 리턴 되었겠죠? ^^



■ boolean endsWith(String suffix);

String str3 = "자바 코딩";

System.out.println(str3.endsWith("코딩"));

"자바 코딩" 이라는 문자열이 "코딩" 이라는 문자열로 끝나는지를 확인 합니다. 


위코드를 다시 쓰면 아래와 같습니다. 

"자바 코딩".endsWith("코딩");


눈으로 봐도 비교대상문자열이 "코딩"으로 끝나고 있음을 알 수 있습니다. 

결과는 true 가 되겠죠. 



또 다른 예제 하나 더 보시겠습니다. 

String str4 = "자바 코딩 ";

System.out.println(str4.endsWith("코딩"));

이번에는 비교대상 문자열 끝에 공백문자가 하나 들어 갔습니다. 

그리고 suffix 는 바로 앞과 동일하게 "코딩" 으로 입력을 했습니다. 


"자바 코딩 ".endsWith("코딩");


위 코드는 당연히 false 가 리턴 되겠죠? ^^




예를 들기 위해 간단한 문자열을 이용했는데요. 어떤 값이 들어 올지 모르는 상황에서 위 두가지 함수를 사용한다면 좀더 편하게 코드를 깔끔하게 정리 할 수 있습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번에는 자바 String 관련 함수 중 특정 문자열을 원하는 문자열로 치환하는 함수에 대해 알아 보겠습니다. 


■ String replace(CharSequence target, CharSequence replacement)


replace() 함수의 첫번째 인자값은 변환하고자 하는 대상이 되는 문자열입니다. 두번째 인자 값은 변환할 문자 값입니다. 


예제를 보시겠습니다. 

String str1 = "aaaa";

System.out.println("result ===> "+str1.replace("aa", "b"));

앞에서 부터 순차적으로 "aa" 라는 문자값이 있을 경우 "b" 로 치환하기 때문에 결과 값은 아래와 같습니다. 

result ===> bb


다른 예제도 하나더 보겠습니다. 

String str2 = "자바 코딩";

System.out.println("result ===> "+str2.replace("바 코", "good"));

치환하고자 하는 문자열이 "바 코"로 공백문자를 포함한 문자 열입니다. 

이를 "good" 으로 치환하면 결과는 아래와 같습니다. 

result ===> 자good딩



■ String replaceAll(String regex, String replacement)


replace() 함수와 같이 첫번째 인자값은 변환하고자 하는 대상이 되는 문자열이며, 두번째 인자 값은 변환할 문자 값입니다. 


예제를 보시겠습니다. 

String str1 = "aaaa";

System.out.println("result ===> "+str1.replaceAll("aa", "b"));

replace() 의 첫번째 예제와 동일한 문자열을 이용하여 "aa" 라는 문자값을 "b" 로 변환 했습니다. 

결과 값은 아래와 같습니다. 

result ===> bb


두번째 예제도 replace() 의 두번째 문자열과 동일하게 사용해 보겠습니다. 

String str2 = "자바 코딩";

System.out.println("result ===> "+str2.replaceAll("바 코", "good"));

replace 를 replaceAll 로 바꾸기만 했습니다. 

결과는 아래와 같습니다. 

result ===> 자good딩



지금까지 예제들을 보시면 replace() 와 replaceAll() 함수의 차이점이 없어 보입니다. 

정말 차이가 없을까요? 차이점이 없는 동일한 동작을 하는 함수인데 이런 API를 제공할리 없겠죠? 

그럼 지금부터 이 두 함수가 뭐가 다른지 알아 보겠습니다. 


■ replace() vs replaceAll()


두 함수의 가장 큰 차이점은 입력 인자 값의 형이 하나는 CharSequence 이고 다른 하나는 String 이라는 겁니다. 여기서 String 이라는 것은 regular expression 즉, 정규표현식이라고 부르는 형식의 인자값을 사용할 수 있다는 겁니다. 


그럼 예제를 하나 보겠습니다. 

String str3 = "abcdefghijk";

System.out.println("result ===> "+str3.replaceAll("[abchij]", "굿"));

replaceAll 의 첫번째 인자 값으로 입력한 [abchij] 라는 값은 정규표현식 값으로 의미하는 바는 a, b, c, h, i, j 라는 값을 모두 의미 합니다. 

즉, 상기 값들 모두 "굿" 이라는 문자열로 변환하겠다는 의미 입니다. 


결과 값은 어떻게 나올까요? 

result ===> 굿굿굿defg굿굿굿k


비슷한 예제 하나 더 보시겠습니다. 

String str3 = "abcdefghijk";

System.out.println("result ===> "+str3.replaceAll("[^abchij]", "굿"));

동일 문자 열을 대상으로 replaceAll 을 하는데 이번에는 정규표현식에 " ^ " 라는 값이 들어 갔습니다. 

이는 a, b, c, h, i, j 를 제외한 모든 문자를 굿으로 변환 하겠다는 의미 입니다. 


결과 값은 아래와 같습니다. 

result ===> abc굿굿굿굿hij굿



replace 를 사용하여 위 replaceAll 한 결과 값을 가져 오기 위해서는 어떻게 해야 할까요? 

String str3 = "abcdefghijk";

System.out.println("result ===> "+
str3.replace("a", "굿")
.replace("b", "굿")
.replace("c", "굿")
.replace("h", "굿")
.replace("i", "굿")
.replace("j", "굿")
);

위와 같이 치환을 원하는 각각의 문자열을 모두 찾거나 연속적인 입력 값이라면 아래와 같이 하면 됩니다. 

String str3 = "abcdefghijk";

System.out.println("result ===> "+
str3.replace("abc", "굿굿굿")
.replace("hij", "굿굿굿")
);

이렇게 하면 첫번째 예제와 동일한 결과 값을 가져 올수 있습니다. 

result ===> 굿굿굿defg굿굿굿k


하지만 뭔가 많이 불편해 보이죠? 

더군다나 실제 대상 문자열이 어떤 형태 인지 모를 경우 replace() 함수만을 이용하여 작업 하기에는 무리가 있어 보입니다. 

그래서 불특정 입력값을 변환하고자 할 경우 replaceAll() 함수에 Regular Expression (정규표현식)을 이용하여 개발을 많이 하고 있습니다. 

물론 replace() 함수도 많이 사용하고 있지만 사용 처가 약간 다르니 이정도는 이해 하고 넘어 가는게 좋을 것 같습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번에는 compareTo() 함수와 compareToIngnoreCase() 함수에 대해 정리해 보겠습니다. 



■ int compareTo(String str)

인자값으로 비교 대상 String 값을 입력 받습니다.

리턴되는 응답값은 비교 값이 동일할 경우 0 으로, 다를 경우 음의 정수 또는 양의 정수 값으로 표현됩니다. 정수값으로 표현된다는 말이 어려우시죠? 예문으로 확인 해보겠습니다. 

String str = "abc";

System.out.println("result 1 ==> "+str.compareTo("abc"));
System.out.println("result 2 ==> "+str.compareTo("bc"));
System.out.println("result 3 ==> "+str.compareTo("c"));
System.out.println("result 4 ==> "+str.compareTo("abcabc"));
System.out.println("result 5 ==> "+str.compareTo("abcabcd"));


위와 같이 "abc" 라는 String 값을 여러 문자열과 비교 해봤습니다. 

결과는 아래와 같습니다. 


result 1 ==> 0

result 2 ==> -1

result 3 ==> -2

result 4 ==> -3

result 5 ==> -4


1번의 경우 동일한 String 값이니 당연히 0 이라는 값을 리턴 합니다. 

2번의 경우 "bc" 만 같고 "a" 가 빠져 한자 차이로 다른 값이 되었습니다. 그래서 -1 값이 리턴 됩니다. 한자리 차이라는 의미죠.

3번의 경우 "c" 만 같고 "ab" 가 빠져 두자 차이로 다른 값이 되었습니다. -2 값이 리턴 되었구요, 역시 두자 차이라는 의미입니다. 

4번의 경우 "abc" 가 두번 반복 되었지만 문자열 비교로 봤을때는 전혀 다른 문자열입니다. 비교대상 문자열보다 "abc" 라는 문자열만큼 3자리가 길어서 -3 이라는 값이 리턴 되었습니다. 


String str = "abc";

System.out.println("result 6 ==> "+str.compareTo("ABC"));

이번에는 소문자 "abc"를 대문자 "ABC"와 비교해봤습니다. 

결과는 아래와 같습니다. 


result 6 ==> 32


앞선 예제와 달리 32 라는 결과 값이 나왔습니다. 

왜 이런 값이 나왔을까요? 


이 결과 값을 이해 하려면 ASCII 코드에 대해 알아야 하는데요. 이 ASCII 코드는 문자를 컴퓨터가 이해 할 수 있는 숫자 형태로 변환한 코드 값이라고 이해 하시면 됩니다. (자세한건 차후에 다루도록 하겠습니다)


이 ASCII 코드 상에서 "a" 와 "A" 의 값을 확인해 보겠습니다. 



붉은 색으로 칠해진 부분의 Decimal 값을 참조 하시면 됩니다. 

"A" 값은 65, "a" 값은 97 입니다. 이 차이가 32 인데요. 

비교 대상인 대문자 "ABC" 가 "abc" 보다 32 만큼 크기 때문에 양의 정수 값으로 리턴 되었습니다. 


그렇다면 반대로 비교 대상값이 소문자 "acb" 라면 어떤 결과 값이 나올까요? 

String str = "ABC";

System.out.println("result 7 ==> "+str.compareTo("abc"));

result 7 ==> -32


결과는 보시는 바와 같이 -32, 즉, 음의 정수 값으로 나오게 됩니다. 




■ int compareToIgnoreCase(String str)

앞서 설명드린 compareTo() 함수와 거의 모든 것이 같습니다. 단, 함수 명에서도 알수 있듯이 Ignore Case!!! 즉, 대소문자를 무시한다는 의미 입니다. 그럼 예제로 확인해보겠습니다. 


String str = "ABC";

System.out.println("result 8 ==> "+str.compareToIgnoreCase("abc"));
System.out.println("result 9 ==> "+str.compareToIgnoreCase("aBc"));

result 8 ==> 0

result 9 ==> 0


결과 값은 대소문자 무시하고 결과 값을 가져 옵니다. 



둘다 상당히 유용한 Java String 관련 함수 들입니다. 

잘 사용하면 개발에 참 유용하게 사용할 수 있습니다. 




 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D


블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번에는 Java 에서 많이 사용하는 String 관련 함수를 알아 보겠습니다. 


앞서 substring 이라는 함수에 대해 정리 했었는데요. 이녀석과 함께 많이 사용하고 있는 함수들을 정리 하면 아래와 같습니다. 


charAt(), indexOf(), length()


■ charAt(int index)

입력 받은 index 번째 문자를 반환 합니다. 

Java 에서 index 값은 항상 0 에서 부터 시작 합니다. 


String str1 = "abcde";

System.out.println(str1.charAt(2));

str1 을 charAt(2) 한 결과 값은 아래와 같습니다. 


문자열

a

b

c

d

e

index

0

1

2

3

4


index 값이 2 인 문자가 c 입니다. 

즉, 결과값은 "c" 가 리턴 됩니다. 



■ indexOf(String keyword)

문자열 중 입력받은 문자가 있으면 해당 문자의 위치 (index) 값을 리턴하고 문자가 없으면 -1 을 리턴 합니다. 

문자열 조회는 index 값 0 부터 시작 합니다 (왼쪽 부터 읽기 시작함을 의미 합니다)


String str2 = "Definition of indexOf";

System.out.println(str2.indexOf("i"));


위와 같은 경우 결과 값은 아래와 같습니다. 


문자열

D

e

f

i

n

i

t

i

o

n

o

f

i

n

d

e

x

O

f

index

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20


첫 "i" 값이 있는 index 값 3 이 리턴 됩니다. 



만약 아래와 같이 "of" 라는 문자열과 "off" 라는 문자열을 찾을 경우 결과 값은 어떻게 나올까요? 


String str3 = "Definition of indexOf";

System.out.println(str3.indexOf("of"));
System.out.println(str3.indexOf("off"));

"of" 라는 문자열을 찾는 경우 index 값이 11 로 리턴됩니다. 

하지만 "off "라는 문자열은 전체 문장중에서 찾을 수 없는 문자 열이므로 -1 이 리턴 됩니다. 



■ lastIndexOf(String keyword)

indexOf 는 왼쪽에서 부터 조회를 하기 때문에 낮은 index 값을 먼저 조회 하게 됩니다. 

이와 반대로 끝에서 부터 조회를 하는 함수도 제공되고 있습니다. 

이것이 바로 lastIndexOf 함수 입니다. 


String str4 = "Definition of indexOf";

System.out.println(str4.lastIndexOf("i"));

이 경우 뒤에서 부터 " i " 값을 찾기 때문에 아래와 같이 index 값이 14 로 리턴됩니다.


문자열

D

e

f

i

n

i

t

i

o

n

o

f

i

n

d

e

x

O

f

index

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20




■ length()

주어진 문자열의 길이를 리턴 합니다. 

주의 할 것은 index 값을 리턴 하는게 아니라 실제 문장의 길이를 조회 리턴 한다는 겁니다. 


String str5 = "a";

System.out.println(str5.length());

위 문자의 경우 a 의 index 값은 0 이지만 실제 문자 길이는 1 입니다. (결과 값도 1로 리턴 됩니다)


indexOf 설명을 위해 이용한 문자열 "Definition of indexOf" 의 경우 마직막 indexOf 의 "f"의 index 값은 20 이지만 index 는 0 에서 시작하므로 +1 을 해야 실제 문자열의 길이가 나옵니다. 


하지만 우리는 이 길이를 굳이 계산할 필요가 없죠. 

위와 같이 바로 str5.length() 를 해버리면 결과 값이 1로 리턴 됩니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,


안녕하세요. 제임스 입니다. 


이번에는 자바 랜덤 함수에 대한 포스팅을 하고자 합니다. 

아니... 사실은 발행 버튼만 누르면 포스팅이 끝났는데... 뜬금없이 블루 스크린이 발생하면서... 날려 먹었습니다. 

그래서 다시 쓴 포스팅 입니다. ㅠㅠ


우선 시작전에 int 형 랜덤함수 조회 공식을 선 공개 하겠습니다. 

int intValue =  (int)( Math.random()*x ) + y;

여기서 x, y 는 물론 변수 입니다 :) 

이 두친구가 무엇을 하는 친구 들인지는 아래에서 정리 하겠습니다. 


■ Java Random Function (자바 랜덤 함수)


자바에서 제공하고 있는 랜덤함수를 사용하면 간단하게 랜덤 값을 반환 할 수 있습니다. 

바로 Math 클라스의 random() 이라는 함수 이야기 인데요. 

이친구가 바로 오늘의 주인공입니다. 

Math.random() 의 값은 double 형으로 0.0 과 1.0 보다 작은 수 (1.0 은 해당사항 없습니다) 사이의 값을 반환하게 됩니다. 



■ int 형의 랜덤 값 반환하기


일반적으로 랜덤하게 int 값을 뽑아 오는 작업을 많이 하는데요. 이때 이 double 로 반환된 값을 int 로 형변환 해주는 작업이 필요 합니다. 이를 위해 아래와 같이 코드를 작성해 봤습니다. 

int intValue = (int)( Math.random() );

0.0 보다 크거나 같고 1.0 보다 작은 값을 (최대 0.9999... 인 값) int 로 형변환 합니다. 

결과 값은 0 만 나오게 되어 있습니다. 

처음 시작할때 x, y 값이 있었는데요. 여기서는 그 값이 빠져 있습니다. 


이제 x, y 값에 대해 알아 보겠습니다. 



■ int 형의 랜덤 값 범위내의 숫자 갯수


우선 x 값이 무엇인지 부터 알아 보겠습니다. 


여기서 예제를 하나 더 보겠습니다. 

원하는 숫자의 범위가 0 ~ 9 까지 입니다. 총 10개의 숫자가 필요 하죠. 그렇다면 이 코드를 어떻게 짜면 될까요? 

int intValue = (int)( Math.random()*10 );

0.0 * 10 , 0.1 *10, .... , 0.99999999*10 을 한 결과는 0 ~ 9.999999.... 라는 double 형의 값이 반환됩니다. 

이를 int 로 형변환 하게 되면 0, 1, 2, .... , 8, 9 까지 결과 값이 10개가 나올 수 있습니다. 


즉, x 라는 값은 랜덤 숫자가 나올수 있는 범위내 존재 하는 숫자 갯수를 의미 한다고 볼수 있습니다. 



이번에는 0 부터 15 까지 원하는 값을 랜덤하게 가져오기 위해서는 아래와 같이 작성하면 됩니다. 

총 16개의 숫자가 필요 하므로 x 값을 16으로 셋팅 해주시면 됩니다. 

int intValue = (int)( Math.random()*16 );



■ int 형의 랜덤 값의 시작값 정의


이번에는 y 값에 대해 알아 보겠습니다. 


x 값에 대해 이야기 하면서 처음 예제가 0 ~ 9 까지였죠. 

이번에는 1 ~ 10 까지 값을 가져오고 싶습니다. 물론 시작 값이 1 이죠? 

그렇다면 y 값에 1을 넣어 주면 됩니다. 

int intValue = (int)( Math.random()*10 ) + 1;

반환되는 값은 1 ~ 10 까지 10개의 값중 하나가 리턴 됩니다. 


다른 예를 들어 보겠습니다. 

만약 3 ~ 12 까지 10개의 값을 원한다면 아래와 같이 작성 하면 됩니다. 

int intValue =  (int)( Math.random()*10 ) + 3;



■ 응용하기


먼저 언급한 x, y 값을 잘 사용하면 조금 다른 범주의 랜덤값들도 가져 올 수 있습니다. 


예를 들어 11, 12, 13 이 세개의 숫자만 랜덤하게 가져 오는 코드를 작성 한다면 어떻게 해야 할까요? 

우선 숫자 갯수가 3개 입니다. x 값은 3이겠죠? 

시작 숫자가 11 입니다. 그렇다면 y 값은 11입니다. 


그럼 코드 작성 해보겠습니다. 

int intValue =  (int)( Math.random()*3 ) + 11;



■ 내용 정리

1. 자바 랜덤은 Math.random() 함수를 사용합니다. 

2. int 형의 랜덤 값을 가져 오는 공식은 아래와 같습니다. 

int intValue =  (int)( Math.random()*x ) + y;

3. x 값은 랜덤 숫자가 나올 수 있는 범위내에 존재하는 숫자의 갯수를, y 값은 시작 값을 의미 합니다. 


위 세가지만 알면 자바에서 랜덤값은 쉬운 녀석입니다 :)



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,



안녕하세요. 제임스 입니다. 


이번에는 Java에서 배열을 정렬하는 방법에 대해 알아 보겠습니다. 


Java 에서 배열(array)을 정렬하는 방법은 간단합니다. 바로 자바에서 제공하고 있는 함수를 사용하는 것이죠. 

제목에도 보시면 아시겠지만 Arrays.sort(배열) 이라는 함수를 사용하면 됩니다. 


■ 숫자 배열의 정렬

int numSort[] = {37, 27, 40, 30, 28, 19};
Arrays.sort(numSort);

for(int i = 0; i < numSort.length; i++){
System.out.println("[ i = "+i+" ]--------[ "+numSort[i]+" ]");
}

numSort 라는 배열에 6개의 숫자를 추가 했습니다. 


그리고 Arrays.sort() 함수를 이용하여 numSort 배열을 정렬 합니다. 

그리고 그것을 for loop 을 돌려서 로그를 찍어 봤습니다. 


물론 결과는 예상 하시는 대로 나옵니다 :)


[ i = 0 ]--------[ 19 ]

[ i = 1 ]--------[ 27 ]

[ i = 2 ]--------[ 28 ]

[ i = 3 ]--------[ 30 ]

[ i = 4 ]--------[ 37 ]

[ i = 5 ]--------[ 40 ]


이쁘게 정렬이 되었습니다. 



■ 영문 배열의 정렬

숫자는 위와 같이 정렬이 됨을 확인 했지만.... 문자열은? 영문 배열은? 이라는 의문 부호가 붙을 수 있습니다. 

영문 배열도 숫자와 동일한 방식으로 처리 하면 됩니다. 

아래 예제를 함께 보시겠습니다. 

String engStrSort[] = {"lovely", "random", "uptown", "girl", "extra"};
Arrays.sort(engStrSort);

for(int i = 0; i < engStrSort.length; i++){
System.out.println("[ i = "+i+" ]--------[ "+engStrSort[i]+" ]");
}

처음 숫자 배열과 다른건 딱 하나 있습니다. 바로 배열 형이 int 에서 String 으로 바뀐것 그리고 배열 값들이 숫자가 아닌 영문으로 바뀐 것이죠? 


결과는 역시 아래와 같이 나옵니다 :)


[ i = 0 ]--------[ extra ]

[ i = 1 ]--------[ girl ]

[ i = 2 ]--------[ lovely ]

[ i = 3 ]--------[ random ]

[ i = 4 ]--------[ uptown ]



■ 한글 배열의 정렬

숫자도 해봤고 영문도 해봤는데 특별히 다를게 있을까요? 

당연히 영문 배열의 정렬때와 동일하게 처리 하면 됩니다. 다만 텍스만 영문을 한글로 바꾸는 거죠? 

한글도 당연히 이쁘게 정렬을 해줍니다. 

String korStrSort[] = {"박길동", "이영자", "홍길동", "장발장", "신발장"};
Arrays.sort(korStrSort);

for(int i = 0; i < korStrSort.length; i++){
System.out.println("[ i = "+i+" ]--------[ "+korStrSort[i]+" ]");
}

결과는 당연히 아래와 같이 이쁘게 정렬되어 나옵니다. 


[ i = 0 ]--------[ 박길동 ]

[ i = 1 ]--------[ 신발장 ]

[ i = 2 ]--------[ 이영자 ]

[ i = 3 ]--------[ 장발장 ]

[ i = 4 ]--------[ 홍길동 ]



고맙게도 자바에서 sort 함수를 제공해주어 우리는 편하게 배열의 정렬을 할 수 있습니다. 



 도움이 되셨다면 로그인이 필요 없는 

▼ 하트 클릭 한번 부탁 드립니다 

감사합니다 :D



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

업무 관련 개발 작업 도중 이상하게 NullPointerException 을 자주 본 날입니다. 


이런 실수 잘 하지 않는데 너무 많이 봐서... 

그래서 이제 이런 실수 하지 말자고 제 스스로를 채찍질 하려고 글을 남깁니다. 




■ NullPointerException 발생 원인


NullPointerException 이 발생하는 원인은 사용할 객체를 생성 후 인스턴스를 생성하지 않고 null 오브젝트를 사용하려 할 경우 발생 합니다. 

TestObject a = null;
String b = a.getTestResult();
b.toString();

null 을 참조 하여 NullPointerException 이 발생하게 됩니다. 이는 아래와 같이 간단히 객체 생성으로 해결 할 수 있습니다. 

TestObject a = new TestObject();
String b = a.getTestResult();
b.toString();


위와 같이 제대로 선언까지 했는데도 불구하고 NullPointerException 이 발생한다면 참조하는 값인 s.getTestResult() 자체가 Null 인 경우입니다. 

위 코드를 기준으로 봤을때 a.getTestResult() 가 null 이므로 b 값도 null 이고 이 null 값을 toString() 함으로 인해 NullPointerException 이 발생하게 되는 겁니다. 



■ NullPointerException 방어 코드 

NullPointerException 은 자주 발생하면서도 얼마든지 예방이 가능합니다. 

방어 코드를 아래와 같이 넣어 줄수 있습니다. 

TestObject a = new TestObject();
String b = a.getTestResult();
if(b != null) {
b.toString();
}

위 코드와 같이 null 체크를 하는 겁니다. 

null 일 경우 toString 을 하지 않음으로 NullPointerException 을 피할 수 있습니다. 



저도 실수 몇 개로 몇번의 오류를 봤는지 모르겠습니다. ㅠㅠ

이런 실수 하지 않도록 정신 차리고 개발 해야 겠습니다 :)





블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,