Today
Total
07-03 00:02
관리 메뉴

T-coding

[자바의 정석] 7장 객체지향 프로그래밍2 본문

Book/자바의 정석

[자바의 정석] 7장 객체지향 프로그래밍2

Tcoding 2023. 4. 6. 10:54
728x90
728x90

남궁성 님의 '자바의 정석'이라는 책을 읽으며 내용을 정리하는 글입니다.

자바의 정석

 

1. 상속(inheritance)

 

상속이란?

기존의 클래스를 재사용하여 새로운 클래스를 작성

 

 

상속의 장점

1. 적은 양의 코드로 새로운 클래스 작성 가능

2. 코드의 추가 및 변경이 매우 용이

 

 

상속 예시

class Parent { }
class Child extends Parent { }

 

단일 상속(single inheritance)

자바에서는 단일 상속만 허용한다.

 

 

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

다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 되어있다. 그래서 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속받기 때문에 Object 클래스에 정의된 멤버들을 사용할 수 있다.

 

 

2. 오버라이딩(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;
    }
}

 

 

오버라이딩의 조건

자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와

  • 이름이 같아야 한다.
  • 매개변수가 같아야 한다.
  • 반환타입이 같아야 한다.

조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때

  1. 접근제어자는 조상클래스의 메서드보다 좁은 범위로 변경할 수 없다.
  2. 조상 클래스의 메서드보다 많은 수의 에외를 선언할 수 없다.
  3. 인스턴스 메서드를 static메서드로 또는 그 반대로 변경할 수 없다.

 

 

오버로딩 vs. 오버라이딩

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

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

 

 

3. package와 import

 

패키지(package)

  • 하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
  • 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
  • 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다.
  • 패키지는 물리적으로 클래스파일(.class)을 포함하는 하나의 디렉토리이다.
package 패키지명;

 

 

import문

사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명 생략 가능

import 패키지명.클래스명;
	또는
import 패키지명.*;

 

 

4. 제어자(modifier)

 

제어자란?

클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.

 

접근 제어자 : public, protected, default, private

그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp

 

static - 클래스의, 공통적인

사용될 수 있는 곳 : 멤버변수, 메서드, 초기화 블럭

제어자 대상 의미
static 멤버변수 - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
- 클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.
- 클래스가 메모리에 로드될 때 생성된다.
메서드 - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
- static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

 

 

final - 마지막의, 변경될 수 없는

사용될 수 있는 곳 : 클래스, 메서드, 멤버변수, 지역변수

제어자 대상 의미
final 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수

인스턴스 변수의 경우 생성자에서 초기화되도록 할 수 있다.

 

 

abstract - 추상의, 미완성의

사용될 수 있는 곳 : 클래스, 메서드

제어자 대상 의미
abstract 클래스 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
메서드 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.

 

 

접근 제어자(access modifier)

사용될 수 있는 곳 : 클래스, 멤버변수, 메서드, 생성자

 

private : 같은 클래스 내에서만 접근이 가능하다.

default : 같은 패키지 내에서만 접근이 가능하다.

protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.

public : 접근 제한이 전혀 없다.

제어자 같은 클래스 같은 패키지 자손클래스 전체
public O O O O
protected O O O  
default O O    
private O      

 

접근 제어자를 사용하는 이유

- 외부로부터 데이터를 보호하기 위해서

- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서

 

 

제어자(modifier)의 조합

1. 메서드에 static과 abstract를 함께 사용할 수 없다.

2. 클래스에 abstract와 final을 동시에 사용할 수 없다.

3. abstract 메서드의 접근 제어자가 private일 수 없다.

4. 메서드에 private과 final을 같이 사용할 수 없다.

 

 

 

5. 다형성(polymorphism)

 

다형성이란?

여러 가지 형태를 가질 수 있는 능력

조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.

 

클래스 Tv와 CaptionTv의 상속 관계도와 다이어그램

Tv t = new CaptionTv();		// 조상 타입의 참조변수로 자손 인스턴스를 참조

 

 

참조변수의 형변환

 

자손 타입 -> 조상 타입 (Up-castiong) : 형변환 생략 가능

자손 타입 <- 조상 타입 (Down-casting) : 형변환 생략 불가

 

FireEngine f;
Ambulance a;
a = (Ambulance)f;	//에러. 상속 관계가 아닌 클래스간의 형변환 불가
f = (FireEngine)a;	//에러. 상속 관계가 아닌 클래스간의 형변환 불가

 

Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;

car = fe;		// car = (Car)fe;에서 형변환 생략됨. 업캐스팅
fe2 = (FireEngine)car;  // 형변환 생략 불가. 다운캐스팅

 

형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.
단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것 뿐이다.

 

 

instanceof 연산자

어떤 타입에 대한 instanceof연산의 결과가 true라는 것은 검사한 타입으로 형변환이 가능하다는 것을 의미한다.

728x90
300x250

'Book > 자바의 정석' 카테고리의 다른 글

[자바의 정석] 6장 객체지향 프로그래밍 1  (0) 2023.03.23