본문 바로가기

Server Programming/BackEnd Project

32일차 - 자바. lang 패키지 (+ String클래스의 compareToIgnoreCase, equalsIgnoreCase)

반응형

Object 클래스

    • 참조값만 비교
    • 객체 자신과 파라미터로 전달된 객체를 비교 참조 값을 비교
    • equals() 메서드를 오버라이딩해서 객체의 값을 비교하는 것으로 변경한다.
package ch13.objequals;

public class ObjectEqualsTest {
    public static void main(String args[]) {
        Object obj1 = new Object();
        Object obj2 = new Object();
        if(obj1.equals(obj2)) { // obj1 == obj2
            System.out.println("obj1.equals(obj2) -> true");
        } else {
            System.out.println("obj1.equals(obj2) -> false");
        }

        ObjectEq oeq1 = new ObjectEq(10);
        ObjectEq oeq2 = new ObjectEq(10);
        // 객체 참조값을 비교
        if(oeq1 == oeq2) {
            System.out.println("o1 == o2 -> true");
        } else {
            System.out.println("o1 == o2 -> false");
        }
        // 오바라이딩된 메서드를 호출하여 객체의 필드값을 비교
        if(oeq1.equals(oeq2)) {
            System.out.println("o1.equals(o2) -> true");
        }
    }
}

 

class EqualsEx1 {
	public static void main(String[] args) {
		Value v1 = new Value(10);
		Value v2 = new Value(10);		

		if (v1.equals(v2)) {
			System.out.println("v1과 v2는 같습니다.");
		} else {
			System.out.println("v1과 v2는 다릅니다.");		
		}

		v2 = v1;

		if (v1.equals(v2)) {
			System.out.println("v1과 v2는 같습니다.");
		} else {
			System.out.println("v1과 v2는 다릅니다.");		
		}
	} // main
} 

class Value {
	int value;

	Value(int value) {
		this.value = value;
	}
}

 

package ch13.objequals;

class ObjectEq {
    private int val;
    public ObjectEq(int val){
        this.val = val;
    }
    @Override
    public boolean equals(Object obj) {
        if(obj != null && obj instanceof ObjectEq) {
            return this.val == ((ObjectEq)obj).val;
        }
        return false;
    }
}

 

class Person {
	long id;

	public boolean equals(Object obj) {
		if(obj!=null && obj instanceof Person) {
			return id ==((Person)obj).id;
		} else {
			return false;
		}
	}

	Person(long id) {
		this.id = id;
	}
}

class EqualsEx2 {
	public static void main(String[] args) {
		Person p1 = new Person(8011081111222L);
		Person p2 = new Person(8011081111222L);

		if(p1==p2)
			System.out.println("p1과 p2는 같은 사람입니다.");
		else
			System.out.println("p1과 p2는 다른 사람입니다.");

		if(p1.equals(p2))
			System.out.println("p1과 p2는 같은 사람입니다.");
		else
			System.out.println("p1과 p2는 다른 사람입니다.");
	
	}
}

 

  • 얕은 복사와 깊은 복사
import java.util.*;

class Circle implements Cloneable {
	Point2 p;  // 원점
	double r; // 반지름

	Circle(Point2 p, double r) {
		this.p = p;
		this.r = r;
	}

	public Circle shallowCopy() { // 얕은 복사
		Object obj = null;

		try {
			obj = super.clone();
		} catch (CloneNotSupportedException e) {}

		return (Circle)obj;
	}

	public Circle deepCopy() { // 깊은 복사
		Object obj = null;

		try {
			obj = super.clone();
		} catch (CloneNotSupportedException e) {}

		Circle c = (Circle)obj; 
		c.p = new Point2(this.p.x, this.p.y); 

		return c;
	}

	public String toString() {
		return "[p=" + p + ", r="+ r +"]";
	}
}

class Point2 {
	int x;
	int y;

