250x250
Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

개린이 개발노트

국비지원 JAVA(자바) 프로그래밍 웹개발자 ( 상속,다형성,추상화) 본문

국비지원(국비교육) 웹 개발자 과정

국비지원 JAVA(자바) 프로그래밍 웹개발자 ( 상속,다형성,추상화)

개린이9999 2022. 11. 29. 11:08
728x90

다형성 기본개념


다형성 기본형태

다형성 게임 캐릭터 기본 공격

 


접근제한자 


package TV만들기;

public class TV extends PrototypeTV {

	String name;
	boolean isInternet;
	
	public TV() {
		super();
		name= "LG TV";
		isInternet=false;
	}
	TV(String name){
		super(false,20,15);
		this.name = name;
		isInternet = false;
	}

		void setPower(boolean isPower) {
			this.isPower = isPower;
		}

		public void setChannel(int cnl) {
			if(cnl>0 && 2000<=cnl) {
				channel=cnl;
			}else {
				System.out.println("채널이 없습니다");
			}
		}
		public void setChannel(int cnl, boolean isInternet) {
			if(isInternet) {
				System.out.println("인터넷 연결 성공");
			this.isInternet=true;
			}else {
				this.isInternet=false;
				if(cnl>0 && cnl<2000) {
					channel = cnl;
					System.out.println("채널이"+channel+"로 변경");
				} else {
					System.out.println("채널이 없습니다.");

				}
			}
		}
		
		public void setVolume(int vol) {
			if (vol>=0 && vol<=100) {
				volume = vol;
			}else {
				System.out.println("볼륨 범위 벗어남");
			}
		}

 public void viewTV() {
	 System.out.println("이름:"+name);
	 System.out.println("전원:"+isPower);
	 System.out.println("채널:"+channel);
	 System.out.println("볼륨:"+volume);
	 System.out.println("인터넷연결:"+isInternet);
 }

}
package TV만들기;

public class PrototypeTV {

	boolean isPower;// 전원 on off
	int channel; // 채널
	int volume; // 볼륨
	
	public PrototypeTV() {
		isPower = false;
		channel = 10;
		volume = 10;
	}

	public PrototypeTV(boolean isPower, int channel, int volume) {
		this.isPower = isPower;
		this.channel = channel;
		this.volume = volume;
	}

	public void setChannel(int cnl) {
	if (cnl>=0 &&cnl<1000) {
		channel = cnl;
	} else {
		System.out.println("채널이 없습니다.");
	}
		
	}
		
}

TV만들기 업그레이드 버전

 

Main문 

package TV만들기;

public class Main {

   public static void main(String[] args) {
      
      /** ==초기상태== **/
      
      //기본 생성자
      TV lgTV = new TV();
      
      //viewTv만 호출 해서 정보 확인해보기
      lgTV.viewTv(); //기본 상태 값 표시
      
      /** ==값 첫 번째 변경 == **/
      
      //전원켜기
      lgTV.setPower(true);
      lgTV.setChannel(500);
      System.out.println("--1--"); //구별하기 위해
      lgTV.viewTv(); //파워와 채널 변경후 다시 viewTv 불러왔을 때 변경 된 값 표시
      
      /** ==값 두 번째 변경 == **/
      
      //오버로딩 때문에 묶어둔것
      System.out.println("--2--"); //구별하기 위해
      lgTV.setChannel(222, true);
      lgTV.viewTv();
      
      lgTV.setChannel(999, false);
      lgTV.viewTv();
      
      lgTV.setVolume(50);
      lgTV.viewTv();

   }

}

public class PrototypeTV 

package TV만들기;

public class PrototypeTV {

	boolean isPower;// 전원 on off
	int channel; // 채널
	int volume; // 볼륨
	
	public PrototypeTV() {
		isPower = false;
		channel = 10;
		volume = 10;
	}

	public PrototypeTV(boolean isPower, int channel, int volume) {
		this.isPower = isPower;
		this.channel = channel;
		this.volume = volume;
	}

	public void setChannel(int cnl) {
	if (cnl>=0 &&cnl<1000) {
		channel = cnl;
	} else {
		System.out.println("채널이 없습니다.");
	}
		
	}
		
}

public class TV extends PrototypeTV 

package TV만들기;

//자식 클래스

public class TV extends PrototypeTV  { //PrototypeTv 상속 받기
	
	String name;
	boolean isInternet;
	
	//기본 생성자
	TV () {
		super();
		name = "LG TV";
		isInternet = false;
	}
	
