본문 바로가기
Programming/Java

[JAVA] API ( java.lang package )

by 공부합시다홍아 2023. 12. 4.
 

[JAVA] 예외 처리

[JAVA] 인터페이스 (Interface) [JAVA] Final 과 Abstract(추상화) [JAVA] SingleTon Design Pattern [JAVA] 정적 제한자 Static [JAVA] 다형성 [JAVA] 접근 제한자 [JAVA] 패키지와 상속 [JAVA] 객체와 클래스 [JAVA] 스택(Stack)과

hong-study.tistory.com


JAVA  API ( Application Programming Interface )

API는 "라이브러리" 라고 부르며, 프로그램 개발에 자주 사용되는 클래스 및 인터페이스의 모음이다. 
▶ 자바 표준 문서 주소 : https://docs.oracle.com/javase/8/docs/api

 

Java Platform SE 8

 

docs.oracle.com


java.lang 패키지

java.lang 패기지는 자바 프로그램의 기본적인 클래스들을 담고 있는 패키지이다. 
그렇기 때문에 java.lang 패키지에 있는 클래스와 인터페이스는 import 구문 없이 사용 가능하다.

java.lang 패키지 주요 클래스 


Object 클래스 

클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 묵시적으로 Object 클래스를 상속하게 된다.
→ 따라서 모든 자바의 클래스는 Object 클래스의 자식이거나 자손 클래스이다. 

모든 클래스가 Object를 상속하기 때문에 Object의 Method는 모든 클래스에서 사용이 가능하다.

Person.Class

public class Person /* extends Object */ implements Cloneable {

	private String name;

	public Person(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	// 오버라이딩 - 객체안에 변수를 빠르게 확인하기 위해서 오버라이딩해서 많이 사용함
	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}

	// 오버라이딩 - obj가 Person인 경우, 매개변수의 name과 나의 name이 같으면 true반환
	@Override
	public boolean equals(Object obj) {

		if (obj instanceof Person) {

			Person p = (Person) obj;

			if (p.getName().equals(this.name)) {
				return true;
			}
		}

		return false;
	}

	// finalize - deprecate(언제 없어질지 모르니 왠만하면 사용하지 마세요)
	// 오버라이딩 - 객체가 메모리에서 해제될 때 자동으로 불려나가는 메서드
	@Override
	protected void finalize() throws Throwable {
		System.out.println(this.name + "님이 소멸했습니다");
		super.finalize();
	}

	// 오버라이딩 - 객체를 복사해서 반환
	// 쉽게말하면 cloneable 반드시 구현해야 합니다.
	@Override
	protected Object clone() throws CloneNotSupportedException {

		return super.clone();
	}

}

Main.Class

public class MainClass {

	public static void main(String[] args) {

		Person p = new Person("홍길동"); // 객체1

		String str = p.toString();
		System.out.println(str);

		int hash = p.hashCode();
		System.out.println(hash); // 해시알고리즘을 사용해서 객체의 고유한 주소에 따라서 중복없는 고유한 숫자를 반환

		System.out.println("----------------------------------------------");

		Person p2 = new Person("홍길동"); // 객체2

		boolean result = p.equals(p2);
		System.out.println(result);

		System.out.println("-----------------------------------------");

		try {
			Person o = (Person) p.clone();

			System.out.println(o.toString());

			System.out.println("원본객체:" + p);
			System.out.println("클론객체:" + o);

		} catch (Exception e) {
			e.printStackTrace();
		}

		System.out.println("----------------------------------------------");

		p = null;
		System.gc(); // 가비지컬렉터 호출

	}
}


System 클래스

System 클래스를 이용하면 운영체제의 일부 기능을 이용할 수 있다.
▶ 프로그램 종료, 키보드 입력, 모니터 출력, 메모리 정리, 현재 시간 읽기 등
System 클래스의 모든 멤버는 static으로 구성되어 있어 클래스 이름으로 바로 접근이 가능하다.