	Point2(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public String toString() {
		return "("+x +", "+y+")";
	}
}

class ShallowCopy {
	public static void main(String[] args) {
		Circle c1 = new Circle(new Point2(1, 1), 2.0);
		Circle c2 = c1.shallowCopy();
		Circle c3 = c1.deepCopy();
	
		System.out.println("c1="+c1);
		System.out.println("c2="+c2);
		System.out.println("c3="+c3);
		c1.p.x = 9;
		c1.p.y = 9;
		System.out.println("= c1의 변경 후 =");
		System.out.println("c1="+c1);
		System.out.println("c2="+c2);
		System.out.println("c3="+c3);
	}
}

 

  • hashCode()
    • 객체 자신의 해시코드를 반환
    • 컬렉션 객체인 HashSet에서는 equals()를 오버라이딩할때 함께 오버라이딩해줘야한다.
import java.util.*;

class HashSetEx4 {
   public static void main(String[] args) {
      HashSet set = new HashSet();

      set.add(new String("abc"));
      set.add(new String("abc"));
      set.add(new Person2("David",10));
      set.add(new Person2("David",10));

      System.out.println(set);
   }
}

class Person2 {
   String name;
   int age;

   Person2(String name, int age) {
      this.name = name;
      this.age = age;
   }

   public boolean equals(Object obj) {
      if(obj instanceof Person2) {
         Person2 tmp = (Person2)obj;
         return name.equals(tmp.name) && age==tmp.age;
      }

      return false;
   }

   public int hashCode() {
      return (name+age).hashCode();
   }

   public String toString() {
      return name +":"+ age;
   }
}
  • getClass()
    • 현재 자신의 객체 클래스 정보를 가지고 있는 런타임 클래스 객체를 얻을 수 있다.
    • 리플렉션 API를 이용하면 클래스 텍스트명으로 클래스 객체 생성, 메서드 호출도 가능하다.
      Class 클래스의 인스턴스를 런타임 클래스 객체라고 한다.
      -> 리소스가 많이 소요되므로 비즈니스로직에서는 사용을 자제해야한다.
      • Class<?> clazz = Class.forName("클래스경로")를 이용하면 접근제어자를 무시하고 클래스 정보를 가져올 수 있다.
      • getName()
      • getFields()
      • getConstructor()
      • getMethods()
package ch13.objgetclass;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class GetClassEx1 {
    public static void main(String args[]) {
        String str = "getClass() 메서드 실행";
        Class clazz = str.getClass();
        System.out.println("클래스명 : " + clazz.getName());
        System.out.println("상위 클래스명 : " + clazz.getSuperclass());
        System.out.println("메서드 목록");
        for(Method method : clazz.getMethods()){
            System.out.print(method.getName() + "\t");
        }
        System.out.println();
        System.out.println("필드 목록");
        for(Field field : clazz.getFields()){
            System.out.print(field.getName() + "\t");
        }
    }
}

 

 

System Properties (환경 변수)

  • getProperty()
  • setProperty()

 

package ch13.prop;

import java.io.FileWriter;
import java.util.Properties;

public class PropsTestEx2 {
    public static void main(String[] args)throws Exception{
        Properties p=new Properties();
        p.setProperty("name","홍길동");
        p.setProperty("email","perfectjava@naver.com");

        p.store(new FileWriter("info.properties"),"Properties Example");
    }
}

 

package ch13.prop;

import java.util.Enumeration;
import java.util.Properties;

public class PropertiesTest {
    public static void main(String args[]){
        Properties props = System.getProperties();
        Enumeration propsNames = props.propertyNames();

        while(propsNames.hasMoreElements()) {
            String propName = (String)propsNames.nextElement();
            String property = props.getProperty(propName);
            System.out.println("property '" + propName +
                    "' = '" + property + "'");
        }
    }
}

 

 

Math class

