728x90
★ hashCode()
  => 객체의 해시코드를 반환하는 메서드
  => Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
  => equals() 를 오버라이딩 하면 hashCode() 도 오버라이딩 해야 한다. 
     equsls() 결과가 true인 두 객체의 해시코드는 같아야 한다.( 주소 때문 )

★ clone() 
   => 객체 자신의 복사본을 반환한다.

★ getClass()
   => 객체 자신의 클래스 정보를 담고있는 class 인스턴스를 반환

★ equals( Object obj )
   => 문자열 비교는 항상 equals 이용한다.
   => 객체 자신과 객체 obj를 비교한다.
   => Object 클래스의 equals()는 객체의 주소를 비교한다.

★ toString()
   => 원형 :: getClass().getName() + '@' + Integer.toHexString(hashCode())
   => 객체를 문자열로 변환하는 메서드 
   => 주로 오버라이딩 한뒤 사용한다.
class Ex9_1 {
	public static void main(String[] args) {
		Value v1 = new Value(10);
		Value v2 = new Value(10);

		if (v1.equals(v2))
			System.out.println("v1과 v2는 같습니다.");
		else
			System.out.println("v1과 v2는 다릅니다.");
	} // main
} 

class Value {
	int value;

	Value(int value) {
		this.value = value;
	}
	
	public boolean equals( Object obj ) {
		//return this == obj ::  주소 비교 , 서로다른 객체는 항상 거짓
		// 참조변수의 형변환 전에는 반드시 instanceof 로 확인 해야 한다.
		if ( !(obj instanceof Value) ) { return false;	}

		Value v = (Value)obj; //obj를 Value로 형변환
		return this.value == v.value;
      //return value == ((Value)obj).value; 변경 가능.
	}
}
import java.util.Objects;

class Card {
	String kind;
	int number;

	Card() {
		this("SPADE", 1);
	}

	Card(String kind, int number) {
		this.kind = kind;
		this.number = number;
	}
	
//	public String toString() {
//		return "kind: " + kind + ", number: " + number;
//	}
	
	public boolean equals(Object obj) {
		if(!(obj instanceof Card)) { return false; }		
		Card c = (Card)obj;
		return this.kind.equals(c.kind) && this.number == c.number;
	}
	
	public int hashCode() {
		return Objects.hash(kind , number);
	}
	
}

class Ex9_4 {
	public static void main(String[] args) {
		Card c1 = new Card();
		Card c2 = new Card();

		System.out.println(c1.toString());  :: Card@92282b5d
		System.out.println(c2.toString());  :: Card@92282b5d
		System.out.println(c1.equals(c2));  :: true
	}
}
 
★ 문자열 초기화
  String s = "";
  char c = ' ';

★ 문자열 결합
  => + 를 이용한 결합은 성능이 떨어짐 
  => join 이용하기 
       String s = String.join("*" , str1 , "+" , str2)  결과 : str1 * + * str2
       String s = String.join("" , str1 , "+" , str2)   결과 : str1 + str2
  => 잦은 변경 또는 결합이 있어야 하는경우 StringBuffer를 이용 

★ StringBuilder
    => StringBuffer는 동기화 되어 있다. 멀티 쓰레드에 안전하다.
    => 멀티 쓰레드 프로그램이 아닌경우 불필요한 성능 => StringBuilder 사용
    StringBuffer sb = new StringBuffer(); 
    StringBuilder sb = new StringBuilder();

★ String 으로 형변환
  => String s = str + "" ;
  => String s = String.valueOf( str );
  => String s = str.toString();

★ String => int bool ... 등 으로 형변환
  => Integer i2 = Integer.valueOf( String s );  :: 문자열 => 래퍼클래스
  => int i2 = Integer.parseInt( String s );     :: 문자열 -> 기본형
  => boolean i2 = Boolean.parseBoolean( String s );
  => byte i2 = Byte.parseByte( String s );

★ n진법 문자열을 숫자로 변환
  => int i = Integer.praseInt("100" , 2 ); :: 2진수
  => int i = Integer.praseInt("100" , 8 ); :: 8진수
  => int i = Integer.praseInt("100" , 16 ); :: 16진수
  => int i = Integer.praseInt("FF" , 16 ); :: 16진수

