티스토리 뷰

반응형

 

🤔 상속(Inheritance)란?

✔ 기존의 클래스로 새로운 클래스를 작성하는 것.(코드의 재사용)

두 클래스를 부모와 자식으로 관계를 맺어주는 것

 

✔ ⭐ 자손은 조상의 모든 멤버를 상속받는다.

(생성자, 초기화블럭 제외)

따라서

✔ 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다.)

왜냐 모든 멤버를 상속받으니까!!

 

✔ 자손의 변경은 조상에 영향을 미치지 않는다.

 

 

🤔 포함(composite) 관계란?

✔ 포함(composite)이란?

클래스의 멤버로 참조변수를 선언하는 것

작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.

 

class Poitn {
	int x;
    int y;
}

class Circle {
    int x; // 원점의 x좌표
    int y; // 원점의 y좌표
    int r; // 반지름(radius)
}

class Circle {
    Point c = new Point(); // 원점
    int r; // 반지름 (radius)
}

 

그림으로 그려보자.

 

 

 

✅ 클래스 간의 관계 결정하기

상속관계 : '~은 ~이다. (is-a)'

포함관계 : '~은 ~을 가지고 있다. (has-a)'

(대부분의 관계는 포함이다.)

 

위의 예제에서 

원은 점이다. - Circle is a Point.

원은 점을 가지고 있다. - Circle has a Point.

중에서 아래의 문장이 좀 더 적합하기 때문에 '포함관계'에 속한다.

 

 

// 포함관계
class Circle {
    Point c = new Point();
    int r;
}

// 상속
class Circle extends Point {
    int r;
}

 

다음을 그림으로 그리면 다음과 같다.

 

상속 관계 예제

class MyPoint {
    int x;
    int y;
}

class Circle extends MyPoint {
    int r;
}

public class Ch6_39 {
    public static void main(String[] args) {
        Circle c = new Circle();
        c.x = 1;
        c.y = 2;
        c.r = 3;
        System.out.println("c.x = " + c.x);
        System.out.println("c.y = " + c.y);
        System.out.println("c.r = " + c.r);
    }
}

 

실행결과

c.x = 1
c.y = 2
c.r = 3

 

 

  포함관계 예제

class MyPoint {
    int x;
    int y;
}


class Circle { // 포함관계
    MyPoint p = new MyPoint();
    int r;
}

public class Ch6_39 {
    public static void main(String[] args) {
        Circle c = new Circle();
        c.p.x = 1;
        c.p.y = 2;
        c.r = 3;
        System.out.println("c.p.x = " + c.p.x);
        System.out.println("c.p.y = " + c.p.y);
        System.out.println("c.r = " + c.r);
    }
}

 

실행결과

c.p.x = 1
c.p.y = 2
c.r = 3

 

 


🤔 단일 상속(Single Interitance)란?

Java는 단일 상속만을 허용한다. (C++은 다중상속 허용)

비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

 

 

🤔 Object 클래스 - 모든 클래스의 조상

부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.

모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.

toString(), equals(Object obj), hashCode(), ...

 

 

 


🤔 메서드 오버라이딩(overriding)이란?

상속받은 조상의 메서드를 자신에 맞게 변경하는 것

 

예시를 통해 살펴보자.

class Point {
    int x;
    int y;
    
    String getLocation() {
        return "x : " + x + ", y : " + y;
    }
}

class Point3D extends Point {
    int z;
    
    String getLocation() { // 오버라이딩
        return "x : " + x + ", y : " + y + ", z : " + z;
    }
}

override : 덮어쓰다.

 

말그대로

내용 즉, 구현부를 변경하는 것이다.

선언부는 변경 불가능하다. ❗

 

 

다음의 코드를 보자.

(코드를 잘 짜는 것이 얼마나 코드를 단축시킬 수 있는지 알게 되는 코드이다.)

필자는 처음에 강의를 듣고 소름이 돋았다. 👍

 

class MyPoint3 extends Object {
    int x;
    int y;

    // Object 클래스의 toString()을 오버라이딩
    public String toString() {
        return "x : " + x + ", y : " + y;
    }
}

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

        MyPoint3 p2 = new MyPoint3();
        p2.x = 3;
        p2.y = 5;
        System.out.println("p2.x = " + p2.x);
        System.out.println("p2.y = " + p2.y);
    }
}

 

위 코드의 실행결과를 보자.

 

p2.x = 3
p2.y = 5

 

 

위의 코드를 간단하게 줄이면 다음과 같다.

 

class MyPoint3 extends Object {
    int x;
    int y;

    MyPoint3(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // Object 클래스의 toString()을 오버라이딩
    public String toString() {
        return "x : " + x + ", y : " + y;
    }
}

public class T1 {
    public static void main(String[] args) {
        MyPoint3 p = new MyPoint3(3,5);
        System.out.println(p);
    }
}

 

보이는가? 엄청난 양의 코드가 줄었다.

만약 매개변수와 출력문이 훨씬 더 많았다고 생각해보라.

어마무시한 코드의 중복을 해결한 것이다!!

 

이제 출력결과가 일치하는지 확인해보자.

 

x : 3, y : 5

출력결과가 일치한다.

 

이 예제를 보고 필자는 객체 지향의 개념을 완벽하게 이해하고

감탄했다.

 

객체 지향의 개념을 완벽하게 깨우친 느낌이었다. 👍

 

그간에는 왜 생성자를 배우며,, 왜 참조형 매개변수를 사용하며,,

아무것도 모른채 기계적으로 학습했다면

이 강의를 듣고 객체지향이 무엇인지

객체지향 프로그래밍이 왜 중복된 코드를 줄여주는지에 대해 확실히 이해했다!!

 

암튼 다음의 내용을 이어서 공부하자. 

 


✅ 오버라이딩의 조건 ⭐⭐

✔ 선언부가 조상 클래스의 메서드와 일치해야 한다.

✔ 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

✔ 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

🤔 선언부란?

반환타입,  메서드 이름, 매개변수 목록을 의미한다. 

 


 

🤔 오버로딩과 오버라이딩의 차이는?

오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것(new)

상속과 상관 x

 

오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것(change, modify)

상속받은 메서드를 변경

 

 


차근차근 처음부터 시작하고 있지만

새로운 것을 알아가고 있어 너무 뿌듯하다.

더 열심히 공부하자. 📙

반응형