tostring(), equals(), substring() append(), setCharAt() 등의 메소드들에 대한 기능을 설명하기 위한 소스인듯 하다.

 

질문)

 

class Test2 {
   static class StrangeStringBuffer
   {
    StringBuffer sb;
    StrangeStringBuffer(String s) {
     sb = new StringBuffer(s);
    }
    void setCharAt(int n,char x) {
     sb.setCharAt(n,(char)(x+1));
    }
    void append(char c) {
     sb.append("X");
    }
    void substring() {
     String s = sb.substring(sb.length()-3);
     sb = new StringBuffer(s);
    }
    public boolean equals(Object o) {
     return true;
    }
    public String toString() {
     return "Strange" + sb.toString();
    }
   }
   public static void main(String args[])
   {
      int data[] = { 2, 1, 4, 3, 5 };
   String x = "";
   String y = "";

   for(int i = 0; i < 5; i++) {
    x = x + " " + data[i];
    y = y + " " + data[4-i];
   }
   StrangeStringBuffer s1 = new StrangeStringBuffer(x);
   StrangeStringBuffer s2 = new StrangeStringBuffer(y);
      s1.setCharAt(x.length()-2,'X'); s2.setCharAt(x.length()-2,'X');
      s1.append('A'); s2.append('A');
   s1.substring(); s2.substring();
   if (s1.equals(s2) == true) {
    System.out.println("A"+s2);
   } else {
    System.out.println("B"+s1);
   }  
   }
}


이거결과랑 이유좀 자세히 제발 상세히 적어주세요 부탁드립니다.

 

 

 

답변)

 

s1과 s2를 주석부분을 확인하기 좋게 구별해서 뒀습니다.

각각의 메소드의 기능을 출력문을 통해 볼수 있게 만들었습니다.

실행결과와 주석은 2. RUN 을 참고하세요.



1. CLASS


public class Test2 {
 
  static class StrangeStringBuffer {
    StringBuffer sb;
  
    StrangeStringBuffer(String s) {
       sb = new StringBuffer(s);
    }
  
    void setCharAt(int n, char x) {
      System.out.print("과 두번째 값 " + x);
      sb.setCharAt(n, (char)(x+1));


      System.out.println("에 'x+1' 을 하면 '" + (char)(x+1) + "'가 된다.");
      System.out.print("해당메소드(setCharAt)은 첫번째값 문자열의 '" + n + "'번째 자릿수에 '" + (char)(x+1) + "' 를 대입해서 '");
      System.out.print(sb + "' 를 만들어 준다.");
    }
  
    void append(char c) {
      System.out.print("가 되고 append 메소드에서 넘겨준 인자 '" + c + "' 는 \n별다른 기능을 하지않고, '" + sb + "' 에 X 만 붙여서 '");


    sb.append("X");
      System.out.println(sb + "' 가 된다.");
    }
  
    void substring() {
      System.out.println("그리고 마지막으로 " + sb + " 문자열에 앞의 " + (sb.length()-3) + " 자리를 뺀 값을 버퍼에 담는다.");


      String s = sb.substring(sb.length()-3);
      sb = new StringBuffer(s);
    }
  
    public boolean equals(Object o) {
      return true;
    }
  
    public String toString() {
      System.out.println("toString() 메소드에서 'Strange'에 sb값 '" + sb.toString() + "' 가 합쳐진 값이 들어있다.");


      return "Strange" + sb.toString();
    }
  }
 
