객체지향개념 II-1

윤재열·2022년 1월 9일
0

Java

목록 보기
12/71

상속(inheritance)

기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것.
두 클래스를 조상과 자손으로 관계를 맺어주는 것.
자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
자손의 멤버개수는 조상보다 적을 수 없다.(같거나 많다.)

상속관계

-공통부분은 조상에서 관리하고 개볇부분은 자손에서 관리한다.
-조상의 변경은 자손에 영향을 미치지만,자손의 변경은 조상에 아무런 영향ㅇ르 미치지 않는다.

포함(composite)

-한 클래스의 멤버변수를 다른 클래스로 선언하는 것.
-작은 단위의 클래스륾 먼저 만들고, 이 들을 조합해서 하나의 커다란 클래스를 만든다.

is-a vs has-a

원(Circle)은 점(Point)이다.- Circle is a point
원(Circle)은 점(Point)을 가지고 있다. - Circle has a point
-상속관계 '~은 ~이다. (is-a)
-포함관계 '~은 ~을 가지고 있다. (has-a)

단일상속(single inheritance)

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

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

Object클래스 - 모든 클래스의 최고조상

조상이 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
상속계층도의 최상위에는 Object클래스가 위치한다.
모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
-to String(), equals(Object obj), hashCode(),....

오버라이딩(overriding)

"조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것"

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

오버라이딩의 조건

  1. 선언부가 같아야 한다.(이름, 매개변수, 리턴타입)
  2. 접근제어자를 좁은 범위로 변경할 수 없다.
    -조상의 메서드가 protected라면, 범위가 같거나 넓은 protected 나 public으로만 변경할 수 있다.
  3. 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

오버로딩(overroading) vs 오버라이딩(overriding)

  • 오버로딩 - 기존에 없는 새로운 메서드를 정의하는 것(new)
  • 오버라이딩 -상속받은 메서드의 내용을 변경하는 것 (change, modify)

super - 참조변수

  • this - 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어있음.
    모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재
  • super - this와 같다. 조상의 멤버와 자신의 멤버를 구별하는 데 사용.
public class Parent {
    public int x=10;
}
class Child extends Parent{
    public void method(){
         int x=20;
        System.out.println("X="+x);
        System.out.println("this.x=" +this.x);
        System.out.println("super.x="+super.x);
    }
}

class Point {
    public int x;
    public int y;

    public String getLocation(){
        return "x : " + x + "y : " + y;
    }
}
class Point3D extends Point{
    public int z;
    public String getLocation(){    //오버라이딩
        // return "x : " + x + ", y : " + y + ", z : " + z;
        return super.getLocation()+", z : " + z;    //조상의 메서드 호출
    }
}

super()- 조상의 생성자

자손클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
조상의 멤버들도 초기화되어야 하기 때문에 자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다.

  • Object클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자(같은 클래스의 다른 생성자 또는 조상의 생성자)를 호출해야한다.
    그렇지 않다면 컴파일러가 자동적으로 'super();'를 생성자의 첫 줄에 삽입한다.

패키지(pacakage)

서로 관련된 클래스와 인터페이스의 묶음.
클래스가 물리적으로 클래스파일인 것처럼.패키지는 물리적으로 폴더이다. 패키지는 서브패키지를 가질 수 있으며, '.'으로 구분한다.
클래스의 실제 이름은 패키지명이 포함된 것이다. (String클래스의 full name은 java.lang.String)

패키지의 선언

  • 패키지는 소스파일에 첫 번째 문장(주석 제외)으로 단 한번 선언한다.
  • 하나의 소스파일에 둘 이상의 클래스가 포함된 경우, 모두 같은 패키지에 속하게된다.(하나의 소스파일에 단 하나의 public클래스만 허용한다.)
  • 모든 클래스는 하나의 패키지에 속하며, 패키지가 선언되지 않은 클래스는 자동적으로 이름없는(default)패키지에 속한다.

import문

사용할 클래스가 속한 패키지를 지정하는데 사용.
import문을 사용하면 클래스를 사용할 때 패키지명을 생략할 수 있다.

jaca.lang패키지의 클래스는 import하지 않아도 사용할 수 있다.
(String, Object, System, Thread,....)

import문의 선언

import문은 패키지문과 클래스선언의 사이에 선언한다.

import문을 선언하는 방법

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글