오버라이딩해서 사용하는 Object클래스의 대표적인 함수
toString( ) / hachCode( ) / equals( )
toString( )
메소드는 메소드를 재정의(오버라이딩)하지 않는다면 기본적으로 인스턴스의 클래스 이름과 골뱅이@, 인스턴스의 해시 코드를 16진수로 변환한 문자열을 반환한다.
ex) C@4926097b
equals(obj)
메소드는 두 객체가 같을 경우 true를 반환하는 메서드.
여기서 객체라는 의미는 인스턴스 일수도 있고 동일한 의미의 객체일 수도 있다.
✔기존의 equals메소드 내용
public boolean equals(Object obj) {
return (this == obj);
}
Fruit fruit1 = new Fruit("사과");
Fruit fruit2 = new Fruit("사과");
System.out.println(fruit1.equals(fruit2));
[결과]
false
class C {
}
//class C extends Object {
// @Override 개발자가 부모에 있는 함수(똑같은 이름의 함수)인지 체크
// public String toString() {
// return "메롱!!!!";
// }
//}
public class Overriding {
public static void main(String[] args) {
C c = new C();
C cc = null;
System.out.println(c); //(c) = c.toString();
// 왜 주소값이 나오지?
System.out.println(cc);
String str = "매롱";
String str2 = new String("매롱2");
System.out.println(str2);
// 왜 값(문자열)이 나오지?
}
}
[결과]
C@4926097b
null
매롱2
Q. c의 주소값이 나오는 이유는?
C c = new C(); System.out.println(c); //(c) = c.toString();
- toString메소드의 기본적 기능은 주소값을 참조하는 것이다.
- Object클래스의 toString메소드를 오버라이딩 하지 않았기 때문이다.
Q. str2의 값이 나오는 이유는?
String str2 = new String("매롱2"); System.out.println(str2); //(str2) = str2.toString();
- Object클래스 toString메소드
public String toString() { return this; }
String형의 값을 그대로 출력하는 기능을 오버라이딩 했기 때문이다.
@(골뱅이)기호를 앞에 붙여서 사용.
컴파일러한테 어떻게 처리해야 하는지 알려주는 역활.
에너테이션을 입력하든 안 하든 프로그램에는 기본적으로 영향을 주지 않는다.
JDK1.5버전 이상부터 사용가능.
@ 자체가 하나의 기능(함수 역할)을 한다.
개발자가 부모 클래스에 있는 함수를 오버라이딩 하겠다 라는 선언(체크).
부모에 있는 함수(똑같은 이름의 함수)가 있는지 확인.
상속받은 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드가 없다면 컴파일 오류가 난다.
자바에서는 다중상속을 지원하지 않기 때문에, 다중상속을 하기 위해서 인터페이스가 있다.
인터페이스 안에는 상수(final)와 추상(abstract) 함수(= 내용이 없는 함수)가 온다.
변수는 오지 않는다.
내용({ } -> 구현부분)이 없으면 컴파일러가 자동으로 public abstract를 선언해준다.
내용은 자식 클래스가 구현한다.
인터페이스도 다형성을 적용한다.
인터페이스 표준 = 강제 = 외주 = 드라이버(가장 대표적)
package ex1;
// 상수(final) + abstract 함수(바디가 없는 추상 함수)
interface Printable {
public abstract void print(String doc);// public abstract 를 안 적어도 컴파일러가 자동으로 넣어준다
}
class Printer implements Printable { // implements = 구현한다
public void print(String doc) { // 함수 내용을 구현하고 있음
System.out.println(doc);
}
}
public class Interface {
public static void main(String[] args) {
Printable prn = new Printer(); //다형성 적용
prn.print("Hello Java");
}
}
[결과]
Hello Java
인터페이스를 사용해 num과 num2의 +, -, /, * 연산한 값을 출력
interface ICalculator {
public abstract int add(int num, int num2); // 더하기
public abstract int sub(int num, int num2); // 뺴기
public abstract int mul(int num, int num2); // 나누기
int div(int num, int num2); // 곱하기
}
class MyCalculator implements ICalculator {
public int add(int num, int num2) {
return num + num2;
}
public int sub(int num, int num2) {
return num - num2;
}
public int mul(int num, int num2) {
return num / num2;
}
public int div(int num, int num2) {
return num * num2;
}
}
public class Interface {
public static void main(String[] args) {
ICalculator calculator = new MyCalculator();
System.out.println(calculator.add(10, 20));
System.out.println(calculator.sub(10, 20));
System.out.println(calculator.mul(10, 20));
System.out.println(calculator.div(10, 20));
}
}
[결과]
30
-10
0
200
String str = "age: " + 17;