관리 메뉴

나구리의 개발공부기록

자바의 정석 기초편 ch7 - 5 ~ 9[단일상속, Object클래스,오버라이딩, 오버로딩 vs 오버라이딩] 본문

유튜브 공부/JAVA의 정석 기초편(유튜브)

자바의 정석 기초편 ch7 - 5 ~ 9[단일상속, Object클래스,오버라이딩, 오버로딩 vs 오버라이딩]

소소한나구리 2023. 11. 23. 14:10

1) 단일상속

  • Java는 단일 상속만을 허용 (C++은 다중상속 허용)
  • 다중상속은 충돌문제가 있어서 다중상속을 제외했음
  • Java는 인터페이스를 이용하면 충돌문제를 해결하면서 다중상속 효과를 낼 수 있음 - 이후에 배움
class TvDVD extends Tv, DVD {	// 에러 발생
}
// 조상은 하나만 허용된다.

 

(1) 인터페이스를 사용하지 않고 다중상속처럼 하려면?

  • 비중이 높은 클래스 하나만 상속관계로 설정하고 나머지는 포함관계로 설정하면 다중 상속 효과를 낼 수 있음
class TV {  // 상속
	 내용 생략
}

class DVD {	// 포함
	void power() { 내용생략 }
	void play() { 내용생략 }
	void stop() { 내용생략 }
	void rew() { 내용생략 }
}


class TvDVD extends TV {	// TV클래스는 상속하고
	DVD dvd = new DVD();	// DVD클래스는 포함으로 작성
    
	void play() {	// 포함 객체 사용(메서드 호출)
		dvd.play()
        }

	void stop() {	// 포함 객체 사용(메서드 호출)
		dvd.play();
        }

	void rew() {
		dvd.play()	// 포함 객체 사용(메서드호출)
        }
}

2)Object 클래스

  • 모든 클래스의 조상
  • 모든 클래스는 자동으로 Object 클래스를 상속 받게 되며 우리가 상속 없이 class를 만들어서 사용했더라도 Object 클래스는 상속을 받음
  • 즉, 모든 클래스의 최상위 조상으로 Object가 있으며 프로그램 실행 시 컴파일러가 자동으로 extends Object를 자동 추가 함
  • 모든 클래스는 Object클래스에 정의 된 11(9장에서 더 배움)개의 메서드를 상속 받음
    • ex) toSting(), equals(Object obj), hashCode(), 등등등

컴파일러 시 부모가 없는 클래스는 자동으로 Object가 추가 됨(우측 사진)

(1) 예제

  • Object 클래스를 상속하지 않아도 프로그램을 실행하면 컴파일러가 자동으로 추가함
  • toSpring()이라는 메서드를 어디에도 만들지 않았지만 Object클래스를 자동으로 상속 받으므로 사용할 수 있음
  • toString메서드는 출력할때 사용하는 기능
class MyPoint {	// 컴파일 하면 자동으로 Object 추가
	int x;
	int y;
}

class Circle { // 컴파일 하면 자동으로 Object 추가
	MyPoint p;
	int r;
    
    Circle() {
    	p = new MyPoint();
    }
}

public class InheritanceTest { // 컴파일 하면 자동으로 Object 추가
	public static void main(String[] args) {
		Circle c = new Circle();
		Circle c2 = new Circle();

		System.out.println(c.toString());	// 객체의 주소 출력
        
		// c.toString()과 동일한 결과 참조변수 c만 출력하나 결과가 똑같음
		System.out.println(c);	
		System.out.println(c2.toString());	// 객체의 주소 출력
	}
}

출력결과

Circle@18b4aac2
Circle@18b4aac2
Circle@764c12b6

3) 오버라이딩(overriding; 메서드 오버라이딩)

  • 상속받은 조상의 메서드를 자신에 맞게 변경하는 것 즉, 기능을 재정의함
  • 내용만 변경 가능(구현부)하며 선언부는 변경 불가
class MyPoint3 {
	int x;
	int y;

	String getLocation() {	// 메서드	
		return"x:" + x + ", y:" + y;
	}
}

class MyPoint3D extends MyPoint3 {	// Point클래스 상속
	int z;

	String getLocation() {	// 메서드 오버라이딩
		return"x:" + x + ", y:" + y +", z:" +z;
    }
}

public class OverrideTest {
	public static void main(String[] args) {
		MyPoint3D p = new MyPoint3D();
		p.x = 3;
		p.y = 5;
		p.z = 7;
		System.out.println(p.getLocation());
	}

}

오버라이딩 안하면 z가 출력 안됨
오버라이딩 출력 결과

x:3, y:5, z:7

 

(1) 오버라이딩의 조건

  • 메서드의 선언부가 조상 클래스의 메서드와 반환타입, 메서드이름, 매개변수 목록이 모두 일치 해야함,
  • 접근 제어자를 조상 클래스의 좁은 범위로 변경할 수 없음 - 접근제어자는 이후에 배움
  • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없음 - 예외선언은 8장에서 배움

(2) 오버로딩과 오버라이딩

  • 서로 전혀 관계가 없음(헷갈리면 안됨)
  • 오버로딩 : 이름이 같은 새로운 메서드를 정의 하는 것 - 상속하고 관계가 없음
  • 오버라이딩 : 상속받은 메서드의 내용을 변경 하는 것

(3) 예제

  • toString()메서드를 오버라이딩하여 출력형식을 재정의
  • 참조변수로만 출력해도 오버라이딩된 출력형식이 적용되는 이유는 print(), println(), printf()모두 호출 시 toString() 메서드가 호출되도록 정의 되었기 때문임
class MyPoint3 {  // 자동으로 Object클래스 상속
	int x;
	int y;

	MyPoint3(int x, int y) {	// 생성자로 변수 초기화
		this.x = x;
		this.y = y;
	}
	
	// Object 클래스의 toString()을 오버라이딩
	// Object 클래스의 toString()메서드에는 public이 붙어있음
	public String toString() {	// 오버라이딩시 선언부는 똑같아야함
		return "x:"+x+", y:"+y;
	}
}

public class OverrideTest {  // 자동으로 Object클래스 상속
	public static void main(String[] args) {
		MyPoint3 p = new MyPoint3(2,3);
//		p.x = 3;	// 직접 변수를 초기화 할 수 있음
//		p.y = 5;	
		
		// 3개 모두다 출력값이 같음
		System.out.println("x:"+p.x+", y:"+p.y);	// 양식을 직접 입력하여 출력
		System.out.println(p.toString());	        // 간단히 toString으로 출력
		System.out.println(p);	                    // 참조변수로만 출력
	}
}

/*
출력 결과(생성자로 변수를 초기화 했을 시)
x:2, y:3
x:2, y:3
x:2, y:3

출력 결과(직접 변수를 초기화 했을 시)
x:3, y:5
x:3, y:5
x:3, y:5
*/

 

** 출처 : 남궁성의 정석코딩_자바의정석