필수 사용 클래스

자바에선 프로그래밍 시 자주 사용되는 기능을 API 클래스로 만들어서 제공한다.
  • Object 클래스
  • Wrapper 클래스
  • Math 클래스
  • String 클래스
  • StringBuffer 클래스 & StringBuilder 클래스
  • System 클래스
  • Class 클래스
  • java.util 패키지의 클래스
  • 참조 타입 배열과 객체를 리턴하는 메서드
  • 열거 타입
  • has-a 관계 클래스
 

Object 클래스

정의 : 모든 클래스의 최상위 클래스(root class)
  • java.lang 패키지에 위치
  • 명시적으로 구현하지 않으면 컴파일 시 클래스가 자동으로 상속받는다.
  • Object 클래스의 멤버는 모든 클래스에서 사용 가능
 

Object에서 제공하는 메서드들

  • protected Object clone() : 객체 자신을 복사한 후에 리턴
  • boolean equals(Object obj) : 객체들의 실제 값을 비교
  • public String toString() : 객체를 문자열로 표현 (기본은 클래스명@해시코드)
  • protected void finalize() : 객체 자신에 대해 더 이상 참조할 경우가 없을 때 garbage colelctor에 의해 호출된다.
  • Class<?>getClass() : 객체 자신의 클래스명을 얻는다.
  • int hashCode() : 객체 자신의 해시 코드를 얻는다.
  • void notify() : 대기 상태의 스레드에게 실행 준비를 알린다.
  • void wait() : 다른 스레드가 notify()나 notifyAll()를 호출할 때까지 현재 실행하는 스레드를 대기 상태에 머물게 한다.
 
참고로
java.lang 패키지 핵심 클래스들
  • Object(모든 클래스의 조상)
  • String/StringBuilder/StringBuffer (문자열 처리)
  • Math, System (유틸리티)
  • Wrapper (Integer, Double 등)
  • Throwable/Exception/Error (예외 처리)
  • Thread/Runnable (멀티스레딩)
  • 기타 : Runtime, Enum, Class
 

equals() 메서드 

  • 기본 타입 데이터 값 비교 : ==
  • 참조 타입 데이터 값 비교  : equals() (==는 위치값이 같은지 비교)
 
  1. Object 클래스의 equals() 메서드는 ‘==’으로 구현되어 있다.
  2. 참조 데이터 비교 시 위치값이 비교된다.
  3. 실제 값을 비교하려면 메서드를 오버라이딩 해야한다.
  4. 대부분의 API 클래스는 미리 equals() 메서드를 오버라이딩해서 제공한다.
 
예를 들어 Student 클래스에서 name과 grade를 동시에 비교하는 equals()메서드를 오버라이딩하고 싶다
→ 
public class Student {
	String name;
	int grade;

	// ...
	@Override
	public boolean equals(Object obj) {
		boolean result = false;
		if (obj instanceof Student) {
			Student s = (Student)obj;
			if(name.equals(s.name)&& (grade == s.grade)) {
				result = true;
			}
		}
	}

}
  1. equals 메서드를 오버라이딩하며 Object obj 객체를 받는다.
  2. result 값는 false 디폴트
  3. obj가 Student의 인스턴스 일때 obj 다운캐스팅
  4. 이름 비교(equals), 점수 비교(==) 둘 다 맞으면 true
 
 

toString() 메서드

예를 들어 객체의 필드값을 한꺼번에 출력해야할 경우 toString() 사용
 
  • Object 클래스에서 제공
  • 인스턴스의 필드 정보를 문자열로 출력
  • 참조 타입 변수를 println() 메서드에 전달하면 자동으로 toString() 메서드가 호출된다.
 
근데 Object 클래스의 toString() 메서드의 실제 기능은 클래스 객체의 클래스명과 객체의 해시코드를 출력하는 기능이다
→ 본 형태는 “클래스명@해시코드”
즉 형식만 선언되어 있을 뿐 필드값을 출력하진 않는다.
상황에 맞게 오버라이딩하여 사용한다.
 
+) 해시코드(hashCode) : 클래스 객체 생성 시, JVM이 클래스 객체에 부여하는 고유 번호
 
예를 들어, toString() 메서드를 오버라이딩하지 않고 사용했을 때

 

 
출력값 : 클래스명과 해시코드가 출력된다.
sec01.ex04.Student@6576fe71
sec01.ex04.Student@6576fe71
 

오버라이딩 했을 때
+
@Override
	public String toString() {
		String info = "이름: " + name + ", 학년: " + grade;
		return info;
	}
→ 
출력값
이름: 이순신, 학년: 24
이름: 이순신, 학년: 24
 

 

Clone() 메서드 