  • 모두 static 메서드로 객체 생성없이 사용
  • 상수로 PI, E가 존재

package ch13;
import static java.lang.System.*;

public class MathTest {
    public static void main(String args[]){
        out.println("10의 절대값 : " + Math.abs(10));
        out.println("10.0 절대값 : " + Math.abs(10L));
        out.println("20.0d의 절대값 : " + Math.abs(-20.0d));
        out.println("큰 값을 반환 : " + Math.max(20, 10));
        out.println("작은 값을 반환 : " + Math.min(10.0, 20.0));
        out.println("Random 값을 반환 : " + Math.random());
        out.println("올림 값 : " + Math.ceil(20.3));
        out.println("작거나 같은 가장 작은 정수를 반환 : " + Math.floor(99.7));
        out.println("가장 가까운 정수를 double 타입으로 반환 : " + Math.rint(101.57));
        out.println("radians로 지정된 sin 값을 반환 : " + Math.sin(100));
        out.println("radians로 지정된 cos 값을 반환 : " + Math.cos(100));
        out.println("radians로 지정된 tan 값을 반환 : " + Math.tan(100));
        out.println("100으로 지정된 로그값을 반환 : " + Math.log(100));
        out.println("3.0의 2.0승 값을 double 값으로 반환 : " + Math.pow(3.0, 2.0));
        out.println("Square root값을 double 값으로 반환 : " + Math.sqrt(3));
   }
}

Wrapper class

  • 기본형 값을 객체로 다룰 때 사용
  • Java5부터 오토박싱과 언박싱으로 자동변환을 지원한다.
  • 언박싱 시에는 static메서드인 valueOf()  
    • instanceof 연산자를 이용해 확인 후 형변환해서 사용한다.
    • Wrapper 클래스의 조상클래스인 Number클래스의 메서드 사용
      • intValue()
      • doubleValue()
      • longValue()

package ch13.wrapper;

public class Boxing {
    public static void main(String arggs[]){
        int val = 20;
        // valueOf() 메서드를 이용하여 래퍼 클래스 객체 변환
        Integer i1 = Integer.valueOf(val);
        // Autoboxing으로 래퍼 클래스 객체 자동 변환
        Integer i2 = val;
    }
}
package ch13.wrapper;

public class UnBoxing {
    public static void main(String arggs[]){
        // new 생성자를 사용하는 것은 deprecated 되었다
        // Integer i = new Integer(20);
        Integer i = Integer.valueOf(20); // 박싱
        // intValue() 메서드를 이용하여 기본형으로 변환
        int val1 = i.intValue();
        // AutoUnboxing 기능으로 기본형으로 자동 변환
        int val2 = i;
    }
}

 

 

package ch13.wrapper;

public class AutoBoxingUnBoxing {
    public static void main(String arggs[]) {
        Integer num = Integer.valueOf(15); // 박싱
        int n = num.intValue();        // 언박싱
        System.out.println(n);

        Character ch = 'X'; // Character ch = new Character('X'); : 오토박싱
        char c = ch;        // char c = ch.charValue();           : 오토언박싱
        System.out.println(c);

        // 오토박싱과 오토언박싱을 통해 기본형과 래퍼클래스간의 다양한 연산도 가능하다
        Integer num1 = Integer.valueOf(7); // 박싱
        Integer num2 = Integer.valueOf(3); // 박싱

        int int1 = num1.intValue();    // 언박싱
        int int2 = num2.intValue();    // 언박싱

        Integer result1 = num1 + num2; // 10
        Integer result2 = int1 - int2; // 4
    }
}

 

package ch13.wrapper;

public class WrapperClassEx01 {
    public static void main(String args[]){
        Integer i1 = Integer.valueOf(10);
        Integer i2 = Integer.valueOf(10);
        boolean isEquals1 = i1.equals(i2);
        boolean isEquals2 = i1 == i2;

        System.out.println(isEquals1);
        System.out.println(isEquals2);
    }
}

 

package ch13.wrapper;

public class WrapperClassEx02 {
    public static void main(String args[]){
        byte    b=20;
        short   s=10;
        int     i=70;
        long    l=200;
        float   f=10.0F;
        double  d=20.0D;
        char    c='c';
        boolean bool=true;

        // Autoboxing
        Byte    byteobj=b;
        Short   shortobj=s;
        Integer intobj=i;
        Long    longobj=l;
        Float   floatobj=f;
        Double  doubleobj=d;
        Character charobj=c;
        Boolean boolobj=bool;

        System.out.println("랩퍼 클래스 객체");
        System.out.println("Byte object :"+  byteobj);
        System.out.println("Short object: "+ shortobj);
        System.out.println("Integer object: "+ intobj);
        System.out.println("Long object: "+ longobj);
        System.out.println("Float object: "+ floatobj);
        System.out.println("Double object: "+ doubleobj);
        System.out.println("Character object: "+ charobj);
        System.out.println("Boolean object: "+ boolobj);

        // Unboxing
        byte    bytevalue = byteobj;
        short   shortvalue = shortobj;
        int     intvalue = intobj;
        long    longvalue = longobj;
        float   floatvalue = floatobj;
        double  doublevalue = doubleobj;
        char    charvalue = charobj;
        boolean boolvalue = boolobj;

        System.out.println("기본형(Primitive type)");
        System.out.println("byte value: " + bytevalue);
        System.out.println("short value: " + shortvalue);
        System.out.println("int value: " + intvalue);
        System.out.println("long value: " + longvalue);
        System.out.println("float value: " + floatvalue);
        System.out.println("double value: " + doublevalue);
        System.out.println("char value: " + charvalue);
        System.out.println("boolean value: " + boolvalue);


    }
}

 

 

Number클래스

