개발공부

JAVA쪼렙탈출기: API

Yuniverse. 2023. 6. 16. 16:07
Python과 SQL만 써본 주니어 분석가. '개발공부를 해보고 싶다', '개발도 공부하긴 해야하는데...'는 말만 한지 어연 1년이 넘어가는 중, 이대로는 안되겠다 싶어 냅다 JAVA 수업 수강에 카드를 긁었다. 쪼렙 중의 쪼렙이 JAVA를 배워나가는 여정을 "JAVA 쪼렙 탈출기"라는 시리즈로 남길 예정이다.

 

API ( Application Programming Interface )

 

Java Platform SE 8

 

docs.oracle.com

 

Object class

JAVA의 최상위 class이며, JAVA의 모든 클래스는 자동으로 Object class를 상속받는다.

 

class Test {
	
}


public class ExObject { // extends Object를 쓰지않아도 자동적으로 Object class를 상속받고 있다.
	
	public static void main(String[] args) {
		
		Test test = new Test(); 
		// Test class에 아무것도 정의하지 않았음에도 내재된 메서드들이 존재. 왜? Object를 자동상속받아서 Object에 있는 메서드들이 있는 것
		
		Object objA = new Object();
		Object objB = new Object();
		
		// getClass() : class type 반환
		System.out.println("objA.getClass() : " + objA.getClass());
		
		// hashCode() : 객체 고유 번호
		System.out.println("objA.hashCode() : " + objA.hashCode());
		System.out.println("objB.hashCode() : " + objB.hashCode());
		
		// toString() : getClass(), hashCode() 조합 (@로 2개 값을 연결, hashCode()를 16진수 형태로 변환하여 반환한다.)
		System.out.println("objA.toString() : " + objA.toString());
		System.out.println(objA); // objA 참조변수가 가진 값이 objA.toString() 값이 된다.
		
		// equals() : 동일한 객체인지 확인
		System.out.println(objA.equals(objB));
		
	}

}

[결과값]

objA.getClass() : class java.lang.Object

objA.hashCode() : 705927765

objB.hashCode() : 366712642

objA.toString() : java.lang.Object@2a139a55

java.lang.Object@2a139a55

false

 

public class Product {
	
	private String serial; // 제품 관리 번호
	
	public Product(String serial) {
		this.serial = serial;
	}
	
	// proA.equals(proC) = true가 나오게 하기 위해선...
	public int hashCode() {
		return serial.hashCode();
	}
	
	public boolean equals(Object obj) {
		if(obj instanceof Product) { // 같은 타입인지 확인
			Product tmp = (Product)obj; // 원래 타입으로 변환 (다운캐스팅)
			if(this.serial.equals(tmp.serial)) {
				return true;
			}
		}
		return false;
	}
	
	public String toString() {
		return "제품번호 : " + serial;
	}

}
public class ProductMain {
	
	public static void main(String[] args) {
		
		Product proA = new Product("p001");
		Product proB = new Product("p002");
		Product proC = new Product("p001");
		
		System.out.println(proA.equals(proB));
		System.out.println(proA.equals(proC)); // 이것도 false가 나온다. 객체 자체로 비교하기 때문에		
		// 객체 비교시 객체 자체가 아니라 멤버 필드로 해서 비교하고 싶을 때 hashCode()와 equals()를 오버라이딩 해야 한다.
		
		// Product class에서 equals를 재정의해주고 나서 proA.equals(proC)가 true가 나오는걸 알 수 있다.
		
		System.out.println(proA); // toString() 오버라이딩 전엔 System.out.println(proA.equals(proB)); 이런 값이 나오지만
		// 오버라이딩 후엔 제품번호 : p001 이런형태로 나오게 된다.
	}

}

[결과값]

false

true

제품번호 : p001

 

 

public class ExString {
	
	public static void main(String[] args) {
		
		String textA = new String("java");
		String textB = "java";
		String textC = "Java";
		
		System.out.println(textA);
		System.out.println(textB);
		System.out.println(textC); // toString()이 자동적으로 오버라이딩 되었기 때문에 문자값 그대로 나온다.
		System.out.println();
		
		System.out.println(textA.hashCode()); 
		System.out.println(textB.hashCode()); // String class는 현재 사용중인 문자값을 기준으로 hashCode를 생성하기 때문에 textA와 textB의 hashCode가 동일하게 나온다.
		System.out.println(textC.hashCode());
		System.out.println();
		
		String phone = "010-1234-5678";
		System.out.println(phone);
		
		// subString : 문자열 자르기
		String pa = phone.substring(4, 8); // 문자열.substring(시작index, 마지막index) : 시작index부터 마지막index-1까지 슬라이싱 
		System.out.println(pa);
		String pb = phone.substring(9); // 문자열.substring(시작index) : 시작index부터 끝까지 슬라이싱
		System.out.println(pb);
		
	}

}

