220926 Today I Learned

Kaan Haan·2022년 9월 26일
0

23일꺼 못썼다. 시간 지나니까 까먹네... 일단 시간없으니까 보류.

상속

📝 상속의 정의와 목적

기존의 것(부모 class)를 재사용 + 자신의 것(자식 Class) 사용

→ 중복 코드를 줄일 수 있다. (필드, 메서드 재사용)

📝 상속 간 클래스 호출

  • 상속 클래스(자식 Class) 생성자 호출 시 부모 클래스 생성자 호출

예제코드


class A {
    public A(){
        System.out.println("Class A의 생성자 호출");
    }
}

class B extends A {
    public B(){
        super();        //  넣지 않으면 컴파일러가 자동으로 생성
        System.out.println("Class B 의 super() 호출 (B의 부모생성자) 윗줄해서 함");

        System.out.println();
        System.out.println("Class B의 생성자 호출");
    }
}

class C extends B {
    public C(){
        System.out.println("Class C의 생성자 호출");
    }
}

public class Inheritance_1 {
    public static void main(String[] args) {
        System.out.println("C 생성자 호출");
        C c = new C();
        System.out.println();

        System.out.println("B 생성자 호출");
        B b = new B();
        System.out.println();
    }
}

Class BClass A 를 상속받는 자식클래스이다.
Class CClass B 를 상속받는 자식클래스이다.
Class A 는 부모클래스.

각 클래스의 생성자 호출에 주의하자
Class C 의 생성자를 호출하면 Class B의 생성자를 호출하고, Class B의 생성자는 Class A의 생성자를 호출한다.
그러면 A -> B -> C 순서대로 생성자가 호출된다.

C 생성자 호출
Class A의 생성자 호출
Class B 의 super() 호출 (B의 부모생성자) 윗줄해서 함

Class B의 생성자 호출
Class C의 생성자 호출

B 생성자 호출
Class A의 생성자 호출
Class B 의 super() 호출 (B의 부모생성자) 윗줄해서 함

Class B의 생성자 호출

콘솔에는 이렇게 출력됨.

super(); 사용

자식 클래스의 default 생성자 안에는 super(); 가 자동 생성된다.

  • 초기화라서 자식 클래스 default 생성자의 맨 위에서만 선언할 수 있다.
  • 부모 클래스에 임의로 만들어진 생성자가 있으면 super(); 안만들어짐.

super.A; 사용

Method가 자신 클래스 내의 필드를 this.a 로 받는 것처럼, 부모 클래스의 필드를 super.A 이런 식으로 받는다.


protected 상속에서 사용 해줄것



오버라이딩(Override)

📝 Method 오버라이딩

  • 자식 클래스가 부모 클래스의 메서드를 자신의 쓰임새를 위해 재정의 하는 것.
  • 부모 클래스의 Method 명, Return Type , parameter 가 같고 바디 안의 내용만 다르다.

예제 코드

public class MethodOverriding_2 {
    public static void main(String[] args) {
        Manager obj1 = new Manager();
        System.out.println("관리자의 월급: " + obj1.getSalary());

        Programmer obj2 = new Programmer();
        System.out.println("프로그래머의 월급: " + obj2.getSalary());
    }
}

class Employee {
    int getSalary(){
        return 0;
    }
}

class Manager extends Employee {
    @Override
    int getSalary(){
        return 5000000;
    }
}

class Programmer extends Employee {
    @Override
    public int getSalary() {
        return 6000000;
    }
}

Employee 클래스를 상속받은 Manager 클래스, Programmer 클래스가 있다.

Manager , Programmer 클래스 모두 Employee 에서 사용하는 getSalary Method 를 갖고 있다.

  • 이 때 Manager 클래스의 객체 변수로 getSalary 를 호출하면 Manager 클래스의 getSalary 가 호출되어 5000000이 리턴된다.
  • 마찬가지로 Programmer 클래스의 객체변수도 Programmer 내의 getSalary 가 호출되어 6000000이 리턴된다.
💡 Overriding 된 Method 호출 시 자식 클래스의 Method 가 호출된다.

오버로딩

📝 오버로딩이란?

  • 같은 클래스 내에 있는 동일한 이름의 Method 를 사용하는 것.
  • 같은 함수 이름으로 parameter의 개수나 타입을 달리 할 수 있다.
  • Return Type , parameter 전부 동일하게는 만들 수 없다. (컴파일 에러)

예제 코드

class Exployee {
    int getSalary(){
        return 0;
    }
    int getSalary(int x, int y) {
        return x * y;
    }
    int getSalary(String str) {
        return 0;
    }
}

→ 위 코드처럼 getSalary Method 는 3가지 방식으로 오버로딩 되었다

💡 오버라이딩과 오버로딩의 차이를 확실히 알아야 한다.
  • 오버라이딩: 상속 내에서 이루어지는 Method 의 재정의
  • 오버로딩: 같은 클래스 내에서 parameter 의 개수, 종류 / 리턴 타입 변화
💡 같은 Method 이름으로 다양한 종류의 Parameter를 받을 수 있다.

→ (C 같은 경우 getSalary , getSalary1 , getSalary2 … 이렇게 함수 이름을 다르게 지정해야 한다.)

다형성(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
  • 업캐스팅(upcasting) - 상형 형변환

부모 클래스 변수로 자식 클래스 객체를 잠조할 수 있다.

⇒ 하위 객체를 상위 클래스형 변수에 대입

💫 위의 코드를 예시로 들어보면 부모 클래스 변수 Shape로 자식 클래스 객체인 Rectangle()을 참조했다.

💡 코드로 작성할 때 부모 = 자식 형태로 형변환 없이 적는다 ⇒ (하위 객체를 상위 클래스형 변수에 대입)
public class ShapeTest {

	public static void main(String[] args) {
    
    	Rectangle rectangle = new Shape(); // 여기서 에러남.
        rectangle.draw();
      
   }
   
}

🚨 반대 형태인 자식 = 부모 형태는 안 된다. 

포함하는 데이터의 범위가 다르기 때문이다.




솔직히 귀찮아서 팀원분꺼 긁어왔다.

0개의 댓글