JAVA

[JAVA] 형식화클래스 / Math 클래스의 메서드 / StringBuffer / StringTokenizer / 연산자 ==

sian han 2022. 3. 15. 22:18

 

※ 형식화클래스

 

▶ DecimalFormat

 - public final String format(double number)

 - 숫자를 형식화 하는데 사용됨

 - 숫자 format 변경

num=123456.723456;
		DecimalFormat df3 = new DecimalFormat("#,###");
		str = df3.format(num); 
		System.out.println("str="+str); //123,457

 

 

▶ SimpleDateFormat

  - public final String format(Date date)

  - 날짜(Date date) 를 형식화된 문자열로 변경해줌 (Date => 형식화문자열) 

Date today = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

  - yyyy-MM-dd E요일 // 2022-03-14 월요일

  - yyyy-MM-dd HH:mm:ss // 2022-03-14 22:16:25

 

 

  ▷ .parse (형식화문자열 => Date)

    - public Date parse(String source) throws ParseException

    - .parse 는 runtime exception아니기 때문에 예외처리를 해야한다

String str="2022-01-02";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date;
		try {
			date = sdf.parse(str);
            }catch (ParseException e) {
			e.printStackTrace();
		}

  - 사용자가입력한 날짜와 오늘 날짜 사이의 간격구하기 : Day24 > VarClass4

 


※ Math 클래스의 메서드

 

▶ Math 메서드 목록

 

▶abs()

System.out.println("abs(-27.5) : "+ Math.abs(-27.5)); // abs(-27.5) : 27.5​

▶ceil()

System.out.println("ceil(27.3):"+ Math.ceil(27.3)); // ceil(27.3):28.0

▶floor()

System.out.println("floor(27.6):"+ Math.floor(27.6)); //floor(27.6):27.0

▶Math.E

System.out.println("Math.E: "+ Math.E);

▶Math.PI

System.out.println("Math.PI: "+ Math.PI);

 

 


※ StringBuffer

 

String은 사실 ! 


    - 변경이 불가능한 문자열의 표현을 위한 클래스
    - 문자열을 더하거나 변경하면 새로운 String 객체가 생성되고, 기존 객체는버려짐

 

ex ) .concat() 

  - 두 문자열 결합 메서드

String str1 = "Happy";
		String str2 = "and";
		String str3 = "Smile";
		String str4 = str1.concat(str2).concat(str3);

 => 추가로 생성된 인스턴스의 개수 : 2개

 


    
그래서 나온것이 !  [StringBuffer / StringBuilder] 
    - 변경이 가능한 문자열의 표현을 위한 클래스

StringBuilder sb = new StringBuilder("AB");

△ 이렇게 StringBuilder 객체를 생성한 후에는 StringBuilder 의 메서드를 사용할 수 있다

 

 

 

▶ .append()

  - 문자열을 이어붙이는 메서드

sb.append(25);
sb.append('Y').append(true);

 = > AB25Ytrue

 

 

.append(int index, boolean)

.append(sb.length(), char ch)

sb.insert(2, false); // index 2에다가 false 넣어라
sb.insert(sb.length(), 'Z'); // 맨마지막에 Z 넣어라

  = > ABfalse25YtrueZ

 

 

 

[1] String 을 StringBuilder로

String str ="java";
StringBuilder sb = new StringBuilder(str);

 

 

[2] StringBuilder를 String으로

▷ toString ()

StringBuilder sb2 = new StringBuilder("안녕하세요");
String s = sb2.toString();

 

 

▶ 좀 신기한사실

  - 문자열이 동일한 경우에는 하나의 String 인스턴스만 생성해서 공유한다!

String str1="Hello";
String str2="Hello";

둘의 주소(str1 ==str2) 는 같다 ! 

문자열이 동일하기 때문에 하나의 인스턴스만을 생성해서 공유한것

 

 

But!

 - new 로 객체생성하면 인스턴스가 다르다.

String str4=new String("Hello");
String str5=new String("Hello");

  = > str4 != str5

 

 


 

※ StringTokenizer

   - 긴 문자열을 지정된 구분자를 기준으로 토큰이라는 여러 개의 작은 문자열로 잘라내는데 사용
   - 구분자로 단 하나의 문자 밖에 사용하지 못함
   - split() 과 유사

 

▷ 토큰화하기

String str = "100,200,300,400";
StringTokenizer st = new StringTokenizer(str,",");

▷ 출력하기

while(st.hasMoreTokens()) {
			String token = st.nextToken();
			System.out.println(token);
		}

 => 토큰화 ( 나누는 것 ) 부터 출력까지 split과 거의 비슷하다

 

 

 

▷ split() 과 비교

String str = "100,200,300,400";
String [] arr = str.split(",");

  => 한개의 구분자 " , " 를 이용했을 때 : 토큰화한것과 결과가 동일하다

 

str="x=100*(200+300)/2
StringTokenizer st2 = new StringTokenizer(str,"+-*/=()", true);

1. 여러개의 구분자를 이용했을 때 : 

       - StringTokenizer는 한문자의 구분자만 사용할 수 있기때문에 +-*/=() 전체가 하나의 구분자가 아니라,

         각각의 문자가 모두 구분자이다

       - 마지막에 True 사용 시 구분자도 토큰으로 간주하여 출력된다

x
=
100
*
(
200
+
300
)
/
2

 

2.  split()는 빈 문자열도 토큰으로 인식하는 반면
    StringTokenizer 는 빈 문자열을 토큰으로 인식하지 않기 때문에 인식하는 토큰의 개수가 서로 다름

 


※ 연산자 ==

 [1] 기본형에서는 이 같은지 비교
 [2] 참조형에서는 주소값을 비교

 

 

 String의 equals() 메서드


 - 문자열 값 Value 이 같은지 비교
 - Object의 equals()를 오버라이딩 한 것

public boolean equals(Object obj) { // equals 메서드 오버라이딩
		if(obj!=null && obj instanceof Person3) {
			Person3 p = (Person3)obj; //부모 (Object) 의 자식만의 멤버 id를 불러오기위해 다운캐스팅한것
			return id == p.id;
		}else {
			return false;
		}
        
main()
Person3 p1 = new Person3(9901071112222L);
Person3 p2 = new Person3(9901071112222L);

      if(p1.equals(p2)) { // 값비교(value) 
			System.out.println("p1,p2는 같은사람");
		}else {
			System.out.println("p1,p2는 다른사람");
		}

Person 으로 객체생성해서 넣은 괄호안의 값 () 을 비교한것이다.

p1 과 p2 의 값Value 는 같으니 결과는 p1,p2는 같은사람 이 출력된다

 

 

 

 Object의 equals()

 - 주소값을 비교

class Test{
	private int value;

	Test(int value){
		this.value = value;
	}
}

main()
Test t1= new Test(10);
		Test t2 = new Test(10);

		if(t1==t2) {
			System.out.println("t1,t2 의 주소가 같다");
		}else {
			System.out.println("t1,t2 의 주소가 다르다");
		}

  => t1,t2 주소가 다르다

       당연함 . 둘은 같은 값을 가진 String 이라서 한개의 인스턴스를 공유하고있어 주소가 같을것같지만

       객체생성을 해서 값이 넣어진것이기 때문에 다른 주소를 가지고있다.