2022-05-16 데일리 회고 (After) 14일차

Sung-min Seo·2022년 5월 16일
0

⭐ 오늘의 학습 내용 📌

1. 다형성 (Polymorphism)

🥕 다형성이란?

    다형성이란 말 그대로 여러가지 형상을 가진다는 의미이다. 같은 자료형을 쓰지만, 대입되는 객체에 따라서 여러가지 결과를 얻어낼수 있다는 것이다.

1. 참조 변수의 다형성

    상위 클래스의 참조변수는 하위 클래스의 인스턴스를 참조할수 있다. 하위 클래스가 상위클래스를 참조하는 반대의 경우에는 오류가 나타난다. 그 이유는 참조하려는 클래스의 변수가 실제 인스턴스의 개수보다 많아지기 때문이다.

📌 참조 변수의 다형성 예제.

class high{} //상위 클래스
class low extends high{} //하위 클래스

high hi = new high(); //  상위 -> 상위 : 허용
low lo = new low(); //  하위 -> 하위 : 허용
high hii = new low(); //  상위 -> 하위 : 허용
low loo = new high(); //  하위 -> 상위 : 오류

2. 참조 변수의 타입변환

    앞서 배웠던 기본 타입들의 형변환 처럼 참조 변수도 타입 변환이 가능하다. 그러기 위해선 3가지의 조건을 먼저 만족해야 한다.
      1. 상위 클래스와 하위 클래스가 우선 상속 관계에 있어야 한다.
      2. 하위 클래스에서 상위 클래스로 형변환시 타입을 명시하지 않아도 된다.
          : 업캐스팅시 하위 클래스의 변수가 더 많으므로 자동으로 형변환이 이루어 질수 있다!!
      3. 상위 클래스에서 하위 클래스로 형변환시 타입을 명시해주어야 한다.
          : 다운 캐스팅시 자동형변환은 이루어지지 않는다.

📌 참조변수의 타입변환 예시

class Parent{} //상위 클래스
class Brother extends Parent{}  //하위 클래스
class Sister extends Parent{}	//하위 클래스2

Parent parent = new Parent();
Brother brother = new brother();
Sister sister = new sister();
 
 
parent = brother; // 부모 개채에서 자식개체로의 형변환 = 자동 형변환 가능
brother = (Brother)parent; // 더 많은 변수를 가지고 있는 자식 개체에서 부모개체로의 형변환
brother = sister; // 상속관계가 아니기 때문에 오류
 
 
// instanceof 연산자 예시
System.out.println(parent instanceof Parent);  // 참
System.out.println(parent instanceof Brother);	// 참
System.out.println(brother instanceof Parent);	// 참
System.out.println(brother instanceof Brother);	// 참
System.out.println(brother instanceof Sister);	// 거짓
    다형성은 때로는 복잡하게 얽혀 그 관계를 확실히 하기가 어려워 질때가 많다. 이럴때 사용되는 연산자가 위에 사용된 instanceof 연산자이다. 이 연산자를 사용하면 참조 변수가 참조하고 있는 인스턴스가 서로 참조된 관계인지 확인할수 있다.

2. 추상화 (Abstraction) 와 인터페이스 (Interface)

🥕 추상화

    추상화란 아직 완성되지 않은 모호한 개념만이 존재 하는 것을 뜻한다. 어렴풋이 개념만이 있기에 확실한 값이 있는 것은 아니지만 이러한 변수값이 존재한다는 것을 알기에 만들고자 하는 객체의 전체적인 설계도를 짜기 매우 쉬워진다는 장점이 있다.

1. 추상화 클래스

    추상화 클래스는 abstract이라는 제어자를 사용하여 표현하며 마찬가지로 abstract이라는 제어자 선언과 함께 내용이 없는 메서드를 포함한다.

📌 추상화 클래스 예시

public abstract class Weapon{
	public String type;
	public abstract void damage();
}
class Sword extends Weapon{
	public Sword(){
		this.type = "검";
	}
	public void damage(){
		System.out.println("10의 데미지를 주었습니다.")
	}
}
class Bow extends Weapon{
	public Bow(){
		this.type = "활";
	}
	public void damage(){
		System.out.println("7의 데미지를 주었습니다.")
	}
}

class Test{       
  public static void main(String[] args) throws Exception {
     Weapon sword = new Sword();
     sword.damage(); // 10의 데미지를 주었습니다.

     Bow bow = new Bow();
     bow.damage(); // 7의 데미지를 주었습니다.
  }
}
    위의 예제처럼 Weapon 클래스에서는 빈 메서드와 변수 값을 가졌지만 밑의 상속 받은 자식 클래스에서는 그 값을 제대로 명시해 줌으로써 출력 값을 가질수 있다.

🥕 인터페이스

    위에서 배웠던 추상화는 어렴풋이 개념을 정해두고 하위 클래스에서 완성하는 방법 이었다. 다만 추상화 클래스는 한번에 하나의 상속만 받을수 있으며 값의 세세한 변화를 주고 싶을때 불편하다는 문제가 있다.
    추상화 클래스가 어렴풋이 정해둔 개념이라면 인터페이스는 미리 정해둔 개념이다. 특히나 인터페이스는 다중 상속이 가능하기에 객체의 세세한 부분을 늘려 나갈때 아주 유용하게 사용될수 있다.

📌 인터페이스 예시

public interface Sauce{
	public abstract void sauce();
}

public interface Parts{
	public abstract void type();
}

class Chicken1 implements Sauce, Parts{
	public void sauce(){
		System.out.println("양념 소스 입니다.")
	}
	public void parts(){
		System.out.println("다리만 주문하셨습니다.")
	}
}

class Chicken2 implements Sauce, Parts{
	public void sauce(){
		System.out.println("후라이드 입니다.")
	}
	public void parts(){
		System.out.println("순살로 주문하셨습니다.")
	}
}

class Order{       
  public static void main(String[] args) throws Exception {
    	Chicken1 yang = new Chicken1();
		Chicken2 fried = new Chicken2();
		
		yang.sauce();	//	양념 소스 입니다.
  		yang.parts();  //	다리만 주문하셨습니다.
  		fried.sauce();	//	후라이드 입니다.
  		fried.parts();	//	순살로 주문하셨습니다.
		
  }
}

⭐ 오늘의 소감

게임을 만들때 자주 봤었던 인터페이스 개념을 다시 배우니 감회가 새로웠다. 많이 어려웠던 파트였고 지금 새로 들어도 많이 헷갈리는 부분이 많지만, 그래도 한번 배웠던 내용이라고 어떻게 활용해볼지 학습하며 생각해보았다.

profile
매일 문제 3개 이상 풀기!!

0개의 댓글