★ 오토박싱 , 언박싱
  * 기본형과 참조형의 형변환은 불가능 하지만 컴파일러가 형변환을 가능하게 한다.
   int => Integer :: 오토박싱 (Integer)i
   Integer => int :: 언박싱  valueOf(); intValue();

   int i = 5; :: 기본형
   Integer obj = new Integer(7); :: 참조형

   int sum = i + obj.intValue();  :: 컴파일된 코드
   int sum = i + obj ( ok )

★ 형식화 클래스
  1. DecimalFormat 숫자 <=> 문자
  double number = 1.11;
  DecimalFormat df = new DecimalFormat("#.#E0");
     a. String result = dr.format(number); 
     b. Number num = df.parse("1,234,567.89"); :: Number 타입은 모든 숫자의 조상
        double d = num.doubleValue();  :: 콤마가 들어가 있어도 가능

  2. SimpleDateFormat 날짜, 시간을 다양한 형식으로 표현
  Date today = new Date();
  SimpleDateFormat df = nes SimpleDateFormat("yyyy-MM-dd");
  String result = df.format(today); :: yyyy-MM-dd 형태로 출력

  DateFormat df = nes SimpleDateFormat("yyyy년 MM월 dd일");
  DateFormat df2 = nes SimpleDateFormat("yyyy/MM/dd");
  Date d = df.parse("2021년 11월 11일");
  String result = df2.format(d); :: yyyy/MM/dd 로 변경됨
  ## ===================================================== ## 
	Date today = new Date();
	SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
	SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;

	sdf1 = new SimpleDateFormat("yyyy-MM-dd");
	sdf2 = new SimpleDateFormat("''yy년 MMM dd일 E요일");
	sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
	sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");

	sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날입니다.");
	sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날입니다.");
	sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 주입니다.");
	sdf8 = new SimpleDateFormat("오늘은 이 달의 W번째 주입니다.");
	sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째 E요일입니다.");
	System.out.println(sdf5.format(today));	// format(Date d)
 
String( char[] value )

char[] c = { 'H' , 'e' , 'l' };
char[] => String :: String s = new String(c);
char[] <= String :: char[] c = s.toCharArray();
String( StringBuffer buf )
StringBuffer sb = new StringBuffer(sb);
String s = new String(sb);
(동기화 되어있다) 쓰레드에 안전한다.
StringBuffer sb = new StringBuffer(); :: 16개문자를 담을 수 있는 StringBuffer 인스턴스 생성
StringBuffer sb = new StringBuffer(10); :: 10개문자를 담을 수 있는 인스턴스 생성


1.배열은 길이 변경 불가능하여 공간이 부족하면 새로운 배열 생성해야 한다.
따라서 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다.
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = sb.append("zz"); // ok


2. equals() 가 오버라이딩 되어 있지 않아서 주소를 비교한다.
System.out.println( sb == sb2); :: false
System.out.println( sb.equals( sb2) ); :: false


