본문 바로가기
Development (국비 복습 )/자바

[2023-03-17]NullPointException,String메소드,인코딩,배열

by Puddingforever 2023. 3. 17.

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 타입으로 여러개의 값을 받겠다는 뜻임

 

댓글