Home [Java 프로그래밍] 8강 - java.lang 패키지
Post
Cancel

[Java 프로그래밍] 8강 - java.lang 패키지

💡해당 게시글은 방송통신대학교 김희천 교수님의 'Java 프로그래밍' 강의를 개인 공부 목적으로 메모하였습니다.



학습 목차


  1. Object 클래스
  2. String 클래스
  3. StringBuffer 클래스
  4. 포장 클래스
  5. System 클래스

학습 개요


  • java.lang 패키지에 존재하는 기본 클래스에 관해 살펴봄
  • 모든 클래스의 조상 클래스인 Object 클래스와 문자열을 표현하는 String 클래스를 학습
  • StringBuffer 클래스의 용도와 기본형을 참조형으로 표현하고자 할 때 필요한 포장 클래스 학습
  • 표준 입 출력 스트림 클래스를 제공하는 System 클래스 학습

학습 목표


  1. Object 클래스가 제공하는 메소드의 기능 이해
  2. String과 StringBuffer 클래스를 적절히 사용 가능
  3. 기본형, 문자열 및 포장 클래스 간의 형변환 방법을 이해
  4. System 클래스 사용 가능

1. Object 클래스


1-1. java.lang 패키지

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

1-2. Object 클래스와 주요 메소드

  • 자동으로 모든 클래스의 조상이 되는 클래스
    • 클래스 계층 구조에서 루트가 되는 클래스
    • 모든 클래스는 자동으로 Object 클래스 상속받음
  • 주요 메소드
    • protected Object clone( )
      • 객체를 복제하여 반환
    • public boolean equals(Object obj)
    • public int hashCode( )
      • 객체를 식별하는 정수값을 반환
    • public String toString( )

1-3. String toString( ) 메소드

  • 객체의 문자열 표현 반환
    • 클래스이름@16진수해시코드로 표현문
  • 문자열의 + 연산, System.out.print( ) 등에서 필요함
  • 자식 클래스에서 재정의할 수 있음
    • String, Integer 클래스 등에서 재정의되어 있음
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
        class MyClass1 { }
              
        class MyClass2 extends Object {
            public String toString( ) { return "This MyClass2 class"; }
        }
      
        public class MyClass3 {
            public static void main(String args[]) {
                MyClass1 my_class1 = new MyClass1( );
                MyClass2 my_class2 = new MyClass2( );
      
                System.out.println(my_class1);
                System.out.println(my_class2);
      
            }
        }
      
        // 출력 결과 
        // MyClass1@762efe5d
        // This MyClass2 class
      

1-4. booleanequals(Object obj) 메소드

  • 두 객체 변수를 비교해서 두 변수의 참조 값이 같을 때 true를 반환
  • Object 클래스에서 equals()의 의미
    • obj1.equals(obj2)의 결과는 (obj1==obj2)
  • 자식 클래스에 재정의 가능
    • String, Integer 클래스 등에서 재정의 되어있음
      1
      2
      3
      4
      
        Integer x = new Integer(5);
        Integer y = new Integer(10);
        Integer z = 5; 
        Short a = 5;
      
      1
      2
      3
      4
      5
      
        System.out.println(x.equals(y)); // false
        System.out.println(x.equals(z)); // true
        System.out.println(x.equals(a)); // false
        System.out.println(x==y); // false
        System.out.println(x==z); // false
      

1-5. Object clone() 메소드

  • 객체를 복제하여 리턴
  • Cloneable 인터페이스를 구현한 클래스의 객체만 clone() 메소드 호출 가능 image
    • 예외(CloneNotSupportedException) 처리 필요
  • Object clone() 메소드 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      class Box implements Cloneable {
          private int width, height;
    
          public Box(int w, int h) {
              width=w; 
              height=h;
      }
          public int width( ) { return width; }
          public int height( ) { return height; }
          public Object clone( ) {
              try {
                  return super.clone( );
              } catch (CloneNotSupportedException e) {
                  return null;
              }
          }
      }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
      public class CloneTest {
          public static void main(String args[ ]) {
              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);
              System.out.println(b2);
          }
      }
    
      // 20
      // 30
      // Box@28a418fc
      // Box@5305068a
    



2. String 클래스


2-1. String 클래스와 생성자

  • 문자열을 표현하고 처리하기 위한 클래스
  • 기본 자료형처럼 다룰 수 있음
    1
    
      String s1 = "Java"; //리터럴을 대입
    
    • 같은 리터럴은 1개만 만들어져 공유
  • String 객체는 내용이 변하지 않는(immutable) 상수 객체
  • 생성자
    • public String( )
      • 빈 문자열 객체 생성
    • public String(String original)
    • public String(char[ ] value)
    • public String(char[ ] value, int offset, int count)

