NullPointException :아직 객체가 만들어지지 않은 상태인 null을 사용하려할 때 나오는 에러
int[] arr = null;//객체 안만들어짐
arr[0] = 10 ; //에러
근데 String 값은 새로운 메모리를 생성하기 때문에 , 에러가 안난다.
String name = null;
name = "푸딩"; // 새로운 heap메모리 생성
String null 과 ""은 비교가 안된다,
null은 아예 객체가 만들어지지 않았기 때문 !!
String myHobby = "";
String yourHobby = null;
if(myHobby.equals("")) {
System.out.println("빈 문자열 객체가 있다.");
}
if(yourHobby == null) {
System.out.println("객체가 없음 ");
}
if(myHobby == yourHobby) {
System.out.println("안나옴");
}
주의점 ! 값이 없다는 표시할 때 항상 null비교를 먼저 하자 !!
String name = null;
if(name == null || name.length() == 0)
if(name == null || name.equals("") == 0)
if(name.length()==0||name==null) // 에러남 .
앞에부터 평가하는데 null이라서 객체가 아예 없어서 평가자체가 안되기 때문에 nullPointerException이 뜬다.
String의 index값을 뽑아내는 charAt() 반환타입은 char !
String ssn = "7008103234567";
char gender = ssn.charAt(6);
System.out.println("gender: "+gender);
switch(gender) {
case '1':
case '3':
case '5':
case '7':
System.out.println("남성");
break;
case '2':
case '4':
case '6':
case '8':
System.out.println("여성");
break;
}
String의 문자열 수를 반환하는 String.length()
String ssn = "7008103234567";
String name = "홍길동 a1";
int strLength = ssn.length();
int nameLength = name.length();
System.out.println("ssn 글자수 : "+ strLength); //13
System.out.println("nameLength 글자수 : "+ nameLength); //6
String 문자열을 교체해주는 String.replace()
String oldStr = "자바는 객체지향언어 입니다. 자바는 풍부한 API를 지원합니다." ;
String newStr = oldStr.replace("자바", "Java");
System.out.println(newStr);
String 문자열을 뽑아주는 substring()
String jumin1 = ssn.substring(0, 6);
String jumin2 = ssn.substring(0);
System.out.println(jumin1); //700810
System.out.println(jumin2); //7008103234567
주민번호로 생년월일 표시하는거 만들기
//받은 값
String ssn = "7008103234567";
//년도생년월일 추출
String getFirstNum = ssn.substring(0,6); //700810
//주민번호 6번째 숫자
char number = ssn.charAt(6); //3
//결과 표시 변수
String birthday = "";
//체크
switch(number) {
case '3':
case '4':
birthday = "19" +getFirstNum;
System.out.println("birthday: "+ birthday);
break;
default:
birthday = "20" +getFirstNum;
System.out.println("birthday: "+ birthday);
}
문자의 인덱스값을 반환하는 subject.indexOf()
String subject = "자바 프로그래밍 자바 프로그래밍";
int location = subject.indexOf("프로그래밍");
System.out.println(location); // 3
//찾을 문자열이 없을 때는 -1이 나옴
location = subject.indexOf("프로그램");
System.out.println(location);//-1
프로그래밍의 프의 인덱스 값을 반환한다.
시작 인덱스 값을 명시 할 수 있다.
String subject = "자바 프로그래밍 자바 프로그래밍";
int location = subject.indexOf("프로그래밍",5);
System.out.println(location); // 12
//인덱스 위치 5부터 찾음
subject.lastIndexOf("프로그래밍")
뒤에서부터 프로그래밍 검색
String subject = "자바 프로그래밍 자바 프로그래밍";
location = subject.lastIndexOf("프로그래밍");
System.out.println(location); // 12
첫번째는 12나오고
두번째는 3나옴 !!
boolean값을 반환하는 contains() !
subject = "자바 프로그래밍 자바 프로그래밍";
boolean isStr = subject.contains("자바");
if(isStr) {
System.out.println("자바와 관련된 내용입니다.");
}else {
System.out.println("자바와 관계없는 내용입니다.");
}
정규식을 기준으로 String을 나눠주고 배열에 담아주는 split()
String text = "홍길동,이수홍 박연수,김자바,최명호,신상현";
String[] names = null;
names = text.split("[,]");
int i=0;
while(i<names.length) {
System.out.println(names[i].length()); //
i++;
}
이수홍 박연수 는 길이 7로 나오고 나머지는 3나온다.
정규식에 조건을 추가할 수 있다.
text = "홍길동,이수홍 박연수,김자바 , 최명호,신상현";
names = text.split("[,. ]+"); // ,.,띄어쓰기가 꼭 있어야함 한개이상+ !! 있고 이걸로 나눠주겠다는 뜻임
i=0;
while(i<names.length) {
System.out.println(names[i].length()); // 다 3이 나옴
i++;
}
양옆 빈칸을 없애주는 trim()
String tel1 = " 02" ; //02 앞에 스페이스바 2번
String tel2 = "123 " ; //123 다음에 스페이스바 3개 탭키 2번
String tel3 = " 1234 "; //앞에 스페이스바 3번 1234 뒤에 스페이스바 4번
String tel4 = " 12 34 "; //스페이스바 1번 탭키 1번 12 스페이스바 1번 탭키 1번 34 스페이스바 1번 탭키 1번
//"문자열" . trim() 문자열의 앞과 뒤에 존재하는
//연속된 빈칸이나 탭키가 제거된 문자열 객체를 생성해서 반환
String tel = tel1.trim()+tel2.trim()+tel3.trim();
System.out.println(tel);//021231234
System.out.println(tel.length());9
tel4 = tel4.trim();
System.out.println(tel4);12 34
철자가 중요하지 않는 경우 equalsIgnoreCase를 쓴다
String mystr1 = "java programing";
String mystr2 = "JAVA PROGRAMING";
String mystr2toUpper = mystr1.toUpperCase();
String mystr1toUpper = mystr2.toLowerCase();
System.out.println(mystr1.equalsIgnoreCase(mystr1toUpper)); // true
문자열.getBytes() 해당 문자 코드값에 대한 byte배열을 반환
String str = "안녕. Hello!!";
byte[] strBytes = str.getBytes();
for(byte myByt : strBytes) {
System.out.println(myByt);
}
한글은 3바이트가 나와서 -20,-107,-120 이 안
만약 인자값을 넣는다면 반드시 try catch 문에 넣는다 .
try {
byte[] yourBytes = str.getBytes("EUC-KR");
}catch(Exception e) {
System.out.println("에러가 났습니당");
}
인코딩 utf-8로 바꿔줘야하는데
euc-k로 만들어져 있는게 엄청 많음
추가적인거 euc-kr로 바꿔줄 때 , getBytes("EUC-KR") 을 쓴다;
중요!!!!!!!!!
요즘은 인코딩을 다 UTF-8로 만들지만 , 예전에는 EUC-KR로 만들었었다.
String 값으로 한글을 입력하면 , UTF-8로 입력되는데 예전에 있던 사이트들을 업데이트 해주려면
인코딩 값이 맞지 않아서 이상한 문자가 나오는 경우가 많다.
따라서 이러한 에러를 막기위해 , 옛날 사이트들을 업데이트 해줄 때 EUC-KR 로 변환해서 String값을 넣어야 한다.
1.글자는 바이트 값이니까 (한글은 3바이트 영어는 1바이트) 먼저 , string값을 byte[] 배열안에 넣어준다.!!
String str = "안녕. Hello!!";
byte[] yourBytes = null;
try {
yourBytes = str.getBytes("EUC-KR");
}catch(Exception e) {
}
2.byte[] 배열에 인코딩값을 설정하거나 , 인자값을 받을 때는 항상 try catch문을 써준다
3.yourBytes라는 바이트배열에 스트링값을 EUC-KR인코딩 상태로 바꿔서 넣어주겠다는 뜻이다.
for(byte yourByte: yourBytes) {
System.out.println(yourByte);
}
3.이제 EUC-KR로 바뀐 문자열값이 출력된다.
하지만 , 저건 내가 String 값을 바로 준 경우고, 웹사이트에 추가를 할 때는 new 연산자를 사용하여 인스턴스를 생성하면서 EUC-KR로 바꿔줘야 한다.
String yourStrEUCKR = null;
try {
yourStrEUCKR = new String(yourBytes, "EUC-KR"); //인코딩 EUC-KR로 바꿈
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(yourStrEUCKR); // 정상적으로 출력
yourStrEUCKR = new String(yourBytes); // 현재 EUC-KR인 상태인데, UTF-8로 변환하겠다
System.out.println(yourStrEUCKR); // 비정상적으로 나옴
EUC-KR 에서 UTF-8로 변환하려고 하면 에러가 난다. ..
배열의 특징
값을 추가할 수 없음
String[] myNames;
myNames = {"홍길동" , "이순신", "슈퍼맨", "베트맨", "강감찬", "세종대왕"}; //오류
이미 배열이 선언됬기 때문에 나중에 다시 값을 배열할 수 없음
새로운 배열객체를 만들어서 값을 대입해야함
myNames = new String[] {"홍길동" , "이순신", "슈퍼맨", "베트맨", "강감찬", "세종대왕"};
for문으로 배열로 뽑을 때 , ()안에 있는 변수는 반드시 타입을 선언해야 함
외부에서 선언된 변수를 ()여기 안에 쓸 수 없다.
for(String name : myNames) {
System.out.println(name);
}
for문을 for(name:myNames) 이런식으로 못적는다.
배열의 길이는 arr.length() 이렇게 안쓰고 arr.length로 쓴다
왜냐하면 배열의 길이는 불변하기 때문이다.
배열을 추가하거나 삭제할 수 없다.
수정만 가능
String 배열은 만들어질때 인덱스 하나하나마다 별도의 객체로 저장된다
String names = {"a","b","c"};
배열객체
인덱스 | 0 | 1 | 2 |
주소값 | 83 | 90 | 87 |
값 | a | b | c |
인덱스 0 1 2
주소값 83 90 87
값 a b c
따라서 문자열의 배열값을 비교할 때는 주소값을 비교하는 것이다.
기본타입은 그냥 값이 들어가는데 문자열의 배열은 하나하나 객체이다 !!
파라메터 값으로 . . . 변수이름쓰면 배열로 비슷하게 쓰이는데 값을 여러개 받고 싶을 때 쓴다.
public int sum1(int[] myValues) {
int sum = 0;
for(int i=0; i<myValues.length;i++) {
sum = sum + myValues[i];
}
return sum;
}
public int sum2(int ... myNums) {
int sum = 0;
for(int i=0; i<myNums.length;i++) {
sum = sum + myNums[i];
}
return sum;
}
실행메소드
public static void main(String[] args) {
Computer myComputer = new Computer();
int[] myValue1 = {10,20,30};
int result1 = myComputer.sum1(myValue1);
System.out.println("result1: " + result1);
System.out.println();
int result2 = myComputer.sum2(myValue1);
}
int result2 = myComputer.sum2(myValue1);
result2 = myComputer.sum2(10,20,30,40,50);
// int 배열이 아니라 int 타입으로 여러개의 값을 받겠다는 뜻임
'Development (국비 복습 ) > 자바' 카테고리의 다른 글
[2023-03-21]배열 중복값, (0) | 2023.03.21 |
---|---|
[2023-03-20]배열복사,다차원 배열,자바 문제 (0) | 2023.03.20 |
[2023-03-16]입력값을 받는 Scanner객체, String객체,Null (0) | 2023.03.16 |
[2023-03-15]for문 활용 (0) | 2023.03.15 |
[2023-03-14]연산자,캐스팅 (0) | 2023.03.14 |
댓글