  • 4개의 추상 메서드와 2개의 메서드 제공
  • 객체를 다른 기본형으로의 변환도 가능하다 (실수 -> 정수)

package ch13.wrapper;

public class NumberTestEx {
    public static void main(String args[]){
        Double doubleValue = Double.valueOf(123.456);

        int intValue = doubleValue.intValue(); // 소숫점 버림
        short shortValue = doubleValue.shortValue();
        long longValue = doubleValue.longValue();

        System.out.println("integer value: " + intValue);
        System.out.println("short value: " + shortValue);
        System.out.println("long value: " + longValue);
    }
}

 

 

String class

  • char 값의 시퀀스를 나타내느 객체로 내부적으로 ch[]로 구성된다.
  • compare(), concat(), equals(), split(), length(), replace(), compareTo(), intern(), substring() 문자열 작업 수행하는 메서드가 존재한다.
  • Serializable, Comparable, CharSequence 인터페이스를 구현한다.
  • String 객체의 인스턴스 내용은 변경 불가능하므로, immutable object라고 하며, 문자열이 변경될 때마다 새로운 인스턴스가 생성된다.
  • CharSequence 인터페이스는 문자 시퀀스를 나타내는데 사용되며, char 값을 읽을 수 있는 시퀀스
  • 변경 가능한 문자열은 StringBuffer, StringBuilder 클래스를 사용할 수 있다.
    • 쓰레드로부터 보호 = StringBuffer [Thread-Safety]
    • 쓰레드로부터 안전하지 않다 = StringBuilder
  • 문자열은 큰 따옴표를 사용해 생성하는데, 문자열 객체는 string constant pool이라는 특별한 메모리 영역에 저장
  • 문자열 리터럴 생성시마다 JVM이 풀을 확인해 동일한 문자열이 존재하면 참조값을 반환하고, 없으면 인스턴스를 생성해 풀에 배치한다.

 

package ch13.string;

public class StringEx01 {
    public static void main(String args[]){
        String s1 = "java"; // 문자열 리터럴로 string 객체 생성

        char ch[] = {'g','i','l','d','o','n','g'};
        String s2 = new String(ch); // char 배열을 문자열로 변환
        // new 키워드로 자바 문자열 객체 생성
        String s3 = new String("새로운 문자열");
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);

