190422_Day11 복습, String, Vector
복습
NullPointException 발생원인
- null이란 메모리 할당 되지 않은 것
String
- substring(int 시작인덱스, int 끝인덱스)
- 단, 시작인덱스 포함, 끝인덱스 미포함
str.charAt(int 인덱스)
- 인덱스에 해당하는 한 문자 리턴
컴퓨터는 ‘a’문자를 내부에서 아스키코드 97로 인식
- 문자열 공백 제거 str.trim();
- 문자열 내용 비교 비교할대상.equals(비교할대상)
- 소문자 대문자는 다르게 비교
- 대소문자 상관없이 하고 싶다면 toUpperCase() 혹은 toLowerCase()로
- 물론 .equalsIgnoreCase() 가 있다 (자바는, SQL등에선 위의 방식)
미션풀이
- “`java
package j0422;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class NameMenuTest
{
public static void main(String[] args) throws IOException
{
// 반복되는 메뉴출력( 화면 뷰 처리 )
// 번호 입력을 위한 read() 또는 readLine() 메인에서 사용
// 이름 입력을 위한 readLine() 메인에서 사용
// 그러니까 통일성 위해 그냥 readline()쓰는게 좋겠넵…
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
NameMenu menu = new NameMenu();int no = 0; int cnt = 0; do { System.out.println("<이름메뉴>"); System.out.println("1.추가 2.검색 3.수정 4.삭제 5.종료"); System.out.print("번호를 입력해 주세요~ =>>"); String noStr = in.readLine();//문자열검사, 숫자로 구성되어있는지! boolean flag = menu.checkNum(noStr); if( !flag ) //( flag == false ) { System.out.println("번호만 입력하세요"); continue; // 제어문 //break : 스위치 혹은 반복문 종료,do while문 벗어남, //continue : 반복문을 계속 진행, for문(증감자를 거친 조건식으로 이동), do-while문(조건식으로), while문(조건식으로) //return : 메소드 프로그램 종료 } no = Integer.parseInt( noStr ); // no에는 "1" "2" "3" 과 같은 문자열이 들어온다~! switch(no) { case 1 : { // 밑에 또 case3 에name이 등장하기 때문에(다시 밑에도 이름 바꿈) 영역괄호로 묶어버린다~! if(cnt == 5) { System.out.println(" 더 이상 입력할 수 없습니다 \r\n " + " 한 개 이상의 이름을 먼저 삭제 한 후 입력하세요 "); break; //switch 블록 벗어나기 } System.out.print("이름 입력 : "); String name = in.readLine(); if(menu.existName(name) ) // 중복된 이름을 발견했다면 { System.out.println("이미 입력된 이름입니다!!"); break; } menu.add(name); cnt++; // 유효성 검사 valid Check //메소드호출 : 메소드명(데이터) } break; case 2 : menu.search(); break; case 3 : System.out.print("변경하고자 하는 기존 이름 입력 : "); String oldName = in.readLine(); if ( !menu.existName( oldName ) ) { //수정할 이름이 존재하지 않는다면 System.out.println("존재하지 않는 이름입니다."); break; } System.out.print("새로 수정 하는 이름 입력 : "); String newName = in.readLine(); menu.update(oldName, newName); break; case 4 : System.out.print("삭제 할 이름 입력 : "); String delName = in.readLine(); if ( !menu.existName( delName ) ) { //수정할 이름이 존재하지 않는다면 System.out.println("존재하지 않는 이름입니다."); break; } menu.delete(delName); }//switch System.out.println(); } while( no != 5 ); //번호에 1,2,3,4,5 입력했다면! , String클래스이기 때문에 == 으로 하면 값이 아닌 주소를 찾는다., equals로! System.out.println("E N D"); //논리데이터 앞에는 !(not) 연산자를 붙일 수 있다~! //<!not연산자> }//main
}
/===
package j0422;
public class NameMenu
{
String names[]; // nullpublic NameMenu() { names = new String[5]; } //배열에 이름 저장 public void add(String name) { //빈방찾기~! for( int i = 0 ; i < names.length; i++ ) { if( names[i] == null ) //빈방을 찾았다면~! { names[i] = name; break; } } } //배열내의 이름들 조회 public void search() { System.out.println("#이름목록"); for( int i = 0; i<names.length; i++) { if(names[i] != null) { System.out.println(names[i]); } } } //배열에 저장된 이름을 변경 public void update(String oldName, String newName) { //oldName과 일치하는 이름을 배열에서 찾기 for( int i = 0; i < names.length; i++) //배열 전체 인덱스 {
// if( names[i].equals( oldName ) )
// {
/*
* NullpointerException 방지
* 1. if(oldName.equals(names[i])) : oldName에 null값 절대 전달되지 않음
* 2. if(names[i] != null && names[i].equals(oldName))
* : names[i]번지의 값이 null이 아닐 때 equals()메소드 호출!
*/
if(names[i] != null && names[i].equals(oldName))
{
names[i] = newName;
break;
}
}}//update //배열에 저장된 이름을 삭제 public void delete(String delName) { // 배열에 저장된 데이터 삭제표현 : 배열명[번지] = null; for( int i = 0; i < names.length; i++ )// 배열에서 삭제할 이름 찾기 { if(names[i] != null) { if(names[i].equals(delName)) { names[i] = null; break; } } } }//delete //추가 메소드 정의 //문자열 데이터가 숫자 조합인지 체크 public boolean checkNum( String str ) { char ch; for( int i = 0; i < str.length(); i++ ) { ch = str.charAt(i); if( ch < '0' || ch > '9' ) //숫자로 구성된 문자가 아니라면! { System.out.println("숫자만 입력하세요"); return false; } } return true; // 전체 문자가 숫자로 구성되었다면 } public boolean existName(String name)//중복(존재하는) 이름 체크 { for(int i = 0; i < names.length; i++) //배열 인덱스 { //null.equals("길동"); // NullPointerException발생 //"길동".equals(null); //NullPointerException 발생 하지 않음 if( name.equals(names[i] ) ) { return true; } } return false; }//existName
}
“`- “`java
str.getBytes() | str.toCharArray() | ||
---|---|---|---|
to | <======= | from | =======> |
byte []b = {97,98,99} | String str = “abc”; | ||
from | =======> | to | <======= |
new String(b); | new String(ch); |
package j0422;
public class StringTest2
{
public static void main(String[] args)
{
String str = "abc";
System.out.println("STR = " + str);
byte[]b = str.getBytes();
for (int i = 0; i < b.length; i++)
{
System.out.println("b[" + i + "] = " + b[i] );
}
String str2 = new String(b);
System.out.println("STR2 = " + str);
}
}
package j0422;
public class StringTest
{
public static void main(String[] args)
{
String str = "JavaProgramming";
//특정 문자열로 시작하는 지 체크 boolean str.startsWith(String prefix)
System.out.println("str은 'Jav'로 시작하는가?\n" + str.startsWith("Jav") + "\n");
System.out.println("str은 'Jav'로 시작하는가?\n" + str.startsWith("av") + "\n");
//특정 문자열로 끝나는지 체크 boolean str.endsWith(String suffix)
System.out.println("str은 \"ing\"로 끝나는가? \n" + str.endsWith("ing") + "\n");
//str.contains(CharSequence s)
System.out.println("str이 \"pro\"를 포함하는가? \n" + str.contains("Pro") + "\n");
String tel = "010-1234-5678";
//tel 값은 02-123-4567 또는 053-123-5656 이렇게도 나올 수 있다.
String teltel = "02-112-1119"; // 번호가 위의 식이 아니라면?!
//문제 String tel1, tel2, tel3 변수를 선언하고 각각 "010", "1234", "5678"을 저장 후
//화면에 각 변수의 값을 출력하시오.
//힌트 substring()메소드와 indexOf() 메소드를 사용
// String tel1;
// String tel2;
// String tel3;
//
////
// tel1 = tel.substring(0, 3);
// System.out.println(tel1);
// tel2 = tel.substring(4, 8);
// System.out.println(tel2);
// tel3 = tel.substring(9, 13);
// System.out.println(tel3);
int idx1 = teltel.indexOf("-"); //첫번째 "-"에 대한 인덱스
int idx2 =teltel.indexOf("-", idx1 + 1); //두번째 "-"에 대한 인덱스
System.out.println("idx1 = " + idx1 + "\nidx2 = " + idx2);
idx2 = teltel.lastIndexOf('-');
System.out.println("last index idx2 = " + idx2);
String tel1 = teltel.substring(0, idx1);
String tel2 = teltel.substring(idx1 + 1, idx2);
String tel3 = teltel.substring(idx2 + 1);
System.out.println("tel1 :" + tel1 + "\ntel2 :" + tel2 + "\ntel3 :" + tel3);
}
}
/*
str은 'Jav'로 시작하는가?
true
str은 'Jav'로 시작하는가?
false
str은 "ing"로 끝나는가?
true
str이 "pro"를 포함하는가?
true
idx1 = 2
idx2 = 6
last index idx2 = 6
tel1 :02
tel2 :112
tel3 :1119
*/
package j0422;
import java.util.StringTokenizer;
public class StringTokenizerTest
{
public static void main(String[] args)
{
//StringTokenizer : 문자열 데이터를 특정 구분자(delimiter)를 통해 분리해주는 클래스
//StringTokenizer(String str, String delim) 생성자
//str ==> 기준 문자열 (전체문자열), delim ==> 구분자
//token(토큰) : 분리된 각각의 데이터
String tel = "010-1234-5678";
StringTokenizer st = new StringTokenizer(tel, "-");
//st = ["010" , "1234", "5678"];
// //토큰 데이터 꺼내오기 : String st.nextToken()
// System.out.println(st.nextToken());
// System.out.println(st.nextToken());
// System.out.println(st.hasMoreTokens()); //st에 토큰 데이터 가지고 있으면 true
// System.out.println(st.nextToken());
//
//
// System.out.println(st.hasMoreTokens()); // st에 토큰 데이터 없다면 false
// //System.out.println(st.nextToken());// 가져올 토근 데이터 초과하면 에러
while(st.hasMoreElements())
{
System.out.println(st.nextToken());
}
System.out.println("=================");
tel = "010-1234-5678";
//String[] tel.split(String regex); //특정문자(매개변수)를 통해 데이터를 분리 - 결과는 문자열 배열
//regex 는 정규식이라는 뜻
//String[] tel.
//split() 메소드는 빈문자열 ""도 저장해서 사용.
String tels[] = tel.split("-"); // tels = {"010", "1234", "5678"};
for (int i = 0; i < tels.length; i++)
{
System.out.println("tels[" + i + "] = " + tels[i]);
}
}
}
package j0422;
public class MatchesTest
{
//String클래스 ==> boolean str.matches(String regex);
//regex ==> regular expression( 정규표현식, 정규식 )
//regex를 통해 전달되는 패턴에 str이 부합(match)된다면 true를 리턴.
// 출현(발생)횟수 관련된 부호 : ?(0,1) , *(0~무한대) , +(1~무한대)
// 부호 없음 =>> 1번 출현
//
public static void main(String[] args)
{
String str = "";//false
String str1 = "a";
String str2 = "aa";
String str3 = "";
String str4 = "abc";
//matches(패턴문자열)
System.out.println("부호 없음\t:\t" + str.matches("[a]")); // a문자 한번 들어오기를 원한다!
System.out.println("?부호\t:\t" + str1.matches("[a]?")); // a문자 : 0,1
System.out.println("*부호\t:\t" + str2.matches("[a]*")); // a문자 : 0~무한대
System.out.println("+부호\t:\t" + str3.matches("[a]+")); // a문자 : 1~무한대
System.out.println("=================");
System.out.println(str4.matches("[abc]")); //a또는 b또는 c문자 중 하나가 오직 1번
System.out.println(str4.matches("[abc]+")); //a또는 b또는 c문자 중 하나가 오직 1번
String name = "jinju";
//name변수에 대한 영문자 체크 !
System.out.println("name변수의 이름체크(영어 소문자) : " +
name.matches("[qwertyuiopasdfghjklzxcvbnm]+"));
//표현식 사용시 대괄호[]안에 '-'부호는 범위를 표현
System.out.println(name.matches("[a-zA-Z]+")); //영문자 상관 없이 다
String su = "4567898765456";
System.out.println("숫자체크 : " + su.matches("[0-9]+")); //
/*
* 이제 이거 쓰면
* 입력 받을 때 숫자만 입력하길 원한다면
* if(!noStr.matches("[0-9]+"))
* {
* //조건문~!
* }
* 이렇게 편하게 쓸 수 있다.
*/
String hangul = "진주는자면서뿡뿡을한다그것도두번이나";
//hangul 변수에 대한 한글 체크
System.out.println("한글 체크 : " + hangul.matches("[ㄱ-힣]+"));
String id = "aasdfgh123";
//아이디는 8 ~ 12자리, 영문자와 숫자 조합
String idPattern = "[a-zA-Z0-9]{8,12}"; //문자열 길이 = 최소 8자리에서 12자리
//{8,12} 8이상 12이하, {8,} 최소 8이상, {8} 무조건 8글자
System.out.println("아이디체크 : " + id.matches(idPattern));
String juminBunho = "931025-2022334";
String juminPattern = "[\\d]{6}-[\\d]{7}";
System.out.println("주민번호체크 : " + juminBunho.matches(juminPattern));
}
}
package j0422;
public class StringConvertTest
{
public void convert1()
{
String s1 = "우리나라";
String s2 = "대한민국만세";
s1 = s1+s2;
/*
* String 클래스 : 고정(길이)문자열!
* 1. String클래스 객체 생성
* 2. 문자열 변환을 위해서 임시로 StringBuffer 클래스 객체 생성
* 3. 내부에서 append() 메소드 호출
* 4. StringBuffer객체를 다시 String객체로 변환
* 5. 임시생성된 StringBuffer객체를 소멸
* 이럴경우 가급적 s3이라는 변수 만들어서 넣는게 좋다!
*/
System.out.println(s1);
}
public void convert2()
{
StringBuffer s1 = new StringBuffer("우리나라");
s1.append("대한민국만세");
/*
* StringBuffer 클래스 : 가변(길이)문자열!
* 1. StringBuffer클래스 객체 생성
* 2. append() 메소드 실행
*/
System.out.println(s1);
}
public void kan()
{
System.out.println("================");
}
public static void main(String[] args)
{
StringConvertTest sct = new StringConvertTest();
sct.convert1();
sct.kan();
sct.convert2();
}
}
<배열 사용이유>
- 여러개의 데이터를 한 변수명으로 정의 =>>(인덱스) 관리가 편해짐
- 제약 : 동일한 자료형, 고정된(수) 데이터만 입력!
<벡터> : 데이터들을 담는 바구니
궁금상자
- matches에서 띄어쓰기까지 포함된거 검색하려면 띄어쓰기 제거 후?!
* 바보야 String 비교는 .equals야....
- break, continue, return이 헷갈려
'클라우드 기반 웹 개발자 과정 공부 > JAVA' 카테고리의 다른 글
190424_Day13 복습, 예외처리, 오버라이딩, 내부클래스 (0) | 2019.04.24 |
---|---|
190423_Day12 복습, Vector실습, 예외처리 (0) | 2019.04.23 |
190519_Day10 복습, 미션풀이, not연산자, NullPointException, String (0) | 2019.04.19 |
190118_Day9 복습, 삼항연산자, 클래스 객체 비교, 오토박싱 언박싱 (0) | 2019.04.18 |
190417_Day8 라인단위 입력, 클래스 객체 생성, 배열, 2차원 배열 (0) | 2019.04.17 |