본문 바로가기
Backend

05월 31일 금 | OOP 12 - JAVA의 Wrapper클래스와 StringBuilder, StringBuffer, StringTokenizer, ObjectArray, Calendar

by 구라미 2019. 5. 31.

9. 객체지향 프로그래밍

String

지난 시간에 이어서 과제해보기.

 

연습문제 1)

파일명, 확장명을 분리해서 출력하시오.

파일명: 2019.05.30.sky

확장명: png

String filename = "d:/java0514/workspace/2019.05.30.sky.png";

 

- 지난 번 포스트 참조

https://seaweedisland.tistory.com/21?category=837825

 


Wrapper 클래스

기본 자료형을 참조형화 해놓은 클래스들

프로그램에 따라 기본형의 데이터를 객체로 취급해야하는 경우가 있다.

예로 메소드의 인수로 객체타입만 요구된다면, 기본형의 데이터를 그대로 사용할 수 없다.

이 때 기본형의 데이터를 먼저 객체로 변환한 후 작업해야한다.

 

주로 java.lang 패키지에 선언되어있음.

기본형: boolean, byte, int, long, float, double, char

이렇게 8개의 기본타입에 해당하는 데이터를 객체로 포장해주는 클래스를 래퍼 클래스라고 한다.

래퍼클래스는 각각 타입에 해당하는 데이터를 인자로 전달받아, 해당 값을 가지는 객체로 만들어 준다.

 

기본형 래퍼클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

*래퍼클래스 중에 Integer클래스와 Character클래스가 기본타입과 이름 다른 것 주의하기.

 

박싱과 언박싱

래퍼 클래스는 산술연산을 위해 정의된 클래스가 아니라서 인스턴스에 저장된 값을 변경할 수 없다.

값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조할 수 있다.

 

 

예제 1) Boolean

boolean flag = true;
//flag. ~ 으로 클래스 부르면 에러
//그래서 wrapper클래스로 박싱

Boolean b1 = new Boolean(true);
Boolean b2 = new Boolean("false"); //string으로 받을 수는 있지만 문자열인 true,false만 허용됨.
		
System.out.println(b1); //boolean형 true
System.out.println(b1.toString()); //String형 "true"
System.out.println(b2); //boolean형 false

 

예제 2) Integer

int a =3;
Integer inte1 = new Integer(5); //정수 5
Integer inte2 = new Integer("7"); //정수 7
		
System.out.println(inte1); // 정수 5
System.out.println(inte2.doubleValue()); // 7이라는 정수를 double형변환.

 

예제 3) 여러 Integer 클래스

System.out.println(Integer.toBinaryString(9)); //2진수 변환 후 String으로 변환.
System.out.println(Integer.toOctalString(9)); //8진수 변환 후 String으로 변환.
System.out.println(Integer.toHexString(9)); //16진수 변환 후 String으로 변환.
System.out.println(Integer.parseInt("9")); //String을 정수로 변환.
		
System.out.println(Integer.max(6,8)); //두 수 중 큰 값
System.out.println(Integer.min(6,8)); //두 수 중 작은 값

연습문제 1) d1과 d2의 합을 구하시오.

int hap = d1.intValue()+d2.intValue(); 
System.out.println(hap);

 

연습문제 2) 대소문자를 서로 바꾸어 출력하시오.

내 풀이

String str = "Gone With The Wind";
		
//1. character 클래스를 이용하려면 받아온 자료형이 char형이어야 한다.
//2. 문자열 str에서 char을 받아온다.
//3. char형 문자들의 대소문자를 바꾸고
//4. 바꾼 것들을 순서대로 출력한다.
		
		
for(a=0; a<str.length(); a++){
Character c1 = new Character(str.charAt(a)); 
	if(c1>='A'&& c1<='Z'){
		System.out.print(Character.toLowerCase(c1));
	}else {
		System.out.print(Character.toUpperCase(c1));
	}
}//for end

//gONE wITH tHE wIND

▶ 풀이

1. for문으로 문자열의 길이를 받아옴.

2. Character객체를 만들어주어야 str.charAt(a)로 문자를 넣어준다.

3. if문으로 객체c1에 담긴 A부터 B까지의 문자를 .toLowerCase로 소문자로 바꾸어주고

4. 해당사항 없는 것은 .toUpperCase로 대문자로 바꾸어준다. 

 

선생님 풀이■

