개발에 필요한 라이브러리들의 집합
선배 개발자들이 만들어 놓은 소스코드
- 내부 API
JDK 설치 시 제공해주는 기본 API
docs.oracle.com/javase
- 외부 API(회사에서 많이 쓴다)
선배 개발자들이 개발한 패키지 및 클래스들을 의미한다.
보통 JAR파일로 배포하며 자바 프로젝트의 buildPath에 추가하여 사용할 수 있다.
ex)
/**
*주석을 꼭 달아줘야 한다
*@author Choi Yura
*@since JDK 11
*
*Calculator
*/
배포할 클래스 또는 패키지 우클릭
> Export > JAVA/JAR file 선택 > Next
> destination을 원하는 경로로 선택
> Export Java source files ... 체크
> Finish
배포된 JAR파일을 다운 받기
> 프로젝트 우클릭 > Build Path > Configure Build Path
> Libraries 탭 클릭 > ClassPath(안되면 ModulePath) 클릭 > Add External JARs
> 저장된 경로의 .jar파일을 더블 클릭으로 추가 > Apply 클릭
> Orders and Exports 탭 클릭
> Select All 클릭 > Apply and Close
1. toString()
항상 객체명을 출력할 때에는 toString()이 생략되어 있다.
toString()을 통해 출력되는 문자열이 마음에 들지 않는다면, 재정의하여 수정하도록 한다.
실무에서는 클래스 선언 시 각 필드의 초기화 여부를 확인하기 위해 toString을 재정의하여 사용한다.
2. equals()
주소값 비교(==).
String 클래스에서 equals를 값 비교로 재정의하여 사용하기 때문에
문자열 비교는 무조건 equals()로 비교한다.
3. hashCode()
JVM에서 관리하는 중복없는 값. 실제 메모리에 할당되는 주소와 다르다.
String 클래스에서는 필드의 해시코드값이 아닌 필드 안에 있는
문자열 상수값의 해시코드값을 리턴하도록 재정의하였다.
상수가 넘쳐나는 영역이라는 뜻
문자열 자체를 넣으면 "ABC" 가 이미 있으면 또 만들지 않고 주소값을 공유
그래서 == 이든 equals 든 true
선언을 그냥 값을 넣어주는 걸로 하면 우선순위가 상수의 주소 비교가 높아서
값을 넣는 걸 알려준 게 아닌 생성자로 필드를 만들어 알려줌.
new 로 넣어주면 필드 비교가 우선순위가 높아서 false 가 나온다.
EqualsTest.java 클래스
package objectTest;
class Student{
int number;
String name;
public Student() {;}
public Student(int number, String name) {
super();
this.number = number;
this.name = name;
}
@Override
public String toString() {
return "Student [number=" + number + ", name=" + name + "]";
}
@Override
public boolean equals(Object obj) {
// 주소비교
if(this == obj) {
return true;
}
// 타입비교
if(obj instanceof Student) {
// 다운 캐스팅
Student s2 = (Student)obj;
if(this.number == s2.number) {
return true;
}
}
return false;
}
}
public class EqualsTest {
public static void main(String[] args) {
String data1 = "ABC";
String data2 = "ABC";
String data3 = new String("ABC");
String data4 = new String("ABC");
System.out.println(data1 == data2);
System.out.println(data1.equals(data2));
System.out.println(data3 == data4);
System.out.println(data3.equals(data4));
Student s1 = new Student(1, "April");
Student s2 = new Student(1, "Jay");
System.out.println(s1.equals(s2));
}
}
HashCodeTest.java 클래스
package objectTest;
import java.util.Random;
public class HashCodeTest {
public static void main(String[] args) {
String data1 = "ABC";
String data2 = "ABC";
String data3 = new String("ABC");
String data4 = new String("ABC");
System.out.println(data1.hashCode());
System.out.println(data2.hashCode());
// new를 사용했기에 필드 우선순위가 높아야하지만
// String 클래스에서 재정의를 해서 필드 안에 값의 해쉬코드를 가져오도록 한다.
Random r1 = new Random();
Random r2 = new Random();
System.out.println(r1.hashCode());
System.out.println(r2.hashCode());
}
}
ToStringTest.java 클래스
package objectTest;
import java.util.Random;
class Animal{
String name;
String kind;
int age;
public Animal() {;}
public Animal(String name, String kind, int age) {
super();
this.name = name;
this.kind = kind;
this.age = age;
}
@Override
public String toString() {
return "이름 : " + name + ", " + "종 : " + kind +", " + "나이 : " + age;
}
}
public class ToStringTest {
public static void main(String[] args) {
Random r = new Random();
// 항상 객체명을 출력할 때에는 toString()이 생략되어 있었다!!
System.out.println(r.toString());
Animal animal = new Animal("진순이", "진돗개", 0);
// 초기화가 잘됐는지 확인할 때 사용할 수도 있다.
System.out.println(animal);
}
}
클래스타입 객체 = new 클래스타입(일반타입의 값); // boxing, 권장하지 않는다.
클래스타입 객체 = 클래스타입.valueOf(일반타입의 값); // boxing
일반타입 변수 = 객체.000Value(); // unboxing
클래스타입 객체 = 일반타입의 값; // auto boxing
일반타입 변수 = 객체; // auto unboxing
원시타입(일반타입)을 박싱하면 다양한 메소드를 제공받을 수 있다.
여러 일반 타입을 하나의 타입으로 묶기 위해서는 반드시 클래스 타입(Wrapper Class)으로
사용해야 되고, 이 때에는 박싱을 해준다.
WrapperTask.java 클래스
package wrapperTest;
public class WrapperTask {
public static void main(String[] args) {
// 1, 3.14, 45.1F, 'H', "april짱", true
// 위 6개의 값을 6칸 배열에 담기
// for문 사용해서 배열에 담긴 값 출력까지!
// My version
// String[] randomArray = {1, 3.14, 45.1F, 'H', "april짱", true};
//
// for (int i = 0; i < randomArray.length; i++) {
// System.out.println(i);
// }
// Answer
// Object[] datas = new Object[6];
Object[] datas = {1, 3.14, 45.1F, 'H', "april짱", true};
Integer number = (Integer)datas[0]; // 다운캐스팅을하면 Integer타입의 친구를 사용할 수 있다.
for (int i = 0; i < datas.length; i++) {
System.out.println(datas[i]);
}
}
}
WrapperTest.java 클래스
package wrapperTest;
public class WrapperTest {
public static void main(String[] args) {
int number = 10;
// boxing
// 디프리케이티드 이제 더 이상 이렇게 쓰지말자!
// valueOf 를 쓰는게 더 좋다.
// Integer number_W = new Integer(number);
// Integer number_W = Integer.valueOf(number);
Integer number_W = number;
System.out.println(number_W);
// unboxing
number = number_W.intValue();
// auto unboxing
number = number_W;
}
}