예시
class A{}
class JavaPractice {
public static void main(String[] args) {
A a = new A();
System.out.println(a);
}
}
PrintScream 클래스 > println(Object x)
(객체가 Object를 자동 상속하므로, 다형성이 적용되었다.)
String은 valueOf() 대입한다.
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
String 클래스 > valueOf(Object obj)
안의 값이 null이면 null, 아니면 toString() 리턴
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Object 클래스 > toString()
해당 클래스의 이름 + "@" + 정수를 16진수로 뿌리기(주소값)
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
class JavaPractice {
public static void main(String[] args) {
A a = new A();
System.out.println(a);
String str1 = "aaa";
System.out.println(str1);
String str2 = new String("abc");
System.out.println(str2); // toString의 Overriding
}
}
[Console]
A@4926097b
aaa
abc
이 코드에서 class A에 코드를 추가한다.
class A extends Object{
@Override
public String toString() {
return "toString()";
}
}
class JavaPractice {
public static void main(String[] args) {
A a = new A();
System.out.println(a); // toString의 Overriding
String str1 = "aaa";
System.out.println(str1);
String str2 = new String("abc");
System.out.println(str2);
}
}
[Console]
toString()
aaa
abc
String 클래스 > toString()
public String toString() {
return this;
}
interface Printable{
public abstract void print(String doc);
// 인터페이스에 public abstract 를 적지 않아도 자동적으로 넣어준다.
}
class Printer implements Printable{
public void print(String doc) {
System.out.println(doc);
} // 자식의 클래스에서 Overriding
}
class JavaPractice {
public static void main(String[] args) {
Printable prn = new Printer();
prn.print("HELLO java");
}
}
[Console]
HELLO java
interface ICalculator {
public abstract int add(int num1, int num2);
public abstract int sub(int num1, int num2);
public abstract int mul(int num1, int num2);
public abstract double div(int num1, int num2);
}
class MyCalculator implements ICalculator {
@Override
public int add(int num1, int num2) {
return num1 + num2;
}
@Override
public int sub(int num1, int num2) {
return num1 - num2;
}
@Override
public int mul(int num1, int num2) {
return num1 * num2;
}
@Override
public double div(int num1, int num2) {
if (num2 == 0) {
System.out.println("div error");
System.exit(0);
}
return (double)num1 / num2;
}
}
class JavaPractice {
public static void main(String[] args) {
ICalculator cal = new MyCalculator();
System.out.println(cal.add(10, 20));
System.out.println(cal.sub(10, 20));
System.out.println(cal.mul(10, 20));
System.out.println(cal.div(10, 20));
System.out.println(cal.div(10, 0));
}
}
[Console]
30
-10
200
0.5
div error
String str = "age: " + 17;
StringBuilder s = new StringBuilder("age: ");
System.out.println(s.toString());
s.append(17);
System.out.println(s.toString());
StringBuilder 클래스 > StringBuilder 생성자 함수
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
StringBuilder() 클래스 > append()
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
AbstractStringBuilder 클래스
abstract class AbstractStringBuilder implements Appendable, CharSequence {
byte[] value;
byte coder;
int count;
@Override
public int length() {
return count;
}
public AbstractStringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
}
Appendable 인터페이스
public interface Appendable {
Appendable append(CharSequence csq) throws IOException;
Appendable append(CharSequence csq, int start, int end) throws IOException;
Appendable append(char c) throws IOException;
}
CharSequence 인터페이스