티스토리 뷰

Object 클래스

-모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.

-notify() , wait() 등은 쓰레드와 관련된 메서드


equals(Object obj)

-객체 자신(this) 과 주어진 객체(obj)를 비교한다. 같으면 true 다르면 false.

-Object클래스의 equlas()는 객체의 주소를 비교(참조변수 값 비교)

-인스턴스 변수(iv)의값을 비교하도록 equals()를 오버라이딩해야 함.

public 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는 다릅니다.");
       }


    }
}
class Value {
    int value;

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

    //Object의 equals () 오버라이딩해서 주소비교가 아닌 인스턴스 값을 비교
    public boolean equals(Object obj) {

        // return this== obj; //주소비교. 서로 다른 객체는 항상 거짓
        //참조 변수의 형변환 전에는 반드시 instanceof로 확인해야함.

        Value v= (Value) obj;

        return  this.value== v.value;
    }
}

hashCode()

-객체의 해시코드(hash code)를 반환하는 메서드

-Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환

-equals()를 오버라이딩하면 , hashcode()도 오버라이딩해야한다.

-equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 떄문

 

toString(), toString()의 오버라이딩

-toString():객체를 문자열(String)으로 변환하기 위한 메서드

객체=='iv 집합' iv값을 문자열로 변환 한다는것과 같음

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;

    }
       //equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다.
    public int hashCode() {
        return Objects.hash(kind,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 class Ex9_4 {
    public static void main(String[] args) {
        Card c1= new Card("SPADE",7);
        Card c2= new Card("HEART",2);

        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c1.equals(c2);
        System.out.println(c1.hashCode());
        System.out.println(c2.hashCode());

    }
}

 

-equals(),hashCode()오버라이딩해서 같은 값일때 같은 주소를 반환 

-값이 다를때 다른 주소로 반환

 


String 클래스

-데이터(char[] + 메서드(문자열 관련)

-내용을 변경할 수없는 불변(immutable) 클래

-덧셈 연산자(+) 를 이용한 문자열 결합은 성능이 떨어짐

-문자열의 결합이나 변경이 잦다면 , 내용을 변경가능한 StringBuffer를 사용


문자열의 비교

String str="abc"; 와 String str= new String("abc"); 비교

String str="abc";  경우  여러 참조변수가 주소를 공유해서 값을 나타내줌(내용변경 불가라 여러 참조변수가 공유해도 문제없음)

String str= new String("abc"); 경우 각 항상 새로운 문자열이 만들어짐

문자열의 비교는 ==(주소비교)가 아닌  equals()를 이용해서 비교해야됨

 


문자열 리터럴 

-문자열 리터럴은 프로그램 실행시 자동으로 생성된다.(constant pool에 저장)

-같은 내용의 문자열 리터럴은 하나만 만들어진다.

 

 

빈문자열("", empty string)

-내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열

 String str= " ";

 

-크기가 0인 배열을 생성하는것은 어느 타입이나 가능

char[] chArr= new char[0];  //길이가 0인 char배열

int [] iArr= { };                      //길이가 0인 int 배열 

 

-문자(char)와 문자열(String)의 초기화

 


join() 과 StringJoiner

-join()은 여러 문자열 사이에 구분자를 넣어서 결합한다.

public class Ex9_10 {
    public static void main(String[] args) {
        int iVal=100;


        String strVal=iVal+""; //int를 String으로 변환하는 또 다른 방법
        double dVal=200.0;
        String strVal2= dVal+"";

        double sum= Integer.valueOf("+"+strVal) + Double.valueOf(strVal2);
        double sum2=Integer.valueOf(strVal)+ Double.valueOf(strVal2);

        System.out.println(String .join("",strVal,"+",strVal2,"=")+sum);//문자열을 숫자로 바꾸는 방법
        System.out.println(strVal+"+"+strVal2+"="+sum2);

    }
}

StringBuffer클래스

-String처럼 문자형 배열(char[])을 내부적으로 가지고있다.

-그러나 String과 달리 내용을 변경할수있다.

-배열은 길이 변경불가, 버퍼(배열)의 크기를 충분히 지정해주는 것이 좋다.

    (버퍼가 작으면 성능 저하 - 작업 중에 더 큰 배열의 생성이 필요)


StringBuffer의 변경

-String  과 달리 내용변경이 가능하다.

-append()는 지정된 내용을 StringBuffer에 추가 후  StringBuffer의 참조를 반환

-StringBuffer는 equals()가 오버라이딩 되어 있지 않다 (주소비교) 

Strng으로 변환 후에 equals()로 비교해야한다.

     StringBuffer sb= new StringBuffer("abc");
        StringBuffer sb2= new StringBuffer("abc");

        System.out.println(sb==sb2);         //false
        System.out.println(sb.equals(sb2));  //false
        
        
        String s= sb.toString();   //sb를 String 변환 
        String  s2= sb2.toString();
        System.out.println(s.equals(s2)); //true

 


StringBuilder 

- StringBuffer는 성능 저하 그래서 , 쓰레드의 동기화 뺀 StringBuilder 가 성능 향상 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하 이럴땐 StringBuffer 대신 StringBuilder를 사용하면 성능향상

String Buffer sb;
sb= new StringBuffer();
sb.append("abc");


StringBuilder sb;
sb= new StringBuilder();
sb.append("abc");

-StringBuffer도 충분히 성능이 좋기 때문에 성능향상이 반드시 필요한 경우를 제외하고는 기존에 작성한 코드에서 StringBuffer를 StringBuilder로 굳이 바꿀 필요없음


래퍼(Wrapper) 클래스

-8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스

public class Ex9_14 {
  public static void main(String[] args) {
    Integer i = new Integer(100);
    Integer i1 = new Integer(100);

    System.out.println("i==i1 ?"+(i==i1));
    System.out.println("i.equals(i1) ?"+i.equals(i1));
    System.out.println("i.compareTo(i1) ?"+i.compareTo(i1)); //값이 같으면 0 , 작으면 ㅣ 양수 크면 :음수
    System.out.println("i.toString()="+i.toString());

    System.out.println("MAX_VALUE="+Integer.MAX_VALUE);
    System.out.println("MIN_VALUE="+Integer.MIN_VALUE);
    System.out.println("SIZE="+Integer.SIZE);
    System.out.println("BYTES="+Integer.BYTES);
    System.out.println("TYPE="+Integer.TYPE);


  }
}


문자열을 숫자로 변환하기

int i= new Integer("100").intValue();
int i2= Integer.parsentInt("100");
Integer i3= Integer.valueOf("100");

n진법의 문자열을 숫자로 변환하는 방법

public class RoundTest {
  public static void main(String[] args) {

    System.out.println("i="+Integer.parseInt("100"));
    System.out.println("i="+Integer.parseInt("100",10));  //위와 동일

    System.out.println("i="+Integer.parseInt("100",2));    //2진수
    System.out.println("i="+Integer.parseInt("100",16));    //16진수


  }
}

오토박싱&언박싱(Auto Boxing & UnBoxing)

-JDK1.5이전에는 기본형과 참조형간의 연산이 불가능

int  i=5;
Integer iObj= new Integer(7);

int sum=i+iObj; //에러 기본형과 참조형 간의 덧셈불가(JDK1.5이전)

-컴파일러가 자동으로 Integer->int 로 바꿔줌

-기본형의 값을 객체로 자동변환하는 것을 오토박싱 ,그 반대는 언박싱

import java.util.ArrayList;
import java.util.Arrays;

public class EX9_15 {
  public static void main(String[] args) {

    ArrayList<Integer>  list=  new ArrayList<Integer>();
    list.add(new Integer(100));
    list.add(100);  //JDK1.5이전에는  에러


//    int i= list.get(0).intValue();//intValue()로 Integer를 int 반환

    int i = list.get(0);  //오토박싱으로 int 은 컴파일러가 자동으로 바꿔줌
  }
}
import java.util.ArrayList;
import java.util.Arrays;

public class EX9_15 {
  public static void main(String[] args) {

    int i =10;

    Integer intg=(Integer) i;
    Object obj =(Object) i;

    Long lng= 100L;
    int i2= intg + 10;
    long l= intg+lng;

    Integer intg2= new Integer(20);
    int i3= (int)  intg2;



  }
}

 

출처: 자바의 정석 저자:남궁성

'TIL > JAVA' 카테고리의 다른 글

Collections Framework(컬렉션 프레임웍)  (0) 2023.01.16
객체지향(OOP)인터페이스  (0) 2023.01.12
예외처리(Exception)  (0) 2023.01.11
객체지향(OOP)추상클래스(abstract class)  (0) 2023.01.11
객체지향(OOP)제어자  (0) 2023.01.11