1. interface에서 정의한 변수는 모두 상수이므로 변경할 수 없다.

2. 추상클래스는 구체적이지 않은 클래스, 클래스 앞에 abstract 라는 키워드를 붙여서 정의한다.
ex) 
abstract class Bird {

}

추상 클래스는 미완성의 추상 메소드를 포함할 수 있음. 추상 메소드는 정의만 하고 구체적인 내용이 없는 메소드.
추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메소드를 반드시 구현해야함(구체적 내용)
추상 메소드를 구현하지 않으면 상속받은 해당 클래스도 추상 클래스가 되어버림.

3. 
Java.lang 패키지

Java.lang의 클래스는 import를 하지 않고도 사용 가능
대표적으로 String, StringBuffer, StringBuilder, System, Math, Thread 관련 중요 클래스 등등 다양한 클래스와 인터페이스가 속해 있음

4.
StringBuffer가 가지고 있는 메소드들은 대부분 자기 자신, this를 반환

StringBuffer sb2 = new StringBuffer();
StringBuffer sb3 = sb2.append("hello"); 

if(sb2 == sb3) {
System.out.println("sb2 == sb3");
}


append 메소드가 자기 자신을 반환하기 때문에 if문의 결과로 sb와 sb3는 같다.
이렇게 자기 자신의 메소드를 호출하여 자신의 값을 바꿔나가는 것을 메소드체이닝 이라고 함

String str2 = new StringBuffer().append("hello").append(" ").append("world").toString(); // 이런 식으로 한줄에 메소드 체인이 가능.

5. 

public class StringExam2 {

public static void main(String[] args) {
String str1 = "hello world";
String str2 = str1.substring(5);
System.out.println(str1);
System.out.println(str2);

String str3 = str1 + str2;
System.out.println(str3);


// 문자열과 문자열을 더하게 되면 내부적으로는 다음과 같은 코드가 실행된다.

String str4 = new StringBuffer().append(str1).append(str2).toString();
System.out.println(str4);


// 이 때 new가 많이 사용되면 성능상 문제가 생길 수 있음.
String str5="";
for(int i=0; i<100; i++ ) {
str5 = str5 + "*";
}
System.out.println(str5);

// 그래서 다음과 같이 객체를 만들어서 new를 한 번만 쓰는 것이 좋다.
StringBuffer sb = new StringBuffer();
for (int i=0; i<100; i++) {
sb.append("*");
}
String str6 = sb.toString();
System.out.println(str6);
}

}
       

+ Recent posts