학원 12일차 - Java

·2021년 4월 13일
0

2021.04.13

유효성 검사

  • length() : 문자열 길이(문자수)
  • charAt() : 특정 위치의 문자 추출
char c = 'A';  //값형, 원시형
String s = "A";  //참조형

//원시형과 참조형간에는 형변환이 불가능하다.★★★★
System.out.println((int)c);
//System.out.println((int)s); //문자열로부터는 형변환을 통해서 문자 코드값을 얻어낼 수 없다.★★


//c = 'A'; // -> 정수 -> 1문자의 문자 코드
s = "ABC";

 //연속된 문자열로부터 특정한 위치에 있는 문자 하나를 char형으로 뽑아낸다.(문자코드값을 알 수 있다.)
c = s.charAt(0);
System.out.println((int)c); //65
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

System.out.print("입력: ");
String input = reader.readLine();

// "hello"만 보면 문자 하나하나가 소문자인지 대문자인지 알 수 없음 -> 그래서 문자로 한글자씩 뽑아서 소문자인지 대문자인지 알아내야한다.

//처음부터 끝까지 한글자씩 문자 뽑아오기
for(int i=0; i<input.length(); i++) {
    c =  input.charAt(i); 

	System.out.printf("%c(%d)\n", c, (int)c);
}

//'a' <= c <= 'z' 

//소문자를 찾는 것
//if((int)c >= 97 && (int)c <= 122) {}

//소문자 아닌 것을 찾는 것 -> 유효성 검사할때는 잘못된 경우를 찾는 것이 더 로직잡기 좋다. ★★
//if((int)c < 97 || (int)c > 122){}

//소문자의 문자코드를 모를때 -> 형변환이용 -> 가독성 안좋음
//if((int)c < (int)'a' || (int)c > (int)'z'){}
  • 영어 소문자만 입력
//A. 영어 소문자만 입력하시오.
// "hello" : 0 ~ 4
//"hello123"

//문자코드값을 몰라도, 형변환을 하지 않아도 비교 가능 -> 가독성 좋음(char형만 가능, String은 비교 불가.)
for(int i=0; i<input.length(); i++) {
    c =  input.charAt(i); 
    
    if(c < 'a' || c > 'z') { //자바의 연산자는 피연산자가 전부 char형일때 연산자로 비교 할 수 있다.
        System.out.println("유효하지 않음");
        break;  //잘못된 것을 찾으면 루프를 멈춘다.
    }
}
System.out.println("종료"); 
  • 영어 대문자만 입력
//B. 영어 대문자만 입력
for(int i=0; i<input.length(); i++) {
    c =  input.charAt(i);
    
    if(c < 'A' || c > 'Z') {
        System.out.println("유효하지 않음");
        break;
    }
}
System.out.println("종료"); 
  • 영어 대소문자만 입력
//c. 영어 대소문자만 입력
for(int i=0; i<input.length(); i++) {
    c =  input.charAt(i);
    
    if((c < 'a' || c > 'z') && (c < 'A' || c > 'Z')) {
        System.out.println("유효하지 않음");
        break;
    }
}
System.out.println("종료"); 
  • 숫자만 입력
//D.숫자만 입력
if(c < '0' || c > '9') {
    System.out.println("유효하지 않음");
    break;
}
System.out.println("종료"); 
  • 영어대소문자 + 숫자만 입력 가능
//E. 영어대소문자 + 숫자만 입력 가능
for(int i=0; i<input.length(); i++) {
    c =  input.charAt(i);
    if((c < 'a' || c > 'z') 
       && (c < 'A' || c > 'Z') 
       && (c < '0' || c > '9')) {
        System.out.println("유효하지 않음");
        break;
    }
}
System.out.println("종료"); 
  • 한글로만 입력
//F.한글로만 입력 
//조합형 한글 -> 자음, 모음 조합 -> 한문자
//완성형 한글 -> 글자 자체를 등록
for(int i=0; i<input.length(); i++) {
    c =  input.charAt(i);
    if(c < '가' || c > '힣') {
        System.out.println("유효하지 않음");
        break;
    }
}
System.out.println("종료"); 
  • 영어대소문자 + 숫자 + '_' 만 입력