  public static void main(String[] args){
    int data[] = { 2, 1, 4, 3, 5 };
    String x = "";
    String y = "";


    System.out.println("0. x 와 y 의 값을 누적한다.");
    for(int i = 0; i < 5; i++) {
      x = x + " " + data[i];
      y = y + " " + data[4-i];
   
      if(i < 2){
        System.out.println("0-" + i + ". 번째 각각 --> x : " + x + "\t\t y : " + y + "");
      }else{
        System.out.println("0-" + i + ". 번째 각각 --> x : " + x + "\t y : " + y + "");
      }
    }
    System.out.println("0-5. x 문자열의 길이 : " + x.length() + " / y 문자열의 길이 : " + y.length());


    System.out.println();
    System.out.println();
  
    System.out.print("1. 버퍼에 들어간 s1의 값 : ");
    StrangeStringBuffer s1 = new StrangeStringBuffer(x);
    System.out.println("--> " + s1);
    System.out.println();
  
    System.out.print("1-1. setCharAt 에 들어갈 첫번째 값 : " + (x.length()-2));
    s1.setCharAt(x.length()-2,'X');
    System.out.println();
    System.out.print("\n1-2. 결론은 's1' 은 " + s1);
    s1.append('A');
    s1.substring();
  
    System.out.println();
    System.out.println();


    System.out.print("2. 버퍼에 들어간 s2의 값 : ");
    StrangeStringBuffer s2 = new StrangeStringBuffer(y);
    System.out.println("--> " + s2);
    System.out.println();
  
    System.out.print("2-1. setCharAt 에 들어갈 첫번째 값 : " + (x.length()-2));
    s2.setCharAt(x.length()-2,'X');
    System.out.println();
    System.out.print("\n2-2. 결론은 's2' 는 " + s2);
    s2.append('A');
    s2.substring();
  
    System.out.println();
    System.out.println();


    System.out.println("s1 과 s2를 비교한다.");
    if (s1.equals(s2) == true) {
      System.out.println("\ns1과 s2가 같으면 A : "+s2);
    } else {
      System.out.println("\ns1과 s2가 다르면 B : "+s1);
    } 
  }
}

 



2. RUN


0. x 와 y 의 값을 누적한다.
0-0. 번째 각각 --> x :  2            y :  5
0-1. 번째 각각 --> x :  2 1          y :  5 3
0-2. 번째 각각 --> x :  2 1 4       y :  5 3 4
0-3. 번째 각각 --> x :  2 1 4 3     y :  5 3 4 1
0-4. 번째 각각 --> x :  2 1 4 3 5  y :  5 3 4 1 2
0-5. x 문자열의 길이 : 10  /  y 문자열의 길이 : 10



1. 버퍼에 들어간 s1의 값 : toString() 메소드에서 'Strange'에 sb값 ' 2 1 4 3 5' 가 합쳐진 값이 들어있다.
--> Strange 2 1 4 3 5


1-1. setCharAt 에 들어갈 첫번째 값 : 8과 두번째 값 X에 'x+1' 을 하면 'Y'가 된다.
해당메소드(setCharAt)은 첫번째값 문자열의 '8'번째 자릿수에 'Y' 를 대입해서 ' 2 1 4 3Y5' 를 만들어 준다.
toString() 메소드에서 'Strange'에 sb값 ' 2 1 4 3Y5' 가 합쳐진 값이 들어있다.


1-2. 결론은 's1' 은 Strange 2 1 4 3Y5가 되고 append 메소드에서 넘겨준 인자 'A' 는
별다른 기능을 하지않고, ' 2 1 4 3Y5' 에 X 만 붙여서 ' 2 1 4 3Y5X' 가 된다.
그리고 마지막으로  2 1 4 3Y5X 문자열에 앞의 8 자리를 뺀 값을 버퍼에 담는다.



2. 버퍼에 들어간 s2의 값 : toString() 메소드에서 'Strange'에 sb값 ' 5 3 4 1 2' 가 합쳐진 값이 들어있다.
--> Strange 5 3 4 1 2


2-1. setCharAt 에 들어갈 첫번째 값 : 8과 두번째 값 X에 'x+1' 을 하면 'Y'가 된다.
해당메소드(setCharAt)은 첫번째값 문자열의 '8'번째 자릿수에 'Y' 를 대입해서 ' 5 3 4 1Y2' 를 만들어 준다.
toString() 메소드에서 'Strange'에 sb값 ' 5 3 4 1Y2' 가 합쳐진 값이 들어있다.


2-2. 결론은 's2' 는 Strange 5 3 4 1Y2가 되고 append 메소드에서 넘겨준 인자 'A' 는
별다른 기능을 하지않고, ' 5 3 4 1Y2' 에 X 만 붙여서 ' 5 3 4 1Y2X' 가 된다.
그리고 마지막으로  5 3 4 1Y2X 문자열에 앞의 8 자리를 뺀 값을 버퍼에 담는다.




s1 과 s2 를 비교한다.
toString() 메소드에서 'Strange'에 sb값 'Y2X' 가 합쳐진 값이 들어있다.


s1과 s2가 같으면 A : StrangeY2X



도움이 되셨기를~