[JAVA]_7일차 실습

전희주·2023년 4월 13일
0

JAVA

목록 보기
8/24
  • 부모클래스에서 상속받아 생성자 생성하기
    • 부모클래스에서 먼저 인자받는 생성자 생성 후, 아래와 같이 실행

java07

p01

Bird

package p01;

public class Bird {
	String name;
	String sex; 
	
	
	
	public Bird() {
		// TODO Auto-generated constructor stub
	}
	
	
	public Bird(String name, String sex) {
		this.name = name;
		this.sex = sex;
	}

 
	public void eatBird( ) {};
	public void flyBird(){};
	public void sleepBird(){};

}

Cat

package p01;

public class Cat {
	String name;
	int age;
	String sex; 
	
	
	public Cat() {
	}
	
	
	public Cat(String name, int age, String sex) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	}


	public void eatCat(){};
	public void runCat(){}; 
	public void sleepCat(){};

}

Dog

package p01;

public class Dog {
	String name;
	int age;
	String sex; 
	String species;
	
	public Dog() {
		// TODO Auto-generated constructor stub
	}
	
	
	
	
 
	public Dog(String name, int age, String sex, String species) {
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.species = species;
	}





	public void eatDog(){};
	public void sleepDog(){}; 

}

PetTest

package p01;

public class PetTest {

	public static void main(String[] args) {
		
		Cat c = new Cat("야옹", 2, "암컷"); 
		Dog d = new Dog("망치", 1, "수컷", "치와와"); 
		Bird b = new Bird("참새", "수컷");
		
		
		System.out.printf("Cat, 이름:%s 나이:%d 성별:%s \n", c.name, c.age, c.sex ); ;
		System.out.printf("Dog, 이름:%s 나이:%d 성별:%s 종:%s \n", d.name, d.age, d.sex, d.species ); ;
		System.out.printf("Bird, 이름:%s 성별:%s \n", b.name, b.sex ); ;
		
		
	}

}

p02

Bird

package p02;

public class Bird extends Pet {
	
	
	// 생성자 입력 
	// 필드가 없으므로 superclass에서 생성자 생성 필 
	public Bird() {
	}

	
	public Bird(String name, String sex) {
		//super(name, sex);
		this.name = name; 
		this.sex =sex; 
	}


	// 메서드 입력  
	public void flyBird() {
		System.out.println("flyBird");
	}
	

}

 

Cat

package p02;



// Cat is a Pet 성립됨. 따라서 상속 적용 가능.
public class Cat extends Pet{

	int age;

	public Cat() {}

	public Cat(String name, int age, String sex) {
		//super(name, sex);
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	public void runCat() {
		System.out.println("runCat");
	}
}

Dog

package p02;

public class Dog extends Pet {

	int age;
	String species;
	
	public Dog() {}

	public Dog(String name, int age, String sex,  String species) {
//		super(name, sex);
		this.name = name;
		this.sex = sex;
		this.age = age;
		this.species = species;
	}
	
	
}

Pet

package p02;

// Cat, Dog, Bird, ..... 모두 포함하는 개념인 부모 클래스
public class Pet {

	String name;
	String sex;

	public Pet() {}

	public Pet(String name, String sex) {
		this.name = name;
		this.sex = sex;
	}



	public void eatPet() {
		System.out.println("eatPet");
	}
	public void sleepPet() {
		System.out.println("sleepPet");
	}
}

PetTest

package p02;

public class PetTest {

	public static void main(String[] args) {

		Cat c = new Cat("야옹", 2, "암컷");
		Dog d = new Dog("망치", 1, "수컷", "치와와");
		Bird b = new Bird("참새", "수컷");
		
		System.out.printf("Cat, 이름:%s 나이:%d 성별:%s \n",
				                         c.name, c.age, c.sex);
		System.out.printf("Dog, 이름:%s 나이:%d 성별:%s 종:%s \n",
				                         d.name, d.age, d.sex, d.species);
		System.out.printf("Bird, 이름:%s 성별:%s \n", b.name, b.sex);
		
	} 

}
  • 자식 객체 생성시 부모 객체가 먼저 생성되고 이후에 자식 객체가 생성된다

p03

Cat

package p03;



// Cat is a Pet 성립됨. 따라서 상속 적용 가능.
public class Cat extends Pet{

