참고

  • p.181~
  • EqualsTest01.java
  • EqualsTest02.java
  • FileEncodingTest.java
  • GetClassTest.java
  • JavaLangBasic.java
  • StringBufferTest.java
  • StringTest01.java
  • WrapperTest.java

java.lang패키지

  • java프로그래밍에서 기본적으로 필요한 클래스들을 모아놓은 패키지이다.
  • rt.jar - package - class
  • String, Object, System...

1. Object

  • Object클래스는 멤버변수없이 11개의 메서드로 되어 있다.

1) equals()

오버라이딩 하지 않고 쓸 때

  • EqualsTest01.java
  • 참조변수가 가르키는 주소를 비교한다.
public class EqualsTest01{
    public static void main(String[] args){
        Value v1 = new Value(50);
        Value v1 = new Value(50);
        
        System.out.println(v1 == v2); //false
        System.out.println(v1.equals(v2));//false -> 인자값: v2의 주소
    }
}

class Value{
    int value;
    Value(int value){
        this.value = value;
    }
}

오버라이딩 하고 쓸 때

  • EqualsTest02.java
  • 주소가 아닌 해당 인스턴스가 가지고 있는 값을 비교하게 하려면 equals()를 오버라이드 해야 한다.
  • equals()가 오버라이드 되어있는 클래스들 : String, File, Date...
    • 만약 equals()로 비교해서 true가 나온다면 이미 오버라이드 되있는 거겠지?
public class EqualsTest02{
    public static void main(String[] args){
        Person p1 = new Person(9411102123456L);
        Person p2 = new Person(9411102123456L);
        
        System.out.println(p1==p2); //false
        System.out.println(p1.equals(p2)); //true
        
        //String a = null;
        //System.out.println(a.equals("")); //참조연산자 .앞에는 null불가
        
        System.out.println(p1.toString());//Person [regNo=9411102123456]
        System.out.println(p1.hashCode());//주소값 16진수를 10진수(해시코드)로 변환
        System.out.println(p1.hashCode()==p2.hashCode()); //false
    }
}

class Person implements Serializable{ //GetClassTest에서 인터페이스 메서드 써보려고
    long regNo;
    
    Person(long regNo) {
        this.regNo = regNo;
    }
    
    @Override
    public boolean equals(Object obj){
        boolean result = false; //if 지역변수로 두면 사라짐
        if(obj instanceof Person && obj != null){//1.해당클래스 객체? 2. null아냐?
            result = this.regNo == ((Person)obj).regNo; //1.형변환 2. (), . 연산우선순위
        }
    }
    
    @Override
    public String toString(){
        return "Person [regNo=" + regNo + "]"; //alt+shift+s+s+enter
    }
}

2) hashCode()

  • 해시코드: 10진수로 이루어져 있다.
  • 객체의 주소에서 해시코드를 만들어 반환한다.
  • String클래스같은 문자열을 가지고 있다면 동일한 해시코드를 반환하게 만들어져있다. (= 주소가 같다)
  • 완벽하게 일치하는지? : 1. hashCode()로 주소 비교 2. equals()로 값 비교
  • 예시: 바로 위 예시

3) toString()

Object의 toString()

return getClass().getName()+"@"+Integer.toHexString(hashCode()); 

toString()을 오버라이딩 한 클래스들

  • String,...

---이아래부터다시

4) getClass()

  • GetClassTest.java
  • 클래스의 정보를 얻어올 때 사용한다.
  • 정보저장목적의 클래스 Class가 있다.

(1) 생성된 객체로부터 얻는 방법

  • 확실한편인데 4%의 사용률
Class re1 = new Person(23424L).getClass();
System.out.println(re1.getName()); //h_javalang.Person
System.out.println(Arrays.toString(re1.getInterfaces()));
//[interface java.io.Serializable]

(2) 클래스 리터럴로부터 얻는 방법 (사용률: 1%)

  • 사용률: 1%
  • 클래스 자체를 일반값(literal)으로 인지
Class re2 = Person.class;
System.out.println(re2.getName()); //h_javalang.Person
System.out.println(Arrays.toString(re2.getInterfaces()));
//[interface java.io.Serializable]

(3) 클래스명으로부터 얻는 방법 ★

  • 로드시킨 것 중에 Person가지고 왓
  • 패키지명.클래스명
  • 무언가를 문자열로 찾을 때오타 위험이 있으니 ClassNotFoundException이 나타날 위험을 인지
    • -> try-catch or 예외던지기 throws
Class re3 = Class.forName("h_javalang.Person"); //패키지명.클래스명
System.out.println(re3.getName()); //h_javalang.Person
System.out.println(Arrays.toString(re3.getInterfaces()));
//[interface java.io.Serializable]