//G. 영어대소문자 + 숫자 + '_' 만 입력
for(int i=0; i<input.length(); i++) {
    c =  input.charAt(i);
    if((c < 'a' || c > 'z') 
       && (c < 'A' || c > 'Z') 
       && (c < '0' || c > '9')
       && (c != '_')
       && (c != ' ')) {
        System.out.println("유효하지 않음");
        break;
    }
}
System.out.println("종료"); 

  • 주민번호 유효성 검사 & 성별확인
// 주민등록번호 입력
// 조건: 반드시 '-'를 입력하시오.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

System.out.print("주민등록번호: ");
String jumin = reader.readLine();

//950413-1234567
if(jumin.charAt(6) == '-') { //중간에 '-'을 입력했는지 확인
    System.out.println("올바른 주민번호입니다.");

    if(jumin.charAt(7) == '1') {
        System.out.println("남자입니다.");
    } else {
        System.out.println("여자입니다.");
    }

} else {
    System.out.println("잘못된 주민번호입니다.");
}

공백제거

  • String trim()
  • 문자열내의 시작과 끝에 존재하는 공백을 제거
  • 검색엔진에서 앞뒤의 공백은 유효문자라고 생각하지 않기 때문에 공백을 제거하고 검색해준다.
String txt = "		하나       둘          셋        ";

System.out.printf("[%s]\n", txt);
System.out.printf("[%s]\n", txt.trim());

//"java" -> "  java"
txt = "  java"; //DB원본

//System.out.println(txt.equals("java));  //true
//System.out.println(txt.equals("  java)); //false

문자열 검색 ★★

  • 문자열내에서 원하는 문자(열)을 검색 > 위치 반환
  • int indexOf(char c)
  • int indexOf(String s)

String txt = "안녕하세요. 홍길동입니다."; //0 ~ 13

//char
int n = txt.indexOf('홍'); //'홍'이라는 글자가 몇번째에 있나?
System.out.println(n); //7 -> 위치

//String
n = txt.indexOf("홍길동"); //"홍길동"의 시작 위치를 알려줌. -> 7
System.out.println(n);


n = txt.indexOf("아무개"); // 없는 문자열을 검색 -> -1 (위치 반환) ->  의미 없는 숫자를 반환해줌.
System.out.println(n);
String txt = "일본 정부는 후쿠시마(福島) 제1원전사고로 발생한 다량의 방사성 물질 오염수를 바다에 배출하기로 했다.일본은 자국의 안전 기준을 강화해 적용하기로 했으나 사고 원전에서 나온 125만t(톤)이 넘는 막대한 양의 오염수를 바다에 버리는 구상은 많은 논란과 우려를 낳고 있다.\n";

while (true) {
    System.out.print("검색어 : ");
    String word = reader.readLine();

    if(txt.indexOf(word) > -1) { //사용자가 입력한 단어의 위치 찾기-> 단어를 찾으면 0 이상 반환.
        //검색o
        System.out.printf("txt의 %d번째 위치에서 발견함\n", txt.indexOf(word));

    } else {
        break;
    }
} //while

System.out.println("프로그램 종료");
//게시판 > 글쓰기
// - 관리자 모드 : 금지어 설정

String txt = "안녕하세요. 반갑습니다.";

//금지어 : 바보
if(txt.indexOf("바보") == -1) { //금지어 못찾음 -> 의미없는 숫자 -1 반환
    System.out.println("글쓰기 진행");
} else {
    System.out.println("금지어 사용 금지!!!");
}

문자열 검색

  • 문자열 내에서 원하는 문자(열)을 검색 > 위치 반환
  • int indexOf(char c)
  • int indexOf(String s)
  • int indexOf(char c, int index)
  • int indexOf(String s, int index)

String txt = "안녕하세요. 홍길동님. 반갑습니다. 홍길동님."; // -> 홍길동이 2개..
//String txt = "홍길동님안녕하세요. . 반갑습홍길동님니다.";
//String txt = "안녕하세요. 홍길동님. 반갑습니다. 홍길동님. 홍길동님. 반갑습니다. 홍길동님 ";