2-2. 문자열의 비교 메소드

  • int compareTo(String anotherString)
    • 같으면 0을 리턴하고, 다르면 0이 아닌 정수값을 리턴함
  • int compareToIgnoreCase(String anotherString)
  • boolean equals(Object anObject)
    • 문자열이 같으면 true를 리턴하고, 다르면 false를 리턴함
  • boolean equalsIgnoreCase(String anotherString)
    1
    2
    3
    4
    
      String s1 = "Java";
      String s2 = "Java";
      String s3 = new String("Java");
      String s4 = new String("Java");
    

2-3. 문자열의 검색 메소드

  • indexOf 메소드
    1
    2
    
      int indexOf(String str), int indexOf(String str, int fromIndex)
      System.out.println("hamburger".indexOf("urge"));
    
    • 처음 위치부터 문자열 str을 찾아 처음 등장하는 위치(인덱스)를 리턴, 없으면 -1을 리턴
  • lastIndexOf 메소드
    1
    
      int lastIndexOf(String str), int lastIndexOf(String str, int fromIndex)
    
    • 마지막 위치부터 앞 방향으로 찾음

2-4. 문자열의 추출 메소드

  • charAt 메소드
    1
    
      char charAt(int index)
    
    • index 위치에 있는 문자를 리턴한다.
  • substring 메소드
    1
    2
    
      String substring(int beginIndex)
      System.out.println("hamburger".substring(3));
    
    • beginIndex 위치부터 마지막까지의 문자열을 리턴함
  • substring 메소드
    1
    
      String substring(int beginIndex, int endIndex)
    
    • beginIndex 위치부터 (endIndex-1)까지의 문자열을 리턴함

2-5. 문자열의 변환 메소드

  • 원본 문자열은 변경되지 않고 새로운 객체가 만들어짐
  • replace 메소드
    1
    
      String replace(char oldChar, char newChar)
    
    • oldChar 문자를 newChar 문자로 변환하여 리턴함
  • trim 메소드
    1
    
      String trim( )
    
    • 문자열 앞과 뒤에 나오는 화이트 스페이스 문자를 제거하여 리턴함
  • toUpperCase 메소드
    1
    
      String toUpperCase( )
    
  • toLowerCase 메소드
    1
    
      String toLowerCase( )
    
  • concat 메소드
    1
    
      String concat(String str)
    
    • 두 문자열을 연결함

2-6. 다른자료형을 문자열로 변환하는 메소드

  • valueOf 메소드
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
      public class TransformData {
          public static void main(String args[ ]) {
              System.out.println(String.valueOf(123));
              System.out.println(String.valueOf(5 > 3));
              System.out.println(String.valueOf(3.0));
              System.out.println(String.valueOf('c'));
    
              char[ ] a = {'J', 'a', 'v', 'a'};
    
              System.out.println(String.valueOf(a));
          }
      }
    
      // 123
      // true
      // 3.0
      // c
      // Java
    

2-7. 기타 메소드

  • startsWith 메소드
    1
    
      boolean startsWith(String prefix)
    
    • prefix로 시작하면 true를 리턴함
  • endsWith 메소드
    1
    
      boolean endsWith(String suffix)
    
    • suffix로 끝나면 true를 리턴
  • toCharArray 메소드
    1
    
      char[ ] toCharArray( )
    



3. StringBuffer 클래스


3-1. StringBuffer 클래스와 생성자

  • 객체 생성 이후 문자열을 수정할 수 있는 기능을 제공
    • StringBuffer는 내용 변경이 가능한 mutable 클래스
  • 내부적으로 문자열을 저장하기 위해 크기가 조절되는 버퍼를 사용함
  • 생성자
    1
    
      StringBuffer( ) // 초기 버퍼의 크기는 16
    
    1
    
      StringBuffer(int length)
    
    1
    
      StringBuffer(String str) // 초기 버퍼의 크기는 (str의 길이+16)
    

3-2. 주요 메소드

  • capacity, length 메소드
    1
    
      int capacity( ), int length( )
    
  • charAt, indexOf 메소드
    1
    
      char charAt(int index), int indexOf(String str)
    
  • substring 메소드
    1
    
      String substring(int start, int end)
    
  • append 메소드
    1
    
      StringBuffer append(char c)
    
    1
    2
    3
    4
    
      StringBuffer s1 = new StringBuffer("start");
      System.out.println(s1.capacity( ));
      System.out.println(s1.length( ));
      System.out.println(s1.append("le" )); //"startle"
    
    • 인자를 String 표현으로 바꾸고 원 문자열 끝에 추가하여 반환
    • 인자는 char[ ], Object, String, 기본 자료형도 가능
  • delete 메소드
    1
    
      StringBuffer delete(int start, int end)
    
    • start 위치에서 (end-1)까지의 문자열을 삭제
  • insert 메소드
    1
    
      StringBuffer insert(int offset, String s)
    
    • offset 위치부터 s를 삽입
  • replace 메소드
    1
    
      StringBuffer replace(int start, int end, String s)
    
    • start 위치부터 (end-1)까지의 문자열을 s로 교체
  • reverse 메소드
    1
    
      StringBuffer reverse( )
    
    • 문자열을 역순으로 변경

