[Java] Object클래스와 Stirng 클래스 API 실습하기

    Object 클래스

    클래스를 선언할 때 extneds 키워드로 다른 클래스를 상속하지 않으면 암시적으로 java.lang.Object 클래스를 상속하게 된다. 따라서 자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스이다. Object는 자바의 최상위 부모 클래스에 해당한다. 따라서 Object에 있는 메소드를 사용할 수 있는 것이다. 다음 대표적인 객체비교 equals() 메소드를 보자


    객체 비교(equals())

    equals() 메소드의 매개 타입은 Object인데, 이것은 모든 객체가 매개값으로 대입될 수있음을 말한다. 그 이유는 Object가 최상위 타입이므로 모든 객체는 Object 타입으로 자동 타입 변환될 수 있기 때문이다. 기본적으로 equals() 메소드는 비교 연산자인 ==과 동일한 결과를 리턴한다. 두 객체가 동일한 객체라면 true를 리턴하고 그렇지 않으면 false를 리턴한다. 하지만 실제로 자바에서 보통 equals()를 사용할 때 동일한 객체인지 비교하는 것이 아니라 객체에 있는 데이터를 비교한다. 이것을 논리적 비교라고 한다. 보통 어떤 데이터를 비교해서 true로 반환할지는 자신이 equals() 메소드를 재정의 해서 사용하지만

     String 클래스의 equals()를 사용할 때는 String 클래스의 데이터(문자열)를 비교하도록 자동적으로 equals()가 재정의 되어있다. 그래서 String 문자열을 비교할 때는 equals() 를 사용한다.


    public class Member {
        public String id;
        
        public Member(String id) {
            this.id = id;
        }
        
        @Override
        public boolean equals(Object obj) {
            if(obj instanceof Member) {
                Member member = (Member) obj;
                if(id.equals(member.id))
                    return true;
            }
            return false;
        }
    }
    cs


    public class MemberExample {
        public static void main(String[] args) {
            Member obj1 = new Member("blue");
            Member obj2 = new Member("blue");
            Member obj3 = new Member("red");
        
            if (obj1.equals(obj2)) {
                System.out.println("obj1과 obj2는 동등합니다.");
            } else {
                System.out.println("obj1과 obj2는 동등하지 않습니다.");
            }
            
            if (obj1.equals(obj3)) {
                System.out.println("obj1과 obj3는 동등합니다.");
            } else {
                System.out.println("obj1과 obj3는 동등하지 않습니다.");
            }
        }
    }
    cs


    위 예제 에서는 Member 클래스에서 no를 가지고 비교하기 위해서 equals() 메소드를 재정의 하였다. equals()를 재정의 하지 않으면 동일한 객체인지 비교한다. 즉 == 연산자와 같은 결과가 나올 것이다.


    public class StringEqualsExample {
        public static void main(String[] args) {
            String a = "안녕하세요";
            String b = new String("안녕하세요");
     
            System.out.println(a == b);
            System.out.println(a.equals(b));
        }
    }
    cs


    a, b를 출력하면 똑같이 "안녕하세요"가 출력될 것이다 하지만 ==로 비교하냐 equals()로 비교하냐에 따라 결과는 달라진다 위에서 말했듯이 == 는 동일한 객체 인지 비교하는 것이다. a 는 "안녕하세요" 라는 리터럴의 주소를 가지고 있지만 b 는 또다른 하나의 객체를 가지고 있어 == 결과는 false가 나오지만 equals()는 true가 나온다 왜냐하면 String 클래스에서 equals()가 문자열을 비교하도록 재정의 되어있기 때문이다. 그래서 정확한 비교를 위해 String 비교는 equals() 메소드를 사용한다.



    String 클래스

    소스상에서 문자열 리터럴은 String 객체로 자동 생성되지만, String 클래스의 다양한 생성자를 이용해서 직접 String 객체를 생성할 수 도 있다. 어떤 생성자를 이용해서 String 객체를 생성할지는 제공되는 매개값의 타입에 달려 있다. 파일의 내용을 읽거나, 네트워클 통해 받은 데이터는 보통 byte[] 배열이므로 이것을 문자열로 변환하기 위해 사용된다.


    문자 추출(charAt())

    charAt() 메소드는 매개값으로 주어진 인덱스의 문자를 리턴한다. 인덱스는 0부터 시작한다. 공백도 하나의 문자로 인식하여 인덱스에 포함된다.


    public class StringCharAtExample {
        public static void main(String[] args) {
            String str = "안녕하세요";
            System.out.println(str.charAt(0));
            System.out.println(str.charAt(1));
            System.out.println(str.charAt(2));
            System.out.println(str.charAt(3));
            System.out.println(str.charAt(4));
        }
    }
    cs



    문자열 찾기(indexOf())

    indexOf() 메소드는 매개값으로 주어진 문자열이 시작되는 인덱스를 리턴한다. 만약 문자열이 포함되어 있지 않으면 -1을 리턴한다.


    public class StringAPIExample {
        public static void main(String[] args) {
            String str = "안녕하세요";
            System.out.println(str.indexOf("안"));
            System.out.println(str.indexOf("녕"));
            System.out.println(str.indexOf("하"));
            System.out.println(str.indexOf("세"));
            System.out.println(str.indexOf("요"));
            System.out.println(str.indexOf("!"));
        }
    }
    cs


    문자열 대치(replace())

    replace() 메소드는 첫 번쨰 매개값인 문자열을 찾아 두 번쨰 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴한다. replace() 메소드가 리턴하는 문자열은 원래 문자열의 수정본이 아니라 완전히 새로운 문자열이다. 따라서 원래 문자열은 그대로 남아있다.


    str.replace("안녕""앵뇽")
    cs

    "안녕" -> "앵뇽" 으로 변경


    문자열 잘라내기(substring())

    subString() 메소드는 주어진 인덱스에서 문자열을 추출한다. subString() 메소드는 매개값의 수에 따라 두 가지 형태로 사용된다. substring(int beginIndex, int endIndex)는 주어진 시작과 끝 인덱스 사이의 문자열을 추출하고, substring(int beginIndex)는 주어진 인덱스 이후부터 끝까지 문자열을 추출한다.


    public class StringAPIExample {
        public static void main(String[] args) {
            String str = "안녕하세요";
        
            System.out.println(str.substring(13));
            System.out.println(str.substring(3));
        }
    }
    cs


    첫번째는 beginIndex, endIndex를 이용하여 문자열을 추출하였다. 마지막 endIndex는 추출이 안된다는 것을 알아두자, 두번째는 3번째 인덱스부터 마지막 인덱스 까지 추출한다.


    알파벳 소 대문자 변경(toLowerCase(), toUpperCase())

    toLowerCase() 메소드는 문자열을 모두 소문자로 바꾼 새로운 문자열을 생성한 후 리턴한다. toUpperCase() 메소드는 그 반대로 대문자로 바꾼다. 


    public class StringAPIExample {
        public static void main(String[] args) {
            String str = "Java Programming";
        
            System.out.println(str.toLowerCase());
            System.out.println(str.toUpperCase());
        }
    }
    cs




    문자열 앞뒤 공백 잘라내기(trim())

    trim() 메소드는 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하고 리턴한다. 중간의 공백은 제거하지 않는다.


    public class StringAPIExample {
        public static void main(String[] args) {
            String str = "   Java Programming   ";
        
            System.out.println(str);
            System.out.println(str.trim());
        }
    }
    cs




    문자열 대소문자 구별안하고 비교하기(equalsIgnoreCase())


    public class StringAPIExample {
        public static void main(String[] args) {
            String str = "quit";
     
            System.out.println(str.equalsIgnoreCase("Quit"));
        }
    }
    cs


    문자열 비교할때 대소문자 구별안하고 비교하려면 equalsIgnoreCase() 메소드를 사용한다.

    댓글

    Designed by JB FACTORY