//★ indexOf는 무조건 처음 만난 검색어의 위치만 반환한다. 
System.out.println(txt.indexOf("홍길동")); //7
System.out.println(txt.indexOf("홍길동")); //7

//int indexOf(String s, int index)  -> 찾을 시작 위치를 지정할 수 있음.★
System.out.println(txt.indexOf("홍길동", 10));  //20


int index = txt.indexOf("홍길동");
System.out.println(index); //7

//첫번째로 오는 홍길동 위치(7) + 홍길동 문자열길이(3) => 다음 시작 위치 (10) => 두번째 홍길동 위치(20)
index = txt.indexOf("홍길동", index + "홍길동".length());
System.out.println(index); //20


index = txt.indexOf("홍길동", index + "홍길동".length()); //더이상 찾을 수 없어서 -1 반환
System.out.println(index); //-1


//최종 -> 검색어를 모두 찾는 법!! (★★★중요★★★)
index = 0;

while(true) {

    index = txt.indexOf("홍길동", index); //처음부터 찾는다는 의미에서 0

    if(index == -1) {
        //찾을 거 다 찾으면 더이상 발견 할 게 없어서 -1 반환 -> 종료
        break;
    }

    System.out.printf("%d번째 발견\n", index);

    index += "홍길동".length();

}

영어 대소문자를 변경

  • String toLowerCase()
  • String to UpperCase()
String txt = "Hello World";

System.out.println(txt);
System.out.println(txt.toLowerCase());
System.out.println(txt.toUpperCase());


//검색
//1. 정확도 높음
//2. 검색률 높음
String content = "우리가 배우는 과목은 Java입니다.";
String word = "java";


//System.out.println(content.toUpperCase());
//System.out.println(word.toUpperCase());


if(content.indexOf(word) > -1) { //정확도 높음
    System.out.println("검색 결과 있음");
} else {
    System.out.println("검색 결과 없음");
}


//검색어와 대상 모두 대문자로 바꾸면, 소문자를 입력했는데 대문자로도 찾아줌.
if(content.toUpperCase().indexOf(word.toUpperCase()) > -1) { //정확도는 떨어지지만 검색률이 높음.
    System.out.println("검색 결과 있음");
} else {
    System.out.println("검색 결과 없음");
}


//메소드 체인★
//content.toUpperCase().indexOf()
//"abc".toUpperCase().indexOf()
//"ABC".indexOf()

패턴검색

  • boolean startsWith(String word)
  • boolean endsWith(String word)
String name = "홍길동";

//이름이 '홍'씨? -> boolean
System.out.println(name.startsWith("홍")); //true
System.out.println(name.startsWith("김")); //false

System.out.println(name.charAt(0) == '홍');
System.out.println(name.indexOf("홍") == 0);


//이름이 '동'으로 끝나는지?
System.out.println(name.endsWith("동"));
System.out.println(name.charAt(name.length() - 1) == '동'); //마지막 글자가 몇번째인지 모를때 length -1을 이용 ★
System.out.println(name.indexOf("동") == name.length() - 1);


String file = "cat.jpg";
//String file = "cat.txt";

//해당 파일이 이미지?
if(file.endsWith(".jpg")) {
    System.out.println("이미지 맞음");
} else {
    System.out.println("이미지 아님");
}

문자열 검색

  • indexOf(String s)
  • lastIndexOf(String s)
String txt = "안녕 홍길동. 잘가 홍길동.";

System.out.println(txt.indexOf("홍길동")); //1번째 홍길동 > 검색방향 : 왼 -> 오
System.out.println(txt.lastIndexOf("홍길동")); //2번째 홍길동을 처음 만남 > 검색방향 : 왼 <- 오

System.out.println(txt.lastIndexOf("홍길동", 10)); //시작 위치를 지정해 줄 수 있다.

문자열 추출

  • char charAt(int index); -> 1문자 추출

  • String substring(int beginIndex, int endIndex); -> 여러 문자 추출 ★★

    • beginIndex(inclusive), endIndex(exclusive) : 시작은 포함, 끝은 포함을 안시킴
String txt = "가나다라마바사아자차타파하";

