예외처리 복습

String 클래스의 메서드

  • ★★★ .charAt() :
    인덱스 번호에 해당하는 문자 1개를 반환
	public static void main(String[] args) {
		String str = "123456-2234567";
		char ch1 = str.charAt(7);
		switch(ch1) {
		case '1' : case '3' :
			System.out.println("남성");
			break;
		case '2' : case '4' :
			System.out.println("여성");
		}
	}

  • .indexOf(문자열) :
    문자열의 시작 인덱스 번호를 얻어옴
	public static void main(String[] args) {
		String str = "java program";
		int index = str.indexOf("program");
		System.out.println(index); 
        =>5
		
		/*int index = str.indexOf("por");
		System.out.println(index);
		=> -1 문자열이 다르기 때문에 이런 값은 없다는 뜻의 -1 출력
		*/
        
        if(str.indexOf("java") == -1)
			System.out.println("자바프로그램이 아닙니다.");
		else
			System.out.println("자바프로그램 입니다.");
            
            
         if(str.indexOf("java") < 0)
			System.out.println("자바프로그램이 아닙니다.");
		else
			System.out.println("자바프로그램 입니다.");
	}

끝 문자의 인덱스 번호를 알고 싶다면?
.lsatIndexOf()

		str = "java program kim java lee java";
		index = str.lastIndexOf("java");
		System.out.println(index);

  • .length() : 배열과 달리 String에서는 메소드로 사용
	public static void main(String[] args) {
		String ssn = "1234567890123";
		//int length = ssn.length();
		if(ssn.length() == 13)
			System.out.println("주민번호 자리 수가 맞습니다");
		else
			System.out.println("주민번호 자리수가 아닙니다");
	}
    

  • .replace() : 글자 치환
	public static void main(String[] args) {
		String str = "javaprogram java kimjava leejava";
		String newStr = str.replace("java", "자바");
		System.out.println(newStr);
        =>자바program 자바 kim자바 lee자바
		
		newStr = str.replace("j", "oi");
		System.out.println(newStr);
        =>oiavaprogram oiava kimoiava leeoiava
        
        newStr = str.replaceFirst("a", "b"); //맨 앞에 있는 a만 치환
		System.out.println(newStr);
        =>jbvaprogram java kimjava leejava
	}

  • substring(시작index, 끝index) : 얘는 s소문자...!
    시작 인덱스 ~ 끝 인덱스 직전까지 반환
public class _06_StringEx6 {
	public static void main(String[] args) {
		String str = "공공데이터 융합 웹 애플리케이션 개발자 양성과정2";
		System.out.println(str.substring(6, 8)); 
     => 융합   
        
    substring(시작index) : 
시작 인덱스부터 끝까지 반환
		System.out.println(str.substring(9));
     => 웹 애플리케이션 개발자 양성과정2   
        
	}
}