	int age;

	public Cat() {
		System.out.println("Cat 생성자");
	}

}

Pet

package p03;

// Cat, Dog, Bird, ..... 모두 포함하는 개념인 부모 클래스
public class Pet {

	String name;
	String sex;

	public Pet() {
		System.out.println("Pet 생성자");
	}

	
	
}

PetTest

package p03;

public class PetTest {

	public static void main(String[] args) {

		Cat c = new Cat();
		
		
		
	} 

}
  • 객체 생성 순서
    • Object - 부모 객체 - 자식 객체

명시적으로 Super(값, 값2...) 요청하는 경우

  • 부모의 인스턴스 변수를 자식이 아닌 부모에서 초기화하기 위함

Cat

package p03;



// Cat is a Pet 성립됨. 따라서 상속 적용 가능.
public class Cat extends Pet{

	int age;

	
	public Cat() {
		super("AA", "BB"); // 명시적으로 선언된 부모의 생성자를 호출하기 => 인자 기재
		System.out.println("Cat 생성자");
	}

}

Pet

package p03;

// Cat, Dog, Bird, ..... 모두 포함하는 개념인 부모 클래스
public class Pet {

	String name;
	String sex;

	
	// 부모에 기본생성자 없고 명시적 선언한 경우 
	public Pet(String name, String sex) {
		System.out.println("Pet 생성자");
	}

	
	
}
  • 자동 오버라이딩 지정

p04

Cat

package p04;

public class Cat extends Pet{ // extends 뒤에는 반드시 하나의 클래스명만 지정이 가능하다 
	
	
	int age; 
	
	// 생성자
	public Cat() {
		
	}
	
	public Cat(String name, String sex, int age) {
		super(name, sex); // super는 부모 생성자 호출, 첫 라인 기재 필, 부모에서 선언되었기 때문에 부모에서 초기화
		this.age = age;
	}
	
	
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	
	// 메서드
	public void runCat() {
		System.out.println("runcat");
	}
	
	// 이름과 성별, 나이까지 한꺼번에 반환 
	/*public String getCat() {
		return name + "\t" + sex + "\t" + age; 
		
	}
	*/ 
	
	// 부모의 getPet 메서드 재정의 
	// 이름과 성별, 나이까지 한꺼번에 반환 
	@Override 
	public String getPet() {
		return name + "\t" + sex + "\t" + age; 
	}
	
	
	
}

Dog

package p04;

public class Dog extends Pet {
	
	// 필드
	int age;
	String species;
	
	// 생성자
	public Dog() {
	}


	public Dog(String name, String sex, int age, String species) {
		super(name, sex); // 부모에서 선언되었기 때문에 부모에서 초기화 
		this.age = age;
		this.species = species;
	}


	// 메서드 
	public int getAge() {
		return age;
	}


	public void setAge(int age) {
		this.age = age;
	}


	public String getSpecies() {
		return species;
	}


	public void setSpecies(String species) {
		this.species = species;
	}

	
	// 이름과 성별, 나이, 종 한꺼번에 반환 
	public String getDog() {
		return name + "\t"+sex+ "\t"+ age + "\t"+species; 
	}


	@Override
	public String getPet() {
		// TODO Auto-generated method stub
		// return name + "\t"+sex+ "\t"+ age + "\t"+species; // 부모에 있는 getPet을 출력 (name, sex 출력)
		return super.getPet()+"\t"+ age + "\t"+species; // 부모에 있는 getPet을 출력 (name, sex 출력)
	}
	
	

}

Pet

package p04;

public class Pet {

	// 필드
	String name;
	String sex;
	
	// 생성자 
	public Pet(){
		
	}

	public Pet(String name, String sex) {
		this.name = name;
		this.sex = sex;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	
	// 공통 기능 
	public void eat() {
		System.out.println("Pet.eat");
	}
	
	public void sleep () {
		System.out.println("Pet.sleep");
	}
	
	// 이름과 성별 한꺼번에 반환 
	public String getPet() {
		return name + "\t" + sex; 
	}
	
	
	
}

TestPet

package p04;

public class TestPet {

