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[]; // null

    public 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
    

    }
    “`


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이 헷갈려

+ Recent posts