	//name을 생성 받아서 만든 생성자 (매개변수)
	TV (String name) {
		super(false, 20, 15);
		this.name = name;
		isInternet = false;
	}
	
	//메서드 생성           (매개변수)
	void setPower(boolean isPower) { //isPower를 전달 받게끔
		this.isPower = isPower;
	}
	
	//오버라이딩 (채널 관련)     (매개변수)
	public void setChannel(int cnl) {
		if(cnl >= 0 && cnl < 2000) {
			channel = cnl;
		} else {
			System.out.println("채널이 없습니다.");
		}
	}
	
	//오버로딩  (인터넷 관련)         (매개변수로 사용되는 것)
	public void setChannel(int cnl, boolean isInternet) {
		if(isInternet) {
			System.out.println("인터넷 연결 성공");
			this.isInternet = true;
		} else {
			this.isInternet = false;
			//채널 설정
			if(cnl >= 0 && cnl < 2000) {
				channel = cnl;
				System.out.println("채널이" + channel + "로 변경");
			} else {
				System.out.println("채널이 없습니다.");
			}
		}
	}
	
	//불륨 설정                        (매개변수)
	public void setVolume(int vol) {
		if(vol>=0 && vol<=100) {
			volume = vol;
		} else {
			System.out.println("볼륨 범위 벗어남");
		}
	}
	
	//정보 표시
	public void viewTv() {
		System.out.println("이름 :" + name);
		System.out.println("전원 :" + isPower); //보안할시 삼항연산자 사용 <--조건식? 참 : 거짓
		System.out.println("채널 :" + channel);
		System.out.println("볼륨 :" + volume);
		System.out.println("인터넷연결 :" + isInternet);
	}

}

추상클래스

→ 반드시 구현해라

 

부모클래스-> 자식클래스

 

abstract - 추상화만드는 작업

추상클래스, 향상된for문

package 추상클래스;

public abstract class Shape {

	String type;

	public Shape(String type) {
		this.type = type;
	}
	
	abstract double area();
	abstract double length();
	
	
}
package 추상클래스;

public class Circle extends Shape{
   
   int r;      //반지름

   public Circle( int r) {
      super("원");
      this.r = r;
      
   }

   @Override      //컴퓨터에게 이건 오버라이딩이라 안내하는 용도
   double area() {
      
      return r*r*Math.PI;
   }

   @Override
   double length() {
      
      return 2*r*Math.PI;   
   }

   @Override
   public String toString() {
      return "Shap [type =" + type + ", r="+r+"]";
   }
   
   
   
   
   
}
package 추상클래스;

public class Rectangle extends Shape {
   
   int width, height;

   public Rectangle(int width, int height) {
      super("사각형");
      this.width = width;
      this.height = height;
   }
   
   //상속 받은 수상메서드 생성

   @Override
   double area() {
      return width * height;
   }

   @Override
   double length() {
      return 2 * (width + height);
   }

   @Override
   public String toString() {
      return "Shape [type=" + type + ", width=" + width + ", height=" + height + "]";
   }
   
   
   
   

}
package 추상클래스;

public class ShapeEx {

   public static void main(String[] args) {

      Shape[] shapes = new Shape[2];
      
      shapes[0]=new Circle(10);
      shapes[1]=new Rectangle(5,5);
      
      for(Shape s : shapes) {
         System.out.println(s);
         System.out.println("넓이 : "+s.area()+" 둘레 "+s.length());
      }
   }

}

println(s); 만 해도 바로 출력되는 이유


fianl 상수선언

final public class Aclass //final 때문에 상속 안되고 독립적으로 쓰이는 클래스가 됨

final void aa() { }  메서드 같은경우 오버로딩이나 오버라이딩이 안됨 (못바꿈)


문제 Caluloator 클래스를 상속하는 UpgradeCaluloator를 생성

빼기 계산하는 minus 메서드를 추가

main

따라치기 해보기

package 문제02;

import org.omg.CORBA.PUBLIC_MEMBER;

public class Calc {

	// 홀수인지 짝수인지 결과값을 true/false로 리턴해주는 isOdd메서드
	// 배열을 전달받아 값듫의 평균을 구해서 리턴해주는 avg 메서드

	public boolean isOdd(int num) {
		  if (num%2==1) {
		         return true;
		      }else {
		     
		    	  return false; }
	}
		  
