본문 바로가기
Java

API - java.lang - Object , System(운영체제) , StringBuffer , Math , Wrapper

by 임혁진 2023. 11. 24.

Object

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

}

}

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

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 - 문자열 다루기 (유용한 메소드)

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.printl

 

StringBuffer , StringBuilder

String의 단점을 보완한 클래스

*String 클래스의 단점 -

String 클래스는 아주 많이 쓰이고 좋은 기능들을 많이 가지고 있지만 메모리를 과소비한다는 문제점이 있다.

String 객체는 처음 초기화된 데이터에 변화가 생기면 기존 객체를 재활용하지 않고 새로운 객체를 생성-삭제생성반복

 

StringBuffer

-String 클래스의 단점인 새로운 객체를 생성하는 문제로 인해 속도가 느려지는 현상이 발생하 기 때문에 이 문제를 해결하기 위해 속도적인 측면에서 개선된 클래스

 

String Buffer의 유용한 메소드

1. append(): 기존 문자열의 뒤에 문자열을 추가합니다.

2. insert(): 특정 인덱스 위치에 문자열을 추가합니다.

3. delete(): 문자열을 삭제합니다.

4. deleteCharAt(): 특정 인덱스의 문자 하나를 삭제합니다.

5. replace(): 문자열의 일부분을 다른 문자열로 대체합니다.

6. setCharAt(): 문자열에서 주어진 index의 문자를 다른 문자로 대체합니다.

7. toString(): StringBuilder 객체의 값을 문자열로 반환합니다.

8. reverse(): 문자열을 거꾸로 뒤집습니다

9. subSequence( start, end(미만)) - 인덱스 start이상 end미만 문자열을 반환한다.

StringBuffer 쓰는방법 예

public class SbBufferEX {

 

public static void main(String[] args) {

 

//buffer, builder는 기능은 동일합니다.

//buffer는 쓰레드환경에서 동기화기능제공, builder는 싱글스레드에서만 사용하는게 좋습니다.

 

//StringBuilder sb2 = new StringBuilder("Java");

 

StringBuffer sb = new StringBuffer("Java");

String s = new String("Java");

 

//문자열의 덧셈

s = s + " program"; //새로운 객체가 생성됨

sb.append(" program"); //원본 sb가 변함

 

System.out.println(sb);

System.out.println(s);

 

//중간에 추가 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(0); //한글자 삭제

System.out.println(sb);

 

//문자열 로꾸꺼

sb.reverse();

System.out.println(sb);

 

// if(s.equals(sb) ) { //String vs StringBuffer

// }

//문자열로 변경후 비교

if( sb.toString().equals(s) ) {

 

}

}

}

 

문자열과 StringBuffer의 속도비교 

public class SbBufferEx2 {

 

public static void main(String[] args) {

 

//문자열과 빠른문자열 속도 비교

long start = System.currentTimeMillis();

 

String str = "A";

for(int i = 0; i < 300000; i++) {

str += "A";

}

 

long end = System.currentTimeMillis();

 

System.out.println("String덧셈:" + (end-start) * 0.001 );

 

 

 

long s = System.currentTimeMillis();

 

StringBuffer sb = new StringBuffer("A");

 

for(int i = 0; i < 300000; i++) {

sb.append("A");

}

 

long e = System.currentTimeMillis();

 

System.out.println("스트링버퍼합계:" + (e - s) * 0.001 );

 

}

}

 

400배  가량의 속도차이가 난다

 

 

Math

- Math 클래스는 수학 계산에 사용할 수 있는 메소드들을 제공

- Math 클래스가 제공하는 메서드는 모두 정적 메소드이므로 Math 클래스 이름으로 바로 사용이 가능

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.5) );

 

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) ); //2의 3제곱

}

}

 

 

Wrapper 

=> 자바는 기본 타입의 값을 갖는 객체를 생성할 수 있습니다.

=> 이러한 객체를 포장(Wrapper) 객체라고 하는데 그 이유는 기본 타입의 값을 객체 내부에 두고 포장하 기 때문입니다.

=> 포장 객체의 특징은 포장하고 있는 기본 타입의 값은 외부에서 변경할 수 없습니다.

     만약 변경하고 싶 으면 새로운 포장 객체를 생성해야 합니다.

=> 다양한 Wrapper클래스 - Byte, Short, Integer, Long, Float, Double, Boolean, Character

 

 

대부분 포장 클래스는 "parse+기본타입"의   static메서드를 제공

실행결과 19.96

public class BoxingEx01 {

 

public static void main(String[] args) {

 

int a = 100;

double b = 3.14;

char c = 'A';

boolean d = false;

 

//boxing = 기본타입을 => 객체형으로 변환

 

Integer v1 = new Integer(a);

Double v2 = new Double(b);

Character v3 = new Character(c);

Boolean v4 = new Boolean(d);

 

//System.out.println(v1);

Object[] arr = {v1, v2, v3, v4 };

 

//unboxing = 객체형 => 기본타입으로 변환

int x = v1.intValue();

double y = v2.doubleValue();

char k = v3.charValue();

boolean j = v4.booleanValue();

 

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

//autoboxing = 자동형변환

Integer a1 = a;

int a2 = a1;

 

Object[] arr2 = {1, 3, 3.14, true };

}

}