System.out.println(txt.substring(3,8)); //시작에서 끝 지정 : 라마바사아 //3~7 ★★주의

//System.out.println(txt.substring(3, 100)); //에러 java.lang.StringIndexOutOfBoundsException (없는 위치라서)

System.out.println(txt.substring(3)); //라마바사아자차타파하 (시작(3)에서 끝까지 추출) ★
String jumin = "950413-1234567";

//'-'을 잘 썼는지 확인
System.out.println(jumin.charAt(6) == '-'); 
System.out.println(jumin.indexOf("-") == 6);
System.out.println(jumin.substring(6, 7).equals("-")); //String으로 반환하기 때문에 equals로 비교.★


//남자?? 여자??
System.out.println(jumin.substring(7,8).equals("1") ? "남자" : "여자");

charAt() or substring()

-> 추출한 글자수에 따라서

1글자 추출 -> charAt() or substring() => 문자 코드 필요

N글자 추출 -> substring()

  • 자주 사용하는 예제
String path= "C:\\class\\java\\JavaTest\\src\\com\\test\\java\\Hello.java";

//파일명?? Hello.java
int index = path.lastIndexOf("\\"); //끝에서부터 마지막 '\'의 위치 찾기

String fileName = path.substring(index + 1); //찾아낸 위치에서부터 끝까지 추출
System.out.println(fileName);


//확장자가 없는 파일명은? Hello
index = fileName.lastIndexOf("."); //뒤에서 부터 마지막 '.'위치 찾기
String fileNameWithOutExt = fileName.substring(0, index); //처음부터 찾아낸 위치까지 추출
System.out.println(fileNameWithOutExt);


//확장자? .java
String ext = fileName.substring(index); //.에서부터 끝까지 추출
System.out.println(ext);

문자열 치환(바꾸기)

  • 문자열의 일부를 교체
  • String replace(String old, String new)
String txt = "안녕하세요. 홍길동님";
System.out.println(txt.replace("홍길동", "아무개")); //'홍길동'을 찾아서 '아무개'로 바꿔라.

//replace가 없다면 어떻게 문자열를 바꿀 수 있을까?
String oldValue = "홍길동";
String newValue = "아무개";

//"안녕하세요. 홍길동님"
//"안녕하세요."
//"홍길동"  -> "아무개"
//"님."

int index = txt.indexOf(oldValue); //바꾸고 싶은 문자 위치 찾기

if(index > -1) {
    String str1 = txt.substring(0, index); //"안녕하세요."
    String str3 = txt.substring(index + oldValue.length()); // "님."

    System.out.println(str1 + newValue + str3);
}
txt = "안녕하세요. 홍길동님. 반갑습니다. 홍길동님. 잘가세요. 홍길동님.";

//replace는 문자열에 있는 모든 홍길동을 아무개로 바꿔준다. 
System.out.println(txt.replace("홍길동", "아무개"));

//★★ 스페이스를 찾아서 빈문자열로 바꿀 수 있다. -> 모든 공백을 제거할때 사용
System.out.println(txt.replace(" ", "")); 

txt = "우리는 Java Class입니다.";
String word = "JavaClass"; //띄어쓰기 상관없이 찾을 수 있음. -> 검색률 상승.

if(txt.replace(" ", "") //원본과 찾을 문자열에 공백제거
   .toUpperCase()
   .indexOf(word.replace(" ", "")
            .toUpperCase()) > -1) {
    System.out.println("o");
} else {
    System.out.println("x");
}
  • 주민등록번호 규칙


배열(Array)

// 요구사항) 학생3명 > 국어 점수 > 총점, 평균 구하기
// 수정사항) 학생 수 증가 > 500명
// 변수로 일일이 만들면 수정하기 매우 어려움.

int kor1;
int kor2;
int kor3;

kor1 = 100;
kor2 = 90;
kor3 = 80;
//학생 수만큼 변수 필요 + 497명..


int total = kor1 + kor2 +kor3;  // + 497
double avg = total / 3.0; // 3 -> 500

System.out.printf("총점: %d점, 평균: %.1f점\n", total, avg);
//배열 사용
//요구사항) 학생3명 > 국어 점수 > 총점, 평균 구하기


