Java lang 패키지

김정훈·2024년 4월 23일

Java

목록 보기
24/48

java.lang

  • 기본적으로 많이 사용하는 클래스들이 포함
    예) String
    java.lang.String
    컴파일러가 패키지명 바로 아래쪽 import java.lang.*; 추가
  • lang 패키지의 모든 클래스는 그냥 사용 가능

1. Object 클래스

  • 모든 클래스의 상위 클래스
  • 상속 명시 X -> extends java.lang.Object 가 추가(컴파일러)
  • Object 클래스에 정의된 메서드
package exam01;
import java.lang.*; //컴파일러가 자동 추가.

public class Book extends java.lang.Object { // extends java.lang.Object 자동추가
    private int isbn;
    private String title;
    private String author;

    public Book(int isbn, String title, String author) {
        this.isbn = isbn;
        this.title = title;
        this.author = author;
    }
}
public class Ex02 {
    public static void main(String[] args) {
        Object[] humans = new Object[2];
        humans[0]= new Human();
        humans[1]= new Tiger();
    }
}

다른클래스들을 묶는방법은 모든클래스들의 상위클래스인 Object로 묶으면 된다.

1) toString() 메서드

Class class : 클래스의 정보를 담고있음.

package exam01;
import java.lang.*; //컴파일러가 자동 추가.

public class Book extends java.lang.Object { // extends java.lang.Object 자동추가
    private int isbn;
    private String title;
    private String author;

    public Book(int isbn, String title, String author) {
        this.isbn = isbn;
        this.title = title;
        this.author = author;
    }
    
    @Override
    public String toString() { //toString() 재정의
        return "Book{" +
                "isbn=" + isbn +
                ", title='" + title + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}
  • getClass().getName() : 클래스명(패키지명을 포함한 전체 클래스명) - exam03.Book
  • Integer.toHexString(hashCode()) : 객체의 주소값을 16진수로 변환한 문자열
public String to String(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public class Book extends java.lang.Object{
}
public class Ex01 {
    public static void main(String[] args) {
        Book book = new Book();
        System.out.println(book); //book.toString();
    }
}

참고)

LocalDate : 내부에서 이미 재정의되어있는 클래스

2) equals() 메서드

== : 동일성비교(주소)
equals() : 동등성비교(재정의)

public boolean equals(Object obj){
	return(this == obj);
}
public class Ex03 {
    public static void main(String[] args) {
        Book b1 = new Book(1000,"책1","저자1");
        Book b2 = new Book(1000,"책1","저자1");
        System.out.printf("b1==b2 : %s%n",b1==b2);
        //flase
        System.out.printf("b1.equals(b2)",b1.equals(b2));
        //false
    }
}

str1과 str2 서로다른객체의 주소값을 참조하지만,
str1.equals(str2)true이 출력됨.
그이유는 String 클래스와 Integer 클래스에는 equals() 메서드가 이미 재정의 되어 있습니다.

  • Object의 equals() 메서드의 원래 기능은 두 인스턴스의 주소를 비교하는 것입니다. 같은 주소인 경우만 equals() 메서드의 결과가 true가 됩니다.
  • 두 인스턴스가 있을 때 ==는 단순히 물리적으로 같은 메모리 주소인지 여부를 확인할 수 있고, Object의 equals() 메서드는 재정의를 하여 논리적으로 같은 인스턴스인지(메모리 주소가 다르더라도 같은 학생인지) 확인하도록 구현할 수 있습니다.
public class Ex04 {
    public static void main(String[] args) {
        String str1 = new String("ABC");
        String str2 = new String("ABC");
        System.out.printf("str1==str2 : %s%n",str1 == str2);
        // >false
        System.out.printf("str1.equals(str2) : %s%n",str1.equals(str2));
        // >true
    }
}

3) hashCode() 메서드

  • 기본 구현 : 객체의 주소값

  • equals와 함께 동등성 비교를 위한 재정의

  • hash : 같은 값에 대해서 같은 값을 생성

  • 객체를 찾기 위한 값

  • 기본값은 유일한 값으로 쓰기 위한 객체의 주소값(System.identityHashCode(...))

public class Ex07 {
    public static void main(String[] args) {
        String str1 = new String("AAA");
        String str2 = new String("AAA");
        System.out.printf("str1.equals(str2) : %s%n",str1.equals(str2));
        System.out.printf("str1.hashCode : %s%n",str1.hashCode());
        System.out.printf("str2.hashCode : %s%n",str2.hashCode());
        //>str1.equals(str2) : true
		//>str1.hashCode : 64545
		//>str2.hashCode : 64545

    }
}
package exam01;

import java.util.HashSet;

