2022.09.26 (월요일)

yeonicerely·2022년 9월 26일
0

1. 상속

  • 상속: 공통 기능을 부모로 빼놓는다!

A. 상속하는 이유

(1) 중복되는 코드를 줄일 수 있다.
(2) 이미 존재하는 클래스의 필드와 메소드를 재사용할 수 있다.


B. 생성자 호출순서

a. 가장 큰 부모 생성자까지 호출한 뒤 메모리에 가장 부모인 클래스를 먼저 올린다

-> 가장 부모인 클래스의 결과값이 먼저 나온다

  • 메모리에 A -> B -> C 순서로 할당됨
  • cf) object는 모든 클래스의 부모
    i) object -> A -> B -> C 순서로 메모리에 올라간다.
    ii) extends Object가 없어도 compiler가 자동적으로 올려준다.






2. 메소드 오버라이딩 & 오버로딩






3. 다형성 (polymorphism)

A. 다형성: 하나의 객체가 여러가지 자료형 타입을 가질 수 있는 것

a. 다형성을 구현할 수 있는 방법

(1) 오버로딩& 오버라이딩
(2) 참조 변수의 형변환
(3) 함수형 인터페이스

b. 참조 변수의 형변환

(1) 업캐스팅: 자바에서는 부모 클래스가 자식 클래스의 인스턴스를 참조할 수 있도록 구현함 -> 형변환 없이 들어감. 즉, 부모 = 자식으로 들어가는 것

Shape shape = new Rectangle(); // 부모 클래스: Shape, 자식 클래스 Rectangle

Aninal animal = new Lion();
Predator predator = new Lion();
// 이 때 animal과 predator가 사용할 수 있는 메소드는 다르다
// animal과 predator이 원래 가지고 있는 메소드를 사용할 수 있다
// 만약 animal과 predator이 가지고 있는 메소드를 모두 사용하고 싶으면 새로운 인터페이스를 사용하여 만들 수 있다.
  • 부모 클래스에 없는 자식 클래스의 메소드를 사용할 수 없음 -> 사용하고 싶으면 인터페이스를 이용해야 함
  • 기본적으로 자식 = 부모는 안 되지만 되는 케이스도 있음(다운 캐스팅)
  • 부모 클래스의 메소드는 자식 클래스로 덮어 씌워짐
//컴파일 에러

Rectangle rectangle = new Shape();

Lion lion = new Animal();
Lion lion = new Predator();

(2) 다운캐스팅: 자식 클래스가 부모 클래스를 참조하여 형변환

B. 메모리 변화


class A{
	private int a;
	
	public getA(){
	...
	}
}

class B extends A{
	private int b;
    
    public getB(){
    ...
    }

}

A a = new B(); // 1번
B b = new A(); // 2번, 에러

(1) A a = new B()

: a가 B를 참조하였으므로 부모 클래스인 A와 B 모두 존재함 -> 따라서 주소값 2000을 통해서 들어가면 b를 확인할 수 있으므로 컴파일 에러가 발생하지 않음

(2) B b = new A()

: b를 A를 참조하였으므로 B 부분은 제거됨 -> 주소값 2000을 통해서 들어가면 b를 확인할 수 없으므로 컴파일 에러가 발생함

C. 다형성 예제


class Shape {
    public Shape() {
        System.out.println("도형입니다.");
    }

    public void draw() {
        System.out.println("도형을 그립니다.");
    }
}

class Rectangle extends Shape {
    public Rectangle() {
        System.out.println("사각형 생성자");
    }

    @Override
    public void draw() {
        System.out.println("사각형 도형을 그립니다.");
    }

    public void draw2() {
        System.out.println("사각형 도형을 그립니다.");
    }
}

class Triangle extends Shape {
    public Triangle() {
        System.out.println("삼각형 생성자");
    }

    @Override
    public void draw() {
        System.out.println("삼각형 도형을 그립니다.");
    }
    public void draw2() {
        System.out.println("삼각형 도형을 그립니다.");
    }
}


public class Poly {
    public static void main(String[] args) {

        Rectangle rectangle = new Rectangle();
        rectangle.draw();
        rectangle.draw2();

        Shape shape2 = new Rectangle();
        shape2.draw();
        shape2.draw2(); // Shape 클래스에서 draw2라는 메소드를 포함하고 있지 않으므로 에러가 발생

        shape2 = new Triangle();
        shape2.draw();     
    }

D. 언제 다형성을 활용하면 좋을까?

다음 시간에

참고 링크
https://sso-feeling.tistory.com/88
http://www.tcpschool.com/java/java_polymorphism_concept
https://wikidocs.net/269

0개의 댓글