32일차 - 2023.2.9

문우림·2023년 2월 10일
0

Java

목록 보기
16/23

1. Object클래스 상속 관계

오버라이딩해서 사용하는 Object클래스의 대표적인 함수
toString( ) / hachCode( ) / equals( )

1-1. toString( )

toString( )메소드는 메소드를 재정의(오버라이딩)하지 않는다면 기본적으로 인스턴스의 클래스 이름과 골뱅이@, 인스턴스의 해시 코드를 16진수로 변환한 문자열을 반환한다.
ex) C@4926097b

  • Object클래스의 기능을 상속받은 String클래스의 toString메소드

1-2. equals(obj)

equals(obj)메소드는 두 객체가 같을 경우 true를 반환하는 메서드.
여기서 객체라는 의미는 인스턴스 일수도 있고 동일한 의미의 객체일 수도 있다.

기존의 equals메소드 내용

public boolean equals(Object obj) {
    return (this == obj);
}
  • equals( )는 재정의(오버라이딩)하지 않는 경우 기본적으로 ==연산자를 통하여 인스턴스가 같은지 확인한다.
  • ==연산자는 인스턴스 메모리 주소를 비교하기 때문에 동일한 의미의 객체가 있다 하더라도 false값을 반환할 수 있다.
    ex)
Fruit fruit1 = new Fruit("사과");
Fruit fruit2 = new Fruit("사과");
	
System.out.println(fruit1.equals(fruit2));

[결과]
false
  • 객체 내용은 같지만 다른 메모리공간에 인스턴스가 생성되었기 때문에 false값을 반환.

1-3. Object클래스 함수 오버라이딩에 대한 예제

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
  • C클래스는 보이지는 않지만 조상 클래스인 Object클래스를 상속 받고있다.

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형의 값을 그대로 출력하는 기능을 오버라이딩 했기 때문이다.

2. 어노테이션

  • @(골뱅이)기호를 앞에 붙여서 사용.

  • 컴파일러한테 어떻게 처리해야 하는지 알려주는 역활.

  • 에너테이션을 입력하든 안 하든 프로그램에는 기본적으로 영향을 주지 않는다.

  • JDK1.5버전 이상부터 사용가능.

  • @ 자체가 하나의 기능(함수 역할)을 한다.

2-1. @Override

  • 개발자가 부모 클래스에 있는 함수를 오버라이딩 하겠다 라는 선언(체크).

  • 부모에 있는 함수(똑같은 이름의 함수)가 있는지 확인.

  • 상속받은 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드가 없다면 컴파일 오류가 난다.

3. Interface

  • 자바에서는 다중상속을 지원하지 않기 때문에, 다중상속을 하기 위해서 인터페이스가 있다.

  • 인터페이스 안에는 상수(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

3-1. Interface예제

인터페이스를 사용해 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

4. 아래의 연산과정에서 호출되는 함수(원리)를 써서 표현해 보세요.

String str = "age: " + 17;

0개의 댓글