Java) Java 기초 복습(2) Object,String,Wrapper class

[클래스]

1. Java. lang 패키지

-> java.lang 패키지는 Import없이 사용가능한 기본이되는 가장 중요한 패키지

1)Object 클래스

-> 모든 클래스의 최상의 클래스(java.lang.Object 클래스)

-> 모든 클래스는 Object 클래스에서 상속 받고, Object 클래스의 메서드 사용 가능

-> Object 클래스 메서드 종류

-> toString() 메서드 :객체 자신의 정보를 문자열로 반환(클래스 이름과 해시값 나옴->함수 재정의하여 의미있는 값 나오도록)

@Override
public String toString() {
	return super.toString();
    //return "나이는 :" + age;	처럼 나이가 나오도록 함수 재정의 
}

-> String 클래스의 toString() = String 인스턴스가 갖고 있는 문자열 반환하도록 오버라이딩 되어 있다.
-> equals() 메서드 : equals(Object obj) 객체 자신과 객체 obj가 같은 객체인지 판단
-> *==과 같이 equals()연산도 내부적으로 주소값을 비교 But, String클래스에서는 equals()를 재정의해 내용을 비교한다.

 public boolean equals(Object obj){
	//매개변수 obj가 Student클래스면 자신의 이름과 비교
	if(!(obj instanceof Student)){
    	return false;
     }
        
    if(Name.equals(((Student)obj).Name)){
    	return true;
    }
    else
    {return false;}
    

-> hashCode() 메서드 : 객체 자신의 해시코드를 반환 -> 두 객체가 동일 객체인지 비교
-> 서로 다른 String 객체도 문자열이 같으면 hashCode 같다.
-> clone() 메서드 : 객체 자신의 복사본(새로운 인스턴스) 반환 --> 오버라이딩 해서 사용
-> Object 메소드가 아니라 Cloneable 인터페이스의 추상메소드 따라서, implements Cloneable 인터페이스 구현 필요
->예외처리 필수

    try{
	return (Member) super.clone();
    } catch(CloneNotSupportedException e) {
    	return null;
    }
    

2)String 클래스

->한번 생성된 string값은 불변. 따라서 두 개 문자열 연결 -> 새로운 인스턴스를 생성하는 것

메소드의미
int length()문자열의 길이를 반환
char charAt(int i)문자열에서 i번째 문자를 반환
byte[] getBytes()현재의 문자열을 바이트 배열로
boolean equals(Object str)현재의 문자열과 str로 지정된 문자열 비교
boolean equalsIgnoreCase(String str)현재의 문자열과 str로 지정된 문자열 비교 (대소문자 무시)
int compareTo(String str)두 개의 문자열을 비교하여 결과를 정수로 반환
String trim()문자열의 앞 뒤 공백을 제거
static String valueOf(double num)num을 문자열로 변환하여 반환
staitc String valueOf(char chars[])문자 배열을 문자열로 변환하여 반환
String toLowerCase() / String toUpperCase()문자열을 모두 소문자/대문자로 변환하여 반환
String substring(int startIndex)startIndex로부터 시작하는 부분 문자열을 반환
String substring(int startIndex, int endIndex)startIndex와 endIndex 사이의 부분 문자열을 반환
String replace(char original, char replacement)original로 지정된 문자를 replacement로 지정된 문자로 대치

-> StringBuffer & StringBuilder 클래스 -> 기존의 String 클래스 한계 극복 위해서 ```java public final class StringBuffer implements java.io.Serializable { private char[] value; ... } ```

-> String클래스는 Immutable(불변)이므로 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만, StringBuffer클래스는 가능하다.

-> 내부적으로 문자열 편집을 위한 buffer를 가지고 있으며, StringBuffer 인스턴스를 생성할 때 그 크기를 지정할 수 있다.

-> buffer의 크기를 지정하지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼 생성

