///////
Search

[220926] 다형성_김예진

날짜
2022/09/26
텍스트

다형성(polymorphism)

객체들의 타입이 다르면 똑같은 메세지가 전달되더라도 서로 다른 동작을 하는 것
⇒ 여러 형태를 가질 수 있는 것
class Shape { public void draw() { System.out.println("도형을 그립니다."); } } class Rectangle extends Shape{ @Override public void draw() { System.out.println("사각형을 그립니다."); } } Shape shape = new Rectangle(); << upcasting
Java
복사
업캐스팅(upcasting) - 상형 형변환
부모 클래스 변수로 자식 클래스 객체를 참조할 수 있다.
⇒ 하위 객체를 상위 클래스형 변수에 대입
위의 코드를 예시로 들어보면 부모 클래스 변수 Shape로 자식 클래스 객체인 Rectangle()을 참조했다.
코드로 작성할 때 부모 = 자식 형태로 형변환 없이 적는다 ⇒ (하위 객체를 상위 클래스형 변수에 대입)
반대 형태인 자식 = 부모 형태는 안 된다.
포함하는 데이터의 범위가 다르기 때문이다.
메소드 오버라이딩
자식 클래스가 부모 클래스와 똑같은 이름과 똑같은 파라미터를 갖는 메소드를 가지는 것이다.
이때 자식 클래스의 메소드가 호출되어 부모의 메소드에 덮어쓰는 것처럼 사용하는 것이다.
Rectangle의 draw 메소드가 Shape의 draw 메소드를 오버라이딩 했기 때문에
출력은 사각형을 그립니다. 로 출력된다.
오버라이딩된 메소드 호출
그럼 오버라이딩된 부모 메소드를 호출하고 싶을 때에는 어떻게 해야할까?
super 키워드를 이용해서 인스턴트 내부에서 사용할 수 있다.
스크롤한 코드를 보면 super.draw()로 오버라이딩 된 메소드를 자식 객체 안에서 호출했다.
그렇기에 출력은
도형을 그립니다.
사각형을 그립니다. 가 출력된다.
어노테이션(Annotation)
직역하면 주석이라는 뜻이지만 일반적인 주석과는 다르게 검증하는 기능을 한다.
오버라이딩을 검증하는 기능을 한다.
@Override
Java
복사
오버로딩
오버로딩은 메소드의 이름이 같고, 매개변수의 개수나 타입이 다른 것을 말한다.
출력 : int형 리턴 getArea 넓이는 =12 double형 리턴 getArea 넓이는 =12.0
Java
복사
위의 코드를 살펴보면 메소드의 이름이 getArea()로 같지만 리턴 타입이 int와 double로 서로 다르고 매개변수의 타입도 다르다.
이때 같은 이름을 가진 함수이지만 리턴타입과 매개변수에 차이를 줘서 서로 다른 일을 하는 메소드로 만들 수 있다. 이것을 오버로딩이라고 부른다.
오버로딩을 사용하는 이유
같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다는 장점이 있다.
우리가 사용하는 syso의 println()도 안에 들어가는 인자의 타입의 종류에 따라 다른 코드가 돌아가지만 print를 한다는 같은 기능을 하기 때문에 활용하면 유용하다.
오버로딩은 메소드의 이름이 같고, 매개변수의 개수 또는 리턴타입이 달라야 한다.
오버라이딩은 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다.