		  public double avg(int[] arr) {
			  int sum=0;
		  
			  for(int a: arr) {
				  sum=sum+a;
			  }
		  
			  return (double) sum/arr.length;
	}
}
package 문제02;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

	int[] arr= {50,30,100,20,40,70};
	int num;
	
	Scanner sc = new Scanner(System.in);
	
	System.out.println("정수입력:");
	num=sc.nextInt();
	
	Calc calc =new Calc();
// num이 홀수인지 짝수인지 홀수면 홀수, 짝수면 짝수로 나오게끔 
	if (calc.isOdd(num)) {
		System.out.println("입력받은 값은 홀수");
	}else {
		System.out.println("입력받은 값은 짝수");

	}
	//arr배열의 평균이 계산된 결과가 출력되게끔
	System.out.println("평균:"+calc.avg(arr));
	}
}

학생 관리 프로그램3명

이름,국어,영어,수학,합계,평균,등수 ]

name kor eng math sum avg rank

등수는 평균을 기준으로 해서 1등,2등,3등 이런식으로 처리함 

sum avg

이름국어영어수학-> 입력받음

합계/평균 메서드 실행 -> sum,avg 저장

 

showinfo()

<학생정보 출력>

이름 국어 영어 수학 합계 평균 등수

==============================

홍길동 100 80 90 270 90

홍길동

홍길동

 

main문

====학생정보입력====

1번쨰학생입력:

1번쨰학생국어:

1번째학생영어

1번째학생수학:

====1번쨰학생 입력완료===

2번쨰학생입력:

2번쨰학생국어:

2번째학생영어

2번째학생수학:

====2번쨰학생 입력완료===

합계 계산 처리

평균 계산 처리 

 

등수처리->main에서 작업 

 

 

package 문제1128;

import java.util.Scanner;

public class Main {

   public static void main(String[] args) {

      Student[] student = new Student[3];

      String name;
      int kor, eng, math, i;

      Scanner sc = new Scanner(System.in);
      System.out.println("===학생 정보 입력===");
      for (i = 0; i < student.length; i++) {

         System.out.print(i + 1 + "번째 학생 이름 : ");
         name = sc.next();
         System.out.print(i + 1 + "번째 학생 국어 : ");
         kor = sc.nextInt();
         System.out.print(i + 1 + "번째 학생 영어 : ");
         eng = sc.nextInt();
         System.out.print(i + 1 + "번째 학생 수학 : ");
         math = sc.nextInt();
         System.out.println("--" + (i + 1) + "번째 학생 입력 완료--");

         student[i] = new Student(name, kor, eng, math);
      }
      for (i = 1; i < student.length; i++) {
         student[i].sum();
         student[i].avg();
      }
      System.out.println("이름 국어 영어 수학 총합 평균 순위");

      for (i = 0; i < student.length; i++) {

         for (int j = 0; j < student.length; j++) {

            if (student[i].avg < student[j].avg) {

               student[i].rank++;
            }

         }

      }
      for (i = 0; i < student.length; i++) {
         student[i].showInfo();
      }

   }

}

이것 때문에 가능

package 문제1128;

public class Student {

   String name;
   int kor;
   int eng;
   int math;
   int sum;
   int avg;
   int rank;
   
   public Student(String name, int kor, int eng, int math) {
      
      this.name = name;
      this.kor = kor;
      this.eng = eng;
      this.math = math;
      this.sum = 0;
      this.rank = 1;
   }
   
   public void sum() {
      sum = kor+eng+math;
   }
   
   public void avg() {
      avg = sum/3;
   }
   
   

   
   public void showInfo() {
      System.out.println(name+" "+kor+" "+eng+" "+math+" "+sum+" "+avg+" "+rank);
   }
}

i=0 인데 i=1로 오타남!! 


인터페이스 정형화 틀이 됨

 

다중 상속

추상 메서드 

상수

default 메서드

static 메서드

 

[public] interface 인터페이스명 {

 

                     

int a =100; final로 인해 상수처리

[public static final] 자료형 상수명 =값 

                     

 int add(); -> 추상메서드

[public abstract] 리턴타입 추상메서드이름(매개변수);

 

[public] default 리턴타입 메서드이름 ( 매개변수) {

              기능구현

}

 

public] static 리턴타입 메서드이름 ( 매개변수) {

              기능구현

}

복합기 만들기 - (프린트 

CLASS에 인터페이스 구현 완료! 

 


익명 구현 객체 // 1회성으로 만들어서 씀 메인내부에서 다 처리됨

익명 객체

 

 

세미콜론 위치 중요!!!

 

 

728x90