for(int idx=0; idx<str.length(); idx++){
	char ch1 = str.charAt(idx);
	if(Character.isUpperCase(ch1)){
		System.out.print(Character.toLowerCase(ch1));
	}else if(Character.isLowerCase(ch1)){
		System.out.print(Character.toUpperCase(ch1));
	} else {
		System.out.print(ch1);
	}
}//for end

▶ 풀이

선생님은 우선 기본형 char ch1을 만들어서 나중에 조건문 안에서 Character 래퍼클래스를 만들었다.

이렇게 나중에 박싱해주어도 된다.

 

 

연습문제 3) 주민번호 각 숫자의 누적의 합을 구하시오.

선생님 풀이■

String jumin = "8912304123654";
		
int sum = 0;
for(int i=0; i<jumin.length(); i++){
	char ch2 = jumin.charAt(i);			
	sum = sum + Character.getNumericValue(ch2);
}
System.out.println(sum);

//48

▶ 풀이

Character.getNumericValue라는 함수로 계산한 경우이다.

 

StringBuilder

불변객체인 String과 다르게 StringBuilder는 String과 문자열을 더할 때 새로운 객체를 생성하는 것이 아닌,

기존의 데이터에 더하는 방식을 사용하기 때문에 String 보다 연산속도가 빠르다.

StringBuffer와 같은 역할을 한다. 그것을 대체할 수도 있다. 

차이점은 StringBuilder는 동시처리를 허용하지 않기 때문에 단일쓰레드 환경에서만 쓸 수 있다.

//StringBuilder		
str="";
System.out.println(str.length());
		
StringBuilder sb = new StringBuilder();
sb.append("one");
System.out.println(sb.toString());
sb.append("two");
System.out.println(sb.toString());
sb.append("three");
System.out.println(sb.toString());
			
//Delete (n~n) 지우자하는 값의 시작과 끝값
sb.delete(0,sb.length()); //length로 범위 지정할 수도 있음.
System.out.println(sb);

//StringBuffer는 위와 거의 같음

 

StringTokenizer

문자열을 분리해주는 클래스이다. 특정기호를 지정하거나, 공백으로 분리해준다.

긴 문자열을 지정된 구분자를 기준으로 문자열을 슬라이싱하는데 사용된다.

StringTokenizer의 경우 단 한개의 구분자를 사용해야한다는 단점 때문에 복잡한 형태의 구분자로

문자열을 나누어야한다면 Scanner나 split을 사용해야한다.

String str1 = "kim,lee,park";
String [] word = str1.split(",");
for(int i=0; i<word.length; i++){
	System.out.println(word[i]);
	
//1) 기호로 문자열 분리하기
String str2 = "Seoul,Jeju,Busan";
		// , 기호로 분리하기
StringTokenizer st = new StringTokenizer(str2,",");
while(st.hasMoreTokens()){ //토큰기호가 있는지 판별
	//토큰기호로 분리된 문자열 가져오기
	System.out.println(st.nextToken());
	//분리된 문자열 출력
}
		
//결과값
//Seoul
//Jeju
//Busan
		
//2) 공백으로 문자열 분리하기
String str3 = "this is a test";
//구분기호가 없는 경우 기본값은 공백
				
StringTokenizer word = new StringTokenizer(str3);
while(word.hasMoreTokens()){ //토큰기호가 있는지 판별
	//토큰기호로 분리된 문자열 가져오기
	System.out.println(word.nextToken());
	//분리된 문자열 출력
}
//결과값
//this
//is
//a
//test



StringTokenizer의 자주 쓰이는 생성자 및 메소드는

StringTokenizer(String str, String delim) 문자열을 구분자로 나누는 StringTokenizer를 생성한다.

int countTokens() - 전체 토큰의 수를 리턴

boolean hasMoreTokens() - 토큰이 남아있는지 알려줌

String nextToken() - 나눈 다음 토큰을 리턴

 

ObjectArray

객체도 배열로 만들 수 있다.

Object형태의 배열도 올 수 있음.

public class Test03_ObjectArray {

	public static void main(String[] args) {
		// 객체 배열
		
		Integer[] inte = { 
					new Integer(3),
					new Integer(5),
					new Integer(7),
					};
		
		for(int i=0; i<inte.length; i++){
			System.out.print(inte[i].toString()+" ");
		}//for end			
		
	}//main end
}//class end

 

ObjectArray의 객체교환

Sungjuk a = new Sungjuk("손흥민",10,40,70);
		Sungjuk b = new Sungjuk("박건우",20,40,80);
		Sungjuk c = new Sungjuk("양의지",30,60,90);
		
		a.disp();
		b.disp();
		c.disp();
	
		System.out.println("---------------------------------------------------");
		//a참조변수와 b참조변수가 가리키고 있는 객체를 서로 교환하시오.
		
		Sungjuk tmp = a;
		a = b;
		b = tmp;
		a.disp();
		b.disp();
		
		
		System.out.println("---------------------------------------------------");

		//Sungjuk [] sj = new Sungjuk[3];
		Sungjuk [] sj ={
				new Sungjuk("손흥민",10,40,70),
				new Sungjuk("박건우",20,40,80),
				new Sungjuk("양의지",30,60,90)			
				};
		
		System.out.println(sj.length);
		
		//sj[0]값과 sj[1] 값을 서로 교환하시오.
		Sungjuk tmp1 = sj[0];
		sj[0] = sj[2];
		sj[2] = tmp1;
		
		for(int idx=0; idx<sj.length; idx++){
			sj[idx].disp();
			
		}

 

 

Calendar

날짜와 시간을 받아오는 클래스이다.

월 표시할 때 주의하기.

Calendar now = Calendar.getInstance();
		
System.out.println(now.get(1)); //2019
System.out.println(now.get(2)); //4
System.out.println(now.get(2)+1); //5 <-현재 월
		
System.out.println(now.get(Calendar.YEAR));
System.out.println(now.get(Calendar.MONTH)+1);
System.out.println(now.get(Calendar.DATE));
		
System.out.println(now.get(Calendar.HOUR));
System.out.println(now.get(Calendar.MINUTE));
System.out.println(now.get(Calendar.SECOND));

 

 

 

 


<클래스 연습>

과제 1) 주민번호 유효성 검사하기.

