Post

[JAVA] java.lang 패키지

java.lang 패키지

  • 자바 프로그래밍에 필요한 기본 클래스를 제공
  • java.lang 패키지에 존재하는 클래스를 사용할 때는 import 문이 필요 없음
  • 주요 클래스
    • Object
    • String, StringBuffer
    • Process, Thread
    • Exception, Throwable, Error
    • System, Package, Class, Math
    • 포장 클래스
      • Number, Integer, Double, Character, Boolean 등

Object 클래스

  • 자동으로 모든 클래스의 조상이 되는 클래스
  • 클래스 계층 구조에서 루트가 되는 클래스
  • 모든 클래스는 자동으로 Object 클래스를 상속받음

주요 메소드

  • protected Object clone()
    • 객체를 복제하여 반환
  • public boolean equals(Object obj)
    • 같은 객체인지 참조값으로 비교
  • public int hashCode()
    • 객체를 식별하는 정수값을 반환
  • public String toString()
    • 객체를 문자열로 반환

toString() 메소드

  • 객체를 문자열로 표현하여 반환함
    • 클래스 이름@16진수 해시코드로 표현
  • 문자열의 + 연산 또는 System.out.print()등에서 필요
  • 자식 클래스에서 재정의할 수 있음
    • String, Integer 클래스 등에서 재정의되어 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MyClass1 {}
class MyClass2 extends Object {
  public String toString() {
    return "This is MyClass2 class";
  }
}

public class Main {
  public static void main(String args[]) {
    MyClass1 my_class1 = new MyClass1();
    MyClass2 my_class2 = new MyClass2();
    System.out.println(my_class1.toString()); // MyClass@3d012ddd
    System.out.println(my_class2.toString()); // This is MyClass2 class
    System.out.println(my_class1); // MyClass@3d012ddd
    System.out.println(my_class2); // This is MyClass2 class
  }
}

equals() 메소드

  • 두 객체 변수를 비교해서 변수가 가리키는 객체의 참조값이 같을 때 true를 반환
  • obj1.equals(obj2)의 결과는 obj1 == obj2와 같음
  • 자식 클래스에서 재정의할 수 있음
    • String, Integer 클래스 등에서 재정의되어 있음
1
2
3
4
5
6
7
8
9
10
11
12
Integer x = Integer.valueOf(5);
Integer y = Integer.valueOf(10);
Integer a = 5;
Short b = 5;

System.out.println(x.equals(y)); // false
System.out.println(x.equals(a)); // true
System.out.println(x.equals(b)); // false

System.out.println(x == y); // false
System.out.println(x == a); // true
System.out.println(x == b); // 컴파일 오류

clone() 메소드

  • 객체를 복제하여 리턴함
  • Cloneable 인터페이스를 구현한 클래스의 객체만 clone 메소드를 호출할 수 있음
    • Cloneable 인터페이스를 구현한 클래스가 아니면 CloneNotSupportedException 예외 처리를 해야 함
1
2
3
4
5
6
Box b1 = new Box(20, 30);
Box b2 = (Box) b1.clone();
System.out.println(b2.width()); // 20
System.out.println(b2.height()); // 30
System.out.println(b1); // Box@626b2d4a
System.out.println(b2); // Box@5e91993f

getClass() 메소드

  • 현재 객체의 유형, 즉 클래스 정보를 가진 Class를 리턴함
  • Class 클래스는 클래스의 정보 확인을 위한 메소드를 제공
    • getName, getSuperclass, getDeclaredFields, getDeclaredMethods 등
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Box box = new Box(20, 30);
Class c = box.getClass();
String class_name = c.getName();
String super_class = c.getSuperclass().getName();
Field []fields = c.getDeclaredFields();
Method []methods = c.getDeclaredMethods();

System.out.println(class_name); // Box
System.out.println(super_class); // java.lang.Object
for(int i = 0; i < fields.length; i++) {
  System.out.println(fields[i]); // Box.width // Box.height
}
for(int i = 0; i < methods.length; i++) {
  System.out.println(methods[i]); // Box.width() // Box.height()
}

String 클래스

  • 문자열을 표현하고 처리하기 위한 클래스
    • String s1 = new String("Java"); // 객체를 생성
  • String 클래스는 기본 자료형처럼 사용될 수 있음
    • String s2 = "Java"; // 리터럴을 대입
  • 같은 리터럴은 1개만 만들어져 공유됨
    • System.out.pringln(s1.equals(s2)); // true
  • String 객체는 내용이 변하지 않는 immutable 상수 객체

생성자

  • Stirng()
    • 빈 문자열 객체 생성
  • String(String original)
  • String(char[] value)
  • String(char[] value, int offset, int count)
    • offset 위치부터 count 개수만큼 문자열을 가져옴

문자열 비교 메소드