Object 클래스의 clone() 메서드는 실행 중 생성된 클래스 객체를 따로 복사(깊은 복사)하는 기능을 제공
 
기본적으로 clone()을 그냥 이용하면 얕은 복사 (Shallow copy)가 된다.

 

+) 예외로 Array의 경우 clone()메서드를 바로 사용해도 deep copy가 된다.
+) Arrays.copyOf(), copyOfRange() 메서드도 deep copy
 
깊은 복사를 위한 3가지 조건
  1. Cloneable 인터페이스를 implements하기
  2. clone() 메서드를 override 하기
  3. try-catch 구문을 이용해 CloneNotSupportedException 던지기
 
예제
 
출력값
이름: 이순신, 학년: 3
이름: 이순신, 학년: 3

이름: 이순신, 학년: 2
이름: 이순신, 학년: 3
값 변경을 공유하지 않는다 → 깊은 복사가 된다.
 
  1. Student 클래스는 Cloneable 인터페이스 구현
    : “ 이 클래스는 clone()을 사용할거다”라는 신호를 컴파일러에게 준다.
    만약 구현하지 않으면  CloneNotSupportedException이 발생
  2. Cloneable을 구현하는 것만으로는 예외가 없어지지 않는다. 호출하는 쪽에서 반드시 예외 처리(try-catch 또는 throws)
 

Wrapper 클래스

기본 타입 데이터 별로 편리한 기능을 제공하는 클래스
+) 자바에선 8가지 기본 타입 데이터 제공됨.
 
기본 타입 데이터 래퍼 클래스
boolean Boolean
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double
 
 

Integer 클래스

Integer 래퍼 클래스
실행 결과
 
+)그 밖의 Integer 클래스의 여러 메소드들
  • int intValue() : Integer 객체의 갑슬 정수값으로 리턴
  • long longValue() : Integer 객체의 값을 long 데이터로 변환하여 리턴
  • static int max(int a, int b) : 두 정수 중 큰 값을 리턴
  • static int min(int a, int b) : 두 정수 중 작은 값을 리턴
  • static int parseInt(String s) : 문자열을 정수로 변환한 후 리턴
  • static String toBinary(int a)  : 정수를 2진수로 변환한 후 문자열로 리턴
  • static String toHexString(int a) : 정수를 16진수로 변환한 후 문자열로 리턴
  • static String toOctalString(int a) : 정수를 8진수로 변환한 후 문자열로 리턴
 

Float 클래스도 마찬가지

Float.MAX_VALUE
Float.parseFloat(…)
Float.toString(…)
 

Math 클래스

java.lang.Math 클래스 : 정적 메서드로 객체 생성 없이 바로 사용
 
상수
  • static final double E : 자연 지수 e의 값
  • static final double PI : 원주율 파이값
메서드
  • static double abs(double a) : a의 double 타입 절대값을 리턴
  • static int abs(int a) : a의 int 타입 절대값을 리턴
  • static double ceil(double a) : a보다 큰 정수 중 가장 작은 정수를 double 타입 실수로 리턴
  • static double floor(double a) : a보다 작은 정수 중 가장 큰 정수를 double 타입 실수로 리턴
  • static double max(double a, double b) : 두 수 중 큰 값을 리턴
  • static double min(double a, double b) : 두 수 중 작은 값을 리턴
  • static double pow(double a, double b) : a의 b 제곱(power)의 값을 리턴
  • static double random() : 0.0에서 1.0 사이의 난수를 리턴
  • static long round(double a) : a의 소수점 아래의 수를 반올림한 후 long 타입 정수로 리턴
  • static double sqrt(double a) : a의 제곱근을 리턴

 

Math 클래스 예제
 
실행결과
 

Random 클래스 

지금까지는 Math 클래스의 random() 메소드를 사용해왔다.
자바는 따로 java.util 패키지에 있는 Random 클래스로 더 많은 난수 기능 제공
 
생성자
  • Random() : 디폴트 생성자. 현재 시간을 초깃값으로 하는 난수 발생기 객체를 생성
  • Random(long seed) : long 타입의 seed값을 매개변수로 받아 객체를 생성
메서드
  • boolean nextBoolean() : boolean 타입의 난수를 리턴
  • double nextDouble() : double 타입의 난수를 리턴
  • float nextFloat() : float 타입의 난수를 리턴
  • int nextInt() : int 타입의 난수를 리턴
  • long nextLong() : long 타입의 난수를 리턴
  • int nextInt(int bound) : 0과 한계값(bound) 사이(한계값은 미포함)의 난수를 리턴
 
Random 클래스 예제
 
실행 결과
755473468
2
5
0.2642843929746739
false
3

 

+ Recent posts