//주민번호가 유효한지 검증
//유효하면 true 리턴.

 

1) Test05_Jumin

package oop0531;
import oop0531.Jumin;


public class Test05_Jumin {

	public static void main(String[] args) {
		//연습문제 1)
		//주민번호 유효성 검사 후
		//생년월일, 성별, 나이, 띠 출력하기
		
		Jumin id = new Jumin("*************");
		if(id.validate()){
			System.out.println("유효한 주민번호 입니다.");
			//id.disp();
		}else{
			System.out.println("유효하지 않은 주민번호 입니다.");
			//
		}			
		

	}//main end
}//class end

1) Jumin Class

package oop0531;
import oop0531.Test05_Jumin;;

public class Jumin {
	private String jumin; //주민번호
	
	public Jumin(){} //default constructor
	public Jumin(String jumin){
		this.jumin=jumin;
	}
	
	public boolean validate(){
		//주민번호가 유효한지 검증
		//유효하면 true 리턴.
		boolean flag = false;
		//flag = true , 여기에 주민번호가 유효하면 flag변수값을 true로 대입하시오.
		// 2 3 4 5 6 7 8 9 2 3 4 5 = 합계
		//합계/11 = 몫 ---2(나머지) , 11-2(나머지)
		//예를들면 나는 몫에서 나머지 뺀 값이 5여야한다.
		
		//1.주민번호의 문자열의 개별값을 가져온다.
		//2.개별 값을 순서대로 2 3 4 5 6 7 8 9 2 3 4 5을 곱해준다음 더해준다.
		//3.합계를 11로 나눈 나머지를 11-나머지 한 값이 문자열의 마지막 값과 일치한지 확인한다.
		//4.판별.
		//****** *******
		//System.out.println(jumin.charAt(0));
		
		int hap = 0;
		//int k =2;
		
		for(int i=0; i<jumin.length(); i++){			
			char ch = jumin.charAt(i);
		}
		
		String juNum = jumin.substring(0, 9);
		System.out.println(juNum);
		
		for(int i=0; i<juNum.length(); i++){
				hap = 0;
			char ch =juNum.charAt(i);
			for(int k=2; k<=9; k++){
				hap = hap + (Character.getNumericValue(ch)*k);
				System.out.println(hap);
			}
		}
	
	
		//	System.out.println(hap+hap1);		
			return flag;
		} //validate() end
	

		public void disp(){
			//2)
			//생년월일, 성별, 나이, 띠 출력하기
			//띠: 태어난년도%12 -> 나머지 0 원숭이 ->switch문 가져오기		
			
			} //disp() end
		}

 

 

 

 

댓글