예외처리 복습
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("여성");
}
}
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);
public static void main(String[] args) {
String ssn = "1234567890123";
//int length = ssn.length();
if(ssn.length() == 13)
System.out.println("주민번호 자리 수가 맞습니다");
else
System.out.println("주민번호 자리수가 아닙니다");
}
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
}
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
}
}
*연습문제*
//주민번호를 할당하고 올해 몇살? 생일 몇월 며칠? 성별은?의 결과를 출력하시오.
public static void main(String[] args) {
//contains(문자열) : 문자열이 포함되어 있으면 true 반환
String str = "java program.txt";
boolean bool = str.contains("va");
System.out.println(bool);
bool = str.endsWith(".png");
System.out.println(bool);
if(bool)
System.out.println("그림파일 입니다.");
else
System.out.println("그림파일이 아닙니다.");
영문일 때만 쓸 수 있는 메서드
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
파이썬엔 해당 메서드 있는데 자바엔 없어서 저렇게 지저분하게.... 써줘야됨...
String strUpper = str1.toUpperCase();
System.out.println(strUpper);
=> JAVA PROGRAM
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() + ":양끝 공백만 제거");
}
}
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
}
}
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 클래스와 달리 덮어쓰기 가능, 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
// 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
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
StringBuffer에서 쓰레드의 동기화만 뺀 클래스
StringBuffer와 사용법, 메소드는 똑같음
그럼 어떨 때 무슨 클래스를 써야할까?
-String: 문자열 연산이 적고, 멀티쓰레드(한꺼번에 여러개의 쓰레드가 돌아가는)의 환경일 경우
-StringBuffer:문자열 연산이 많고(변경이 많고) 멀티쓰레드 환경일 경우
-StringBuilder:문자열 연산이 많고 단일쓰레드이거나 동기화를 안 하는 환경일 경우
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
-----------------------
7과 8중 큰 숫자: 8
7과 8중 작은 숫자: 7
7.345와 7.545중 큰 숫자: 7.545
7.345와 7.545중 작은 숫자: 7.345
-----------------------
1234.567
1235.0
12.35
기본형 값도 객체로 다뤄져야할 때가 있어서 기본형을 클래스로 정의한 것.
Character 와 Integer는 원형으로 적는 것 주의~
형변환 많이 했으니 wrapper 클래스의 예제들은 넘어간대~
lang.package의 클래스들 끝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
java.util.Date :
날짜와 시간을 다룰 목적으로 만들어진 클래스
Date메소드는 사망선고했지만 여전히 쓰이고 있음 (대체 왜냐)
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
*연습문제*
// 현재 월일 현재요일 오후 현재 시 현재 분을 출력하시오.