[결과값]

java

java

Java

 

3254818

3254818

2301506

 

010-1234-5678

1234

5678

 

 

DecimalFormat

  • 숫자를 원하는 형식의 문자열로 변환할 때 사용
  • 0 : 빈자리를 0으로 채움
  • # : 빈자리를 0으로 채우지 않음
public class ExDecimalFormat {
	
	public static void main(String[] args) {
		
		double data = 12345.600;
		System.out.println("data : " + data);
		System.out.println();
		
		DecimalFormat df = null;
		
		df = new DecimalFormat("0"); 
		String sa = df.format(data);
		System.out.println("sa : " + sa);
		System.out.println();
		
		df = new DecimalFormat("0.0"); 
		String sb = df.format(data);
		System.out.println("sb : " + sb);
		System.out.println();
		
		df = new DecimalFormat("0.00"); 
		String sc = df.format(data);
		System.out.println("sc : " + sc);
		System.out.println();
		
		// 0 말고 #을 쓸 수도 있다.
		// 0을 쓰면 빈자리를 0으로 표시하지만, #은 빈자리를 표시하지 않는다는 차이가 있다.
		df = new DecimalFormat("#.##"); 
		String sd = df.format(data);
		System.out.println("sd : " + sd);
		System.out.println();
		
		df = new DecimalFormat("###,###.##"); 
		String se = df.format(data);
		System.out.println("se : " + se);
		System.out.println();
		
	}

}

[결과값]

data : 12345.6

sa : 12346

sb : 12345.6

sc : 12345.60

sd : 12345.6

se : 12,345.6

 

 

Date class

날짜를 표현할 때 사용

 

SimpleDateFormat

날짜를 원하는 형태의 문자열로 변환

y 년도 a 오전/오후
M H 0 ~ 23시
d h 1 ~ 12시
D 1 ~ 365일 m
E 요일 s
public class ExDate {
	
	public static void main(String[] args) {
		
		Date date = new Date();
		System.out.println(date);
		System.out.println();
		
		// 원하는 date 타입으로 바꾸고 싶으면 SimpleDateFormat class를 활용한다.
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분 ss초");
		String today = sdf.format(date);
		System.out.println(today);
		
		
	}

}

[결과값]

Fri Jun 16 16:02:42 KST 2023

2023년 06월 16일 04시 02분 42초

 

 

Wrapper class

기본자료형을 포장해서 객체화시키는 클래스

기본타입 Wrapper
byte Byte
short Short
int Integer
float Float
double Double
boolean Boolean
char Character
public class Ex01Wrapper {
	
	public static void main(String[] args) {
		
		// boxing
		// - 기본타입의 값을 포장해서 객체화하는 과정
		// - Wrapper class의 인자값으로 기본타입의 값 또는 문자열을 사용하면 됩니다.
		// Integer wia = new Integer(1000); // java 11 버전에서는 이 방식 삭제  
		Integer wia = 1000; // 이런식으로 해서 auto boxing한다.
		Double wda = 2.3;
		
		// --------------------------------------------
		
		// unboxing
		// - 포장된 객체를 기본타입으로 변환하는 과정
		int ia = wia; // auto unboxing
		double da = wda;
		
		int res = wia + 2000; // 연산시 auto unboxing된다.
		
		
	}

}

 

파싱 ( Parsing )

  • 문자열을 분석해서 해당 데이터의 기본자료형으로 변환한다.
  • parse + 기본자료형
class Data {
	
	private String value;
	
	public Data(String value) {
		this.value = value;
	}
	
	public String getValue() {
		return value;
	}
	
}

public class Ex02Parse {
	
	public static void main(String[] args) {
		
		String stnA = "100";
		
		// int ia = stnA; Error
		int ia = Integer.parseInt(stnA);
		System.out.println(ia);
		System.out.println();
		
		String stnB = "2.3";
		double da = Double.parseDouble(stnB);
		System.out.println(da);
		System.out.println();
		
		Data dataA = new Data("123");
		String sa = dataA.getValue();
		int a = Integer.parseInt(sa);
		
		Data dataB = new Data("3.4");
		double b = Double.parseDouble(dataB.getValue()); // 이런식으로 한 줄로 정의할 수도 있다.
		
	}

}

[결과값]

100

2.3

 

데이터조작은 문자열 타입이 편하기 때문에 문자열 타입으로 쓰다가 다른 타입이 필요할 때 기본자료형으로 파싱해서 사용하는 편이 낫다.