본문 바로가기
AWS(산대특)

DAY 6 -JAVA

by dkdlxl 2024. 1. 25.

상속 

: 객체지향 프로그래밍의 특성 중 하나

: 원래 존재하던 클래스를 확장하여 재사용할 수 있도록 하는 것

: 코드 중복을 제거하고 확장성을 높일 수 있음

: extends 키워드를 사용하여 확장

class SuperClass {}; // 부모 클래스(ParentBook)
class SubClass extends SuperClass {}; // 자식 클래스(ChildBook)

 

부모 클래스

class Human {
	String name;
	int age;
	
	void sleep () {
		System.out.println(name + "가 잠을 주무십니다.");
	}
}

* 부모 클래스를 바꾸면 상속 받은 자식 클래스도 바꿀 수 있음

 

자식 클래스

class Teacher extends Human {
	String course;
	
	void teach () {
		System.out.println(name + "가 " + course + "를 가르칩니다.");
	}
}

class Developer extends Human {
	String position;
	
	void develop () {
		System.out.println(name + "가 " + position + " 개발을 합니다.");
	}
}

 

JAVA에서는 클래스의 단일 상속만 지원함 

: 다이아몬드 문제를 방지하기 위함

* 다이아몬드 문제 : 다중 상속을 했을 때 발생하는 메서드 호출의 모호성 

 

부모 클래스2

class Animal {
	String species;
	
	void sleep () {
		System.out.println("잠을 잡니다.");
	}
}

* 자식 클래스는 이미 Human을 받고 있는 상태에서 Animal을 받게 되면 누구의 sleep을 받아야하는지 컴퓨터가 구분하지 못하기 때문에 단일 상속을 함 

 

★ 모든 클래스는 'Object' 라고하는 최상위 클래스를 반드시 상속받고 있음

public class B_inheritance {

	public static void main(String[] args) {
		
		Human human1 = new Human();
		human1.name = "홍길동";
		human1.age = 0;
		human1.sleep();
		
		Teacher teacher1 = new Teacher(); // Human의 기능과 teacher 기능을 함께 가지게 됨 
		teacher1.name = "김철수";
		teacher1.age = 10;
		teacher1.course = "국어";
		teacher1.sleep();
		teacher1.teach();

		Developer developer1 = new Developer();
		developer1.name = "이영희";
		developer1.age = 20;
		developer1.position = "백엔드";
		developer1.sleep();
		developer1.develop();
		
		
	}

}
결과 출력

홍길동가 잠을 주무십니다.

김철수가 잠을 주무십니다.
김철수가 국어를 가르칩니다.

이영희가 잠을 주무십니다.
이영희가 백엔드 개발을 합니다.

 

오버라이딩

: 하위 클래스에서 상위 클래스의 메서드를 재정의 하는 것

규칙

1. 상위 클래스에서 선언된 메서드와 메서드 이름, 매개변수의 조합이 같아야 함

2. 상위 클래스에서 선언된 메서드가 final로 선언되면 재정의가 불가능

3. 상위 클래스에서 선언된 메서드가 더 좁은 범위의 접근 제어를 할 수 없음

 

부모 클래스 

class SuperClass1 {
	
	int superInstanceVariable;
	
	SuperClass1 (int superInstanceVariable) {
		this.superInstanceVariable = superInstanceVariable;
	}
	
	void instanceMethod () {
		System.out.println("조상 클래스의 메서드입니다."); // 조상 클래스의 메서드입니다.
	}
}

 

*  super() : 부모 클래스의 생성자를 호출하는 키워드 

: 부모 클래스에서 기본 생성자가 없다면 자식 클래스의 생성자에서
   반드시 부모 클래스의 생성자를 호출 해야함

→ 명시적 생성자 선언이 없다면 컴파일러는 알아서 기본 생성자를 생성하여 호출

→ 부모클래스는 명시적 생성자 선언X, 자식 클래스는 명시적 생성자 선언 O

→ 컴파일러가 super();를 알아서 생성하여 super();가 부모 클래스의 기본 생성자를 컴파일러가 호출함 

class SubClass1 extends SuperClass1 {
	
//	void instanceMethod () { // 오버라이딩한 것 
//		System.out.println("SubClass1의 인스턴스 메서드입니다.");
//	}	
	
	// SuperClass1을 상속된 상태에서는 아래 메서드(1)를 가지고 있음 
	//(1) void instanceMathod () {...} 가지고 있는 상태에서
	
	// 'void instanceMethod ()' 메서드를 이미 가지고 있기 때문에
	// 아래 메서드는 'void instanceMethod ()' 메서드를 오버로드 한것 
	void instanceMethod (String string) {
			System.out.println(string);
		}
	
//	void instanceMathod (String string) {
//		System.out.println(string);
//	}
	
	SubClass1() {
    	// : 부모 클래스의 생성자 호출
        super(10);
	}
	
	
}

 

@Override

: 컴파일러에게 아래에 오는 메서드가 오버라이드 메서드라는 것을 알려주는 것
: 가독성 향상과 개발자의 실수를 방지할 수 있음 

class SubClass2 extends SuperClass1 {
	
	SubClass2 (int superInstanceVariable) {
		super(superInstanceVariable);	
	}
	
    @Override // 오버라이딩
	void instanceMethod () {
		// super 키워드 : 자손 클래스에서 조상클래스의 필드 혹은 메서드에 접근할 때 사용
		super.instanceMethod(); 
		System.out.println("SubClass2의 인스턴스 메서드입니다.");
	}
	
}
public class B_Overriding {

	public static void main(String[] args) {
		
		SuperClass1 instance1 = new SuperClass1(0); 
		SubClass1 instance2 = new SubClass1(); // SubClass1()에서 super(10)을 가져옴
		SubClass2 instance3 = new SubClass2(50); 
        
		System.out.println(instance1.superInstanceVariable); // 0
		System.out.println(instance2.superInstanceVariable); // 10
		System.out.println(instance3.superInstanceVariable); // 50
	}
}

 

'AWS(산대특)' 카테고리의 다른 글

DAY 8 - JAVA  (0) 2024.01.29
DAY 7 - JAVA  (0) 2024.01.28
객체지향 프로그래밍 보충  (0) 2024.01.25
DAY 5 -JAVA  (0) 2024.01.24
JAVA class 만들기  (0) 2024.01.23