메소드설명
int compareTo(String anotherString)두 문자열이 같으면 0을 리턴하고, 다르면 0이 아닌 정수값을 리턴
int compareToIgnoreCase(String anotherString)대소문자를 무시하고 비교
boolean equals(Object anObject)두 문자열이 같으면 true를 리턴하고, 다르면 false를 리턴
boolean equalsIgnoreCase(String anotherString)대소문자를 무시하고 비교
1
2
3
4
5
6
7
String s1 = "Java";
String s2 = new String("java");

System.out.println(s1.compareTo(s2)); // -32
System.out.println(s1.compareToIgnoreCase(s2)); // 0
System.out.println(s1.equals(s2)); // false
System.out.println(s1.equalsIgnoreCase(s2)); // true

문자열 검색 메소드

메소드설명
int indexOf(String str)처음 위치부터 문자열 str을 찾아 처음 등장하는 위치(인덱스)를 리턴하고, 없으면 -1을 리턴
int indexOf(String str, int fromIndex)fromIndex 위치부터 문자열 str을 찾아 처음 등장하는 위치(인덱스)를 리턴하고, 없으면 -1을 리턴
int lastIndexOf(String str)마지막 위치부터 앞 방향으로 문자열 str을 찾아 처음 등장하는 위치(인덱스)를 리턴하고, 없으면 -1을 리턴
int lastIndexOf(String str, int fromIndex)fromIndex 위치부터 앞 방향으로 문자열 str을 찾아 처음 등장하는 위치(인덱스)를 리턴하고, 없으면 -1을 리턴
1
2
3
4
5
6
String s1 = "Java";

System.out.println(s1.indexOf('a')); // 1
System.out.println(s1.indexOf('a', 2)); // 3
System.out.println(s1.lastIndexOf('a')); // 3
System.out.println(s1.lastIndexOf('a', 2)); // 1

문자열 추출 메소드

메소드설명
int charAt(int index)index 의치에 있는 문자를 리턴
String substring(int start)start 위치부터 마지막까지의 문자열을 리턴
String substring(int start, int end)start 위치부터 (end-1) 위치까지의 문자열을 리턴
1
2
3
4
5
String s1 = "Java";

System.out.println(s1.charAt(2)); // v
System.out.println(s1.substring(2)); // v
System.out.println(s1.substring(2, 4)); // va

문자열 변환 메소드

  • 원본 문자열을 변경되지 않고, 새로운 객체가 만들어짐
메소드설명
String replace(char oldChar, char newChar)oldChar 문자를 newChar 문자로 변환하여 리턴
String trim()문자열 앞과 뒤에 나오는 화이트 스페이스 문자를 제거하여 리턴
String toUpperCase()모든 문자를 대문자로 변환하여 리턴
String toLowerCase()모든 문자를 소문자로 변환하여 리턴
String concat(String str)문자열 뒤에 str을 연결하여 리턴
1
2
3
4
5
6
7
String s1 = " Java ";

System.out.println(s1.replace('a', 'o')); // " Jovo "
System.out.println(s1.trim()); // "Java"
System.out.println(s1.toUpperCase()); // " JAVA "
System.out.println(s1.toLowerCase()); // " java "
System.out.println(s1.concat("programming")); // " Java programming"

valueOf() 메소드

  • 다른 자료형을 문자열로 변환하는 메소드
  • 자료형이 객체인 경우 해당 객체의 toString() 메소드 호출
  • null인 경우 문자열 “null”을 반환
1
2
3
4
5
6
7
8
System.out.println(String.valueOf(123)); // "123"
System.out.println(String.valueOf(5 > 3)); // "true"
System.out.println(String.valueOf(3.0)); // "3.0"
System.out.println(String.valueOf('c')); // "c"
int[] a = new int[5];
System.out.println(String.valueOf(a)); // "[I@7de26db8"
char[] b = { 'J', 'a', 'v', 'a' };
System.out.println(String.valueOf(b)); // "Java"

기타 메소드

메소드설명
boolean startsWith(String prefix)문자열이 prefix로 시작하면 true를 리턴
boolean endsWith(String suffix)문자열이 suffix로 끝나면 true를 리턴
char[] toCharArray()문자열을 배열로 변환하여 리턴

String 클래스의 문제점

  • 문자열을 빈번하게 변경하는 경우 메모리 낭비 문제가 있음
  • 기존 객체는 놔둔 채 새로운 String 객체가 계속 생성되어 실행이 느려짐
  • 자주 변경되는 문자열을 다루어야 할 경우에는 String 클래스보다 StringBuffer나 StringBuilder 클래스를 사용하는 것이 보다 효율적임
    • StringBuffer 클래스는 동시성 제어 기능 때문에 StringBuilder 클래스보다는 약간 느림

StringBuffer 클래스

  • 객체 생성 이후 문자열을 변경할 수 있는 mutable 클래스
  • 내부적으로 문자열을 저장하기 위해 크기가 조절되는 버퍼를 사용함

생성자

  • StringBuffer()
    • 초기 버퍼의 크기는 16
  • StringBuffer(int length)
    • 초기 버퍼의 크기는 length
  • StringBuffer(String str)
    • 초기 버퍼의 크기는 (str의 길이+16)

