카테고리 없음

상속(Inheritance) - 17

동윤123 2024. 4. 30. 16:23

1. 상속에 대한 개념을 이해하자.

 

상속(Inheritance)은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다. 상속은 기존의 클래스를 확장하여 새로운 클래스를 정의하는 메커니즘을 말합니다. 상속을 통해 기존 클래스의 속성과 메서드를 재사용하고 확장하여 새로운 클래스를 만들 수 있습니다.

이를 위해 상속에서는 두 개의 클래스가 필요합니다:

  1. 부모 클래스(Parent Class) 또는 슈퍼 클래스(Superclass): 기존에 정의된 클래스로, 상속의 대상이 되는 클래스입니다. 부모 클래스의 속성과 메서드를 자식 클래스에게 상속합니다.
  2. 자식 클래스(Child Class) 또는 서브 클래스(Subclass): 부모 클래스를 확장하여 새롭게 정의되는 클래스입니다. 자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받습니다.

2. 오버라이드란 뭘까?

오버라이드(Override)란 상속 관계에서 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의(다시 정의)하는 것을 말합니다. 즉, 자식 클래스에서 부모 클래스의 메서드를 새로운 내용으로 구현하는 것입니다. 이렇게 하면 자식 클래스는 부모 클래스의 메서드를 덮어쓰게 되므로, 부모 클래스의 메서드 대신에 자식 클래스에서 정의한 메서드가 호출됩니다.

 

시나리오코드'

```java
package basic.ch17;

// 상상력 추가
// 선임이 작성한 코드라고 가정 
public class A {
	
	String name; 
	int height; 
	int weight; 
	int age; 
	
	 
}
// 단. 하나의 자바 파일안에 여러개의 클래스를 작성할 수 있다. 
// 단, public 클래스는 오직 하나만 정의 가능하다. 

// 복사 붙여 넣기도 가능 
class B {
	
	String name; 
	int height; 
	int weight; 
	int age; 
	
	int level; 
	String nickName; 
}

// 상속이라는 문법을 배운 개발자라면 
class C extends A {
	
	int level;
	int nickName; 
	String phone; 
}

```

```java
package basic.ch17;

/**
 * OOP란? 
 * 객체와 객체간에 관계를 형성하고 
 * 상호작용하게 코드를 설계해 나가는 것 
 * 
 * 상속 
 */
public class CTest {

	public static void main(String[] args) {
		
		C c = new C();
		c.name = "A";

	} // end of main 

} // end of class
package basic.ch17;

public class Cal {
	
	public int sum(int n1, int n2) {
		return n1 + n2; 
	}
	
	public int multiply(int n1, int n2) {
		return n1 * n2;
	}
	
	// 코드 테스트 
	public static void main(String[] args) {
		
		Cal2 cal2 = new Cal2();
		System.out.println(cal2.sum(5, 3));
		System.out.println(cal2.minus(10, 3));
		System.out.println(cal2.multiply(10, 0));
		
		
	} // end of main 
	
}

class Cal2 extends Cal {
	
	public int minus(int n1, int n2) {
		return n1 - n2; 
	}
	
	// 부모 코드의 기능을 변경하고 싶다면 --> 재정의 하고 싶다면 
	// 오버라이드 처리 한다. 
	public int multiply(int n1, int n2) {
		// a 또는 b --> 논리 연산자 --> 논리 합 --> 둘중에 하나라도 true 라면 --> true 이다. 
		// a 그리고 b --> 논리 연산자 --> 논리 곱 --> 전부 true 이여야 --> true 이다. 
		if(n1 == 0 || n2 == 0) {
			System.out.println("0을 입력하지 마시오");
		}
		return n1 * n2;
	}
	
}
```

부모 클래스가 먼저 존재해야 자식 클래스가 생성 될 수 있다.

super. ← 부모 객체를 가리킨다.

package basic.ch17;

public class Cal {
	
	public Cal() {
		System.out.println("Cal()  부모 생성자 호출");
	}
	
	public int sum(int n1, int n2) {
		return n1 + n2; 
	}
	
	public int multiply(int n1, int n2) {
		System.out.println("2. 호출");
		System.out.println("여기는 부모 클래스 메서드 입니다. ");
		return n1 * n2;
	}
	
	// 코드 테스트 
	public static void main(String[] args) {
		
		Cal2 cal2 = new Cal2();
		System.out.println(cal2.sum(5, 3));
		System.out.println(cal2.minus(10, 3));
		System.out.println(cal2.multiply(10, 0));
		
		
	} // end of main 
	
}

class Cal2 extends Cal {
	
	public Cal2() {
		System.out.println("Cal2() 자식 생성자 호출");
	}
	
	public int minus(int n1, int n2) {
		return n1 - n2; 
	}
	
	// 부모 코드의 기능을 변경하고 싶다면 --> 재정의 하고 싶다면 
	// 오버라이드 처리 한다. 
//	public int multiply(int n1, int n2) {
//		// a 또는 b --> 논리 연산자 --> 논리 합 --> 둘중에 하나라도 true 라면 --> true 이다. 
//		// a 그리고 b --> 논리 연산자 --> 논리 곱 --> 전부 true 이여야 --> true 이다. 
//		if(n1 == 0 || n2 == 0) {
//			System.out.println("0을 입력하지 마시오");
//		}
//		return n1 * n2;
//	}
	
	@Override // <-- 애노티이션, 어노테이션 --> 주석 + 힌트   
	public int multiply(int n1, int n2) {
		System.out.println("1. 호출");
		return super.multiply(n1, n2);
	}
	
}