System 클래스의 주요 메서드 
  • exit() 
    현재 실행하고 있는 프로세스 강제 종료
    정상 종료일 경우 매개값으로 0을 주고, 비정상종료의 경우 0이외의 값을 준다. 
  • currentTimeMillis() 
    컴퓨터의 시계로부터 현재시간을 읽어 밀리세컨드(1/1000) 단위와 나노세컨드 단위의 long 값을 리턴
    주로 프로그램의 실행 소요시간 측정으로 성능 테스트시 사용
  • getProperty() 
    JVM이 시작할 때 자동 설정되는 시스템의 속성값을 구한다.
  • gc() 
    : Garbage Colletor를 실행시킨다.
import java.io.PrintStream;
import java.util.Properties;
import java.util.Scanner;

public class SystemEx {

	public static void main(String[] args) {

		// system클래스는 운영체제 관련된 기능을 가지고 있습니다.
		// 전부 static메서드 입니다.

		// 콘솔의 출력
		PrintStream out = System.out;
		out.println("hello world");
		System.out.println("hello world");

		// 키보드로 입력
		Scanner scan = new Scanner(System.in);

		System.out.println("----------------------------");

		// 운영체제 관련된 내용을 얻을 수 있음
		Properties p = System.getProperties();
		System.out.println(p);
		System.out.println(p.get("user.name"));
		System.out.println(p.get("os.version"));

		System.out.println("----------------------------");

		// 1970.1.1일 부터 현재까지 지난시간을 밀리초로 반환
		// 프로그램 실행 시간 체크
		long start = System.currentTimeMillis();

		long sum = 0;
		for (long i = 1; i <= 1000000000; i++) {
			sum += i;
		}

		long end = System.currentTimeMillis();

		System.out.println("실행시간:" + (end - start) * 0.001);

		System.out.println("----------------------------------");

		System.exit(0); // 프로그램 종료

	}
}


String 클래스 - 문자열

String은 생성자를 사용해서 객체를 만들 필요없이 기초 데이터를 사용할 때처럼 바로 초기화해서 사용 가능하다.

String 클래스의 주요 메서드 
  • charAt() : 특정 인덱스의 글자 리턴
  • indexOf() : 특정 문자열의 시작 인덱스 값을 반환 ( 주어진 문자열이 미포함시 -1 을 반환 )
  • length() : 문자열의 길이 반환
  • replace() : 특정 문자열을 변경
  • substring() : 인덱스를 기준으로 그 앞의 문자열을 자른다.
  • toUpperCase() : 문자열을 대문자로 치환
  • toLowerCase() : 문자열을 소문자로 치환
  • trim() : 문자열의 앞,뒤 공백을 제거
  • equals() : 문자열의 값을 비교
  • valueOf() : 기본 데이터 타입의 값들을 문자열로 변환
  • split() : 특정 문자열을 기준으로 잘라 배열에 리턴
import java.util.Arrays;

public class StringEx {

