[자바] getter / setter / 다형성 (Polymorphism)

심심이·2024년 2월 18일
0

java

목록 보기
34/46

상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술.
자식클래스로 생성되어진 객체를 부모 클래스 타입으로 받을 수 있다는 것이 다형성(Polymorphism)이다.


Animal. java

  • 추상 메소드 & 부모 메소드로 추상 클래스를 만들어서 꼭 구현해야만 하는 클래스를 자식들이 구현할 수 있도록 한다.
  • 부모는 자식을 담을 수 있다.
  • Animal 은 추상 클래스라 객체화가 불가능하지만, 배열로 만들어서 자식 객체를 담아 활용할 수 있다. (부모의 것은 자식이 모두 상속받을 수 있다!) 다형성을 이용하면 다양한 자식 인스턴스를 참조할 수 있으며 메소드 오버라이딩을 통해 객체별로 다르게 출력할 수 있다.

public abstract class Animal {
	// Dog, Cat, Duck 의 공통 field (추상화)
	private String name;
	private int birth_year;
	
	// Dog, Cat, Duck 의 공통 method(기능) (추상화)
	protected String getName() {
		return name;
	}
	protected void setName(String name) {
		//널과 공백 제외
		if(name != null && !name.isBlank()) {
			this.name = name;
		} else {
			return;
		}
	}
	protected int getBirth_year() {
		return birth_year;
	}
	protected void setBirth_year(int birth_year) {
		if(!(birth_year < 0)) {
			this.birth_year = birth_year;
		}
	}
	//추상 메소드
	protected abstract void view_info();
	protected abstract void action();
	
	
	
}

Cat. java


public class Cat extends Animal {
	// cat 만 가지는 field를 정의 (추상화)
	private String color;
	// cat 만 가지는 method를 정의 (추상화)
	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		if(color != null && !color.isBlank()) {
			this.color = color;
		}
	}
	//메소드의 오버라이딩(재정의)
	@Override
	protected void view_info() {
		System.out.println("======== 고양이 정보 =======\n"
				+ "1. 성명 :" + super.getName() + "\n"
				+ "2. 생년 :" + super.getBirth_year() + "년 \n"
				+ "3. 색깔 : " + color + "\n");
	}
	
	@Override
	protected void action() {
		System.out.println("고양이는 점프를 합니다.!!!");
	}
	
	
	
}

Dog. java


public class Dog extends Animal {
	// dog 만 가지는 field를 정의 (추상화)
	
	private int weight;

	// dog 만 가지는 method를 정의 (추상화)
	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		if(weight > 0) {
			this.weight = weight;
		}
	}
	//메소드의 오버라이딩(재정의)
	@Override
	protected void view_info() {
		System.out.println("======== 강아지 정보 =======\n"
				+ "1. 성명 :" + super.getName() + "\n"
				+ "2. 생년 :" + super.getBirth_year() + "년 \n"
				+ "3. 몸무게 : " + weight + "kg \n");
	}
	@Override
	protected void action() {
		System.out.println("강아지가 빠르게 달립니다~~");
	}
	
	
}

Duck. java


public class Duck extends Animal {
	
	// duck 만 가지는 field를 정의 (추상화)
	private int price;

	// duck 만 가지는 method를 정의 (추상화)
	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		if(price > 0) {
			this.price = price;
		}
	}
	
	
	@Override
	protected void view_info() {
		System.out.println("======== 오리 정보 =======\n"
				+ "1. 성명 :" + super.getName() + "\n"
				+ "2. 생년 :" + super.getBirth_year() + "년 \n"
				+ "3. 가격 : " + new DecimalFormat("#,###").format(price) + "원\n");
	}
	@Override
	protected void action() {
		System.out.println("오리는 물가에서 헤엄을 칩니다.^^");
	}
	
}

Main. java

  • Main 클래스에서 getter/setter를 써준다.
  • set 메소드로 값을 넣어주고, private한 필드에 값이 넣어지며, 그 넣어진 값을 get 메소드로 반환한다.
	public static void main(String[] args) {
		
		//Animal an = new Animal(); 오류!!
		//추상 클래스를 사용하여 객체(인스턴스) 생성 불가
		Animal[] ani_arr = new Animal[5]; //"공간만" 만듬. 객체는 () 생성자가 있어야함
		//추상 클래스는 스스로 객체생성(인스턴스화)는 불가하지만
		//일반적인 자식클래스로 생성된 객체를 저장하는 용도로 사용이 가능하다
		
		Dog dog = new Dog();
//		Animal ani1 = new Dog(); // 가능 -> 다형성
//		ani_arr[0] = new Dog(); // 가능 -> 다형성
		dog.setName("뽀삐");
		dog.setBirth_year(2021);
		dog.setWeight(3);
		
		ani_arr[0] = dog;
		
		Cat cat = new Cat();
//		Animal ani2 = new Cat(); // 가능 -> 다형성
//		ani_arr[1] = new Cat(); // 가능 -> 다형성
		cat.setName("톰");
		cat.setBirth_year(2022);
		cat.setColor("검정");
		
		ani_arr[1] = cat;
		
		
		Duck duck = new Duck();
//		Animal ani3 = new Duck(); // 가능 -> 다형성
//		ani_arr[2] = new Duck(); // 가능 -> 다형성
		duck.setName("도널드");
		duck.setBirth_year(2022);
		duck.setPrice(5000);
	
		ani_arr[2] = duck;


		for(Animal ani : ani_arr) {
			if(ani != null) {
				ani.view_info();
				ani.action();
			}
			//0번 == dog, 오버라이딩되어진 dog의 메소드가 나옴
			// 1번 == cat. cat의 오버라이딩 메소드가 나옴
			//2번 == duck. duck의 오버라이딩 메소드가 나옴.
		}
		System.out.println("\n-------------------------- \n");

		
		
	}
profile
개발하는 심심이

0개의 댓글

관련 채용 정보