public class Ex06 {
    public static void main(String[] args) {
        HashSet<Book> books = new HashSet<>();
        books.add(new Book(1000,"책1","저자1"));
        books.add(new Book(1000,"책1","저자1"));
        books.add(new Book(1000,"책2","저자1"));
        books.add(new Book(1000,"책3","저자1"));
        books.add(new Book(1000,"책4","저자1"));
        books.add(new Book(1000,"책5","저자1"));
        for(Book book: books){
            System.out.println(book);
            System.out.printf("str1.hashCode : %s%n",book.hashCode());
        }
    }
}

2. String 클래스

1) String을 선언하는 두 가지 방법

  • String str = "문자열";
    문자열은 힙영역의 문자열 상수 풀에 저장되어있다.
    리터럴 상수처럼 여러개 존재할 필요가 없기 떄문에 하나만 저장.
public class Ex02 {
    public static void main(String[] args) {
        String s1 = "ABC"; //힙영역 - 문자열 상수 풀
        String s2 = "ABC"; //힙영역 - 문자열 상수 풀
        System.out.printf("s1==s1 : %s%n",s1==s2);
        System.out.printf("s1의주소 : %s%n", System.identityHashCode(s1));
        System.out.printf("s2의주소 : %s%n", System.identityHashCode(s2));
    }
}
  • String str= new String("문자열");
package exam02;

public class Ex01 {
    public static void main(String[] args) {
        String s1 = new String("ABC");
        String s2 = new String("ABC");
        //서로 다른 객체 2개가 생성된다.
        System.out.printf("s1==s1 : %s%n",s1==s2);
        System.out.printf("s1의주소 : %s%n", System.identityHashCode(s1));
        System.out.printf("s2의주소 : %s%n", System.identityHashCode(s2));
    }
}

2) String 클래스의 final char[] 변수

final byte[ ] : 최근

  • 문자열은 불변하는 특징(final)

문자열을 값이 변경될때에는 변경된값이 힙에 새로운 주소로 저장되고, 참조변수는 새로운주소를 참조하게된다.(객체생성) 그리고 이전의 값은 아무도 참조하고있지 않기 떄문에 가비지콭렉터에 의해 삭제된다.

public class Ex03 {
    public static void main(String[] args) {
        String str = "ABC";
        System.out.printf("str 주소 : %d%n", System.identityHashCode(str));
        //>str 주소 : 1324119927
        str += "DEF";
        System.out.printf("str 주소 : %d%n", System.identityHashCode(str));
        //str 주소 : 189568618
    }
}

3) StringBuffer와 StringBuilder 클래스 활용하기

버퍼란?
Buffer : 임시 메모리

  • 문자열을 값이 변경될때에는 새로운 객체가 매번 생성되고 매번 삭제되기 떄문에, 성능저하를 야기한다. 이를 해결하기 위해 버퍼를 사용한다.
  • 문자열 가감이 많은 경우 사용함.

StringBuffer : 쓰레드 안전성(동시성 작업시 안전)
StringBuilder : 쓰레드 안전성 X(동시성 작업시 영향을 받는다.)

StringBuffer을 사용할경우 append메서드로 값을 더하더라도 객체의 주소값은 변경되지않는다.(새로운 객체 생성 X)
StringBuffer자료형 sb참조변수의 값을 toString()으로 String클래스 str에 넘겨주면 다른 객체가 생성된다.

public class Ex04 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(100); //매개변수가없으면 기본값 16byte로 설정
        sb.append("ABC");
        System.out.println(System.identityHashCode(sb));
        String str = sb.toString();
        System.out.println(System.identityHashCode(str));
        System.out.println(str);
    }
}

메서드 체이닝 의도

반환값이 this : 동일한 객체를 반환
반환값은 this로 StringBuffer 그 자체이다.
append는 반환값이 this로 StringBuffer객체 자신 그자체를 반환하기 떄문에 메서드체이닝을 의도 할 수있다.

public class Ex05 {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer(100);
        String str = sb.append("ABC").append("DEF").append("GHI").toString();//메서드체이닝
        /*
        StringBuffer sb2 = sb.append("ABC"); //반환값은 this로 StringBuffer그자체이다.
        StringBuffer sb3 = sb2.append("DEF"); 
        System.out.println(sb==sb2);
         */
    }
}

String 메서드

  • boolean endsWith(...) : 특정 문자열로 끝나는지 체크
  • boolean startsWith(...) : 특정 문자열로 시작하는지 체크
  • static join : 문자열을 연결
  • static format(..) : 형식화된 문자열로 출력
  • subString
  • empty : 여백 포함 X 체크
  • isBlack : 여백 포함 체크
  • indexOf : 왼쪽 → 오른쪽 검색
  • lastIndexOf : 오른쪽 → 왼쪽 검색
  • matches :
  • String strip() : 여백제거
    • String stripeLeading() : 앞쪽여백제거
    • String stripeTrailing() : 뒤쪽여백제거
  • subString
  • toCharArray() :
  • toLowerCase() : 소문자로 변환
  • toUpperCase() : 대문자로 변환
  • static valeOf() :

