jdk11 API 명세서 : https://docs.oracle.com/en/java/javase/11/docs/api/index.html
// jdk11 API 명세서 : https://docs.oracle.com/en/java/javase/11/docs/api/index.html
package test01.api;
class IT {
public int num;
public IT(int num) {
this.num = num;
System.out.println("IT " + num + "가 생성 되었습니다.");
}
// 객체가 제거 될때에 자동으로 호출되는 메소드
public void finalize() {
System.out.println("IT " + num + "가 제거 되었습니다.");
}
}
public class Ex01Lang {
public static void main(String[] args) {
// Object 클래스
Object obj1 = new Object();
obj1 = new Object(); // obj1의 주소가 바뀌고 기존 주소는 버려짐
// hashcode() : 객체 주소값을 정수로 변환
System.out.println(obj1.hashCode()); // 1651191114
// * toString() : 객체의 정보(주소값)를 문자열로 반환
System.out.println(obj1); // 객체 출력시 자동으로 호출됨
System.out.println(obj1.toString()); // java.lang.Object@626b2d4a
// * equals() : 동일한 객체인지 비교후 그 결과 반환
Object obj2 = new Object();
System.out.println(obj1.equals(obj2)); // false
// 기본 타입에서의 == : 값을 비교
// 참조 타입에서의 == : 주소를 비교
System.out.println(obj1 == obj2); // false
// System 클래스
// getProperty() : 시스템의 속성값 활용
System.out.println(System.getProperties());
// * gc() : 더이상 사용되지 않는 객체의 메모리를 반환
IT it;
it = new IT(1);
it = null;
it = new IT(2);
it = new IT(3);
System.gc(); // 굳이 쓰지 않아도 알아서 삭제해줌
// String 클래스
String str00 = "String";
String str01 = "String";
String str02 = new String("String");
// equals() : 문자열 값을 비교 후 결과를 반환
System.out.println(str00.equals(str02)); // true
// == : 주소의 값을 비교하므로 str02는 새로운 객체이므로 다름
System.out.println(str00 == str01); // true
System.out.println(str00 == str02); // false
// charAt() : 지정 인덱스 위치 문자를 반환
String str1 = "Java API";
System.out.println(str1.charAt(5)); // A
// System.out.println(str1.charAt(8)); // 예외 : StringIndexOutOfBoundsException
// length() : 문자열의 길이를 반환
System.out.println(str1.length()); // 8
// indexOf() : 찾고자 하는 (첫번째)문자의 위치를 반환
System.out.println(str1.indexOf("a")); // 1
// toXXXCase() : 대소문자 변경
System.out.println(str1.toUpperCase()); // JAVA API
System.out.println(str1.toLowerCase()); // java api
// substring() : 지정 위치에서 또 다른 지정 위치의 문자열을 반환
// index3 ~ index5까지 출력됨
System.out.println(str1.substring(2 , 6));
// replace() : 지정 문자열 치환 후 반환
System.out.println(str1.replace("Java", "자바")); // 자바 API
// trim() : 문자열의 앞, 뒤 공백 제거
String strTrim = " Java API ";
System.out.println(strTrim.length()); // 12
System.out.println(strTrim.trim()); // Java API
System.out.println(strTrim.trim().length()); // 8
// split() : 특정 구분자를 기준으로 분리된 문자열 배열 객체 반환
String strSplit = "Java-API";
System.out.println(strSplit.split("-")); // [Ljava.lang.String;@7de26db8
String[] result = strSplit.split("-");
// 배열이므로 for문을 활용하여 출력
for (String word : result) {
System.out.println(word); // Java
} // API
// object type method
// 실제로 String객체는 불변객체임
String str = "abc";
System.out.println("before" + " " + str.hashCode()); // before 96354
System.out.println(str.getClass()); // class java.lang.String
// "def" 를 추가하면? : 새로운 객체가 생김
str += "def";
System.out.println("after" + " " + str.hashCode()); // after -1424385949
System.out.println(str.getClass()); // class java.lang.String
// StringBuilder : 새로운 객체를 만들지 않으므로 메모리 운영을 효율적으로 할 수 있음
StringBuilder sb = new StringBuilder();
sb.append("abc");
System.out.println("before" + " " + sb.hashCode()); // before 292938459
sb.append("def");
System.out.println("after" + " " + sb.hashCode()); // after 292938459
// 문자열 사이에 추가하고 싶을 때
sb.insert(3, "xxxx");
System.out.println(sb); // abcxxxxdef
// valueOf() : 기본타입 문자열로 반환
// 뒤에 . 을 찍어서 기본 타입인지 참조 타입인 확인할 수 있음
int i = 10;
System.out.println(i); // 10
System.out.println(String.valueOf(i)); // 10 (String)
System.out.println(Integer.parseInt("10")); // 10 (숫자)
// 기본 타입 <-> 객체 타입
// Wrapper 클래스 : 기본 타입의 값을 갖고 있는 객체
// 박싱 (Boxing)
Integer intgr1 = new Integer(10);
System.out.println(intgr1); // 10
System.out.println(intgr1.getClass()); // class java.lang.Integer
System.out.println(10 + intgr1); // 20, 자동언박싱 됨
// 언박싱 (Unboxing)
int i1 = intgr1.intValue(); // 명시적인 언박싱
System.out.println(i1); // 10
Double double1 = new Double(10.3);
double double11 = double1.doubleValue();
System.out.println(double1); // 10.3
System.out.println(double11); // 10.3
// 자동 박싱/언박싱
Integer intgr2 = 3; // 자동 박싱
System.out.println(intgr2); // 3 (객체)
int i2 = intgr2; // 자동 언박싱
System.out.println(i2); // 3 (기본형)
// parseXXX() : 문자열을 기본타입(Number)으로 변경
System.out.println(Integer.parseInt("3")); // 3
// .을 찍어서 확인할 수 있음 (속성을 사용할 수 있는지)
// Math 클래스
// abs() : 절대값 표현 메소드
System.out.println(Math.abs(-20)); // 20
// ceil() : 올림값, floor() : 내림값, round() : 반올림값
System.out.println(Math.ceil(2.1)); // 3.0
// max(), min()
System.out.println(Math.max(2, 10)); // 10
// random() : 0.0 <= random < 1.0
System.out.println(Math.random()); // 0.634523
// 1 ~ 10 까지의 난수를 생성하려면?
System.out.println((int) (Math.random() *10)+1);
}
}
package test01.api;
// import를 해야 사용할 수 있음
import java.text.SimpleDateFormat;
import java.util.Date;
public class Ex02Util {
public static void main(String[] args) {
// Date 클래스
Date date = new Date();
System.out.println(date);
// SimpleDateFormat
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println(sdf.format(date));
}
}
package test01.api;
import java.time.LocalDateTime;
public class Ex03Time {
public static void main(String[] args) {
// LocalDate, LocalTime, LocalDateTime 클래스가 있음
// 주로 사용됨
LocalDateTime currentTime = LocalDateTime.now();
System.out.println(currentTime);
}
}
package test02.oop;
class A {}
class B extends A {}
class C extends B {} // C 는 A까지 상속 받을 수 있음
// 부모 클래스
// Parent 도 사실 Object로 부터 상속받음 (최상위 조상은 Object, 생략 가능)
class Parent extends Object {
// 필드
String name;
int age;
// 생성자
public Parent () {}
// 사용자 정의 생성자
public Parent (String name, int age) {
this.name = name;
this.age = age;
}
// 메소드
public void printInfo() {
System.out.println(name);
System.out.println(age);
}
}
// 자식 클래스
class Child extends Parent{
String wish;
public Child () {
super(); // super: 부모 클래스를 지칭함, 생략 가능, () : 생성자
// 자식 클래스 자체를 지칭할 때 this 사용
}
// 사용자 정의 생성자
public Child(String name, int age, String wish) {
// super, this 활용
super(name, age);
this.wish = wish;
}
public void printInfoChild() {
System.out.println(wish);
}
// 부모와 메소드 명이 같을 때, 메소드 오버라이딩
// 오버라이딩 된 경우 자식의 메소드가 실행됨
public void printInfo(String name) {
System.out.println(wish); // travel
System.out.println(name); // 자식
}
}
public class Ex01Child {
public static void main(String[] args) {
Child child = new Child("java", 29, "travel"); // 이것만 실행해도 부모 생성자가 나옴
// 상속을 통해 부모는 자식에게 필드, 메소드를 전달할 수 있다.
child.name = "java";
child.age = 29;
child.wish = "travel";
child.printInfo("자식"); // 오버라이딩되어 travel, 자식이 출력됨
// 다형성 : 타입을 다양한 형태로 변경시킬 수 있음
Parent p1 = new Parent();
Child c1 = new Child();
// 자동 타입 변환 : 자식 객체가 부모의 타입으로 생성
Parent c2 = new Child(); // 부모의 타입으로 만들어 졌으므로 부모 타입만 사용 가능
/* 같은 표현임
* Child c = new Child();
* Parent c2 = c;
* */
// 부모의 객체는 자식의 타입으로 생성이 가능할까? : 불가
// Child p2 = new Parent(); // 에러
// 강제 타입 변환(명시 타입 변환) : 자식 객체가 부모의 타입으로 생성 되었다가 다시 자식 타입으로 변환
// 데이터 타입 변환은 큰쪽에서 작은쪽으로만 가능함
Child c3 = (Child)c2;
}
}
종종 import를 사용하지 않으면 예외가 생기는 경우가 있다.
자동 완성이나 해당 예외에 커서를 올리면 해결 방법을 알려준다.
다형성, 생성자를 활용하는 것이 아직 미숙함
어려워 짐에 따라 복습과 질문을 아끼지 말아야 겠다.