자바-11일차(4) 이클립스

최성현·2023년 6월 29일
0

Java

목록 보기
30/46

상속3

부모클래스에 디폴트생성자/명시적 생성자 둘 중 하나만 있다면
자식클래스에는 부모클래스에서 만든 것만 쓸 수 있다
-> 둘 중 하나의 생성자를 생성하면 다른 하나가 없어지기 때문

부모클래스에 디폴트생성자/명시적생성자 둘 다 없다면
자식클래스에서 자체 생성가능

부모클래스(상위클래스)

//부모클래스
class Point{
	int x;
	int y;
	
	//디폴트생성자
	public Point() {
		System.out.println("super_디폴트 생성자");
	}
	
	//명시적 생성자
	public Point(int x,int y) {
		System.out.println("super_인자있는 생성자");
		this.x=x;
		this.y=y;
	}
	
	//메서드
	public void write()
	{
		System.out.println("x좌표="+x+"y좌표="+y);
	}
}

자식클래스(하위클래스)

//자식클래스
class SubPoint extends Point{

	String msg;
	
	public SubPoint(int x, int y,String msg) {
		super(x, y);
		this.msg=msg;
	}
	
	//부모클래스에 디폴트생성자 만들어줘서 에러가 안남
	public SubPoint() {
		super(); //생략되있음
		System.out.println("sub_디폴트 생성자");
	}
	
	//오버라이딩...부모의 메서드 재구현할 목적
	@Override
	public void write() {
		super.write();
		System.out.println("메세지: "+msg);
	}
	
}

메인클래스

public class ExobTest_05 {

	public static void main(String[] args) {
		
		SubPoint sp=new SubPoint(); //디폴트 생성자가 있어서 받아짐
		sp.write();//디폴트 생성자에 값을 안넣어줘서 null값 출력
		
		SubPoint sp1=new SubPoint(100, 200, "오늘 비많이 온다!!!");
		sp1.write();

	}

}

상속 문제

부모클래스

class Shop{
	String sangpum;
	int su;
	
	public Shop(String sang,int su) {
		this.sangpum=sang;
		this.su=su;
	}
	
	public void writeShop() {
		System.out.println("상품: "+sangpum+"\n개수: "+su);
	}
}

자식클래스

class MyCart extends Shop{
	
	int price;
	
	public MyCart(String sang, int su```
코드를 입력하세요
```, int p) {
		super(sang, su);
		this.price=p;
	}
	
	
	//오버라이딩은 super 위치 상관없이 사용가능
	@Override
	public void writeShop() {
		super.writeShop();
		System.out.println("가격: "+price);
	}
	
}

메인클래스

public class Inheri_06 {

	public static void main(String[] args) {
		
		MyCart in=new MyCart("아이폰", 5, 1100000);
		in.writeShop();
	}

}

부모클래스 상속시 자식클래스 메소드안 변수는 this. 사용 가능

상속 받아 왔기 때문에 자식클래스 변수로서 this. 사용 가능

부모클래스

class Person{
	
	String name;
	String buseo;
	
	public void getPerson()
	{
		System.out.println("**부모변수출력**");
		System.out.println("이름: "+this.name);
		System.out.println("부서: "+this.buseo);
	}
}

자식클래스

class My extends Person{
	
	int age;
	
	//extends로 받았기 때문에 부모클래스의 변수도 this.로 사용가능
	public My(String name, String buseo, int age) {
		this.name=name;
		this.buseo=buseo;
		this.age=age;
	}
	
	
	public void write() {
		
		System.out.println("사원명: "+this.name);
		System.out.println("부서: "+buseo);
		System.out.println("나이: "+age);
	}
	
	//오버라이드
	@Override
	public void getPerson() {
		super.getPerson();
		System.out.println("나이: "+this.age);
	}
	
}

메인클래스

public class Inheri_07 {
	
	public static void main(String[] args) {
		
		My my1=new My("이미나", "교육부", 30);
		my1.write();
		System.out.println();
		System.out.println("**오버라이드 통한 메서드 출력**");
		my1.getPerson();

	}

}

추상클래스/추상메서드

추상클래스는 new로 생성못함
추상메서드가 하나라도 존재하는 클래스를 추상 클래스라고 한다
추상클래스-일반메서드,추상메서드, 둘 다 존재 가능

클래스 안에 추상메서드가 1개라도 있다면 클래스 앞에 abstract를 붙여서 추상클래스로 만들어야함

추상메서드(미완의 메서드...선언문만 있고 구현부인 몸통이 없다)

추상메서드 목적 - 오버라이딩

부모클래스(추상클래스)

abstract class Fruit{
	
