20240813 수업
문자열 조작 함수
// 0123456 7 8 9012
String s1 = "Hello 李순신 123"; //영어와 공백과 숫자는 1bytes 한글 한자는 3bytes
String s1_2 = "Hello 李순신 123";
// 0 1 2 3 4 56789012
String s2 = new String("안녕하세요 Mark 42");
String s2_2 = new String("안녕하세요 Mark 42"); //새 메모리 생성
문자열길이(글자수) = UNI-code문자의 개수
int len1 = s1.length(); // 13>>공백 포함
System.out.println( len1 );
int len2 = s2.length(); // 13>>공백 포함
System.out.println( len2 );
문자열 byte 수 구하기
// byte[] b = s1.getBytes(); 문자열을 byte[] 배열로 변환
byte[] b = s1.getBytes();
System.out.println(b); //[B@372f7a8d:배열의 위치의 hashcode (메모리 위치 16진수)
int lenb1 = s1.getBytes().length; // length : 배열의 길이, 19 (1*5+1+3*3+1+1*3)
System.out.println( lenb1 );
특정위치의 문자열(또는 문자)을 추출∙찾기
String name = s1.substring(6, 8+1); // (시작위치, 끝위치(+1해줘야 함.) substr일때▶ (시작위치, 개수)
System.out.println(name); //李순신
String strbytes2 = new String( "Hello Java".getBytes() , 6, 4 ); //6의 위치에서 4개를 뽑아냄
System.out.println( strbytes2 ); // 'Java'
H:0, e:1, l:2, l:3, o:4, :5, J:6, a:7, v:8, a:9 (공백과 영어는 1byte)
// 01234567890123
String jumin = "970508-2111020";
System.out.print(jumin.substring(0, 2) + " "); // "97"
System.out.print(jumin.substring(2, 4) + " "); // "05"
System.out.print(jumin.substring(4, 6) + " "); // "08"
System.out.print(jumin.substring(7, 8) + " "); // "2"
char ch1 = s1.charAt( 6 );//6에 위치해있는 문자(char) 한 자를 꺼내라
System.out.println( ch1 ); // 李
int pos1 = s1.indexOf('l'); // -1 : 못찾았을때
System.out.println( pos1 ); // 2 : 첫번째의 'l' 위치
int pos2 = s1.indexOf('l', pos1+1); // 2+1 : 2 다음 부터 문자의 위치를 찾음
System.out.println( pos2 ); // 3 : 두번째의 'l' 위치
// 0123456789012345678901
String str1 = "Hello Hello Hello love";
for (int i = 0; i < str1.length(); i++) { //모든 문자 다비교>>시간大
if( str1.charAt(i) == 'l' )
System.out.print( i + " " );} // 2 3 8 9 14 15 18
🔝str1에 있는 모든 'l'의 위치를 출력한 것이다. 모든 문자를 다 비교하기 때문에 시간이 길어지는 단점이 있다.
indexOf("찾는 문자(열)",위치값)
int p = -1;
do {
p = str1.indexOf("l", p+1); //0위치에서부터 찾기
if(p > -1) System.out.print (p + " ");
} while( p != -1 ); // 2 3 8 9 14 15 18
System.out.println( s2.indexOf("Mark") ); // 6 문자열 검색가능
System.out.println( s1.contains("순신") ); // true , 일부일치 ~를 포함하는(*=)
System.out.println( s1.equals("순신이") ); // false, 완전일치 String
System.out.println( s1.contentEquals("순신이") ); // false, 완전일치 String, StringBuilder
System.out.println( s1.contentEquals("Hello 李순신 123") ); // true
- StringBuilder:thread사용금지
- StringBuffer:thread safe 버전
String sa3 = null;
if(sa3 == null)
System.out.println("null 입니다");
else
System.out.println( sa3.indexOf('a') ); // ERROR▶java.lang.NullPointerException
문자열비교 ( ==로 비교하면 안됨)
String s1 = "Hello 李순신 123";
String s1_2 = "Hello 李순신 123";
System.out.println( s1 == s1_2); // true s1 == s1_2, 주소(위치)비교
System.out.println( s1.equals(s1_2) ); // true 문자열 data (글자값)비교
String s3 = "이순신";
String s4 = "이이";
boolean isSame = s3.equals(s4); // 문자열 data 비교
System.out.println( isSame ); // false
int eq = s3.compareTo( s4 ); // 위치결정
System.out.println( eq ); // -1368 : 사전순서상 이순신이 앞에 있기 떄문에 (이순신의 주소값)-(이이의 주소값)
// "ABC1".compareTo("ABA") ⇒ "ABC1" - "ABA" = 2
String s5 = "Test123";
String s6 = "TEST123";
System.out.println( s5.equals(s6) ); // false
System.out.println( s5.compareTo(s6) ); // 32 ⇒ 대소문자 차이
System.out.println( s5.compareToIgnoreCase(s6) ); // // 대소문자 무시하고 비교 ⇒0 ⇒ 같다
String sa1 = "abcdef";
String sa2 = ""; //≠null
System.out.println( sa1.isEmpty() ); // false -> 빈문자열인가?
System.out.println( sa1.equals("") ); // false
System.out.println( sa2.isEmpty() ); // true
System.out.println( sa2.equals("") ); // true
문자열 조작(StringBuilder) - 속도가 비교적 빠르다
(String보단 빠르긴하지만 근래에는 문명의 발달로 속도차가 근소함)
// 문자열을 모두 대문자로 변경
System.out.println( s5.toUpperCase() );
// 문자열을 모두 소문자로 변경
System.out.println( s5.toLowerCase() );
// 문자열 결합
String s7 = s5 + "," + s6;
System.out.println( s7 );
String s8 = s7.concat("|").concat("Hello"); //더하기 함수버전>>Test123,TEST123|Hello
System.out.println( s8 );
StringBuilder sb = new StringBuilder(); // String sb;
sb.append( s8 ); // sb = sb + s8;
sb.append("---------------"); // sb = sb + "---------------"
System.out.println( sb.toString() ) ; //Test123,TEST123|Hello---------------
System.out.println( sb ) ; //Test123,TEST123|Hello---------------
문자열을 숫자로 변환
String sv1 = "124";
정수
int [] arr1 = new int[5]; // int 배열 5개 짜리
// 배열 - 실행할때 사이즈가 변하지 않는다
ArrayList<Integer> al1 = new ArrayList<Integer>();
// ArrayList - 실행할때 배열의 크기가 변경된다
Wrapper Class : Primitive Type(원시타입) -> Reference Type(참조 타입)
int : value type(변수 타입) Primitive type(기본형, 원시형) data자체가 정수
Integer : reference type(참조타입) int 의 Wrapper Class
▶class(Primitive type data):int type에 기능을 추가한 것
Integer.MAX_VALUE:214748....
수치형 문자열▶정수로 표현
String ▶int
"-124" ▶ -124
Integer.parseInt("-124") ▶ -124
double -> Double
byte -> Byte
int v1 = Integer.parseInt( sv1 ); //parseInt: v1에 sv1을 Int로 리턴
Integer v2 = Integer.valueOf( sv1 ); //valueOf:Integer로 리턴
int v3 = Integer.valueOf( sv1 );
System.out.println( v1 );
System.out.println( v2.toString() ); // v2를 문자열로 바꿔라
System.out.println( v2 ); // .toString() 생략가능
실수
String sw1 = "124.567";
double w1 = Double.parseDouble( sw1 ); // 124.567
Double w2 = Double.valueOf( sw1 );
double w3 = Double.valueOf( sw1 ); // 자동형변환 implicit vs 수동형변환 explicit
System.out.println( w1 );
System.out.println( w2.toString() );
System.out.println( w3 );
// 숫자 -> 문자 String.valueOf()
int num1 = 123;
String snum1 = num1 + "";
String snum2 = String.valueOf( num1 );
double num2 = 123.456;
String snum3 = String.valueOf( num2 );
문자열을 문자배열로 변환
getBytes
byte [] bytes = {'H', 'e', 'l', 'l', 'o', ' ', 'J', 'a', 'v', 'a' };
String strbytes = new String ( bytes ); // String <- byte[]
System.out.println( bytes ); // [B@36aa7bc2 :배열의 위치의 hashcode (메모리 위치 16진수)
System.out.println( Arrays.toString( bytes ) );
//[72, 101, 108, 108, 111, 32, 74, 97, 118, 97]
System.out.println( strbytes ); //Hello Java
System.out.println( strbytes.toString() ); // "Hello Java"
//String strbytes2 = new String( bytes, 6, 4 );
String strbytes2 = new String( "Hello Java".getBytes() , 6, 4 ); //6의 위치에서 4개를 뽑아냄 (subString(44)을 대체 가능)
System.out.println( strbytes2 ); // 'Java'
문자열 바꾸기
replace
String sc1 = "Test123Test한글 영어 한글test";
String sc2 = sc1.replace("Test", "Example");
System.out.println( sc1 ); //Test123Test한글 영어 한글test
System.out.println( sc2 ); //Example123Example한글 영어 한글test
공백제거
trim
String sd1 = " Text Editor v1.0 ";
System.out.println( sd1 );
System.out.println( sd1.trim() ); //앞 뒤의 공백제거
System.out.println( sd1.length() ); // 34 , 내용의 글자수
System.out.println( sd1.trim().length() ); // 19 , trim한것의 공백수
날짜 및 시간 나타내기
// 01234567890123
String jumin = "970508-2111020";
int year = Integer.parseInt("19" + jumin.substring(0, 2)); // 1997
int month = Integer.parseInt(jumin.substring(2, 4)); // 5
int dayOfMonth = Integer.parseInt(jumin.substring(4, 6)); // 8
LocalDateTime bDate
= LocalDateTime.of(year, month, dayOfMonth, 0, 0);
System.out.println("\n생일:" + bDate); // 생일:1997-05-08T00:00(UTC time)
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println("\n생일:" + bDate.format(fmt) ); // 생일:1997/05/08
String dayOfWeek = bDate.getDayOfWeek().toString(); // MONDAY
int dayOfWeekValue = bDate.getDayOfWeek().getValue(); // 1(월)~7(일)
// 0 1 2 3 4 5 6 7
String [] weekDay = {"", "월","화","수","목","금","토","일"};
System.out.println("\n요일:" + weekDay[dayOfWeekValue] + "요일");
System.out.println("\n요일:" + dayOfWeek + "요일");
성별 나타내기
int sex = Integer.parseInt( jumin.substring(7, 8) );
if (sex % 2 == 1)
System.out.println("남자");
else
System.out.println("여자");
숫자 표현
%d : decimal 10진 정수
%x : hexa decimal 16진 정수
%f : 실수 float, double
%c : char
%s : string
%5d 전체 5자리수 100 : 100__ 뒷쪽 공배 추가
%-5d 전체 5자리수 100 : __100 앞쪽 공백 추가
%05d 100 : 00100
%.3f 소수이하 3자리로 반올림 12.34567 : 12.346
long l = Math.round(12.34567); // 정수만 반올림한다
System.out.println("l=" + l); //12
String r = String.format("%.3f\n", 12.34567);
System.out.println( r ); //12.346
int num3 = 12;
String snum3_2 = String.format("%05d", num3);
System.out.println( snum3_2 ); //00012
DecimalFormat
// 세자리마다 , 출력
// # : 숫자, 공백
// 0 : 숫자, 0
DecimalFormat df = new DecimalFormat("#,###,##0.00");
DecimalFormat df2 = new DecimalFormat("0,000,000.00");
double price1 = 12345678.789543;
System.out.println( "df=" + df.format(price1) ); // 12,345,678.79
System.out.println( "df2=" + df2.format(123) ); // 0,000,123.00
System.out.println( "df0="+ df.format(0) ); // 0.00
double price2 = 123456789.56789;
System.out.println( df.format(price2) ); // 123,456,789.57
System.out.println( df2.format(12.3456) ); // 0,000,012.35
~로 시작하는 지
String name1 = "김유신"; //"유제석";
System.out.println( name1.startsWith("김") ); // 김~
System.out.println( name1.contains("유") ); // 유~, ~유~, ~유
System.out.println( name1.endsWith("신") ); // ~신
//style [name^=김] startsWith //김~
//style [name^=유] contains //유~,~유~,~유
//style [name|=신] startsWith //~신
String [] names = new String [] {
"김유신", "이유신", "박유신", "최유신", "김순신",
"홍길동", "전우치", "김장군", "이장군", "박대장",
"유관순", "아이유", "제갈유지"
};
// "김" 으로 시작되는
for (int i = 0; i < names.length; i++) {
if( names[i].startsWith("김") )
System.out.print( names[i] + " ");} //김유신 김순신 김장군
System.out.println();
// "유" 를 포함하는
for (int i = 0; i < names.length; i++) {
if( names[i].contains("유") )
System.out.print( names[i] + " ");}//김유신 이유신 박유신 최유신 유관순 아이유 제갈유지
// 중간에 "유"가 있는 이름 출력
// 1.
for (int i = 0; i < names.length; i++) {
if( names[i].indexOf("유") == 1 ) //1위치
System.out.print( names[i] + " " );}//김유신 이유신 박유신 최유신
// 2.
for (int i = 0; i < names.length; i++) {
int idx = names[i].indexOf("유");
int lastIdx = names[i].length() - 1;
if( idx > 0 && idx != lastIdx )
System.out.print( names[i] + " "); //1의 위치가 아니더라도 찍음
/*
if (idx == -1) // "유"글자없음
if( idx == 0 ) // "유" 가 첫글자
if( idx == names[i].length()-1 ) // 마지막 글자가 "유"
*/
}//김유신 이유신 박유신 최유신 제갈유지
'JAVA' 카테고리의 다른 글
[java]ArrayList (자동배열)로 성적 입력 프로그램 만들기 (0) | 2024.08.18 |
---|---|
[java]정규식 (Regular Expression) (0) | 2024.08.17 |
[java] 주민등록번호, 사업자 등록번호 유효성 검사 (0) | 2024.08.15 |
[java]배열 (Array) (0) | 2024.08.13 |
[java] 반복문 for 2 (0) | 2024.08.12 |