[220929] Object, String

최수정·2022년 9월 29일
0

멋쟁이사자처럼

목록 보기
5/14
post-thumbnail

object 클래스

Object 클래스는 java.lang 패키지에들어있는 모든 클래스의 조상이며 오직 11개의 메서드만을 가지고 있다.
자바는 많은 클래스에서 객체지향적 프로그래밍을 하기 위해 공통적으로 써야 할만한 것들을 object에 모아둔것이다.
https://www.youtube.com/watch?v=NI6QZy6juc8

잘 사용 되는 object 메소드 종류보기

  • public boolean equals(Object obj) : obj가 이 객체와 같은지를 검사한다.
  • public String toString() : 객체의 문자열 표현을 반환한다.
  • protected Object clone() : 객체 자신의 복사본을 생성하여 반환한다.
  • public int hashCode() : 객체에 대한 해쉬 코드를 반환한다.
  • protected void finalize() : 가비지 콜렉터에 의하여 호출된다.
  • public final Class getClass() : 객체의 클래스 정보를 반환한다.

🔍 활 용: object 클래스의 메소드를 오버라이딩하여 프로그램에 필요한 코드로 재정의 할 수 있다.

🔽 Equals() 메소드 code

class Circle {

	private int radius;

	public Circle(int radius) {
		this.radius = radius;
	}
	
	@Override
	public boolean equals(Object obj) {

		if (obj instanceof Circle) {
			Circle c1 = (Circle) obj;

			if (this.radius == c1.radius)
				return true;
		}

		return false;
	}
}

public class ObjectTest {

	public static void main(String[] args) {

		Circle circle = new Circle(10);
		Circle circle2 = new Circle(10);

		if (circle == circle2) {
			System.out.println("2개의 원은 같습니다.");
		} else {
			System.out.println("두개의 원은 같지 않습니다.");
		}
		// if는 숫자적으로 연산자로 비교를 하는것이기 때문에 주소값을 가진 참조변수는 따질 수 없다.
        // 따라서 출력값은 "두개의 원은 같지 않습니다."
		
		if (circle.equals(circle2)) {
			System.out.println("2개의 원은 같습니다.");
		} else {
			System.out.println("두개의 원은 같지 않습니다.");
		}
		// eeuals문을 이용함으로써 반지름을 가진 객체라면 true로 나오게끔 설정해주었다. 
		// 따라서 출력값은 "2개의 원은 같습니다."

	}
   // public boolean equals(Object anObject) {
   //     if (this == anObject) {
   //         return true;
}

🔽 toString() 메소드

public class Test {

	public static void main(String[] args) {
        // 참조변수를 print()하면 주소 값이 나오는 이유는,
        // print(Object) 함수에 toString()이 포함 되어 있기때문이고,
        // 이 toSrting은 Object 클래스에 기본메서드 인데, 오버라이딩을 해주지 않는이상
        // 아래와같이 해쉬태그를 출력하기로 정의되어 있기 때문이다. 
        
        // Object 클래스의 기본 toString() 코드 
		// public String toString() {
		// return getClass().getName() + "@" + Integer.toHexString(hashCode());
		// } 

		Object obj = new Object();
		System.out.println(obj.toString());
		System.out.println(obj);
		// 그냥 객체를 넣으면, println(Object obj)을 f3으로 확인해봤을 때, 안데 ValueOf라는 함수가 있어서,
		// 참조 변수가 null이 아니면 obj.toString() 되도록 코드가 짜있다. 그래서 위 두줄 코드는 같은 값을 반환한다.

		// (밑 코드 참조)
		/*
		 * public static String ValueOf(Object obj) { return (obj == null) ? "null" :
		 * obj.toString(); }
		 */
	}

}

String 클래스
String 클래스는 문자열을 구성하는 문자들을 내부에 저장하는 배열이라고 생각한다. 또 그 안에는 변수를 제어하는 수 많은 메서드가 있다.
🔽 문자열 비교 code

public class Test {

	public static void main(String[] args) {
	    // string 클래스의 주요 변수 
		// private final byte[] value;
		
		// (1) 리터럴을 정의해서 쓰기
		String s1 = "java"; 
		String s2 = "java";
		// (2) 객체 생성해서 쓰기 
		String s3 = new String("java");
		String s4 = new String("java");
		
		if (s1 == s2) {
			System.out.println("같습니다.");
		} else {
			System.out.println("다릅니다.");
		} // =>  "같습니다." 이건 왜 같다고 나올까?
		// 리터럴 정의 방법은 "java"를 상수로 인식해서 메서드 메모리 쪽에 올려두기 떄문에 (static느낌)
		// 같은 상수가 들어오면 같은 번지로 정의하기 때문에 비교했을때 같다고 나온다. 
	
		if (s3 == s4) {
			System.out.println("같습니다.");
		} else {
			System.out.println("다릅니다.");
		}
		// => 다릅니다 (주소값이)
		
		// 따라서 문자열 비교를 할때에는, 리터럴 정의보단 객체 생성해서 equal함수 써서 하기를 기준으로 잡아
		// 다른 값이 나오게 실수 하지 않도록 주의하자.
		if (s3.equals(s4)) {
			System.out.println("같습니다.");
		} else {
			System.out.println("다릅니다.");
		} 
        // => 같습니다. (객체안의 글자가)
			
	}

}