	public static void main(String[] args) {
		
		Cat c = new Cat("야용","암컷", 2);

		Dog d = new Dog("망치","수컷", 1, "불독");

		System.out.printf("Cat, 이름:%s 나이:%d 성별:%s \n", c.name, c.age, c.sex);
		System.out.printf("Dog, 이름:%s 나이:%d 성별:%s 종:%s \n", d.name, d.age, d.sex, d.species);
		
		System.out.println("고양이 총정보 " + c.getPet());
		System.out.println("강아지 총정보 " + d.getPet());
	}
	
}

p05

Cat

package p05;

public class Cat extends Pet{ // extends 뒤에는 반드시 하나의 클래스명만 지정이 가능하다 
	
	
	int age; 
	
	// 생성자
	public Cat() {
		
	}
	
	public Cat(String name, String sex, int age) {
		super(name, sex); // super는 부모 생성자 호출, 첫 라인 기재 필, 부모에서 선언되었기 때문에 부모에서 초기화
		this.age = age;
	}
	
	
	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	
	// 메서드
	public void runCat() {
		System.out.println("runcat");
	}
	
	// 이름과 성별, 나이까지 한꺼번에 반환 
	/*public String getCat() {
		return name + "\t" + sex + "\t" + age; 
		
	}
	*/ 
	
	// 부모의 getPet 메서드 재정의 
	// 이름과 성별, 나이까지 한꺼번에 반환 
	@Override 
	public String getPet() {
		return name + "\t" + sex + "\t" + age; 
	}

	@Override
	public String toString() {
		return "Cat [age=" + age + ", name=" + name + ", sex=" + sex + "]";
	}

	
	
	
	
	
}

Dog

package p05;

public class Dog extends Pet {
	
	// 필드
	int age;
	String species;
	
	// 생성자
	public Dog() {
	}


	public Dog(String name, String sex, int age, String species) {
		super(name, sex); // 부모에서 선언되었기 때문에 부모에서 초기화 
		this.age = age;
		this.species = species;
	}


	// 메서드 
	public int getAge() {
		return age;
	}


	public void setAge(int age) {
		this.age = age;
	}


	public String getSpecies() {
		return species;
	}


	public void setSpecies(String species) {
		this.species = species;
	}

	
	// 이름과 성별, 나이, 종 한꺼번에 반환 
	public String getDog() {
		return name + "\t"+sex+ "\t"+ age + "\t"+species; 
	}


	@Override
	public String getPet() {
		// TODO Auto-generated method stub
		// return name + "\t"+sex+ "\t"+ age + "\t"+species; // 부모에 있는 getPet을 출력 (name, sex 출력)
		return super.getPet()+"\t"+ age + "\t"+species; // 부모에 있는 getPet을 출력 (name, sex 출력)
	}
	
	

}

Pet

package p05;

public class Pet {

	// 필드
	String name;
	String sex;
	//int age; 
	
	// 생성자 
	public Pet(){
		
	}

	public Pet(String name, String sex) {
		this.name = name;
		this.sex = sex;
	}
 
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	
	// 공통 기능 
	public void eat() {
		System.out.println("Pet.eat");
	}
	
	public void sleep () {
		System.out.println("Pet.sleep");
	}
	
	// 이름과 성별 한꺼번에 반환 
	public String getPet() {
		return name + "\t" + sex; 
	}
	
	
	
}

TestPet

package p05;


public class TestPet {

	public static void main(String[] args) {
		
		// 다형성 
		Pet p = new Cat("야용","암컷", 2);
		System.out.println("고양이 총정보 " + p.getPet());
		
		/*
		 * 
		 *  p 변수는 컴파일 시점에는 Pet 으로 인식되고 
		 *  실행 시점에는 실제로 new 한 클래스로 인식된다. 
		 *  (동적 바인딩 이라고 부른다.) 
		 *  
		 *  
		 *  동적 바인딩은 메서드에만 적용되는 개념이다
		 * */

		System.out.println("고양이 총 정보"+ p.getPet()); 
		// p" 변수의 타입인 "Pet" 클래스에 "age" 변수가 선언되어 있지 않으면 에러 발생 
		// 형 변환을 통한 해결 가능: 다형성을 이용해서 객체 생성 후에 자식에만 존재하는 멤버 접근하려면 형 변환 필요 
		Cat c = (Cat) p; 
		System.out.println(c.age);
		
		if(p instanceof Cat) { // p가 Cat 클래스의 인스턴스인지 확인
            System.out.println(((Cat) p).age); // Cat 타입으로 캐스팅하여 age 변수 사용
        }
		
		p = new Dog("망치","수컷", 1, "불독"); // 기존에 선언한 "p" 변수를 재활용
		System.out.println("강아지 총정보 " + p.getPet());

		
	}
	
}

TestPet2

package p05;

public class TestPet2 {

