220623 TIL

Yeoni·2022년 6월 23일
0

국비교육TIL

목록 보기
17/41

국비교육 17일차 Java : 다중 상속, 다형성(instanceof), 미완성 클래스/메소드, 오버로딩(overloading)

1. 다중 상속

  • Java에서는 한 클래스가 여러 클래스를 동시에 상속 받는 다중 상속은 불가능 하다.

2. 다형성

  • 부모 클래스
public class Parent {
	// 공통 field(추상화)
	pirvate String name;
	
	// 공통 method
	// getter-setter
	protected String getName() {
		return name;
	}
	
	protected void setName(String name) {
		if(name != null & !name.trim().isEmpty()) {
			this.name = name;
		}
	}
	
	// == 고양이의 정보를 출력해주는 메소드 == //
	public void show_info() {	
		System.out.println("=== 고양이 정보 ===\n"
						 + "1. 성명 : " + name + "\n");
	}
	
	// parent 클래스에서는 cat_cry가 필요 없지만, 자식 클래스에서 오버라이딩 해서 
	// 사용하기 위하여, 부모 클래스인 parent 클래스에 메소드를 만들어 놔야만
	// main에서 호출할 수 있다.
	public void cat_cry() { }

} // end of class
  • 자식 클래스
public class Child extends Parent { 		// Parent가 부모 클래스

	// Cat만 가지는 field를 정의(추상화)
	private String color;

	// Cat만 가지는 method를 정의(추상화)	
	// getter-setter
	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		if(color != null && !color.trim().isEmpty() )
			this.color = color;
	}
	
	// 메소드의 오버라이딩
	// 메소드 재정의 할 때 접근제한자 : 부모와 같거나 부모보다 범위가 커야함. 
	@Override
	public void show_info() {
		super.show_info(); 		
        // Parent 클래스의 show_info에 옷 색깔 내용 추가 ==> 오버라이딩
		System.out.println("2. 옷색깔 : " + color + "\n");
	}
	
	@Override
	public void cat_cry() { 	
    // Parent 클래스의 비어있는 cat_cry 메소드에 오버라이딩
		System.out.println("고양이는 냥 \n");
	}
	
	public void cat_jump() {
		System.out.println(">> 고양이 점프 << \n");
	}

} // end of class
  • 메인 클래스
public class Main_Review {

	public static void main(String[] args) {
		
		// >>> 다형성(Polymorphism) <<<	 
		// ==> 상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술.
		// 자식클래스로 생성되어진 객체를 부모 클래스 타입으로 
        // 받을 수 있다는 것이 다형성(Polymorphism)이다.
		
		Parent [] cat_arr = new Parent[3];
		
		Child cat = new Child();
//		Parent cat = new Parent();		// 가능
//		cat_arr[0] = new Child();		// 가능
		cat.setName("나비");
		cat.setColor("치즈");

		cat_arr[0] = cat;
		
		for(int i=0; i<cat_arr.length; i++) {
			if(cat_arr[i] != null)
				cat_arr[i].show_info(); 		
                // Parent 에서 만들어 준 show_info
		} // end of for
		
		for(int i=0; i<cat_arr.length; i++) {
			
			if(cat_arr[i] != null)
				cat_arr[i].cat_cry(); 		
                // Parent에 빈 껍데기 cat_cry 만들어 주고, 
                // 자식 클래스에서 오버라이딩 해서 내용을 적어주고, 
                // 호출은 부모클래스로.
			
		} // end of for		
		
		for(int i=0; i<cat_arr.length; i++) {
			
			if(cat_arr[i] != null) {
				
				if( cat_arr[i] instanceof Child) {		
                // 이 배열(cat_arr[i])에 저장되어진 객체가 Child 입니까?
				// cat_arr[i] 저장소에 들어있는 instance(객체)가 
                // Child라는 클래스로 만든 instance 입니까?	
					((Child)cat_arr[i]).cat_jump();			
                    // (Child)cat_arr[i] : cat_arr 배열을 Child로 형변환
				} 
				
			} // end of if

		} // end of for	
		
	} // end of main
		
} // end of class

3. 미완성(abstract) 클래스/메소드

public abstract class Parent { 	
// 미완성 클래스(추상 클래스, abstract class)

	/*
	    미완성 메소드가 있는 클래스는 반드시 미완성 클래스로 만들어야 한다.  
	    미완성 메소드를 사용하는 이유는 자식클래스에서 메소드를 오버라이딩(재정의)를 하기 때문에 
	    부모클래스에서는 메소드를 정의할 필요가 없으므로 미완성 메소드로 만들어 버린다.
	    
	    일반적으로 부모클래스를 미완성 클래스로 만든다.
	    
	    미완성 클래스를 사용하여 객체(인스턴스)를 생성할 수 없지만,
	    저장소로는 사용이 가능하다.       
	*/

	// 부모 클래스
	// 공통 field(추상화)
	public String name;
	
	// 공통 method
	// getter-setter
	protected String getName() {
		return name;
	}
	
	protected void setName(String name) {
		if(name != null & !name.trim().isEmpty()) {
			this.name = name;
		}
	}
	
	// == 고양이의 정보를 출력해주는 메소드 == //
	public void show_info() {	
		System.out.println("=== 고양이 정보 ===\n"
						 + "1. 성명 : " + name + "\n");
	}
	
	// abstract 미완성 메소드라는 표시 
	// 미완성 메소드가 들어오면 클래스도 미완성 클래스가 됨
	// 미완성 메소드(== 추상 메소드, abstract method ==) 	
    			   // 추상(OOP의 특징인 추상이 아님)
	// 미완성 메소드는 반드시 자식 클래스에서 override 되어야한다. 
	public abstract void cat_cry(); 

}

4. 오버로딩(overloading)

  • 메소드의 이름이 같지만 파라미터의 개수 또는 파라미터의 타입, 파라미터 타입의 순서가 다르면 메소드의 이름이 비록 같더라도 서로 다른 메소드로 보기 때문에 중복이 아니다.
  • 조심할 사항은 메소드의 리턴 타입은 다르지만 메소드의 파라미터 형식이 똑같으면 동일한 메소드로 보기 때문에 중복되어 오류가 발생한다.
public class Review {

	public void sum(int a) {
		
	}
	
	public void sum(int a, int b) {
		
	}
	
	public void sum(int a, int b, int c) {
		
	}

	public void sum(int a, double b) {
		
	}
	
	public void sum(double b, int a) {
		System.out.println(b+a);
	}	
	
//	public void sum(double n, int m) {		 // 오류
// 변수명과 상관 없이 타입이 달라야함
//		
//	}		
	
//	public double sum(double n, int m) {	// 오류	
// 리턴 타입과도 상관 없이 파라미터가 달라야함.	
//		retrun n+m;
//	}		
	
} // end of class
profile
이런 저런 기록들

0개의 댓글