티스토리 뷰
클래스와 다형성
다형성 : 프로그램 언어의 각 요소들이 다양한 자료형에 속하는 것이 허가되는 성질.
↔ 단형성 : 프로그램 언어의 각 요소들이 한가지 자료형만 가지는 성질.
단형성을 갖는 자료형 : bool, char, short, int, long, float, double 등
다형성을 갖는 자료형 : var(JavaScript), Python의 변수, 상속 관계의 Class 등
상속(Inheritance)
: 코드 중복을 줄이기 위해 한 클래스가 다른 클래스에 정의 된 변수나 함수를 이어받아 그대로 이용하는 것.
이때 상속은 자식 클래스 → 부모 클래스의 방향으로만 이루어지며, 한 번에 한 부모에게만 상속이 가능하다.
class Animals{}; // 부모 클래스
class Dogs extends Animals{}; // 자식 클래스
위와 같은 코드로 상속이 가능하다.
이러한 상속을 이용하여 부모 클래스의 함수들을 이용할 수 있다.
또한 이러한 상속 관계에서는 두 가지 캐스팅 방법을 사용할 수 있다.
class NP{};
class P extends NP{};
NP non_poly = new P(); // Up-Casting
P poly = new P();
poly = (P)non_poly; //Down-Casting
위의 예시에서
Up-Casting : non_poly; P클래스의 객체가 부모 클래스인 NP 클래스로 높여져 형 변환이 됨.
Down-Casting : poly; NP클래스의 객체로 업캐스팅된 non_poly는 본래 P 클래스이므로, 자식 클래스로 변환 후 대입.
또한 이러한 상속 관계를 확인하기 위해 JAVA에서는 instanceof라는 연산자를 사용할 수 있다.
class NP{};
class P extends NP{};
NP np1 = new NP();
NP np2 = new P();
P p = new P();
System.out.println(np1 instanceof NP); // true
System.out.println(np1 instanceof P); // false
System.out.println(np2 instanceof NP); // true
System.out.println(np2 instanceof P); // true
System.out.println(p instanceof NP); // true
System.out.println(p instanceof P); // true
- np1은 NP의 객체이기 때문에 NP에 속하므로 true.
- np1은 NP의 객체이며, P와 연관이 없기 때문에 false.
- np2는 NP의 객체이기 때문에 NP에 속하므로 true.
- np2는 NP의 객체이지만 본래 P 클래스의 객체였으므로 P에 속함. 때문에 true.
- p는 NP에 extends된 객체이므로 NP와 상속 관계. 때문에 true.
- p는 P의 객체이기 때문에 P에 속하므로 true.
이러한 다형성을 배열로도 활용이 가능하다.
abstract class OS // 추상 클래스; 무조건 오버라이딩 해야하는 메소드를 가진 클래스
{
abstract void info();
};
class Linux extends OS
{
public void info(){ System.out.println("OS : Linux"); }
};
class Windows extends OS
{
public void info(){ System.out.println("OS : Windows"); }
};
class Mac extends OS
{
public void info(){ System.out.println("OS : Mac"); }
};
public class Main
{
public static void main(String[] args)
{
OS o[] = {new Linux(), new Windows(), new Mac()};
for(OS system : o)
{
system.info();
}
}
}
/* output
OS : Linux
OS : Windows
OS : Mac */
'언어 > 자바' 카테고리의 다른 글
[JAVA/기초] HashSet을 이용한 집합연산 (0) | 2022.11.14 |
---|---|
[JAVA/기초] 스트림(Stream) (0) | 2022.11.09 |
[JAVA/기초] String : .equals()와 ==의 차이, 그리고 StringBuffer (0) | 2022.11.03 |
댓글