locale : 지역화

3. Wrapper 클래스

  • 기본 자료형을 위한 클래스
    • 정수 : byte, short, int, long
    • 실수 : float, double
    • 논리 : boolean
    • 문자 : char
  • 재료가 되는 값

1) Wrapper 클래스의 종류

기본 자료형의 값 → 기능X
기본 자료형에 기능을 주기 위해 Wrapper 클래스사용.

  • Wrapper : 기본 자료형의 값을 처리하는 편의 기능 클래스

    • Byte : byte

    • Short : short

    • Integer : int

    • Long : long

    • Float : float

    • Double : double

    • Boolean : boolean

    • Character : char

2) Integer 클래스

Integer 클래스의 메서드

  • static Integer parseInt : 문자열 숫자 → int기본형 숫자 변환
String str = "1000";
int num3 = Integer.parseInt(str);
  • static Integer valueOf(int i)
  • static Integer valueOf(String str)

값은 동일하지만 서로 다른 객체가 생성되었다 → 자원낭비

public class Ex02 {
    public static void main(String[] args) {
        Integer num1 = new Integer(10);
        Integer num2 = new Integer(10);
        System.out.printf("num1 주소 : %d%n",System.identityHashCode(num1));
        System.out.printf("num2 주소 : %d%n",System.identityHashCode(num2));
    }
}

자원낭비를 해결하기 위해 valueOf를 사용해서 객체를 생성하는것이 좋다. 값이 같으면 새로운 객체를 생성하지 않는다.
참고) valueof() 메서드 내부에 정의된 범위를 넘어서면 새로운 객체로 생성된다. ex)Integer num1 = Integer.valueOf(100000000;

public class Ex03 {
    public static void main(String[] args) {
        Integer num1 = Integer.valueOf(10);
        Integer num2 = Integer.valueOf(10);
        Integer num3 = 100 // Integer.valueof(100)
        System.out.printf("num1 주소 : %d%n",System.identityHashCode(num1));
        System.out.printf("num2 주소 : %d%n",System.identityHashCode(num2));
    }
}

3) 오토박싱과 언박싱

오토박싱

Integer num1 = 100;으로 해도 자동으로 valueOf(100)으로 오토박싱해준다.

public class Ex06 {
    public static void main(String[] args) {
        Integer num1 = 100; //Integer.valueOf(100)
        Integer num2 = 200;
    }
}

언박싱

연산은 기본 자료형만 가능한 연산, 같은 자료형끼리만 가능. 그러나, 객체도 연산이 가능하게할수있다. 그이유는 객체에서 자동으로 intValue()를 수행해준다.

public class Ex05 {
    public static void main(String[] args) {
        int num1 = 100;
        Integer num2 = Integer.valueOf(200);
        int result1 = num1 + num2; //num2.intValue()
        System.out.printf(result1);

    }
}

4. java.lang.Number

  • 매개변수의 자료형을 결정하지 못했을때 사용이 가능하다.
  • 매개변수의 자료형을 상황에 따라 변경이 가능하다.
public class Ex07 {
    public static void main(String[] args) {
        double result = add(10.0,10L);
        System.out.println(result);
    }
    public static double add(Number num1, Number num2){
        return num1.doubleValue() + num2.doubleValue();
    }
}

5. Class 클래스

클래스의 정보가 담겨 있는 객체가 자동 생성 - class 클래스 객체

1) Class 클래스를 선언하고 클래스 정보를 가져오는 방법

  1. 모든 클래스의 정적 변수 class
  2. Object 클래스의 정의된 getClass()

2) Class 클래스를 활용해 클래스 정보 알아보기

package exam03;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Ex08 extends java.lang.Object {
    public static void main(String[] args) {
        Class cls1 = Person.class;

        Field[] fields = cls1.getFields();
        Method[] methods = cls1.getMethods();
        Constructor[] constructors = cls1.getConstructors();

        System.out.println("----Fields----");
        for(Field field : fields){
            System.out.println(field); //field.toString();
        }
        System.out.println("----Method----");
        for(Method method : methods){
            System.out.println(method);//constructor.toString();
        }
        System.out.println("----Constructor----");
        for(Constructor constructor : constructors){
            System.out.println(constructor);//constructor.toString();
        }


        Person person = new Person();
        Class cls2 = person.getClass(); //클래스 내부에서 사용할 목적, 객체를 생성해야함.
    }
}

3) Class.forName()을 사용해 동적 로딩 하기

public class Ex09 {
    public static void main(String[] args) throws ClassNotFoundException
    {
        Class cls = Class.forName("exam03.Person");
    }
}
profile
안녕하세요!

0개의 댓글