//1. 배열 만들기 (선언하기)
// - 자료형[] 배열명 = new 자료형[길이];

int[] kor = new int[3];

//배열의 방 위치 [0] [1] [2]
kor[0] = 100;
kor[1] = 90;
kor[2] = 80;

int total = kor[0] + kor[1] + kor[2];

double avg = total / 3.0;

System.out.printf("총점: %d점, 평균: %.1점\n", total, avg);
// 수정사항) 학생 수 증가 > 500명 > 10000

int[] kor = new int[500]; //배열을 사용하면 이득 발생
//int[] kor = new int[10000]; -> 여러개 데이터를 다를때 배열을 사용하면 수정, 보수유지하기 좋다.


//배열의 방 위치 [0] [1] [2]
kor[0] = 100;  //경우에 따라 이득 발생
kor[1] = 90;
kor[2] = 80;
//...
kor[500] = 100;

//int total = kor[0] + kor[1] + kor[2];
int total = 0;

//length -> 배열의 길이
for(int i=0; i<kor.length; i++) {
    total += kor[i];
}

double avg = (double)total / kor.length;

System.out.printf("총점: %d점, 평균: %.1f점\n", total, avg);
// 요구사항) int 숫자 -> 1~10까지 저장

int[] num = new int[10];  // 배열 쓰면 생산성 증가~

//int num [] = new int[10]; -> 이렇게 배열을 쓸 수 있지만 비추천,, 다른 언어는 이렇게 안씀.

//배열안의 방 10개 -> 숫자 대입
//배열을 탐색
for(int i=0; i<num.length; i++) {
    num[i] = i + 1;
}

//출력
System.out.println(num[0]);
System.out.println(num[1]);
System.out.println(num[2]);

System.out.println(num[9]); //length - 1

//에러 -> java.lang.ArrayIndexOutOfBoundsException: Index 10 out of bounds for length 10
//없는 배열에 접근하면 생기는 런타임 에러
//System.out.println(num[10]); //존재안함


for(int i=0; i<num.length; i++) {
    System.out.printf("num[%d]  = %d\n", i, num[i]);

}

배열 + 여러 자료형

  • 정수 배열(byte, short, int, long)
byte[] list1 = new byte[3];
list1[0] = 10;
System.out.println(list1[0]);
  • 실수형 배열(float, double)
double[] list2 = new double[3];
list2[0] = 3.14;
System.out.println(list2[0]);
  • 문자열 배열(char)
char[] list3 = new char[3];
list3[0] = 'A';
System.out.println(list3[0]);
  • 논리배열(boolean)
boolean[] list4 = new boolean[3];
list4[0] = true;
System.out.println(list4[0]);
  • 참조형 타입 배열 (★중요★)
    • 문자열은 참조형에 속하지만 사용법은 값형과 동일하다.
String[] list5 = new String[3];
list5[0] = "홍길동";
System.out.println(list5[0]);
  • 모든 자료형으로 배열을 생성할 수 있다.
Calendar[] list6 = new Calendar[3];
list6[0] = Calendar.getInstance();
System.out.printf("%tF\n", list6);

배열의 성질

  • 배열의 길이가 불변(immutable)이다. -> 한번 만들어진 배열의 방 갯수는 수정이 불가능 하다.-> 방을 더 만들거나 있는 방을 삭제할 수 없다. -> 배열에 들어갈 데이터의 갯수를 미리 충분히 예측해서 최대값의 근접한 길이로 잡는다.(조금 더 크게)
//학생수 평균 330명 -> 넉넉히 350개 배열 생성.
int[] num = new int[350];


//추후에 변경 불가!!!


// - 자바의 배열은 동적할당이 가능하다. > 자바 배열의 길이는 런타임에서 결정할 수 있다.

//int[] list = new int[5]; -> 정적할당

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

System.out.print("숫자 : ");

int n = Integer.parseInt(reader.readLine());

int[] list = new int[n];  //동적할당 -> 한번 만들어지면 절대 불변임.

System.out.println(list.length);
		
profile
모르면 괴롭고 알면 즐겁다.

0개의 댓글

관련 채용 정보