[Java] Lang, Util, OOP

JH·2023년 3월 22일

Java

목록 보기
3/21

1. TIL

A. api

jdk11 API 명세서 : https://docs.oracle.com/en/java/javase/11/docs/api/index.html

1. Lang

// 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);
		
	}
}


B. Util

1. SimpleDateFormat

  • LocalDateTime, SimpleDate, Cal 순으로 많이 쓰임
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));
	}
}

2. LocalDateTime

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);
	}
}


C. OOP

1. 객체 지향 프로그래밍 (Object Oriented Programming)

  • 상속 (extends) : 필드와 메서드만 물려줌
  • Java는 반드시 단일 상속만을 허용함, 하나의 클래스만 상속 가능함
  • 메소드 오버라이딩 (Method Overriding) : 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것, 부모의 메소드 위에 덮어씀

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;
		
	}
}


2. 에러

종종 import를 사용하지 않으면 예외가 생기는 경우가 있다.
자동 완성이나 해당 예외에 커서를 올리면 해결 방법을 알려준다.


3. 보완 해야 할 것

다형성, 생성자를 활용하는 것이 아직 미숙함


4. 느낀점

어려워 짐에 따라 복습과 질문을 아끼지 말아야 겠다.

profile
잘해볼게요

0개의 댓글