        String strVar1 = "abc";
        String strVar2 = "abc";
        String strVar3 = new String("abc");
        String strVar4 = new String("abc");
        // true = 동일한 객체 참조값
        System.out.println(strVar1 == strVar2);
        // false = new로 생성되어 객체 참조값이 다르다
        System.out.println(strVar3 == strVar4);
        // 오버라이된 equals메서드로 값을 비교
        System.out.println(strVar1.equals(strVar2));
        System.out.println(strVar3.equals(strVar4));
    }
}

 

package ch13.string;

import java.util.Locale;

public class StringEx02 {
    public static void main(String args[]){
        String s = new String("ABCDEFGH");
        System.out.println(s.charAt(4)); // E
        System.out.println(s.compareTo("ABCDEFGH")); // 0
        System.out.println(s.compareToIgnoreCase("abcdefgh")); // 0
        System.out.println(s.concat("abc")); // ABCDEFGHabc
        System.out.println(s.endsWith("FGH")); // true
        System.out.println(s.equals("ABCDEFGH")); // true
        System.out.println(s.equalsIgnoreCase("abcdefgh")); // true

        s = new String("This is a String");
        System.out.println(s.indexOf("i")); // 2
        System.out.println(s.indexOf("i", 7)); // 13
        System.out.println(s.indexOf("is")); // 2
        System.out.println(s.lastIndexOf("is")); // 5
        System.out.println(s.length()); // 16
        System.out.println(s.replace('i', 'Q')); // ThQs Qs a StrQng
        System.out.println(s.replaceAll("is", "IS")); // thIS IS a String
        System.out.println(s.startsWith("This")); // true
        System.out.println(s.substring(5)); // is a String
        System.out.println(s.substring(5, 13)); // is a Str
        System.out.println(s.toLowerCase()); // this is a string
        System.out.println(s.toUpperCase()); // THIS IS A STRING
    }

}

 

 

#trim()은 모든 공백을 지우지만 java11부터 앞의 공백만, 뒤의 공백만 지우는 메서드 추가

  • stripLeading()
    • 앞의 공백만 지운다.
  • stripTrailing()
    • 뒤의 공백만 지운다.
replaceAll에 정규식으로 뒤의 공백 제거하는 방법
String str = "    ABCD      ";
str = str.replaceAll("\\s+$", "");

 

 


StringBuffer 클래스 

  • 동일한 객체에 값을 변경가능한 변경가능한 객체
  • 멀티스레드 환경에서 불변 객체인 String의 경우에는 값이 변하지 않는다는 점이 보장되므로 스레드 세이프 처리를 하지 않아도 된다.변경가능한 객체인 StringBuffer의 경우에 스레드 세이프한 처리한 코드를 가지고 있다. (즉, syncronized- 동기화 처리 수행)
    변경가능한 객체인 StringBuilder의 경우에 스레드 세이프한 처리가 되어있지 않다.
  • 생성자
    • StringBuffer() : 빈 버퍼
    • StringBuffer(int capacity) : 매개변수만큼 버퍼를 초기화해 생성
    • StringBuffer(String initialString) : 초기 스트링 값을 포함해 버퍼를 초기화해 생성
  • 수정 메서드
    • append
    • insert
    • reverse
    • setCharAt
    • setLength
  • append()메서드에 스레드 동기화를 위한 synchronized 처리

 

중간에 끼어넣을 수 있는 (문자열 변경이 가능한) 특징을 위한 예제

  • buffer.append("bind").append("string");

 

  • String vs StringBuffer

 

String 클래스에 + 연산하는 경우와 StringBuffer로 +연산하는 경우

 

  • StringBuffer 메서드

 

반응형

'Server Programming > BackEnd Project' 카테고리의 다른 글

35일차 - TIL  (0) 2023.01.16
32일차 - TIL  (0) 2023.01.13
31일차 - TIL  (0) 2023.01.12
30일차 - TIL  (0) 2023.01.11
30일차 - 자바. 예외처리  (0) 2023.01.11