String s = sb.toString(); :: String 으로 변환후 비교해야 한다.
String s2 = sb2.toString();
System.out.println( sb.equals( sb2) ); :: true
sb. append("qbc"); // 문자열 추가
sb.capacity(); // 버퍼크기를 알려준다. StringBuffer sb = new StringBuffer(10) => 버퍼크기 10
sb.length(); // 문자열 길이 알려준다.
sb.charAt(2); // 지정된 위치 index 에 있는 문자 반환
sb.delete( start , end ); // 시작위치 ~ 끝위치 사이 문자 제거( begin ≤ X < end )
sb.deleteCharAt( index ); // 지정된 위치의 문자를 제거한다.
sb.insert( position , 11 ); // 11 을 지정된 위치 position 에 추가한다.( int, boolean 등 모두 추가 가능 )
sb.replace( start , end , str ); // ( begin ≤ X < end )사이의 문자를 str 문자열로 변경한다.
StringBuffer sb = new StringBuffer("0123456"); > sb.replace( 3, 6 , "AB" ); > 012AB6
sb.reverse(); // 저장된 문자열의 순서를 뒤집기
sb.setCharAt( index , char ); // 지정된 위치의 문자를 주어진 문자로 바꾼다.
sb.setLength(10); // 지정된 길이로 문자열 길이를 변경한다, 나머지 공간은 null로 채워진다. "0123 "
sb.toString(); // 인스턴스의 문자열을 String으로 반환
sb.substring( start , end ); // 문자열 자르기( begin ≤ X < end )
char charAt( int index )
String s = "Hello";
char c = s.charAt(1); :: e
int compareTo( String str )
문자열str 과 사전순서로 비교하고
같으면0
이전이면 음수,
이후면 양수 반환
int i = "aaa".compareTo("aaa"); :: i = 0
int i2 = "aaa".compareTo("bbb"); :: i2 = -1
int i3 = "bbb".compareTo("aaa"); :: i3 = 1
String conat( String str )
문자열을 덧붙인다.
String s = str.concat(" world");
boolean contains( CharSequence s )
문자열 s 가 포함된지 검사
boolean b = s.contains("bc")
boolean endsWith( String s )
지정된 문자열로 끝나는지 검사
boolean b = s.endsWith("txt");
boolean startWith( String prefix )
주어진 문자열을 prefix로 시작하는지 검사
boolean b = s.startWith(("txt");
boolean equalsIgnoreCase( String str )
대소문자 구분없이 비교
str.equalsIgnoreCase("hello");
int indexOf( str )
문자 str이 위치한 index 알려준다
못찾으면 -1 반환, inedx 는 0부터 시작
int indexOf( str , int position )
str이 위치한곳을 position 부터 확인하여 알려준다.
int idx = str.indexOf( 'e' , 2 );
int laseIndexOf( str )
str 을 문자열의 오른쪽 끝에서 부터 찾아서 index를 알려준다.
String s = "java.lang.test";
int idx = s.lastIndexOf("."); // 9
int length()
문자열의 길이 반환
str.length();
String replace( char old , char nw )
문자열중에 old를 nw로 변환하여 반환
정규표현식 사용이 불가능
String s = str.replace("하" , "호");
String replaceAll( String regex , String rep )
문자열중에 regex를 rep로 변환하여 반환
정규표현식 사용이 가능
String s = str.replace("[abc]" , "호");
String replaceFirst( String regex , String rep )
문자열중에 첫번째 것만 regex를 rep로
변환하여 반환
String[] split( String regex )
문자열을 지정된 분리자로 나누어 배열에 담아 반환
String[] arr = str.split(",");
String[] split( String regex , int limit )
문자열을 지정된 분리자로 나누어 배열에 담아 반환
단, 문자열 전체를 지정된 수로 자른다.
String[] arr = str.split("," , 2);
join
배열의 문자열을 char 로 결합
+ 로 문자 결합하는것보다 속도가 빠르다.


=> String s = str.join( "-" , arr );
=> String s = String.join("*" , str1 , "+" , str2)
결과 : str1 * + * str2
String substring( int begin )
String substring( int begin , int end)
시작위치 부터 끝 위치 범위에 포함된 문자열을 얻는다. begin ≤ X < end
String toLowerCase()
소문자로 변환
String s = str.toLowerCase();
String toUpperCase()
대문자로 변환
String s = str.toUpperCase();
String trim()
String s = str.trim();
static String valueOf( ..... )
static String valueOf( Object obj )
지정된 값을 문자열로 변환하여 반환
String b = String.valueOf( true );
String b = String.valueOf( 100L );
String b = String.valueOf( 'a' );

★ Math 클래스

 

Math.abs( -10.0 );
절대값 반환
Math.ceil( 10.8 );
올림
Math.floor( 10.8 );
버림
Math.max( 9,5 , 9.50001 );
두 값중 큰값 반환
Math.min( 9,5 , 9.50001 );
두 값중 작은값 반환
Math.round(1.2);


Math.round( 90.7552 * 100 ) / 100.0 :: 90.76
System.out.printf( "%4.2f " , sum);
반올림
Math.rint( 1.2 );
가장 가까운 정수를 double 형태로 반환
1.6 => 2 , 1.5 => 1

★ 날짜와 시간
  => java.util.Date 
  => java.util.Calendar ( JDK 1.1 )
  => java.time  ( JDK 1.8  / 8 )

  * Calendar ( 추상클래스 )
    Calendar cal = Calendar.getInstance();
    int thisYear = cal.get( Calendar.YEAR ); //올해
    int lastDayOfMonth = cal.getActualMaximum( Calendar.DATE ); //이달의 마지막날

    Calendar date1 = Calendar.getInstance();
    date1.set( 2021 , 7 , 15 );  :: 2021년 8월 15일
    date1.set( Calendar.YEAR , 2021 );
   
    date1.clear(); :: 모든 필드 초기화 1970년 1월 1일 00:00:00
    date1.clear( Calendar.SECOND ); :: 특정필드(초) 를 초기화
    date1.add( Calendar.DATE , 1);  :: 날짜 +1 , 다른 필드에 영향을 줌(31->1 , month +1)
    date1.roll( Calendar.DATE , 1);  :: 날짜 +1 , 다른필드에 영향 없음(31->1 , month 유지)
  
  * time
   LocalDate currentDate = LocalDate.now();    
   // 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴한다. 결과 : 2016-04-01 
   LocalDate targetDate = LocalDate.of(int year, int month, int dayOfMonth); 
   // 파라미터로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴한다. 결과 : 1986-11-22
 
 

Calendar

public class CalTest { 
    :: 두 날짜 차이 비교 
    :: diff 함수를 쓰면 밀리초 때문에 정확한 계산 불가능

	public static void main(String[] args) throws ParseException {
		Calendar getToday = Calendar.getInstance();
		getToday.setTime(new Date()); //금일 날짜
		
		String s_date = "2020-03-01";
		Date date = new SimpleDateFormat("yyyy-MM-dd").parse(s_date);
		Calendar cmpDate = Calendar.getInstance();
		cmpDate.setTime(date); //특정 일자
		
		long diffSec = (getToday.getTimeInMillis() - cmpDate.getTimeInMillis()) / 1000;
		long diffDays = diffSec / (24*60*60); //일자수 차이
		
		System.out.println(diffSec + "초 차이");
		System.out.println(diffDays + "일 차이");
	}
}
 
import java.util.*; 

class Ex10_5 {  // 달력 그리기
	public static void main(String[] args) { 
		if(args.length !=2) { 
			System.out.println("Usage : java Ex10_5 2019 9"); 
			return; 
		} 
		int year  = Integer.parseInt(args[0]); 
		int month = Integer.parseInt(args[1]); 
		int START_DAY_OF_WEEK = 0; 
		int END_DAY = 0; 

		Calendar sDay = Calendar.getInstance(); // 시작일 
		Calendar eDay = Calendar.getInstance(); // 끝일 

		// 월의 경우 0부터 11까지의 값을 가지므로 1을 빼주어야 한다. 
		// 예를 들어, 2019년 11월 1일은 sDay.set(2019, 10, 1);과 같이 해줘야 한다. 
  		sDay.set(year, month-1, 1);       
		eDay.set(year, month, 1); 

		// 다음달의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막 날(11월 30일)이 된다. 
		eDay.add(Calendar.DATE, -1);       

		// 첫 번째 요일이 무슨 요일인지 알아낸다. 
		START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK); 

		// eDay에 지정된 날짜를 얻어온다. 
		END_DAY = eDay.get(Calendar.DATE); 

		System.out.println("      " + args[0] +"년 " + args[1] +"월"); 
		System.out.println(" SU MO TU WE TH FR SA"); 

		// 해당 월의 1일이 어느 요일인지에 따라서 공백을 출력한다. 
		// 만일 1일이 수요일이라면 공백을 세 번 찍는다.(일요일부터 시작) 
		for(int i=1; i < START_DAY_OF_WEEK; i++)  
			System.out.print("   "); 
            
		for(int i=1, n=START_DAY_OF_WEEK ; i <= END_DAY; i++, n++) { 
			System.out.print((i < 10)? "  "+i : " "+i ); 
			if(n%7==0) System.out.println(); 
		} 
	} 
}
 
package com.fastB.ch2;
import java.util.Calendar;

// 년월일을 입력하면 요일을 알려주는 프로그램
public class YoilTeller {

	public static void main(String[] args) {
		
		String year = args[0];
		String month = args[1];
		String day = args[2];
		
		int yyyy = Integer.parseInt(year);
		int mm = Integer.parseInt(month);
		int dd = Integer.parseInt(day);
		
		// 작업
		Calendar cal = Calendar.getInstance();
		cal.set(yyyy, mm-1 , dd);
		
		int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
		char yoil = "일월화수목금토".charAt(dayOfWeek-1);
		
		//출력
		System.out.println(year + "년 " + month + "월 " + day + "일은");
		System.out.println(yoil + "요일입니다.");
	}
}
 

 

 

 

728x90

+ Recent posts