3-3. String 클래스를 사용할 때의 문제점

  • 문자열을 빈번하게 변경하는 프로그램
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
      public class StringTest {
          public static void main(String args[ ]) {
              final String aValue = "abcde";
              String str = new String( );
    
              for (int i = 0; i < 1000; i++)
                  str = str + aValue;
              System.out.println(str);
          }
      }
    
    • String은 immutable 클래스
    • 기존 String 객체는 놔둔 채 새로운 String 객체가 계속 생성

3-4. StringBuffer와 StringBuilder의 사용

  • StringBufferStringBuilder 사용
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
      public class StringTest2 {
          public static void main(String args[]) {
              final String tmp = "abcde"; long start, end;
    
              String str = new String( );
              StringBuffer sb1 = new StringBuffer( );
              StringBuilder sb2 = new StringBuilder( );
    
              start = System.nanoTime( );
              for(int i = 0; i < 10000; i++) str = str + tmp;
              end = System.nanoTime( );
              System.out.println((end-start)/1000000.0 +" msecs");
    
              start = System.nanoTime( );
              for(int i = 0; i < 10000; i++) sb1.append(tmp);
              end = System.nanoTime( );
              System.out.println((end-start)/1000000.0 +" msecs");
    
              start = System.nanoTime();
              for(int i = 0;i < 10000; i++) sb2.append(tmp);
              end = System.nanoTime();
              System.out.println((end-start)/1000000.0 +" msecs");
          }
      }
    
      // 402.328576 msecs
      // 0.79763 msecs
      // 0.416001 msecs
    



4. 포장 클래스


4-1. 포장 클래스

  • 기본형을 참조형으로 표현하기 위한 클래스
    • 기본형의 값을 가지고 객체로 포장(boxing)
    구분정수형정수형정수형정수형실수형실수형문자형논리형
    기본형byteshortintlongfloatdoublecharboolean
    참조형ByteShortIntegerLongFloatDoubleCharacterBoolean
  • 사용 목적
    • 메소드의 인자로 객체가 필요할 때
    • 클래스가 제공하는 상수를 사용할 때
      • Integer.MIN_VALUE, Integer.MAX_VALUE
    • 클래스가 제공하는 다양한 메소드를 사용할 때

4-2. Number 클래스

  • NumberByte, Short, Integer, Long, Float, Double의 추상 부모 클래스
  • Number의 자식 클래스에서 구현된 주요 메소드
    • byte byteValue( ), short shortValue( ), …
      • 객체를 해당 기본형의 숫자로 변환(unboxing)
    • int compareTo(Byte anotherByte), …
      • this와 인자를 비교하여 같으면 0을 리턴
    • boolean equals(Object obj)
      • 같은 유형이고, 값이 같으면 true를 리턴

4-3. String과 기본형 데이터 간의 변환

  • 포장 클래스가 제공하는 static 메소드를 사용
    1
    2
    
      int n = Interger.parseInt("123");
      long l = Long.parseLong("1234");
    
  • Stringint(또는 long)형으로 변환할 때
  • int 형(또는 long)을 String 형으로 변환
    1
    2
    3
    
      String s1 = Integer.toString(4);
      String s2 = Long.toString(5);
      String s3 = String.valueOf(123);
    

4-4. Integer 클래스

  • Integer, String, int 사이의 변환 기능을 제공
  • Integer, String, int 사이의 변환 기능을 제공
  • 주요 메소드
    1
    2
    3
    4
    5
    
      static int parseInt(String s) // String을 int로
      static String toString(int i) // int를 String으로
      static Integer valueOf(int i) // int를 Integer로
      String toString( ) // Integer를 String으로
      static Integer valueOf(String s) // String을 Integer로
    

4-5. 박싱

  • 기본형 데이터를 포장 클래스의 객체로 변환하는 것
  • 박싱 예시
    1
    2
    3
    
      Double radius = new Double(2.59); // 생성자 사용, 구식
      Double radius = Double.valueOf(10.4); // valueOf( ) 사용
      Double radius = 2.59; // 자동 boxing
    
  • 자동 박싱
    • 기본형에서 포장 클래스의 객체로 자동 변환되는 것
    • 인자에 전달되거나 변수에 대입될 때 적용

4-6. 언박싱

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

5. System 클래스