*연습문제*
//주민번호를 할당하고 올해 몇살? 생일 몇월 며칠? 성별은?의 결과를 출력하시오.


  • contains(문자열) :
    문자열이 포함되어 있는지 판별
	public static void main(String[] args) {
		//contains(문자열) : 문자열이 포함되어 있으면 true 반환
		String str = "java program.txt";
		boolean bool = str.contains("va");
		System.out.println(bool);
  • endsWith(문자열) :
    문자열로 끝나는지 판별
		bool = str.endsWith(".png");
		System.out.println(bool);
		
		if(bool) 
			System.out.println("그림파일 입니다.");
		else
			System.out.println("그림파일이 아닙니다.");

영문일 때만 쓸 수 있는 메서드

  • toLowerCase() :
    모든 문자열을 소문자로 변환하여 반환
public class _08_StringEx8 {
	public static void main(String[] args) {
		String str1 = "JAVA Program";
		
		String strLower = str1.toLowerCase();
		System.out.println(str1);	//원본이 바뀌는 것이 아님!
		System.out.println(strLower);
    }
}
=> JAVA Program
   java program


앞글자만 대문자로 출력하고 싶다면?
String str2 = strLower.substring(0, 1).toUpperCase() + strLower.substring(1, 5) + strLower.substring(5, 6).toUpperCase() + strLower.substring(6);
		System.out.println(str2);
=>Java Program

파이썬엔 해당 메서드 있는데 자바엔 없어서 저렇게 지저분하게.... 써줘야됨...

  • toUpperCase() :
    모든 문자열을 대문자로 변환하여 반환
String strUpper = str1.toUpperCase();
		System.out.println(strUpper);
        
=> JAVA PROGRAM

  • trim() :
    앞과 뒤의 공백 제거
public class _09_StringEx9 {

	public static void main(String[] args) {
		String str1 = "java        ";
		System.out.println(str1 + "공백제거 전");
		System.out.println(str1.trim() + "공백제거 후");
		
		String str2 = "   program   ";
		String str3 = "   입문";
		System.out.println(str1.trim() + str2.trim() + str3.trim());
		
		String str4 = "   java  program  입문   ";
		System.out.println(str4.trim() + ":양끝 공백만 제거");
	}

}

  • .equalsIgnoreCase() :
    대소문자 구분없이 문자가 같은지 비교
public class _10_StringEx10 {

	public static void main(String[] args) {
		String str1 = "java";
		String str2 = "JAVA";
		
		System.out.println(str1.equals(str2));	//대소문자 다르기 때문에 false
		System.out.println(str1.equalsIgnoreCase(str2));	//대소문자 구분없어서 True
		
	}

}
  • 문자열 분리
    1.split() :
    String 클래스
public class _11_StringEx11 {

	public static void main(String[] args) {
		String text = "홍길동-아무개-이순신-강감찬";
		String[] name = text.split("-");
		System.out.println(Arrays.toString(name));
		
		for(String i : name)
			System.out.print(i + " ");
		System.out.println();
		
		String str = "";
		for(int i=0; i<name.length; i++) {
			if(i < name.length-1)	//4개의 이름값에서 마지막 1개의 이름값만 빼고 이름 3개까지만 콤마 넣기
			System.out.print(name[i] + ",");
			else
				System.out.print(name[i]);
			
			//삼항연산자로 , 넣기
			str += (i==0) ? "" + name[i] : ", " + name[i];
			// name[0] 홍길동 + name[1(0과 달라서 후행문)] , 아무개 + name[2] ,이순신 + ...
		}
		System.out.println();
		System.out.println(str);
        
        text = "홍길동,아무개&이순신-강감찬";
		String[] names = text.split(",|&|-");	//OR연산자로 구분 가능
		System.out.println(Arrays.toString(names));
	}

}

2.StringTokenizer 클래스
countTokens() 메서드 :
남아있는 토큰 수

hasMoreTokens() :
남아있는 토큰이 있는지 여부

nextToken() :
토큰을 하나씩 꺼냄. 다 꺼냈으면 남아있는 것이 없어서 출력하면 아무것도 안 나옴. 그래서 다시 넣어줘야 함

package langPackage03.stringMethod;

import java.util.StringTokenizer;

public class _12_StringEx12 {

	public static void main(String[] args) {
		String text = "홍길동-아무개-이순신-강감찬";
		StringTokenizer st = new StringTokenizer(text, "-");
		int count = st.countTokens();
		System.out.println("남아있는 토큰 수: " + count);
		
		/*
		for(int i=0; i<st.countTokens(); i++) {
			String name = st.nextToken();	
			//홍길동 꺼내면 남은 토큰 수 3, 아무개 꺼내면 남은 토큰 수 2 그럼 i가 2보다 작다라는 뜻이라 이름 2개밖에 안 나옴
			System.out.println(name);
		*/	
		for(int i=0; i<count; i++) {
			//count로 해야 위에 객체 생성을 해줬기 때문에 수량에 제한 안 받음
			String name = st.nextToken();	
			System.out.println(name);
		}
		System.out.println("------------------------");
		st = new StringTokenizer(text, "-");
		while(st.hasMoreTokens()) {	//토큰이 남아있는 동안엔 토큰을 하나씩 꺼내오삼
			System.out.println(st.nextToken());
		}
	}

}

String Buffer :

String 클래스와 달리 덮어쓰기 가능, equals를 오버라이딩 하지 않아서 값이 아닌 주소가 같은지 묻게 됨

String의 특징:
기존의 문자열은 보존하고 새로 만들어짐
다시말해, 덮어쓰기가 안 된다

String a = "abc"
a = "def"
=> 객체가 새로 만들어져서 각각의 객체에 값이 있음
그래서 반복문 돌 때도 i의 반복값만큼 객체가 만들어져 메모리 낭비가 심해 비효율적임.

그래서 나온 것이 String Buffer

public class StringBuffer01 {

	public static void main(String[] args) {
		//StringBuffer는 무조건 객체 생성 해줘야됨!!!
		StringBuffer sb1 = new StringBuffer("abc");
		StringBuffer sb2 = new StringBuffer("abc");
		
		//equals()를 오버라이딩 하지 않았음 : 주소가 같은가를 물어봄
		System.out.println("sb1 == sb2 ? " + (sb1 == sb2));
		System.out.println("sb1.equals(sb2) ? " + sb1.equals(sb2));
        
=> false
   false
  • append() :
    문자열 맨 뒤에 추가 문자열을 붙임
		// String은 sb2 = sb1 + "def"; 이렇게하면 넣어졌지만 Buffer는 안 됨. 그래서 append 사용
		sb1.append("def");
		System.out.println("sb1 출력: " + sb1);
		sb1.append("... 알파벳");
		System.out.println("sb1 출력: " + sb1);
		
		sb2.append("def... 알파벳");
		String str = sb1.toString();	// = new String(sb1);과 같음
		String str2 = sb2.toString();
		System.out.println(str.equals(str2));	
		//String으로 변환했기 때문에 안에 들어있는 값이 같은지 볼 수 있음
	}

}

=>sb1 출력: abcdef
sb1 출력: abcdef... 알파벳
true

  • insert(원하는index) :
    원하는 index 뒤에 문자를 추가함
  • deleteCharAt(원하는index) :
    원하는 index 값의 문자를 삭제함
  • delete() :
    시작 인덱스 ~ 끝 인덱스 직전까지의 문자를 제거한다
  • replace() :
    원하는 위치의 값을 다른 값으로 변경
  • reverse() :
    문자열을 거꾸로 반환
public class StringBuffer02 {

	public static void main(String[] args) {
		StringBuffer  sb = new StringBuffer("010");
        
        //맨 뒤에 추가
		sb.append("1111");
		System.out.println(sb);
		
        //원하는 인덱스에 추가
		sb.insert(3, "-");
		System.out.println(sb);
		
       //index값 문자 삭제
		sb.deleteCharAt(3);
		System.out.println(sb);
		
        //시작 index ~ 끝 index 직전까지 삭제
		sb.delete(0, 3);
		System.out.println(sb);
		
        // 원하는 위치의 값을 다른값으로 변경
		sb.replace(2, sb.length(), "22");
		System.out.println(sb);
		
        //문자열 거꾸로
		sb.reverse();
		System.out.println(sb);
	}

}

=>
0101111
010-1111
0101111
1111
1122
2211

StringBuilder :

StringBuffer에서 쓰레드의 동기화만 뺀 클래스
StringBuffer와 사용법, 메소드는 똑같음


그럼 어떨 때 무슨 클래스를 써야할까?

-String: 문자열 연산이 적고, 멀티쓰레드(한꺼번에 여러개의 쓰레드가 돌아가는)의 환경일 경우
-StringBuffer:문자열 연산이 많고(변경이 많고) 멀티쓰레드 환경일 경우
-StringBuilder:문자열 연산이 많고 단일쓰레드이거나 동기화를 안 하는 환경일 경우


Math 클래스의 메서드

Math에서 가장 많이 쓰는 건 Math.random()!

-Math.abs(): 절대값 처리

-Math.ceil(): 소수점 이하 무조건 올림 처리

-Math.floor(): 소수점 이하 무조건 내림 처리

-Math.rint(): 가장 가까운 정수값 반환

-Math.round(): 소수점 이하 반올림

-Math.max(num1, num2): 둘 중에 더 큰 값

-Math.min(num1, num2): 둘 중에 더 작은 값

public class Math01 {

	public static void main(String[] args) {
		// 절대값
		System.out.println("-11의 절대값: " + Math.abs(-11));
		System.out.println("-11.13의 절대값: " + Math.abs(-11.13));
		System.out.println("-----------------------");
		
		// 소수점 이하 무조건 올림
		System.out.println("13.1의 올림: " + Math.ceil(13.1));
		System.out.println("-13.1의 올림: " + Math.ceil(-13.1));
		System.out.println("-----------------------");
		
		// 소수점 이하 무조건 내림
		System.out.println("13.8의 내림: " + Math.floor(13.8));
		System.out.println("-13.8의 내림: " + Math.floor(-13.8));
		System.out.println("-----------------------");
		
		//가장 가까운 정수값 반환
		System.out.println(Math.rint(13.1));
		System.out.println(Math.rint(13.9));
		System.out.println(Math.rint(-13.1));
		System.out.println(Math.rint(-13.9));
		System.out.println("-----------------------");
		
		//소수점 이하 반올림
		System.out.println(Math.round(13.6));
		System.out.println(Math.round(13.1));
		System.out.println(Math.round(-13.6));
		System.out.println(Math.round(-13.1));
		System.out.println("-----------------------");
		
		//둘 중 큰 수, 작은 수
		System.out.println("7과 8중 큰 숫자: " + Math.max(7, 8));
		System.out.println("7과 8중 작은 숫자: " + Math.min(7, 8));
		System.out.println("7.345와 7.545중 큰 숫자: " + Math.max(7.345, 7.545));
		System.out.println("7.345와 7.545중 작은 숫자: " + Math.min(7.345, 7.545));
        
        // 소수점 원하는 자리까지 얻기
		double value = 12.34567;
		double value2 = value * 100;
		System.out.println(value2);
		double value3 = Math.round(value2);
		System.out.println(value3);
		System.out.println(value3/100); 
        //위에것들은 잘 안 쓰고 거의 밑에 거 사용
		System.out.printf("%.2f", 89.45678);
	}

}

=>
-11의 절대값: 11
-11.13의 절대값: 11.13
-----------------------
13.1의 올림: 14.0
-13.1의 올림: -13.0
-----------------------
13.8의 내림: 13.0
-13.8의 내림: -14.0
-----------------------
13.0
14.0
-13.0
-14.0
-----------------------
14
13
-14
-13
-----------------------
78중 큰 숫자: 8
78중 작은 숫자: 7
7.3457.545중 큰 숫자: 7.545
7.3457.545중 작은 숫자: 7.345
-----------------------
1234.567
1235.0
12.35

wrapper 클래스 :

기본형 값도 객체로 다뤄져야할 때가 있어서 기본형을 클래스로 정의한 것.
Character 와 Integer는 원형으로 적는 것 주의~

형변환 많이 했으니 wrapper 클래스의 예제들은 넘어간대~


lang.package의 클래스들 끝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


날짜와 시간

  1. java.util.Date :
    날짜와 시간을 다룰 목적으로 만들어진 클래스
    Date메소드는 사망선고했지만 여전히 쓰이고 있음 (대체 왜냐)

  2. java.util.Calendar :
    -Date 클래스를 개선한 클래스. 여전히 단점 존재
    -추상클래스이기 때문에 getInstance()를 통해 객체 얻어옴
    -get(int field)으로 날짜와 시간 가져옴

package calendar02;

import java.util.Calendar;

public class Calendar01 {

	public static void main(String[] args) {
		Calendar today = Calendar.getInstance();
		System.out.println("현재 년도: " + today.get(Calendar.YEAR));
		//월은 0이 1월이라 +1 해줘야함
		System.out.println("현재 월: " + (today.get(Calendar.MONTH)+1));
		System.out.println("올해의 몇째 주: " + today.get(Calendar.WEEK_OF_YEAR));
		System.out.println("이 달의 몇째 주: " + today.get(Calendar.WEEK_OF_MONTH));
		
		System.out.println("오늘 일자: " + today.get(Calendar.DATE));
		System.out.println("오늘 일자: " + today.get(Calendar.DAY_OF_MONTH));
		System.out.println("365일 중 몇일째: " + today.get(Calendar.DAY_OF_YEAR));
		
		int week = today.get(Calendar.DAY_OF_WEEK);
		System.out.println("오늘 요일: " + week);
		switch(week) {
		case 1 :
			System.out.println("일요일");
			break;
		case 2 :
			System.out.println("월요일");
			break;
		case 3 :
			System.out.println("화요일");
			break;
		case 4 :
			System.err.println("수요일");
			break;
		case 5 :
			System.out.println("목요일");
			break;
		case 6 :
			System.out.println("금요일");
			break;
		case 7 :
			System.out.println("토요일");
			break;
		}
		int time = today.get(Calendar.AM_PM);
		System.out.println("오전(0)_오후(1): " + today.get(Calendar.AM_PM));
		switch(time) {
		case 0 :
			System.out.println("오전");
			break;
		case 1 :
			System.out.println("오후");
			break;
		}
		
		System.out.println("시간(0~11): " + today.get(Calendar.HOUR)); 
		System.out.println("시간(0~23): " + today.get(Calendar.HOUR_OF_DAY)); 
		System.out.println("분: " + today.get(Calendar.MINUTE));
		System.out.println("초: " + today.get(Calendar.SECOND)); 
		System.out.println("1/1000초: " + today.get(Calendar.MILLISECOND)); 
        
=>
현재 년도: 2023
현재 월: 3
올해의 몇째 주: 9
이 달의 몇째 주: 1
오늘 일자: 2
오늘 일자: 2
365일 중 몇일째: 61
오늘 요일: 5
목요일
오전(0)_오후(1): 1
오후
시간(0~11): 5
시간(0~23): 17: 15: 2
1/1000: 43
  1. java.time패키지 :
    Date와 Calendar의 단점을 개선한 새로운 클래스 제공
    만들어졌지만 이거 잘 사용 안 한대... (대체 왜)

*연습문제*
// 현재 월일 현재요일 오후 현재 시 현재 분을 출력하시오.

profile
내 인생을 망치러 온 나의 구원, 개발

0개의 댓글