	static final String MESSAGE="오늘은 비 많이 오는 날";
	
	//일반메서드
	public void getTitle()
	{
		System.out.println("우리는 추상클래스 공부중!!!");
	}
	
	
	//추상메서드(미완의 메서드)만 담은 곳이 인터페이스 -> 거기에는 abstract를 붙일 필요가 없다
	
	//추상메서드(미완의 메서드...선언문만 있고 구현부인 몸통이 없다)
	//abstract -> 추상메서드라는 표시 -> 클래스에도 abstract 붙어야함
	abstract public void showMassage(); //오버라이딩 목적
}

자식클래스

부모클래스가 추상클래스라도 무조건 extends로 상속받음

//추상이지만 클래스는 무조건 extends로 상속받음
class Apple extends Fruit{

	@Override
	public void showMassage() {
		System.out.println("Apple_Message");
		System.out.println(Fruit.MESSAGE);
	}
	
}
/////////////////////////////////////////////////////////////////////////////////////////
class Banana extends Fruit{

	@Override
	public void showMassage() {
		System.out.println("Banana_Message");
	}
	
}
////////////////////////////////////////////////////////////////////////////////////
class Orange extends Fruit{

	@Override
	public void showMassage() {
		System.out.println("Orange_Message");
	}
	
}

메인클래스 (다형성 처리)

다형성 처리
하나의 변수로 여러가지 일을 처리할 때 이용

부모(상위)클래스명 변수명; 선언
변수명=new 자식(하위)클래스명();
변수명.메소드명();

생성해준 클래스 밑에 그 클래스에서 있는 메소드명만 사용가능

메인클래스

public class EXAbstract_08 {

	public static void main(String[] args) {
		
		//일반생성_메서드호출
		Apple a=new Apple();
		Banana b=new Banana();
		Orange o=new Orange();
		
		a.showMassage();
		b.showMassage();
		o.showMassage();
		
		//다형성 처리
		//하나의 변수로 여러가지 일을 처리할 때 이용
		//부모클래스명 변수명; 선언
		//변수명=new 자식클래스명();
		//변수명.메소드명();
		//생성해준 클래스 밑에 그 클래스에서 있는 메소드명만 사용가능
		Fruit fruit;
		
		fruit=new Apple();
		fruit.showMassage();
		
		fruit=new Banana();
		fruit.showMassage();
		
		fruit=new Orange();
		fruit.showMassage();
		
		fruit.getTitle();
		

	}

}

다형성처리

부모클래스

class Work{
	
	public void process()
	{
		System.out.println("작업중!!!!!!!");
	}
}

자식클래스

추상 메서드가 아니라서 extends 해도 클래스 밑에 오버라이딩 밑줄이 안뜸
-> 오버라이딩 할 메소드명으로 오버라이딩

//추상 메서드가 아니라서 extends 해도 클래스 밑에 밑줄이 안뜸
class Food extends Work{
	@Override
	public void process() {
		super.process();
		System.out.println("*****음식을 합니다******");
	}
}
///////////////////////////////////////////////////////////
class Clean extends Work{
	
	@Override
	public void process() {
		super.process();
		System.out.println("********청소를 합니다******");
	}
	
}
//////////////////////////////////////////////////////////

class Study extends Work{
	@Override
	public void process() {
		super.process();
		System.out.println("**********공부를 합니다*********");
	}
}

메인클래스

다형성..하나의 변수로 호출시 누가 생성되었느냐에 따라 그 기능이 달라짐

상위클래스명 변수명=null;

클래스 기본값 중복되는 것을 없애기 위해 null사용

사용안해도 상관 없다 -> 상위클래스명 변수명=new 하위클래스명(); 사용 가능

-> 상위클래스명 변수명=new 하위클래스();에서 상위클래스명을 지우기 위해

public class Inher_09 {

	public static void main(String[] args) {
		
		//일반적인 생성...메서드호출
		Study s=new Study();
		Clean c=new Clean();
		Food f=new Food();
		
		c.process();
		s.process();
		f.process();
		
		//다형성..하나의 변수로 호출시 누가 생성되었느냐에 따라 그 기능이 달라짐
		System.out.println("***다형성 출력중***");
		Work work=null; //클래스 기본값 중복되는 것을 없애기 위해 null사용
						//ex) work=new 하위클래스();
						//Work work=new 하위클래스();에서 Work(상위클래스명)을 지우기 위해
		
		work=new Study();
		work.process();
		
		work=new Clean();
		work.process();
		
		work=new Food();
		work.process();

	}

}
profile
백엔드 개발자로서 성장해 나가는 성현이의 블로그~

0개의 댓글