주요 메소드

메소드설명
int capacity()버퍼의 크기를 리턴
int length()문자열의 길이를 리턴
char charAt(int index)index 위치의 문자를 리턴
int indexOf(String str)str로 시작하는 첫 위치를 리턴
String substring(int start, int end)start 위치부터 (end-1) 위치까지의 문자열을 리턴
StringBuffer append(char c)문자열 뒤에 c를 추가한 StringBuffer 객체를 리턴
StringBuffer delete(int start, int end)start 위치에서 (end-1) 위치까지의 문자열을 삭제
StringBuffer insert(int offset, String s)offset 위치부터 s를 삽입
StringBuffer replace(int start, int end, String s)start 위치부터 (end-1) 위치까지의 문자열을 s로 교체
StringBuffer reverse()문자열을 역순으로 변경
1
2
3
4
5
StringBuffer s1 = new StringBuffer("start");
System.out.println(s1.capacity()); // 21
System.out.println(s1.length()); // 5
System.out.println(s1.insert(2, 'n')); // stnart
System.out.println(s1.reverse()); // trants

포장 클래스

  • 기본형을 참조형으로 표현하기 위한 클래스
  • 기본형과 상응하는 객체 사이의 형변환(박싱 또는 언박싱) 기능 제공
  • 기본형과 String 사이의 형변환 기능 제공
  • 사용 목적
    • 메소드의 인자로 객체가 필요할 때
    • Number의 자식 포장 클래스가 제공하는 상수를 사용할 때
      • Integer.MIN_VALUE, Integer.MAX_VALUE 등
    • 클래스가 제공하는 다양한 메소드를 사용할 때
구분기본형참조형
정수형byteByte
 shortShort
 intInteger
 longLong
실수형floatFloat
 doubleDouble
문자형charCharacter
논리형booleanBoolean

박싱

  • 기본형 데이터를 포장 클래스의 객체로 변환
    • ex) double 값을 Double 객체로 변환
  • 포장 클래스의 valueOf() 메소드를 사용
  • 자동 박싱
    • 기본형에서 포장 클래스의 객체로 자동 변환되는 것
    • 인자에 전달되거나 변수에 대입될 때 적용됨
1
2
3
Double radius = new Double(2.59); // 생성자 방식. 옛날 방식
Double radius2 = Double.valueOf(10.4);
Double radius3 = 2.59; // 자동 박싱

언박싱

  • 포장 클래스의 객체를 기본형 데이터로 변환하는 것
  • 포장 클래스의 기본형Value() 메소드를 사용
  • 자동 언박싱
    • 포장 클래스의 객체에서 기본형으로 자동 변환되는 것
    • 인자에 전달되거나 변수에 대입될 때 적용됨
1
2
3
4
Double radius = 2.59;
double r = radius.doubleValue();
double r2 = Integer.valueOf(3) % 2;
double r3 = radius; // 자동 언박싱

Number 클래스

  • 숫자를 표현하는 포장 클래스인 Byte, Short, Integer, Long, Float, Double의 추상 부모 클래스

Number의 자식 클래스에서 구현된 주요 메소드 (예: Double 클래스)

메소드설명
double doubleValue()Double 객체를 double 값으로 변환 (언박싱)
String toString()Double 객체를 String으로 변환
static Double valueOf(double)double 값을 Double 객체로 변환 (박싱)
static Double valueOf(String)String 값을 Double 객체로 변환
static String toString(double)double 값을 String으로 변환
static double parseDouble(String)String 값을 double 값으로 변환

String과 기본형 데이터 간의 변환

  • String을 int(또는 long)형으로 변환하는 경우
    • 포장클래스.parse포장클래스(값) 사용
    • int n = Integer.parseInt('123');
    • long n = Long.parseLong('123');
  • int(또는 long)형을 String으로 변환하는 경우
    • 포장클래스.toString(값) 혹은 String.valueOf(값) 사용
    • String s1 = Integer.toString(4);
    • String s2 = Long.toString(5l);
    • String s3 = String.valueOf(123);

System 클래스

  • Java 플랫폼 및 시스템과 관련된 기능 제공
  • 모든 멤버는 static이므로 사용할 때 객체를 생성할 필요 없음

주요 기능

  • 표준 입출력 객체를 제공
  • JVM 또는 운영체제 속성과 시스템 환경 변수의 사용과 제어
  • 배열 복사, 시간 조회
  • 프로그램의 제어 등

System 클래스의 표준 입출력 필드

  • System.in
    • 표준 입력 스트림으로 InputStream 유형
    • 키보드로부터 입력을 받을 때 사용
    • ex) System.in.read(): 키보드로부터 1바이트 문자를 입력 받음
  • System.out
    • 표준 출력 스트림으로 PrintStream 유형
    • 화면에 데이터를 출력할 때 사용
  • System.err
    • 표준 에러 출력 스트림으로 PrintStream 유형
    • 오류 메시지를 화면에 출력할 때 사용
This post is licensed under CC BY 4.0 by the author.