Test121~Test133
일반적으로 클래스는 하나만 존재하는 것이 아니라
같은 종류의 클래스를 여러개 묶어서 사용하게 되는데
이러한 클래스나 인터페이스의 묶음을 패키지(package)라고 한다.
Sun(Oracle)사에서는 자바 프로그램을
효율적으로 작성할 수 있도록 자바 표준 패키지를 제공하며,
자바 표준 패키지에는 그래픽, 네트워크, 데이터베이스 등의
다양하고 유용한 클래스들이 포함되어 있다.
자바 표준 패키지나 사용자에 의해 외부에서 만들어진 패키지를 사용하기 위해서는
컴파일을 수행하기에 앞서 프로그램에 포함시키는 과정이 필요한데,
이 때 『import』문을 이용하여 패키지 또는
클래스를 프로그램에 포함시키게 된다.
하지만, 『java.lang.*』패키지는 자바 프로그램에 기본적으로
import 되어 있기 때문에 이 패키지의 클래스들은 import 하지 않고
바로 사용하는 것이 가능하다.
import 문은 반드시 클래스 설계 구문 전에 선언되어 있어야 하며
형식은 다음과 같은 두 가지가 있다.
import [static] 패키지.클래스;
import [static] 패키지.*;
※ JDK 1.5 부터는 import 다음에 『static』키워드를 붙임으로써
정적으로 패키지를 import 할 수 있는 기능을 제공하게 되었다.
만약 패키지를 정적으로 import 한 경우라면 모든 접근 가능한
메소드와 멤버 변수들은 접두사(ex -> ob, br, sc 처럼...)를 붙이지 않고
사용하는 것이 가능하다.
『java.lang.Object』클래스는 자바 클래스의 최상위 클래스로
자바 표준 패키지 클래스나 사용자에 의해 작성된 모~~~~~~~든 클래스는
기본적으로 이 클래스로부터 상속받는다.
따라서 자바의 모든 클래스는 『java.lang.Object』 클래스의
메소드를 가지고 있으며, 바로 사용하는 것이 가능하다.
※ Java Platform, Standard Edition 8 API Specification URL
→ http://docs.oracle.com/javase/8/docs/api/
즐겨찾기 해두기!
// import java.lang.*;
// -> import java.lang.Object;
public class Test122 //extends Object
{
/*
Object 클래스로부터 상속받은 멤버들...
...
toString()
{
...;
}
*/
public static void main(String[] args)
{
Test122 ob = new Test122();
//br.readLine();
//sc.next();
//객체.xxx();
//-- 해당 객체를 생성시키는 대상 클래스의 메소드 xxx() 호출~!!!
//Rect ob.Rect();
//ob.input();
//-- ob 객체를 생성시키는 대상 클래스 -> Rect 클래스
// Rect 클래스에 정의되어 있는 input() 메소드 호출
// 객체.xxx();
//-- 해당 객체를 생성시키는 대상 클래스에
// xxx() 메소드가 존재하지 않을 때....
// -> 에러 발생
//System.out.println(ob.test());
//--==>> 에러 발생(컴파일 에러) test()를 안만들었으니까
System.out.println(ob.toString());
//--==>> Test122@15db9742 얘는 우리눈에 보이지 않지만 Test122에 존재한다! 위에 주석처리한곳!
//-- 자바가 객체를 내부적으로 구분하기 위해 임의로 부여하는 식별 번호
//-- 에러 발생하지 않는 상황
// -> toString() 메소드가 Test122 클래스에 존재
// -> Object 클래스로부터 상속
System.out.println(ob);
//--==>> Test122@15db9742
//시스템안에 아웃안에 프린트엘엔 안에도 오브젝트가 포함
}
}
// ※ Test122 와 비교~!!!
// import java.lang.*;
public class Test123 //extends Object
{
/*
...
public String toString()
{
...;
}
...
*/
@Override
public String toString()
{
return "재정의한 toString()...";
}
public static void main(String[] args)
{
Test123 ob = new Test123();
System.out.println(ob.toString());
//--==>> 재정의한 toString()...
System.out.println(ob);
//--==>> 재정의한 toString()...
}
}
class Test //extends Object
{
/*
public boolean equals(object obj)
{
...;
}
*/
private int a = 10;
public void write()
{
System.out.println("a : " + a);
}
}
public class Test124
{
public static void main(String[] args)
{
Test ob1 = new Test();
Test ob2 = new Test();
System.out.println("10 == 9 : " + (10 == 9));
//--==>> 10 == 9 : false
//-- 『==』 비교연산자는 피연산자의 크기를 비교함을 확인(관찰)
int a = 10;
int b = 10;
System.out.println("a == b : " + (a == b));
//--==>> a == b : true
//-- 『==』 비교연산자는 피연산자의 크기를 비교함을 확인(관찰)
System.out.println("ob1 == ob2 : " + (ob1 == ob2));
//--==>> ob1 == ob2 : false --> 같은 Test타입이지만 크기가 다르게 나옴!
//-- 객체(Test 즉, Object)들을 비교하는 과정에서 사용하는 『==』 연산자는
// 크기를 비교하는 것이 아니라 객체의 주소값을 비교(할당되는 주소값을 다름!!)
// check~!!!
System.out.println("ob1.equals() : " + (ob1.equals(ob2)));
System.out.println("ob2.equals() : " + (ob2.equals(ob1)));
//--==>> ob1.equals() : false
// ob2.equals() : false
//-- 『==』 연산자와 Object 클래스가 갖고있는 『equals()』 메소드는
// 동일한 개념으로 객체의 주소값을 비교
System.out.println();
System.out.println("-----------------------------------------------");
System.out.println();
System.out.println("ob1 :" + ob1);
System.out.println("ob1.toString() :" + ob1.toString());
//--==>> ob1 :Test@15db9742
// ob1.toString() :Test@15db9742
System.out.println("ob2 :" + ob2);
System.out.println("ob2.toString() :" + ob2.toString());
//--==>> ob2 :Test@6d06d69c
// ob2.toString() :Test@6d06d69c
}
}
class NewCar
{
private int velocity; //-- 자동차의 속도
private int wheelNum; //-- 자동차의 바퀴 갯수
private String carName; //-- 자동차의 이름
NewCar(int speed, String name, int wheel)
{
velocity = speed;
carName = name;
wheelNum = wheel;
}
}
public class Test125
{
public static void main(String[] args)
{
//NewCar nCar1 = new NewCar(); //-- 사용자정의 생성자를 위에서 만들어서 이렇게 만들수 없음
NewCar nCar1 = new NewCar(100, "k5", 4);
NewCar nCar2 = new NewCar(120, "미니쿠퍼",4);
// equals()
System.out.println("1-1 : " + nCar1.equals(nCar2));
System.out.println("1-2 : " + (nCar1 == nCar2));
//--==>> 1-1 : false
// 1-2 : false
//주소가 다르다!
NewCar nCar3 = nCar1; //-- 객체 복사 -> 얕은 의미 복사(참조형)
// -> 주소값 복사
System.out.println("2-1 : " + nCar1.equals(nCar3));
System.out.println("2-2 : " + (nCar1 == nCar3));
//--==>> 2-1 : true
// 2-2 : true
////주소가 같다!
// toString()
System.out.println("3-1 : " + nCar1.toString());
System.out.println("3-2 : " + nCar2.toString());
System.out.println("3-3 : " + nCar3.toString());
//--==>> 3-1 : NewCar@15db9742
// 3-2 : NewCar@6d06d69c
// 3-3 : NewCar@15db9742
//hashCode()
System.out.println("4-1 : " + nCar1.hashCode());
System.out.println("4-2 : " + nCar2.hashCode());
System.out.println("4-3 : " + nCar3.hashCode());
//--==>> 4-1 : 366712642
// 4-2 : 1829164700
// 4-3 : 366712642
//-- 결과값을 16진수 형태로 바꾸게 되면
// 『toString』메소드가 반환한 결과값 확인 가능
// hashcode(해시코드)가 같다고 같은 객체는 아니다.
//getClass()
System.out.println("5-1 : " +nCar1.getClass());
System.out.println("5-2 : " +nCar2.getClass());
System.out.println("5-3 : " +nCar3.getClass());
//--==>> 5-1 : class NewCar
// 5-2 : class NewCar
// 5-3 : class NewCar
//-- 생성된 객체를 통해
// 기반 설계도 클래스를 확인할 수있는 기능을 가진 메소드
// clone() //-- 객체 복사
// finalize() // 객체 직렬화
// 기타 나머지 메소드는 스레드 처리와 관련이 있다.
}
}