본문 바로가기

Web Development/Java

[Java] 객체지향개념4

상속?

1. 상속

-기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것

-두 클래스를 조상과 자손으로 관계를 맺어주는 것

-자손은 조상의 모든 멤버를 상속받음 (생성자, 초기화블럭 제외)

  -> 골라서 받을 수 없음

-각 클래스의 생성자에는 자신에 정의된 멤버변수만을 초기화하는 코드 + 조상의 생성자를 호출하는 코드를 넣음

-자손의 멤버 개수는 조상보다 무조건 같거나 많음

 

class 자손클래스 extends 조상클래스 {

         // ...

}

 

2.

1)클래스간의 관계 - 상속관계

-공통부분은 조상에서 관리하고 개별부분은 자손에서 관리하는 것이 좋음

-조상의 변경은 자손에 영향을 미치지만 자손의 변경은 조상에 아무런 영향 안미침

 

2)클래스간의 관계 - 포함관계

-포함이란 한 클래스의 멤버변수로 다른 클래스를 선언하는 것

-작은 단위의 클래스를 먼저 만들고 이들을 조합해서 하나의 커다란 클래스를 만듦

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

 

3. 클래스간의 관계 결정하기 - 상속 vs 포함

-관련된 클래스들은 최대한 관계를 많이 맺어줘야 재사용성을 높일 수 있음

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

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

-대부분의 경우는 포함관계임

 

4. 단일상속

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

-상속계층도가 복잡해지고, 서로 다른 조상으로부터 같은 이름의 멤버를 상속받는 경우를 방지

-> 가장 비중이 높은 클래스만 상속관계로, 나머지는 포함관계로 정의한다

 

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

-조상이 없는 클래스는 자동적으로 Object 클래스를 상속받음

-상속계층도의 최상위에는 Object 클래스가 위치함

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

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

 

 

오버라이딩?

1. 오버라이딩

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

 

2. 오버라이딩의 조건

(1) 선언부가 같아야 한다. (이름, 매개변수, 리턴타입)

(2) 접근제어자를 좁은 범위로 변경할 수 없다.

      (조상의 메서드가 protected라면 범위가 넓거나 같은 protected, public으로만 변경할 수 있다)

(3) 조상클래스의 메서드에 선언되지 않은 예외를 선언할  없다.

 

3. 오버로딩 vs 오버라이딩

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

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

 

4. super - 참조변수

▶ this - 인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있음

▶ super - this와 같음. 조상을 가리키며 조상의 멤버와 자신의 멤버를 구별하는 데 사용

 

5. super() - 조상의 생성자

-자손 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성됨

-조상의 멤버들도 초기화되어야 하기 때문에 자손 생성자의 첫 문장에서 조상 생성자를 호출해야 함

※Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에는 생성자(같은 클래스의 다른 생성자 또는 조상의 생성자)를 호출해야 한다.

    if not, 컴파일러가 자동적으로 'super();'를 생성자 첫 줄에 삽입한다.

    그러니까 this() 아니면 super()를 명시적으로 삽입해주어야 에러를 예방할 수 있음

 

 

Package & Import?

1. 패키지

-서로 관련된 클래스와 인터페이스의 묶음

-클래스가 물리적으로 클래스파일(*.class)인 것처럼 패키지는 물리적으로 폴더임

-패키지는 서브패키지를 가질 수 있으며 '.'으로 구분함

-클래스의 실제 이름(full name)은 패키지명이 포함된 것

 (e.g. String 클래스의 full name: java.lang.String)

 

2. 패키지의 선언

-패키지는 소스파일에 첫번째 문장으로 단 한번 선언

-하나의 소스파일에 둘 이상의 클래스가 포함된 경우 모두 같은 패키지에 속하게 됨

-모든 클래스는 하나의 패키지에 속하며 패키지가 선언되지 않은 클래스는 자동적으로 unnamed 패키지에 속함

 

3. import문

-사용할 클래스가 속한 패키지를 불러오는데 사용

-import문을 사용하면 클래스를 사용할 때 패키지명을 생략 가능

-java.lang 패키지의 클래스는 import하지 않고도 사용할 수 있음

 (e.g. String, Object, System, Thread, ...)

 

import.패키지명.클래스명;

  또는

import.패키지명.*;

 

import문은 컴파일 시에 처리되므로 별표를 사용한다고 해도 프로그램의 성능에 아무 영향을 미치지 않음

 

출처: 남궁성의 자바의정석 강의자료

 

 

'Web Development > Java' 카테고리의 다른 글

[Java] 객체지향개념5  (0) 2024.01.17
[Java] 캡슐화, TDA 원칙  (2) 2024.01.13
[Java] 객체지향개념3  (1) 2024.01.09
[Java] 객체지향개념2  (1) 2024.01.09
[Java] 객체지향개념1  (1) 2024.01.09