	public static void main(String[] args) {

		// 문자열 다루기 메서드

		String str = "hello world";

		char[] arr = { 'h', 'e', 'l', 'l', 'o' };
		String str2 = new String(arr);

		System.out.println(str2);

		System.out.println("------------------------------------------");

		// 1. 문자열의 인덱스 위치를 잘라서 char형 반환
		// char r = str.charAt(0);
		// System.out.println(r);
		System.out.println(str.charAt(0));

		// 2. 문자열길이
		System.out.println("문자열길이:" + str.length());

		// 3. 문자열 자르기
		System.out.println(str.substring(2)); // 2인덱스 미만 절삭
		System.out.println(str.substring(2, str.length())); // 2이상~11미만 추출

		System.out.println("원본문자열:" + str);

		// 4. 문자열 자르기 split()
		String[] r1 = str.split("");
		System.out.println(Arrays.toString(r1));

		String[] r2 = str.split("", 5); // 최대 길이 5
		System.out.println(Arrays.toString(r2));

		// 5. 문자열 자르기 toCharArray()
		char[] r3 = str.toCharArray();
		System.out.println(Arrays.toString(r3));

		// 6. 문자열 치환 replace()
		str = "커피중에 가장 맛있는 커피는 아이스 아메리카노 커피입니다";
		System.out.println(str);

		System.out.println(str.replace("커피", "coffee")); // 찾을문자, 바꿀문자
		System.out.println(str);
		System.out.println(str.replaceFirst("커피", "coffee"));

		// 7. 앞뒤 공백 치환하기 trim()
		str = "    안녕 하세요?    ";
		System.out.println(str);
		System.out.println(str.trim());

		// 8. 문자열 찾기 indexOf
		str = "010-1234-5678";

		System.out.println("1이 있는 위치:" + str.indexOf("1")); // 1이 있는 위치
		System.out.println("2번째 인덱스 부터 1이 있는 위치:" + str.indexOf("1", 2)); // 2번째 인덱스 부터 1이 있는 위치
		System.out.println("없는 문자열이라면 -1반환:" + str.indexOf("hello"));

		// 9. 문자열 찾기 contains
		System.out.println(str.contains("1234")); // 문자가 포함되어 있으면 true

		// 10. 문자열 찾기 startWith()
		System.out.println(str.startsWith("010")); // 010으로 시작하면 true

		// 11. 문자열 비교 compareTo
		System.out.println("홍길동".compareTo("홍길자")); // 음수가 나오면 앞문자가 사전적으로 빠름
		System.out.println("홍길자".compareTo("홍길동")); // 양수가 나오면 앞문자가 사전적으로 느림
		System.out.println("홍길동".compareTo("홍길동")); // 같은 문자라면 0반환

		// 12. 문자열 비교 eqauls
		System.out.println("홍길동".equals("홍길동")); // 문자자체가 같으면 true
		System.out.println("abc".equalsIgnoreCase("ABC")); // 대소문자는 무시하고 문자비교

		// 13. 문자열 합치기 join - 스플릿의 반대
		System.out.println(String.join("^^", "오늘은", "날씨가", "춥습니다"));

		// 14. 기본타입을 -> 문자열로변경
		String result = String.valueOf(3);
		System.out.println(result);

	}
}


StringBuilder
  • StringBuilder는 String 클래스의 단점을 보완하기 위해 사용한다. 
  • 새로운 객체를 생성하는 문제로 인해 속도가 느려지는 현상을 보완한다.
String 클래스의 단점

1. 메모리 과소비
2. 객체 재활용성이 떨어짐 
    ▶ 처음 초기화된 데이터에 변화가 생기면, 기존 객체 재사용보단 새로운 객체를 생성
StringBuilder 의 주요 메서드 
  • append() : 기준 문자열의 뒤에 문자열을 추가
  • insert() : 특정 위치에 문자열 추가
  • delete() : 문자열 삭제
  • deleteCharAt() : 특정 인덱스의 문자 하나 삭제
  • replace() : 문자열의 일부분을 다른 문자열로 대체
  • setCharAt() : 문자열에서 주어진 index의 문자를 다른 문자로 대체
  • toString() : StringBuilder 객체의 값을 문자열로 반환
  • reverse() : 문자열을 거꾸로 출력
StringBuffer

StringBuffer는 동작적인 측면에서 StringBuilder와 동일하다. 
두 클래스의 차이는 "동기화 여부"이다.

StringBuffer는 각 메서드별로 Synchronized Keyword가 존재하여, 멀티스레드 환경에서도 동기화를 지원하지만
StringBuilder는 동기화를 보장하지 않는다

Single Thread 환경이라면 StringBuilder를 사용하는 것이 성능적인 측면에서 더 좋다. 

  • String은 짧은 문자열을 더할 경우 사용
  • StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지
    모를 경우 사용하면 좋다.
  • StringBuilder는 스레드에 안전한지 여부가 전혀 관계없는 프로그램을 개발 할 때 사용하면 좋다. 
public class SbBufferEx01 {

