학습 개요
java.lang
패키지에 존재하는 기본 클래스에 관해 살펴봄- 모든 클래스의 조상 클래스인
Object
클래스와 문자열을 표현하는String
클래스를 학습함 StringBuffer
클래스의 용도와 기본형을 참조형으로 표현하고자 할 때 필요한 포장 클래스, 그리고 표준 입력과 표준 출력 스트림을 제공하는System
클래스에 관해 학습함
학습 목표
Object
클래스가 제공하는 메소드의 기능을 설명할 수 있음String
과StringBuffer
클래스를 적절히 사용할 수 있음- 기본형, String 및 포장 클래스 간의 형 변환 방법을 설명할 수 있음
System
클래스를 사용할 수 있음
강의록
Object
클래스
java.lang
패키지
- 자바 프로그래밍에 필요한 기본 클래스를 제공
java.lang
패키지에 존재하는 클래스를 사용할 때는import
문이 필요 없음
- 주요 클래스
Object
,System
,Math
String
,StringBuffer
Process
,Thread
Exception
,Throwable
,Error
- 포장 클래스
Number
,Integer
,Double
,Character
,Boolean
등
Object
클래스와 주요 메소드
- 자동으로 모든 클래스의 조상이 되는 클래스
- 클래스 계층 구조에서 루트가 되는 클래스
- 모든 클래스는 자동으로
Object
클래스 상속 받음
- 주요 메소드
객체를 복제하여 반환
1
protected Object clone()
같은 객체인지 참조 값으로 비교
1
public boolean equals(Object obj)
객체를 식별하는 정수 값을 반환
1
public int hashCode()
객체를 문자열로 반환
1
public String toString()
Object
클래스의 toString()
메소드
- 객체의 문자열로 표현하여 반환함
- 클래스이름@16진수해시코드로 표현
- 문자열의
+
연산 또는System.out.print()
등에서 필요함 - 자식 클래스에서 재정의할 수 있음
String
,Integer
클래스 등에서 재정의되어 있음
toString()
메소드의 사용1 2
class MyClass1 { }
1 2 3 4 5
class MyClass2 extends Object { public String toString() { return "This MyClass2 class"; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
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_class1.toString()); System.out.println(my_class2); System.out.println(my_class2.toString()); } } // MyClass1@762efe5d // MyClass1@762efe5d // This MyClass2 class // This MyClass2 class
Object
클래스의 equals()
메소드
Object
클래스에서equals()
의 의미obj1.equals(obj2)
의 결과는(obj1 == obj2)
와 같음
- 두 객체 변수를 비교해서 변수가 가리키는 객체의 참조 값이 같을 때 true를 반환
- 자식 클래스에 재정의할 수 있음
String
,Integer
클래스 등에서 재정의 되어있음
참조 값이 아닌 객체의 유형과 저장된 데이터 값을 비교함
1 2 3 4
Integer x = new Integer(5); Integer y = new Integer(10); Integer a = 5; Short b = 5;
1 2 3 4 5 6 7
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(a == b); // 컴파일 오류
Object
클래스의 clone()
메소드
- 객체를 복제하여 리턴함
Cloneable
인터페이스를 구현한 클래스의 객체만clone()
메소드를 호출할 수 있음- 예외(
CloneNotSupportedException
) 처리를 해주어야함
- 예외(
복제 가능한 사용자 클래스의 정의
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
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 Main { 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
Object
클래스의 getClass()
메소드
- 현재 객체의 유형, 즉 클래스 정보를 가진
Class
객체를 리턴함Class
클래스는 클래스의 정보 확인을 위한 메소드를 제공
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 29 30 31
public class Main { public static void main(String args[]) { 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); System.out.println("슈퍼 클래스 이름 : " + super_class); System.out.println("필드 목록"); for(int i = 0; i < fields.length; i++ ) System.out.println(fields[i]); System.out.println("메소드 목록"); for(int i = 0; i < methods.length; i++) System.out.println(methods[i]); } } // 클래스 이름 : Box // 슈퍼 클래스 이름 : java.lang.Object // 필드 목록 // private int Box.width // private int Box.height // 메소드 목록 // public int Box.width() // public int Box.height()
String
클래스
String
클래스와 생성자
문자열을 표현하고 처리하기 위한 클래스
1
String s1 = new String("Java"); // 객체를 생성
String
클래스는 기본 자료형처럼 사용될 수 있음1
String s2 = "Java"; // 리터럴을 대입
- 같은 리터럴은 1개만 만들어져 공유됨
String
객체는 내용이 변하지 않는(immutable) 상수 객체- 생성자
빈 문자열 객체 생성
1
public String()
1
public String(String original)
1
public String(char[] value)
1
public String(char[] value, int offset, int count)
문자열의 비교
- 주요 메소드
compareTo
메소드1
int compareTo(String anotherString)
두 문자열이 같으면 0을 리턴하고, 다르면 0이 아닌 정수 값을 리턴함
compareToIgnoreCase
메소드1
int compareToIgnoreCase(String anotherString)
- 대소문자를 무시하고 비교
equals
메소드1
boolean equals(Object anObject)
- 두 문자열을 비교하여 같으면 true를 리턴하고 다르면 false를 리턴함
equalsIgnoreCase
메소드1
boolean equalsIgnoreCase(String anotherString)
- 대소문자를 무시하고 비교
1
2
3
4
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
String s4 = new String("Java");
문자열의 검색
- 주요 메소드
indexOf
메소드처음 위치부터 문자열 str을 찾아 처음 등장하는 위치(인덱스)를 리턴, 없으면 -1을 리턴함
1
int indexOf(String str)
1
System.out.println("hamburger".indexOf("urge"));
fromIndex 위치부터 문자열 str을 찾아 처음 등장하는 위치(인덱스)를 리턴하며, 없으면 -1을 리턴함
1
int indexOf(String str, int fromIndex)
lastIndexOf
메소드1
int lastIndexOf(String str), int lastIndexOf(String str, int fromIndex)
- 마지막 위치부터 앞 방향으로 찾음
문자열의 추출 메소드
- 주요 메소드
charAt
메소드index 위치에 있는 문자를 리턴 함
1
char charAt(int index)
substring
메소드beginIndex 위치부터 마지막까지의 문자열을 리턴 함
1 2
String substring(int beginIndex) System.out.println("hamburger".substring(3));
substring
메소드beginIndex 위치부터 (endIndex - 1)까지의 문자열을 리턴 함
1
String substring(int beginIndex, int endIndex)
문자열의 변환
- 원본 문자열은 변경되지 않고 새로운 객체가 만들어짐
- 주요 메소드
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)
- 두 문자열을 연결하여 리턴 함
다른 자료형을 문자열로 변환하는 메소드
문자열의 변환
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
public class Main { 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')); int[] a = new int[5]; System.out.println(String.valueOf(a)); char[] b = { 'J', 'a', 'v', 'a' }; System.out.println(String.valueOf(b)); } } // 123 // true // 3.0 // c // [I@7de26db8 // Java
기타 메소드
startsWith
메소드1
boolean startsWith(String prefix)
- prefix로 시작하면 true를 리턴 함
endsWith
메소드1
boolean endsWith(String suffix)
- suffix로 끝나면 true를 리턴 함
toCharArray
메소드1
char[] toCharArray()
- 문자 배열로 변환하여 리턴 함
StringBuffer
클래스
StringBuffer
클래스와 생성자
- 객체 생성 이후 문자열을 변경할 수 있는 클래스
StringBuffer
는 내용 변경이 가능한 mutable 클래스
- 내부적으로 문자열을 저장하기 위해 크기가 조절되는 버퍼를 사용함
생성자
1
StringBuffer() // 초기 버퍼의 크기는 16
1
StringBuffer(int length)
1
StringBuffer(String str) // 초기 버퍼의 크기는 (str의 길이+16)
StringBuffer
클래스의 주요 메소드
주요 메소드
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.append("le")); // startle
capacity
메소드1
int capacity()
- 버퍼의 크기를 리턴 함
length
메소드1
int length()
- 문자열의 길이를 리턴 함
charAt
메소드1
char charAt(int index)
- index 위치의 문자를 리턴 함
indexOf
메소드1
int indexOf(String str)
- str로 시작하는 첫 위치를 리턴 함
substring
메소드1
String substring(int start, int end)
- start 위치부터 (end - 1) 위치 까지의 문자열을 리턴 함
append
메소드1
StringBuffer append(char c)
- 문자 c를 추가한
StringBuffer
객체를 리턴 함
- 문자 c를 추가한
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()
- 문자열을 역순으로 변경
String
클래스를 사용할 때의 문제점
- 문자열을 빈번하게 변경하는 프로그램에서 메모리 낭비 문제
String
은 immutable 클래스- 기존 객체는 놔둔 채 새로운 String 객체가 계속 생성되어 실행이 느려짐
ex)
String
클래스의 메모리 낭비1 2 3 4 5 6 7 8 9 10
public class Main { 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); } }
StringBuffer
클래스와 StringBuilder
클래스의 사용
String
과StringBuffer
및StringBuilder
클래스의 비교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
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"); // 88.3837 msecs // 1.2864 msecs // 1.2675 msecs
포장 클래스
포장 클래스란
- 기본형을 참조형으로 표현하기 위한 클래스
- 기본형과 상응하는 객체 사이의 형변환(박싱 또는 언박싱) 기능 제공
기본형과
String
사이의 형변환 기능 제공구분 정수형 정수형 정수형 정수형 실수형 실수형 문자형 논리형 기본형 byte short int long float double char boolean 참조형 Byte Short Integer Long Float Double Character Boolean - 사용 목적
- 메소드의 인자로 객체가 필요할 때
Number
의 자식 포장 클래스가 제공하는 상수를 사용할 때Integer.MIN_VALUE
,Integer.MAX_VALUE
등
- 클래스가 제공하는 다양한 메소드를 사용할 때
Number
클래스
Number
는 숫자를 표현하는 포장 클래스인Byte
,Short
,Integer
,Long
,Float
,Double
의 추상 부모 클래스Number
의 자식 클래스에서 구현된 주요 메소드doubleValue
메소드1
double doubleValue()
Double
객체를 double 값으로 변환- unboxing
toString
메소드1
String toString()
Double
객체를 String으로 변환
valueOf
메소드(double)1
static Double valueOf(double)
- double 값을
Double
객체로 변환 - boxing
- double 값을
toString
메소드(double)1
static String toString(double)
- double 값을
String
으로 변환
- double 값을
valueOf
메소드(string)1
static Double valueOf(String)
String
을Double
객체로 변환
parseDouble
메소드(string)1
static double parseDouble(String)
String
을 double 객체로 변환
compareTo
메소드1
int compareTo(Byte anotherByte)
- 인자와 비교하여, 숫자가 같으면 0을 리턴
equals
메소드1
boolean equals(Object obj)
- 같은 유형이고, 값이 같으면 true를 리턴
String
과 기본형 데이터 간의 변환
- 포장 클래스가 제공하는
static
메소드를 사용함 String
을 int(또는 long)형으로 변환하는 경우1 2
int n = Integer.parseInt("123"); long l = Long.parseLong("1234");
int형(또는 long)을 String형으로 변환하는 경우
1 2 3
String s1 = Integer.toString(4); String s2 = Long.toString(5l); String s3 = String.valueOf(123);
Integer
클래스
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로 static String toString() // Integer를 String으로 static Integer valueOf(String s) // String을 Integer로
박싱
- 기본형 데이터를 포장 클래스의 객체로 변환하는 것
ex) double 값을
Double
객체로 변환1
Double radius = new Double(2.59); // 생성자 사용, 옛날 방식
1
Double radius = Double.valueOf(10.4); // valueOf() 사용
1
Double radius = 2.59; // 자동 boxing
- 자동 박싱
- 기본형에서 포장 클래스의 객체로 자동 변환되는 것
- 인자에 전달되거나 변수에 대입 될 때 적용 됨
언박싱
- 포장 클래스의 객체를 기본형 데이터로 변환하는 것
- 포장 클래스에서 기본형
Value()
메소드를 사용 ex)
1 2 3 4
// radius는 Double형 객체라 가정 double r = radius.doubleValue(); // 객체.기본형Value() double r = radius; // 자동 unboxing System.out.println(Integer.valueOf(3) % 2); // 자동 unboxing
- 자동 언박싱
- 포장 클래스의 객체에서 기본형으로 자동 변환되는 것
- 인자에 전달되거나 변수에 대입 될 때 적용됨
System
클래스
System
클래스
- Java 플랫폼 및 시스템과 관련된 기능 제공
- 유용한 클래스 필드와 메소드를 가짐
- 모든 멤버는
static
, 사용할 때 생성할 필요 없음
- 주요 기능
- 표준 입출력 객체를 제공
- JVM 또는 운영체제 속성과 시스템 환경 변수의 사용과 제어
- 배열 복사, 시간 조회
- 프로그램의 제어 등
System
클래스의 표준 입출력 필드
System.in
- 표준 입력 스트림으로
InputStream
유형 - 키보드로부터 입력을 받을 때 사용
System.in.read()
는 키보드로부터 1바이트 문자를 입력 받음
- 표준 입력 스트림으로
System.out
- 표준 출력 스트림으로
PrintStream
유형 - 화면에 데이터를 출력할 때 사용
- 표준 출력 스트림으로
System.err
- 표준 에러 출력 스트림으로
PrintStream
유형 - 오류 메시지를 화면에 출력할 때 사용
- 표준 에러 출력 스트림으로
키보드로부터 문자 입력 받기
표준 입력을 사용하여 문자 입력 받기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
import java.io.*; public class Main { 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
여러 자리 숫자 입력 받기
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 Main { 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
학습 정리
java.lang
패키지의 클래스를 사용할 때는import
구문을 쓰지 않아도 됨- String은 문자열 처리를 위한 다양한 메소드를 제공하지만 immutable 클래스로,
String
객체는 생성 이후에 내용 변경이 불가능함 toString()
메소드와equals()
메소드는Object
클래스에서 정의되어 있으며, 몇몇 하위 클래스들에서 적절히 재정의되어 있음- 자주 변경되는 문자열을 다루어야 할 경우에는
String
클래스보다StringBuffer
나StringBuilder
클래스를 사용하는 것이 보다 효율적임 - 기본형 값을 객체로 다루기 위해, 모든 기본형마다 상응하는 포장 클래스가 존재함
System
클래스는 표준 입력과 출력, 표준 오류 출력을 위해in
,out
,err
객체를 제공함
연습 문제
다음 프로그램의 출력 결과는 무엇인가?
1 2 3 4 5 6 7 8
public class Main { public static void main(String args[]) { String s = new String("Jovo"); s.replace('o','a'); s.concat("Exam"); System.out.println(s); } }
a. Jovo
- Java에서
String
객체는 불변(immutable)하기 때문에 원본 문자열은 변경되지 않음 replace
와concat
메서드는 새로운 문자열을 반환할 뿐, 기존 문자열 객체를 수정하지 않음- 반환 값을 저장하지 않았기 때문에
s
는 계속"Jovo"
를 참조하고 있음 수정된 문자열을 저장하기 위해서는 아래처럼 반환 값을 s에 다시 저장해야 함
1 2 3 4 5 6 7 8
public class Main { public static void main(String args[]) { String s = new String("Jovo"); s = s.replace('o', 'a'); // 반환 값을 다시 s에 저장 s = s.concat("Exam"); // 반환 값을 다시 s에 저장 System.out.println(s); // "JavaExam" } }
- Java에서
Object
클래스와String
클래스에 대한 설명이다. 잘못된 것은 무엇인가?a.
String
클래스는 표준 입출력 스트림을 위한static
필드를 제공한다.Object
클래스와String
클래스에 대한 설명으로 옳은 것- 모든 클래스는 묵시적으로
Object
클래스를 상속 받음 Object
클래스에toString()
과equals()
메소드가 정의되어 있음String
클래스에toString()
과equals()
메소드가 재정의되어 있음
- 모든 클래스는 묵시적으로
String
클래스는 표준 입출력 스트림과 관련된static
필드를 제공하지 않음- 표준 입출력 스트림(
System.in
,System.out
,System.err
)은System
클래스에서 제공함
- 표준 입출력 스트림(
교재의 소스 7-22에서 문자열 처리 시간에 차이가 생기는 이유를 설명하라.
a.
String
클래스는 immutable 클래스여서 반복이 진행될수록 계속해서 기존 문자열은 버려지고 새로운 문자열이 새롭게 만들어지기 때문임 (버려지거나 만들어지는 문자열의 길이도 점점 커짐)StringBuffer
클래스를 사용한 경우가StringBuilder
클래스를 사용한 경우보다 시간이 더 걸리는 이유는 동시성 제어를 고려하여 메소드가 구현되었기 때문임