1) StringBuilder 클래스 : 문자열 변경 시 추가 메모리 생성 없이 기존 문자열 확장하는 클래스 but, 멀티쓰레드 환경 X

 class Main{
	public static void main(String[] args) throws Exception{
    	StringBuilder sb = new StringBuilder("test");	//StringBuilder sb 선언
        System.out.println(sb +" "+ System.identityHashCode(sb));	//문자열sb가 할당된 메모리 주소 출력
        sb.append("2")	//문자열 추가
        sb.append("3")
        System.out.println(sb +" "+ System.identityHashCode(sb));	//문자열sb가 할당된 메모리 주소 출력
        String temp= sb.toString();	//StringBuilder 클래스를 String 클래스로 변환
        }}
        
        결과
        test 4242
        test23 4242  -> 문자열이 변경되어도 문자열 주소가 변경되지 않았다.

2)StringBuffer 클래스 : 멀티쓰레드 환경에서도 사용 가능

->String 클래스 객체 선언 방법
1) 스트링 리터럴로 직접 넣기
String str1 ="hi there"; -> 하나의 데이터 공유 따라서, 변경 불가 String str2 ="hi there";​


2) new + 생성자

```java
	String str3 = new String("hi there");
	String str4 = new String("hi there");
	-> 각자 자신의 메모리 공간을 할당 받아 사용
```

Wrapper 클래스

-> 프리미티브(기본) 타입 변 데이터를 객체로 표현하기 위해 포장해 주는 클래스 (포장=boxing)

Primitive Data Type (기본 타입)Wrapper Class
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean

->wrapper class 인스턴스에 저장된 값을 변경할 수 없다. (산술 연산을 위한 클래스가 아니기 때문이다.)
->Boxing : 기본 타입의 데이터를 -> wrapper class의 인스턴스로 변환하는 과정

Integer num = new Integer(1);// Integer num = 1; auto boxing
UnBoxing : wrapper class의 인스턴스에 저장된 값을 -> 기본 타입의 데이터로 꺼내는 과정
int n = num.intValue();// int n= num;  auto unboxing

->Wrapper Class 비교연산
-wrapper class의 비교연산은 AutoUnBoxing에 가능하다.
-인스턴스에 저장된 값에 대한 동등 여부 판단은 동등 연산자 ==으로 불가능하다. -> wrapper class 객체의 주소값을 비교한다.
-equals()메소드를 통해 가능하다.

 Integer num = new Integer(10); //래퍼 클래스1
	Integer num2 = new Integer(10); //래퍼 클래스2
	int i = 10; //기본타입
		 
	System.out.println("래퍼클래스 == 기본타입 : "+(num == i)); //true
	 System.out.println("래퍼클래스.equals(기본타입) : "+num.equals(i)); 	//true
	System.out.println("래퍼클래스 == 래퍼클래스 : "+(num == num2)); 		//false 객체의 주소값 비교하므로
	 System.out.println("래퍼클래스.equals(래퍼클래스) : 					"+num.equals(num2)); //true​

Parse 메소드, valueOf 메소드
-Integer.parseInt(arg) = 문자열을 분석하여 리턴 타입이 기본 타입으로
ex) Boolean.parseBoolean("true") =true // 대소문자 상관 없이 true 문자열만 true 나머지는 false

-Integer.valueOf(arg) = 문자열을 분석하여 리턴 타입이 Wrapper 클래스 타입으로

4)Class 클래스

->getClass() =class 객체 얻기 , 해당 클래스로 객체를 생성하는 경우에 사용 가능

Class clasis = obj.getClass();

->forName() = 클래스 전체 이름을 파라미터로 받고 class 객체 얻기 . 객체 생성 전 직접 class 객처 얻을 수 있다.

//Class.forName() 메소드는 클래스 찾지 못하여 경우 대비 예외 처리 필요
try {
	Class clasis = Class.forName(String className);
    } catch(ClassNotFoundException e) {}

좋은 웹페이지 즐겨찾기