🔽 문자비교 code
💡charAt()

public class Test {

	public static void main(String[] args) {
		
		String subject = "자바 프로그래밍";
		char Value = subject.charAt(3);
		char Value2 = "자바 프로그래밍".charAt(4);
		// 리터럴도 컴파일러가 객체로 변환해서 쓸 수 있다. 
		
		System.out.println(Value);
		System.out.println(Value2);
		
		
		Scanner sc = new Scanner(System.in);
		char ch = sc.next().charAt(0);
		
		System.out.println(ch);
			
	}

}

🔽 문자찾기 code
💡indexOf()


🔽 글자수세기code

public class Test {

	// static이 붙은 main안에서 함수를 돌리려면 그 함수도 꼭 static을 붙여줘야한다. 
	public static int stringCount(String[] strArr) {
		int count = 0;
		
		for (String str : strArr) {
			count = count + str.length();
		}
		
		return count;
		
	}
	public static void main(String[] args) {


		String[] strArr = { "abcde", "봄", "가을" };

		int total = stringCount(strArr);
		
		System.out.println(total);

	}

}

💡 trim() 공백없애기

String trimStr = " I LOVE you ";
		System.out.println(trimStr.length());
		System.out.println(trimStr.trim().length());
// 중간 공백 말고 맨 앞뒤 공백만을 없애, 출력값은 각각 12,10이다.		
        

💡split() 분절

public static void main(String[] args) {
	   // 공백을 기준으로 문장을 자르겠다. 	
		String[] tokens = "I am a boy".split(" ");
		                           // 리턴값이 String 배열이다.
		// 따라서 출력하려면, 아래와 같이 해야한다. 
		for (String token : tokens) {
			System.out.println(token);
		}
	}

💡valueOf()

오버로딩 되어 있는 느낌을 받을 수 있으며 print()랑 비슷하다고 생각 할 수 있다. 이 메서드의 기능은 기본 타입값을 문자열로 전환하는것이다.

String str1 = String.valueOf(100); 
		System.out.println(str1); // "100"
		
		String str2 = String.valueOf(false);
		System.out.println(str2); //"false"

✍️ 활용문제

package Day0929;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {

        Readline readline = new Readline();
        while (true) {
            readline.Read();
            if (readline.getInput().equals("그만")) {
                break;
            }
            System.out.println("어절 개수는 " + readline.countWord());
        }
        System.out.println("종료합니다...");
    }
}

class Readline {
    Scanner sc = new Scanner(System.in);

    public String getInput() {
        return input;
    }

    private String input;
    private String[] word;

    public void Read() {
        this.input = sc.nextLine();
    }

    public int countWord() {
        this.word = this.input.split(" ");
        return word.length;
    }

}

StringBuffer/ StringBuilder

✏️ 개념
String클래스 안의 메서드의 특징으로 인해 빈번한 문자열 변경은 여러개의 객체 생성을 만들어 내기 때문에, StringBuilder의 다양한 메서드를 이용해 객체 생성없이 문자열을 변경한다.

public static void main(String[] args) {
		// 1. String끼리 연산자가 가능하다. (+)
		
		String str = "Hello";
		String str2 = "world";
		
		String str3 = "Hello" + "world"; // 출력: Helloworld
		            //Hello.concat("world"); 요 문장이 자동 실행돼서 가능한거.
		
		// 2.String은 데이터 타입이 달라도 연산이 가능하다.
		
		String str4 = "Hello" + 1.0;
		
		// 3. 중요한부분 = String은 연산을 할때마다 새로운 객체를 생성한다. 
        // 왜냐하면 문자열의 내용을 변경하는 String 클래스 메소드의 경우, 
        // 새로운 String 객체를 생성하고 기존의 내용을 복사하기 때문이다.
		
		String str5 = str + "world" + "AAAS";
		// 이와 같은 특성으로 인해 문제가 생길 수 있는 것을 방지하는것이 
		// StringBuffer, StringBuilder
	}


🔍 메서드 종류

public static void main(String[] args) {
		
		StringBuilder sb = new StringBuilder("123");
		
	
		sb.append(4567); //문자열 덧붙이기
		
		sb.delete(0, 2); //문자열 삭제
		
		sb.replace(0, 3, "AB"); // 문자열 일부교체
		
		sb.reverse(); // 문자열뒤집기
		
		sb.substring(2,4); // 인덱스 2~3에 해당하는 문자를 추출한다.  
        // string sub = sb.substring(2,4);
        
        // 활용예제
        Scanner sc = new Scanner(System.in);
		System.out.println("입력하세요: ");
		String input = sc.nextLine();
		
		// I Love you
		for (int i=0; i <= input.length(); i++) {
			System.out.print(input.substring(i)); // input[i]~끝까지 뽑는다
			System.out.println(input.substring(0,i)); // input[i]까지만 출력한다 

			}
			
		sc.close();

	}

0개의 댓글