우선 class와 type의 의미를 알아보겠습니다.
String str = new String("Jeong");
위와 같이 객체를 생성할 때, 저는 String을 클래스 또는 타입이라고 혼용해서 사용했습니다. 둘은 차이점이 있고 이 차이점을 무엇일까요.
클래스는 "객체가 수행할 행동에 대한 연산의 집합"이라고 할 수 있습니다. 클래스를 떠올려보면 값을 저장할 변수와 변수를 가지고 연산할 구현된 메소드로 구성되어 있습니다.
타입은 "객체가 수행할 행동에 대한 약속의 집합"이라고 할 수 있습니다. 타입을 떠올려보면 메소드가 선언만 되어 있고 구현이 되어 있지는 않습니다. Java에서는 인터페이스가 있습니다.
Subclassing
클래스 상속이라고도 불립니다. 부모 클래스를 자식 클래스가 상속 받습니다. 그러면 자식은 부모의 특징을 그대로 물려 받습니다. 만약에 자식 클래스에서만의 특징을 부여하고 싶으면 override를 하여 메소드를 재정의해야 합니다.
아래 예시를 보겠습니다. 객체 B를 만들었습니다. 그런데 출력해보니 "Class A"라고 나옵니다. 부모 클래스의 특징을 그대로 가지고 있습니다.
static class A {
public String Name() {
return "Class A";
}
}
static class B extends A {
}
public static void PrintName(A obj) {
System.out.println(obj.Name());
}
public static void main(String[] args) {
A objA = new A();
A objB = new B();
PrintName(objA); // "Class A"
PrintName(objB); // "Class A"
}
Class B의 특징을 만들기 위해서는 Override가 필요합니다.
static class A {
public String Name() {
return "Class A";
}
}
static class B extends A {
@Override
public String Name() {
return "Class B";
}
}
SubTyping
(자바 기준) 인터페이스에서 정의한 추상 메소드를 서브 타입이 물려 받습니다. Runtime에서 인터페이스의 메소드를 서브 타입의 객체로 대체가 가능하도록 해줍니다. 그러면 변경에 유연하게 대응할 수 있습니다. 인터페이스의 객체를 하위타입 객체로 대체하면 동적으로 하위 타입의 메소드를 대체되어 호출이 됩니다.
interface MyClass {
String Name();
}
static class A implements MyClass {
@Override
public String Name() {
return "Class A";
}
}
static class B implements MyClass {
@Override
public String Name() {
return "Class B";
}
}
public static void PrintName(MyClass obj) {
System.out.println(obj.Name());
}
public static void main(String[] args) {
MyClass objA = new A();
MyClass objB = new B();
PrintName(objA); // "Class A"
PrintName(objB); // "Class B"
}
참조
'IT > Others' 카테고리의 다른 글
디자인 패턴 소개 (POSA 2) (0) | 2023.03.19 |
---|---|
디자인 패턴 소개 (POSA 1) (0) | 2023.01.26 |
싱글톤 패턴 (0) | 2022.08.27 |
전략 패턴 (0) | 2022.08.13 |
DMA (Direct Memory Access) (0) | 2022.05.11 |