2. String

  • 다른언어에서는 문자열을 char형 배열로 다룬다.
  • 하지만 java에서는 문자열을 다루는 String클래스를 제공한다.
  • 문자열을 합칠때는 합쳐진 문자열을 저장할 인스턴스가 생성된다.
  • 문자열의 비교 (StringTest01.java)
    • 문자열 리터럴을 만드는 방법
    • 객체의 생성자를 이용
//클래스가 다 로드가 되고나면 해당클래스 내에서 문자열 리터럴을 다 찾는다
//heap에 abc주소가 생성, abc가 로드, str1과 str2이 참조

String str1 = "abc";
String str2 = "abc";

System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
//true:같은문자열이면 동일 주소 참조

//str3,4에 담긴건 리터럴이 아닌 '주소'
String str3 = new String("abc"); 
String str4 = new String("abc");

System.out.println(str3 == str4); //false. str3,4에 담긴 것은 주소

System.out.println(str3.equals(str4));//true. 오버라이드: 문자열이 같으면 true반환
System.out.println(str3.equals(str2)); //true

1) 인코딩 변환

  • ★프로젝트 넘겨받을 때 필수확인
  • FileEncodingTest.java
  • 이클립스의 기본 인코딩 방식은 "MS949"
  • 한글 윈도우의 기본 인코딩 방식은 "CP949"
  • 우리가 사용하는 인코딩 방식은 "UTF-8"

MS949 vs. CP949 vs. UTF-8

public static void main(String[] args) throws UnsupportedEncodingException {
    String str = "가나";
    
    //문자를 입력할때 exception 발생가능성 염두
    //영문자는 인코딩방식과 전혀 문제가 되지 않는다.
    byte[] cpStr = str.getBytes("CP949");
    byte[] msStr = str.getBytes("MS949");
    byte[] utfStr = str.getBytes("UTF-8");
    
    System.out.println(Arrays.toString(cpStr));
    //[-80, -95, -77, -86]
    System.out.println(Arrays.toString(msStr));
    //[-80, -95, -77, -86]
    System.out.println(Arrays.toString(utfStr));
    //[-22, -80, -128, -21, -126, -104]
}

2) 문자열 format

기본형 타입 -> String 타입

  • (1) 빈 문자열을 더하는 방식
    • 가장 안 좋은 방식: 새로운 인스턴스가 생성되기때문에
int a = 10;
String b = a + "";
  • (2) valueOf 메서드 - 효율적
String b = String.valueOf(a);

String 타입 -> 기본형 타입

  • (1) wrapper 클래스를 이용하는 방식
    • wrapper: 클래스명이 아닌 기본형8가지클래스를 통칭하는 용어
String b = "123";
int c = Integer.parseInt(b); // ★ b ="sdb" -> 예외발생 -> try-catch
int c = Integer.valueOf(b); // byte,long 관계없이 valueOf 사용
  • (2) wrapper 클래스의 진수
String b = "234";
int c = Integer.parseInt(b,8); // b = 8진수 -> c = 234를 10진수로 바꾼 형태

StringBuffer, StringBuilder

  • StringBufferTest.java
  • 문자열 합치기 효율적으로 하는 방법!
  • Buffer: 동기화 보장, 멀티쓰레드에서 안전
  • Builder: 동기화 보장하지 않기 때문에 Buffer보다 더 빠름
/*
String str = "a"; 
str += "a";
str += "a";
str += "a";
str += "a";
str += "a";

위의 식이 아래와 같이 실행되는 것
String str = "a";
str = new StringBuffer(str).append("a").toString();
//1. new StringBuffer(str): "a"를 가지고있는 Stringbuffer객체가 생김
//2. .append("a"): "a"를 추가
//3. .toString(): StringBuffer를 String으로 변환
이 짓을 30000번해야한다면? 객체가 3만개, 메소드가 3만번실행..
*/

String str = "a";
long start = System.currentTimeMillis();
for (int i = 0; i <300000; i++){
	str += "a";
}
long end = System.currentTimeMillis();
System.out.println(end-start);


StringBuilder sb = new StringBuilder("a");
long start = System.currentTimeMillis();
for (int i = 0; i < 300000000; i++) {
	sb.append("a");
}
long end = System.currentTimeMillis();
System.out.println(end-start);

Wrapper

  • '자바는 모든 것을 객체로 다루어야 한다.' 는 논리에 입각
  • Auto-Boxing : 기본형타입 -> wrapper클래스
  • Unboxing : wrapper클래스 -> 기본형타입
profile
갈 길이 멀다

0개의 댓글