[23.01.02] 50일차 [백엔드] 다형성, 참조형 형변환

W·2023년 1월 2일
0

국비

목록 보기
75/119
  • 할아버지 클래스
package test;

public class 할아버지 {
	
	// 조상 클래스 할아버지
	// 메서드 노래하기() "노래를 한다"
	
	public void 노래하기() {
		System.out.println("노래를 한다");
	}
}
  • 아버지 클래스
package test;

public class 아버지 extends 할아버지 {
	
	// 부모 클래스 아버지
	// 메서드 일하기() "일을 한다"
	
	 public void 일하기() {
		 System.out.println("일을 한다");
	 }
}
  • 자식 클래스
package test;

public class 자식 extends 아버지 {
	
	// 자식 클래스 자식
	// 메서드 게임하기() "게임을 한다"
	// 노래하기() 메서드 오버라이딩(메서드 재정의)
	// "노래를 아주 잘한다"
	
	public void 게임하기() {
		System.out.println("게임을 한다");}
	
	@Override
	public void 노래하기() {
		System.out.println("노래를 아주 잘한다");
	}
	
}
  • 메인 클래스
package test;

public class Test1 {

	public static void main(String[] args) {

		// 자식 클래스 객체 생성
		// 메서드() 호출 노래하기() 일하기() 게임하기()
		
		자식 son = new 자식();
		son.노래하기();
		son.일하기();
		son.게임하기();
	}
}
  • 부모 자식 클래스가 다른 package에 있을 때
    import : 폴더가 틀리면 위치를 지정해서 가져옴
    import 폴더위치.파일
    ctrl space => 목록 선택, ctrl shift o

  • 할아버지 클래스는 com.itwillbs.p1 위치
    아버지 클래스는 com.itwillbs.p2 위치

또는 ctrl shift o 눌리면 import 자동 생성됨

다형성

메서드 이름은 동일한데 메서드 내에 동작내용 다름

  • 상속에서 생성자 super(), super.메서드()

  • 상위클래스 공통 부분의 메서드를 제공하고 하위클래스에서 추가요소를 더하면 코드 양도 줄어들고 유지보수도 편리

  • Shape 클래스 (부모)

package test;

public class Shape {
	
	// Shape 도형 클래스 (부모)
	// prn() "도형을 그린다"
	
	protected void prn() {
		System.out.println("도형을 그린다");
	}
}
  • Circle 클래스 (자식)
package test;

public class Circle extends Shape {
	
	// Circle 원 클래스 (자식) 상속 Shape
	// 메서드 오버라이딩 prn() "원을 그린다"
	
	protected void prn() {
		System.out.println("원을 그린다");
	}
}
  • Tri 클래스 (자식)
package test;

public class Tri extends Shape {
	
	// Tri 삼각형 클래스 (자식) 상속 Shape
	// 메서드 오버라이딩 prn() "삼각형을 그린다"

	protected void prn() {
		System.out.println("삼각형을 그린다");
	}	
}
  • Rec 클래스 (자식)
package test;

public class Rec extends Shape {
	
	// Rec 사각형 클래스 (자식) 상속 Shape
	// 메서드 오버라이딩 prn() "사각형을 그린다"
	
	protected void prn() {
		System.out.println("사각형을 그린다");
	}
}
  • 메인 클래스
package test;

public class Test2 {

	public static void main(String[] args) {
		Circle c = new Circle();
		c.prn(); // 원을 그린다
		
		Tri t =new Tri();
		t.prn(); // 삼각형을 그린다
		
		Rec r=new Rec();
		r.prn(); // 사각형을 그린다

	}

}

참조형 형변환

참조형 자동으로 형변화
부모 = 자식 객체생성
부모 = 자식 (업캐스팅 : 부모형으로 자동형변환)
메서드호출 () 다형성
부모 참조변수 , 메서드 동일
자식이 재정의한 메서드 구현내용 다양함

  • Shape(부모), Circle, Tri, Rec(자식) 클래스 이용
Shape s = new Circle();
s.prn(); // 원을 그린다

s = new Tri();
s.prn(); // 삼각형을 그린다
		
s = new Rec();
s.prn(); // 사각형을 그린다

예제

  • School 클래스 생성
package test;

public class School {
	// 메서드 정의 draw(원, 삼각형, 사각형)
	// "모든 도형 그리기"
	// prn() 메서드 호출
	
	public void draw(Shape s) {
		System.out.println("모든 도형 그리기");
		s.prn();
	}
	
}
  • 메인 클래스
School l = new School();
l.draw(c); // 모든 도형 그리기 원을 그린다
l.draw(t); // 모든 도형 그리기 삼각형을 그린다
l.draw(r); // 모든 도형 그리기 사각형을 그린다

예제

  • Animal 클래스(부모)
package test;

public class Animal {
	
	public void move() {
		System.out.println("동물이 움직인다");
	}
}
  • Tiger 클래스 (자식)
package test;

public class Tiger extends Animal {
	// 메서드 오버라이딩 부모의 move 메서드 재정의
    
	@Override
	public void move() {
		System.out.println("호랑이 네발로 움직인다");
	}

}
  • Eagle 클래스 (자식)
package test;

public class Eagle extends Animal {

	@Override
	public void move() {
		System.out.println("독수리 날개로 움직인다");
	}
}
  • 메인
		// Tiger 객체생성
		// 메서드 호출
		Animal a = new Tiger();
		a.move(); // 호랑이 네발로 움직인다

		// Eagle 객체생성
		// 메서드 호출
		a = new Eagle();
		a.move(); // 독수리 날개로 움직인다

예제

  • Zoo 클래스
package test;

public class Zoo {

	public void setEagle(Eagle e) {
		System.out.println("Eagle 전달 받음");
		e.move();
	}
	
	public void setTiger(Tiger t) {
		System.out.println("Tiger 전달 받음");
		 t.move();}
		 
	public void setAnimal(Animal a) {
		System.out.println("모든 동물 전달 받음");
		a.move();
	}
}
  • 메인
Tiger t = new Tiger();
Eagle e = new Eagle();
		
Zoo z = new Zoo();
z.setEagle(e); // Eagle 전달 받음 독수리 날개로 움직인다
z.setTiger(t); // Tiger 전달 받음 호랑이 네발로 움직인다
		
z.setAnimal(e); // 모든 동물 전달 받음 독수리 날개로 움직인다
z.setAnimal(t); // 모든 동물 전달 받음 호랑이 네발로 움직인다

0개의 댓글