[Java] Java Basic APIs

게맛살맛게·2021년 12월 7일
0

Java

목록 보기
15/18
post-thumbnail

Java Basic APIs

Language API

java.lang 패키지 : 자바에 가장 기본적인 클래스들을 포함
java.lang

  • 자바 프로그램에서 가장 많이 사용하는 패키지
  • import하지 않아도 자동으로 포함됨

Object 클래스

  • 모든 클래스의 최상위 클래스
  • 명시적으로 extends java.lang.Object 하지 않아도 자동으로 상속
  • 다음과 같은 메소드를 가지고 있어 하위 객체들도 모두 사용 가능
    • hashCode();
    • getClass().getName();
    • toString(); == getclass().getName() + "@" + Integer.toHexString(hashCode())
    • equals(); default : public boolean equals(Object obj) { return (this == obj); }
    • finalize();
    • notify();, notifyAll();
    • wait();


  • 기본 메서드 Overriding
// 자바 최상위 클래스는 Object
public class Point {
	private int x , y;
	
	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public String toString() {
		// 객체 문자열 포맷을 반환
		return String.format("Point(%d, %d)", x, y);
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Point) {
			Point other = (Point) obj;
			return x == other.x && y == other.y;
		}
		return super.equals(obj);
	}

}

객체의 복제

얕은 복제 vs. 깊은 복제(객체 복제)

  • 얕은 복제 : 단순히 내부 필드의 값을 복제
    clone() 이라는 메소드를 사용하기 위해 Cloneable이라는 Interface 생성 필요
    ❗ 참조형 얕은 복제 시 같은 메모리를 참조하여 값 변경이 발생하면 함께 변경 되는 문제 발생

  • 깊은 복제 : 참조하고 있는 객체도 복제하여 새로 할당하는 것 ✅
    Cloneable 구현 후 clone메서드를 override하여 내부 참조 객체도 복제

String 클래스

  • 문자 (Character)
    - 기본 자료형
    • 문자 선언 : char letter; 문자 할당 : letter = 'A';

  • 문자열 (String) 클래스
    - 연속된 문자(char)들을 저장하고 다루기 위한 클래스
    • 문자열 상수 : ""로 둘러싸인 문자열 ➡ 한번 만들어진 String 객체는 변경 불가immutable
    • 문자열 선언 : String greeting; 문자열 할당 : greeting = "Hello Java!";
    • 특수 문자의 표현 (Escape characters) : \;, \", \\, \n, \r, \t

  • String 연산
    • +연산자 : 문자열의 연결 (문자열과 다른 타입의 연결은 문자열로 변환되어 연결)
      +연산자로 합쳐진 문자열은 새로운 메모리 공간에 할당되고 그 메모리를 변수가 다시 참조 ✅ ➡ 변경되는 것이 아니라 새 문자열 생성 후 참조 (변경 불가 원칙 - immutable)
    • .charAt(position) : 해당 위치의 문자 반환
    • .subString(start, end) : start 부터 end까지의 문자들을 새로운 문자열로 반환
    • .concat(string) : 문자열 뒤에 붙여 새로 생성

  • String Methods
	// 유용한 메서드들
	String str = "Java Programming JavaScript Programming";
	
	System.out.println("str : " + str);			// str : Java Programming JavaScript Programming
	System.out.println("LENGTH : " + str.length());		// LENGTH : 39
	
	// 변환 메서드
	System.out.println("UPPER : " + str.toUpperCase()); 	// UPPER : JAVA PROGRAMMING JAVASCRIPT PROGRAMMING
	System.out.println("LOWER : " + str.toLowerCase());	// LOWER : java programming javascript programming
		
	// 검색 메서드
	System.out.println("인덱스 5의 글자 : " + str.charAt(5));			// 인덱스 5의 글자 : P
	int index = str.indexOf("Java");					// "Java"의 인덱스
	System.out.println("1번째 Java 인덱스 : " + index);			// 1번째 Java 인덱스 : 0
	index = str.indexOf("Java", 5);						// 5번 인덱스 이후의 "Java"
	System.out.println("2번째 Java 인덱스 : " + index);			// 2번째 Java 인덱스 : 17
	index = str.indexOf("Java", 21);					// 21번 인덱스 이후의 "Java"
	System.out.println("3번째 Java 인덱스 : " + index);			// 3번째 Java 인덱스 : -1 // -1 : 찾을 수 없음
	
	System.out.println("마지막 Java 인덱스 : " + str.lastIndexOf("Java"));	// 마지막 Java 인덱스 : 17
	
	// 문자열 추출
	System.out.println("substring(5) : " + str.substring(5));		// substring(5) : Programming JavaScript Programming // 5부터 전체
	System.out.println("substring(5, 16) : " + str.substring(5, 16));	// substring(5, 16) : Programming		// 5 ~ 16 앞까지
	
	// 문자열 변경
	System.out.println("replace : " + str.replace("Programming", "Coding"));// replace : Java Coding JavaScript Coding
	
	// 문자열은 변경되지 않음 (새로운 문자열이 생성되는 것)
	System.out.println("str : " + str);					// str : Java Programming JavaScript Programming
	
	// 화이트 스페이스 (공백문자, 개행문자, 탭문자 등) 제거 .trim()
	String s2 = "           Hello      ";
	String s3 = "      Java           ";
	System.out.println(s2.trim() + " " + s3.trim());			// Hello Java
	
	// 문자열 분리	.split(구분자) -> 구분자로 잘라서 배열로 반환
	String[] words = str.split(" ");
	System.out.println(Arrays.toString(words));				// [Java, Programming, JavaScript, Programming]
	for (String word : words) {
		System.out.println("WORD : " + word);
	}
	
	// 문자열 비교 : Unicode 비교
	// 0 : 순서가 같다		음수 : 전자가 후자보다 순서가 빠르다		양수 : 순서가 늦다
	System.out.println("ABC".compareTo("ABD"));			// -1	



