#6 문자열 내용 비교, 이름(추가,검색,수정,삭제), String Test
public class Car {//★★
String carName;//null
int wheelNum;//0
int velocity;//0
public Car(String carName, int wheelNum, int velocity)
{
this.carName = carName;
this.wheelNum = wheelNum;
this.velocity = velocity;
}
/*@Override
public String toString() {//to~메소드 :변환메소드, toString(): 문자열변환 메소드
//---> 객체의 상태를 표현하는 메소드 (필드의 값이 무엇인지를 표현)
String str = "이 차는 "+ this.carName+"이고 바퀴수는 "+ wheelNum+", 속도는 "+ velocity+"입니다!!";
return str;
}//toString
*/
public boolean equals(Car c) {//객체내용 비교
/*
★★ 문자열 내용 비교!!
String s1="java"; String s2=new String("JAVA");
s1 == s2 : 메모리비교
s1.equals(s2) : 값의 비교!!
*/
if(carName.equals(c.carName) &&wheelNum == c.wheelNum &&velocity == c.velocity)
return true;
else
return false;
}//equals
@Override
public String toString()
{
return "Car [carName=" + carName + ", wheelNum=" + wheelNum +", velocity=" + velocity + "]";
}
public static void main(String[] args)
{
Car c1 = new Car("소나타", 4, 100);
Car c2 = new Car("소나타", 4, 100);
System.out.println(c1.toString());
System.out.println(c1); //-----> c1을 출력하는 경우 내부적으로 toString()메소드
를 호출!!
System.out.println(c2);
//System.out.println(c2.toString());
//c1,c2변수 ---> 참조(reference)변수
//★c1과 c2를 비교??
if(c1 == c2) {//레퍼런스 비교!!
System.out.println("객체(메모리)주소같음!!");
}else {
System.out.println("객체(메모리)주소다름!!");
}
//객체내용 비교!!----> 클래스를 구성하는 필드값을 각각 비교
if(c1.equals(c2)) {
System.out.println("객체내용 같음!!");
}else {
System.out.println("객체내용 다름!!");
}
}//main
}
<클래스작성>
1. NameMenu.java(이름에 대한 추가, 검색, 수정, 삭제 기능메소드를 정의)
- 멤버필드: 배열객체(String names[])
-추가(insert, add, append, push, plus .....)
-검색(select, search, find)
-수정(update, modify, fix)
-삭제(delete, remove, clear, erase, drop)
2. NameMenuTest.java
- main()포함
----> 반복되는 메뉴 출력
----> 번호입력, 추가 수정 삭제에 필요한 이름입력
<NameMenu>
public class NameMenu {
String []names;//(이름)데이터 저장소
public NameMenu() {
names = new String[5];
//names[0]번지~names[4]번지 방만들기
//각 방에는 null값을 입력
}//생성자
public void insert(String name) {//데이터 입력
//main()통해 전달받은 이름을 배열에 저장!!
//빈공간(null)을 찾아서 이름을 저장!!
// if(names[0] == null)names[0]=name;
// else if(names[1] == null)names[1]=name;
// else if(names[2] == null)names[2]=name;
for(int i=0; i<names.length; i++) {//0~4
if(names[i] == null) {
names[i]=name;
break;
}
}//for
}//insert
public void select() {//데이터 검색
System.out.println("\n#이름목록");
for(int i=0; i<names.length; i++) {//배열의 전체 인덱스
//System.out.print("names["+i+"]번지=");
if(names[i] != null)
System.out.println(" "+names[i]);
}
}
public void update(String oldName, String newName) {//데이터 수정
for(int i=0; i<names.length; i++) {//배열0~4 : 전체
/*if(names[i] != null) {//널이 아닐때
if(names[i].equals(oldName)) {
//변경할 기존 이름을 찾았다면!!
names[i]=newName;//이름 변경
break;
}
}*/
//"".equals("")
if(oldName.equals(names[i])) {
//변경할 기존 이름을 찾았다면!!
names[i]=newName;//이름 변경
break;
}
}//for
}//update
public void delete(String delName) {//데이터 삭제
for(int i=0; i<names.length; i++) {
//삭제표현: 변수명[번지첨자]=null;
if(delName.equals(names[i])) {
//삭제할 이름 찾기
names[i]=null;
break;
}
}//for
}//delete
}
<NameMenuTest>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class NameMenuTest {
public static void main(String[] args) throws IOException {
//프로그램 제어, (반복적인 메뉴)화면출력
boolean flag=true;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
NameMenu menu = new NameMenu();
do{
System.out.println("<이름메뉴>");
System.out.println("1.추가 2.검색 3.수정 4.삭제 5.종료");
System.out.print("번호입력==> ");
String no = in.readLine(); //입력시점
//no="1" "2" "3" "4" "5"
//if(no.equals("1")){insert();}else if(no.equals("2")){select();}
switch(no) {
case "1":
{
System.out.print("이름입력: ");
String name=in.readLine();
menu.insert(name);
}
break;
case "2": menu.select();
break;
case "3":
System.out.print("기존이름입력: ");
String oldName = in.readLine();//입력시점
System.out.print("변경이름입력: ");
String newName = in.readLine();
menu.update(oldName,newName);
break;
case "4":
System.out.print("삭제이름입력: ");
String delName = in.readLine();
menu.delete(delName);
break;
case "5": flag=false;
}
System.out.println();
}while(flag);//while(do영역을 반복할 조건식);
System.out.print("-- END --");
}//main
}
※ NullPointerException 발생원인!!
===> 메모리 할당을 하지않은 상태에서 메소드 또는 필드를 참조했을때 발생하는 에러!!
===> null.필드명 null.메소드명(); 발생
<StringTest>
public class StringTest {
public static void main(String[] args) {
//String 문자열 : 문자들의 나열!!
String str="JavaProgramming";
//인덱스 012345678901234
//str.~ String클래스에 있는~
//문자열 길이(문자 갯수)
System.out.println("str문자열길이(문자갯수): "+ str.length());
//부분문자열 ---> "Pro"문자열 얻기
System.out.println("str.substring(4,7)="+str.substring(4,7));//beginIndex포함,
endIndex불포함
//부분문자열 ---> "Programming"문자열 얻기
System.out.println("str.substring(4)="+str.substring(4));
//특정인덱스의 문자 얻어오기 :char str.charAt(int index)
System.out.println("str.charAt(4)="+str.charAt(4));
//특정문자의 인덱스 얻어오기:int str.indexOf(int ch)
System.out.println("str.indexOf('P')="+str.indexOf('P'));//str.indexOf(97)); //97 == 'a'
System.out.println("str.indexOf(\"am\")="+str.indexOf("am"));
//문자열에 조건문자가 없다면 -1 리턴!!
//String str="JavaProgramming";
//인덱스 012345678901234
//문자열 치환(대체)
//replace(char oldChar, char newChar)
System.out.println("str.replace('a', 'o')="+ str.replace('a', 'o'));
//str = str.replace('a', 'o');
System.out.println("STR="+ str);
//"JavaProgramming" ---> "자바Programming"으로 변경하시오.
//replace(CharSequence target,CharSequence replacement)
System.out.println("str.replace(\"Java\", \"자바\")="+ str.replace("Java", "자바"));
//문자열에 공백 추가!!
str = " "+str+" ";//앞에 공백2개, 뒤에 공백2개
System.out.println("공백추가후 STR="+ str);
System.out.println("STR문자열 길이="+ str.length());
//문자열제거!!
str = str.trim();//좌우 연속된 공백(white space ---> 한개이상의 space,tab,enter의 조합)을 제거
System.out.println("공백제거후 STR문자열 길이= "+ str.length());
}//main
}
<StringTest2>
public class StringTest2 {
public static void main(String[] args) {
String s1 = "java";
String s2 = "JaVA";
//문자열 s1,s2를 비교(문자열 내용비교)하시오.
System.out.println("s1.equals(s2) = "+ s1.equals(s2));//false: 대소문자를 구분하기 때문에
//"java".equals("JAVA")
//대소문자 구분없이 s1과 s2 철자를 비교하시오!!
System.out.println("대문자 변환: s1.toUpperCase(): "+ s1.toUpperCase());
System.out.println("소문자 변환: s2.toLowerCase(): "+ s2.toLowerCase());
System.out.println("소문자로 전체 변경후 비교:"+s1.toLowerCase().equals(s2.toLowerCase()));
System.out.println("대소문자 구분없이 비교: equalsIgnoreCase():"+s1.equalsIgnoreCase(s2));
String str="Java3Pro7gra9mm0ing";
//문제) 문자열 str안의 숫자의 갯수를 출력하시오.
// --->힌트) 문자열안의 각 문자들은 인덱스를 갖는다!!
int cnt=0;
for(int i=0; i<str.length(); i++) {//str문자열 길이만큼 반복
char ch = str.charAt(i); //'3' ---> 51
if(ch >= '0' && ch<= '9') {
cnt++;
}
}
System.out.println("str의 숫자 개수: "+ cnt);
/*
st.getBytes(); st.toCharArray()
<----------------- ---------------->
byte b[] String st="abc"; char ch[]
={97,98,99}; ={'a','b','c'};
-----------------> <----------------
new String(b); new String(ch);
*/
String st="abc";
//byte배열 변환
byte []b = str.getBytes();
cnt=0;
for (int i = 0; i < b.length; i++) {
System.out.println("b["+i+"]="+b[i]);
if(b[i] >= '0' && b[i]<= '9') {//b[i] >= 48 && b[i]<=57) {//숫자
로 구성된 문자라면
cnt++;
}
}
System.out.println("byte[]배열 변환후 숫자 카운트: "+ cnt);
//char배열 변환
char []ch = st.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.println("ch["+i+"]="+ch[i]);
}
//byte[]b를 문자열로 변환
String st2 = new String(b);
System.out.println("ST2 = "+ st2);
//char[]ch를 문자열로 변환
String st3 = new String(ch);
System.out.println("ST3 = "+ st3);
}//main
}
<StringTest3>
public class StringTest3 {
public static void main(String[] args) {
String str="JavaProgramming";
//특정문자열로 시작하는지 체크 boolean str.startsWith(String prefix)
System.out.println("str은 'Jav'로 시작하는가? "+ str.startsWith("Jav"));
System.out.println("str은 'av'로 시작하는가? "+ str.startsWith("av"));
//특정문자열로 끝나는지 체크 boolean str.endsWith(String suffix)
System.out.println("ing로 끝나는가? "+ str.endsWith("ing"));
//특정문자열이 포함되었는지 체크 boolean str.contains(CharSequence s)
System.out.println("Pro를 포함하는가? "+ str.contains("Pro"));
String tel="010-1234-4567";
//01234567890
//문제) String tel1,tel2,tel3변수에 각각 "02","123","4567"을 저장하고 화면에
출력하시오.
// 힌트: indexOf()메소드와 substring()을 사용.
//첫번째 '-'에 대한 인덱스
int idx=tel.indexOf('-');
System.out.println("idx="+ idx);//3
//두번째 '-'에 대한 인덱스 indexOf(int ch, int fromIndex)
int idx2= tel.indexOf('-', idx+1);
idx2 = tel.lastIndexOf('-'); //<----- 뒤에서 부터 '-' 조회
System.out.println("idx2="+ idx2);//8
//String tel="010-1234-4567";
//01234567890
String tel1= tel.substring(0,2);//0~1
tel1 = tel.substring(0,idx);
String tel2= tel.substring(3,6);//3~5
tel2 = tel.substring(idx+1, idx2);
String tel3= tel.substring(7);//7~끝까지
tel3 = tel.substring(idx2+1);
System.out.println("tel1="+tel1);
System.out.println("tel2="+tel2);
System.out.println("tel3="+tel3);
}
}
<StringTest4>
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--5678";
StringTokenizer st = new StringTokenizer(tel, "-");
//st = ["010","1234","5678"]
//String nextToken()
/*
System.out.println(st.nextToken());
System.out.println(st.nextToken());
System.out.println(st.nextToken());
System.out.println(st.nextToken());//가져올 토큰데이터가 없을시 에러발생
*/
//st = ["010","1234","5678"]
while(st.hasMoreTokens()) {//st에 토큰데이터를 가지고 있다면 true리턴
System.out.println(st.nextToken());//토큰 데이터 뽑아오기
}
//-------------------------------------------------------
//String tel="010-1234-5678";
//tel.split(String regex) : 특정문자를 통해 데이터를 분리!!
System.out.println("=========================");
String [] tels = tel.split("-");//tels[]={"010","1234","5678"}
for (int i = 0; i < tels.length; i++) {
System.out.println("tels["+i+"]="+ tels[i]);
}
}//main
}