	public static void main(String[] args) {

		Pet[] pets = { new Cat("야옹이1", "암컷", 2), new Dog("망치1", "암컷", 4, "불독"), new Cat("야옹이2", "암컷", 2),
				new Dog("망치2", "암컷", 1, "치와와"), new Cat("야옹이3", "암컷", 2), };

		for (Pet x : pets) {
			System.out.println(x.getPet()); // 동적 바인딩
		}
		System.out.println();
		
		// 고양이만 출력하시오? ==> (변수 instanceof 타입) 연산자
		// 첫 번째 for 루프에서 사용된 pet과 두 번째 for 루프에서 사용된 pet은 서로 다른 변수이므로, 
		// 중복된 변수명으로 인한 에러가 발생하지 않습니다.
		for (Pet pet : pets) {
			if (pet instanceof Cat) {
				System.out.println("Cat: " + pet.getPet());
					}
				}
				
		// 고양이의 age만 출력하시오 ? ==> instanceof + 형변환
		for (Pet pet : pets) {
			if (pet instanceof Cat) {
				Cat c = (Cat) pet;
				System.out.println("Cat: " + c.getAge());
					}
				}
		System.out.println();
		
		
		// 다른 표기 
		for (Pet x : pets) {
			if (x instanceof Cat) { // x가 Cat 클래스의 인스턴스인지 확인
				System.out.println(((Cat) x).getPet()); // Cat 타입으로 캐스팅하여 getPet() 사용
				System.out.println(((Cat) x).age); // Cat 타입으로 캐스팅하여 age 필드 사용
			}
		}
		
	}
}

TestPet3

package p05;
import java.util.Date;
public class TestPet3 {

	public static void main(String[] args) {

		Cat c = new Cat("야옹", "암컷", 2); 
		
		// Cat 클래스에서 toString() 메서드를 재정의하지 않음
		// Object 클래스에서 상속받은 기본 toString() 메서드가 호출
		System.out.println(c);
		System.out.println(c.toString()); // Cat@16진수
		
		////////////////////////////////////API (우리가 만든 클래스가 아니라 내장된 것)
		// String 클래스와 Date 클래스는 Java API (Application Programming Interface)에 포함된 클래스
		// s는 String 클래스의 인스턴스
		// String 클래스에서 toString() 메서드는 인스턴스 자신을 반환
		String s = "hello"; 
		System.out.println(s); // 참조변수, 자동으로 toString() 호출됨 
		System.out.println(s.toString()); //hello 
		
		//  d는 Date 클래스의 인스턴스
		Date d = new Date(); 
		System.out.println(d);// d.toString()과 동일한 결과를 출력 
		System.out.println(d.toString()); // 2023~
		
	}
}

Bird

package p05;

// 나중에는 생성자, getter/setter, toString 자동으로 제공하는 
// lombok 라이브러리 사용할 것이다. 

public class Bird{ 
	
	// 1. 변수 
	String name; 
	int age;
	
	// 2. 생성자( 기본 생성자 + 파라미터 존재하는 생성자)
	// 생성자는 객체를 생성하고 초기화
	
	public Bird() {
		// TODO Auto-generated constructor stub
	}

	public Bird(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	// 3. getter /setter ( 객체의 필드 값을 읽거나 변경 ) 
	//  getter는 필드 값을 반환하고, setter는 매개변수로 받은 값을 필드에 설정

	public String getName() {
		return name;
	} 

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	
	// Object toString() 재정의
	@Override
	public String toString() {
		return "Bird [name=" + name + ", age=" + age + "]";
	} 
	
	
}

0개의 댓글