StringBuffer 클래스

가변 크기의 문자 버퍼를 가짐

  • Stringimmutable인 것에 비해, StringBuffer 객체는 수정 가능
    버퍼의 크기는 문자열의 길이에 따라 가변적으로 변한다
	// 버퍼의 생성
	StringBuffer sb = new StringBuffer("Tbis");
	System.out.println(sb);						// This
			
	// 문자열 추가 : append
	sb.append(" is pencil");
	System.out.println(sb);						// This is pencil
	
	// 문자열 삽입 : insert
	sb.insert(7, " my");						// 7번 인덱스에 " my"를 추가
	System.out.println(sb);						// This my is pencil
	
	// 문자열 치환 : replace
	sb.replace(7, 10, " your");					// 7번부터 10번 앞까지를 " your"로 변경
	System.out.println(sb);						// This your is pencil
	
	// 버퍼사이즈 조정 : setLength
	sb.setLength(6);
	System.out.println(sb);						// This i
	
	// 위와 동일하지만 체이닝한 방법
	StringBuffer sb2 = new StringBuffer("This").append(" is pencil").insert(7, " my").replace(7, 10, " your");
	String s = sb2.toString();					// 문자열 생성
	System.out.println(s);



Wrapper 클래스

기본 데이터형을 객체로 다루기 위한 포장 클래스
Wrapper

  • 사용이유
    • 자바에서는 객체를 대상으로 처리하는 경우가 많음
    • 특정 클래스는 객체만 다루기 때문에 기본 데이터 형을 사용할 수 없음 (비교 연산과 같은)
    • 문자열을 기본 타입값으로 변환할 때 유용
    • 다양한 유틸리티 메서드 활용 가능

  • 활용
    .valueOf() 메서드를 이용하여 생성

  • 박싱과 언박싱 (boxing & unboxing)
    + 박싱 (boxing) : 기본 데이터를 Wrapper 클래스에 담는 것
    + 언박싱 (unboxing) : Wrapper 클래스를 기본 데이터에 담는 것
    박싱언박싱
    + 자동 박싱과 언박싱자동박싱언박싱
    == 연산자로 비교시 그래도 객체 이므로 권장하지 않음 (같은 값(참조값)이 아닐 가능성이 높음)
profile
IT 기술블로그

0개의 댓글