	public static void main(String[] args) {
		
		//buffer, builder 기능은 동일
		//buffer는 스레드환경(멀티스레드)에서 동기화기능 제공,
		//builder는 싱글스레드에서만 사용하길 권장
		
		StringBuffer sb = new StringBuffer("Java");
		String s = new String("Java");
		StringBuilder sb2 = new StringBuilder("Java");
		
		//문자열의 덧셈
		s = s + " Program";
		//새로운 객체로 저장됨
		
		sb.append(" Program");
		//원본이 그냥 바로 저장됨
		
		sb2.append(" Program");
		
		System.out.println(sb);
		System.out.println(s);
		System.out.println(sb2);
		
		System.out.println("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ");
		
		//insert : 중간에 추가
		sb.insert(5, "Support ");
		System.out.println(sb);
		
		//문자열 변경 replace
		sb.replace(5, 12, "Hello");
		System.out.println(sb);
		
		//문자열 삭제 delete
		sb.delete(5, 11);
		System.out.println(sb);
		
		sb.deleteCharAt(4); //한글자 삭제
		System.out.println(sb);
		
		//문자열 로꾸꺼
		sb.reverse();
		System.out.println(sb);
		
		if(s.equals(sb)) { //String vs StringBuffer
			
		}
		
		//문자열로 변경(sb.toString()) 후 비교(.equals(s))
		if(sb.toString().equals(s)) {
		}
		
	}
}


Math 클래스 

Math 클래스는 수학 계산에 사용할 수 있는 메서드를 제공한다.
Math 클래스가 제공하는 메서드는 모두 정적 메서드이므로 Math 클래스 이름으로 바로 사용이 가능하다.

Math 클래스 주요 메서드
  • abs() : 절대값
  • ceil() : 올림값
  • floor() : 내림값 
  • max() : 최대값
  • min() : 최소값
  • random() : 랜덤값
  • rint() : 현재 수에서 가까운 정수를 실수형태로 구함
  • round() : 반올림값 구함
public class MathEx {

	public static void main(String[] args) {

		// Math math = new Math();
		// 생성자가 private 때문
		// Math는 전부 static

		double d = Math.random();
		System.out.println(d);
		System.out.println("절대답값: " + Math.abs(-1));
		System.out.println("올림 : " + Math.ceil(3.14));
		System.out.println("내림 : " + Math.floor(3.14));
		System.out.println("반올림" + Math.round(3));
		System.out.println("큰수" + Math.max(3, 4));
		System.out.println("작은수 : " + Math.min(3, 4));
		System.out.println("루트값 : " + Math.sqrt(4));
		System.out.println("제곱근 : " + Math.pow(2, 3));

	}
}


Wrapper 클래스 

자바는 기본 타입의 값을 갖는 객체를 생성할 수 있다.
이러한 객체를 포장(Wrapper) 객체라고 하는데, 그 이유는 기본 타입의 값을 객체 내부에 두고 포장하기 때문이다.
포장객체의 특징은 포장하고 있는 기본 타입의 값은 외부에서 변경할 수 없다.
▶ 만약 변경하고 싶으면 새로운 포장 객체를 생성해야한다.

  • Wrapper 클래스 : Byte, Short, Integer, Long, Float, Double, Boolean, Character
Wrapper 의 두 가지 의미
- 기본 타입의 값을 포장 객체로 만드는 과정을 박싱(Boxing) 이라하며
   포장 객체에서 기본 타입의 값을 얻어내는 과정을 언박싱(UnBoxing)이라고 한다. 

문자열을 기본 타입 값으로 변환할 때도 많이 사용한다.
대부분의 포장 클래스는 "parse + 기본타입"  명으로 되어있는 static 메서드를 제공한다. 
public class BoxingEx02 {

	public static void main(String[] args) {

		// wrapper는 문자열=>기본형 으로 형변환 할때 많이 사용됩니다.

		int a = Integer.parseInt("3");
		double b = Double.parseDouble("3.14");
		long c = Long.parseLong("5");

		System.out.println(a + b + c);

	}
}

 

728x90

'Programming > Java' 카테고리의 다른 글

[JAVA] API-IO (Input 스트림과 Output 스트림)  (1) 2023.12.06
[JAVA] API - java.util Package  (0) 2023.12.05
[JAVA] 예외 처리  (0) 2023.12.01
[JAVA] 인터페이스 (Interface)  (0) 2023.11.30
[JAVA] Final 과 Abstract(추상화)  (0) 2023.11.30