5-1. System 클래스

  • Java 플랫폼 및 시스템과 관련된 기능 제공
    • 유용한 클래스 필드와 메소드를 가짐
    • 모든 멤버는 static, 사용 시 생성할 필요 없음
  • 주요 기능
    • 표준 입출력
    • JVM 또는 운영체제 속성과 시스템 환경 변수의 사용
    • 배열 복사

5-2. System 클래스의 표준 입출력 필드

  • System.in
    • 표준 입력 스트림으로 InputStream 유형
    • 키보드로부터 입력을 받을 때 사용
      • System.in.read( )는 키보드로부터 1바이트 문자를 입력 받음
  • System.out
    • 표준 출력 스트림으로 PrintStream 유형
    • 화면에 데이터를 출력할 때 사용
  • System.err
    • 표준 에러 출력 스트림으로 PrintStream 유형
    • 오류 메시지를 화면에 출력할 때 사용

5-3. 키보드로부터 문자 입력받기

  • 키보드 문자 입력
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
      import java.io.*;
      public class ExInput {
          public static void main(String args[ ]) throws IOException {
          char cInput = 0;
          int i;
          System.out.print("Input a character: ");
          cInput = (char)System.in.read( );
          System.out.println(cInput);
          i = System.in.read( );
          System.out.println(i);
          i = System.in.read( );
          System.out.println(i);
          System.out.println(System.in.available( ));
          }
      }
    
      // Input a character: a↲
      // a
      // 13
      // 10
      // 0
    

5-4. 여러 자리 숫자 입력받기

  • 키보드 여러 자리 숫자 입력
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
      import java.io.*;
    
      public class ExInout4 {
          public static void main(String args[]) throws IOException {
              String szInputLine;
              int nValue;
              InputStreamReader isr = new InputStreamReader(System.in);
              BufferedReader is = new BufferedReader(isr);
              System.out.print("Input a number: ");
              szInputLine = is.readLine( );
              nValue = Integer.parseInt(szInputLine);
              System.out.println(nValue);
              is.close();
          }
      }
    
      // Input a number: 134↲
      // 134
    



학습 정리


  1. java.lang 패키지는 import 구문을 쓰지 않더라도 모든 Java 소스 코드에 자동으로 포함된다.
  2. String은 문자열 처리를 위한 다양한 메소드를 제공하지만 immutable 클래스로, String 객체는 생성 이후에 내용 변경이 불가능하다.
  3. toString() 메소드와 equals() 메소드는 Object 클래스에서 정의되어 있으며, 몇몇 하위 클래스들에서 적절히 재정의되어 있다.
  4. 자주 변경되는 문자열을 다루어야 할 경우에는 String 클래스보다 StringBufferStringBuilder 클래스를 사용하는 것이 보다 효율적이다.
  5. 기본형 값을 객체로 다루기 위해, 모든 기본형마다 상응하는 포장 클래스가 존재한다.
  6. System 클래스는 표준 입력과 출력, 표준 오류 출력을 위해 in, out, err 객체를 제공한다.



연습 문제


Q1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Test {
    public static void main(String args[]) {
        String s = new String("Jovo");
        s.replace('o','a');
        s.concat("Exam");
        System.out.println(s);
    }
}

// 다음 프로그램의 출력 결과는 무엇인가?
// 1 Jovo
// 2 Java
// 3 JovoExam
// 4 JavaExam

// 1 Jovo

Q2.

1
2
3
4
5
6
7
8
// Object 클래스와 String 클래스에 대한 설명이다. 잘못된 것은 무엇인가?

// 1 모든 클래스는 묵시적으로 Object 클래스를 상속 받는다.
// 2 Object 클래스에 toString()과 equals() 메소드가 정의되어 있다.
// 3 String 클래스에 toString()과 equals() 메소드가 재정의되어 있다.
// 4 String 클래스는 표준 입출력 스트림을 위한 static 필드를 제공한다.

// 4 String 클래스는 표준 입출력 스트림을 위한 static 필드를 제공한다.

Q3.

1
2
3
4
5
// 교재의 소스 7-21에서 문자열 처리 시간에 차이가 생기는 이유를 설명하라.

// String 클래스는 immutable 클래스여서 반복이 진행될수록 계속해서 기존 문자열은 버려지고 새로운 문자열이 새롭게 만들어지기 때문이다
// 버려지거나 만들어지는 문자열의 길이도 점점 커진다
// StringBuffer 클래스의 경우가 StringBuilder 클래스의 경우보다 시간이 더 걸리는 이유는 동시성 제어를 고려하여 메소드가 구현되었기 때문이다.

[Java 프로그래밍] 7강 - 패키지와 예외 처리

[Java 프로그래밍] 9강 - java.io 패키지와 스트림