JAVA

#6 문자열 내용 비교, 이름(추가,검색,수정,삭제), String Test

Daniel환 2018. 11. 24. 19:16

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

}