백엔드/Java의 정석

TIL 정리_08

ran4 2022. 2. 23. 20:42

 

객체지향 III

 

상속 (Inheritance)

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

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

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

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

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

 

포함관계

포함(composite)이란?

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

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

 

클래스 간의 관계 결정하기

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

2. 포함관계 : ~은 ~을 가지고 있다 (~has a~) //대부분의 경우는 포함관계이다

Point c = new Point(); 

 

단일 상속

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

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

 

Object 클래스 

모든 클래스의 조상, 부모가 없는 클래스는 컴파일러에 의해 자동으로 Object 클래스를 상속받는다

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

toString(), equals(Object obj), haseCode() 등

상속계층도는 SmartTv > Tv > Object //오른쪽이 조상

 

오버라이딩(overriding) //덮어쓰다

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

오버라이딩 조건

1. 선언문이 조상 클래스와 동일해야 한다

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

3. 예외는 조상 클래스보다 많이 선언할 수 없다.

 

오버로딩과 오버라이딩

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

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

 

참조변수 super

객체 자신을 가리키는 참조변수

인스턴스 메서드(생성자)내에만 존재

조상의 멤버를 자신의 멤버와 구별할 때 사용

//this는 lv와 iv 구별에 사용

 

조상 클래스의 생성자 super()

조상의 생성자를 호출할 때 사용

조상의 멤버는 조상의 생성자를 호출해서 초기화 한다.

자손의 생성자는 본인이 선언한 것만 초기화 할 수 있다.

**생성자의 첫 줄에 반드시 생성자를 호출해야 한다**

 

클래스패스(path)

클래스 파일(*.class)의 위치를 알려주는 경로

환경변수 classpath로 관리하며, 경로간의 구분은 ';'을 사용한다

환경변수에 패키지를 등록해야 한다.

 

패키지

서로 관련된 클래스의 묶음

클래스는 클래스 파일(*.class), 패키지는 폴더, 하위 패키지는 하위 폴더

클래스의 실제 이름(full name)은 패키지를 포함 (java.lang.String)

패키지의 선언 : Package 패키지명;

같은 소스 파일의 클래스들은 모두 같은 패키지에 속함

 

import문

클래스를 사용할 때 패키지 이름을 생략할 수 있다.

컴파일러에게 클래스가 속한 패키지를 알려준다

이클립스에서 자동추가 단축키 : ctrl shift O

 

import문의 선언

import 패키지명.클래스명; | import 패키지명.*; //패키지와 클래스 선언사이에 선언한다

이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명을 붙인다

 

Static import문

static 멤버 (static 메서드, cv)를 사용할 때 클래스 이름을 생략할 수 있게 해준다.

import static java.lang.Integer.*; //Integer클래스의 모든 static 메서드

import static java.lang.Mathrandom.*; //Math.random()괄호 안붙임

import static java.lang.System.out.*; //System.outout만으로 참조가능

 

제어자

클래스와 클래스의 멤버(멤버변수, 메서드)에 부가적인 의미부여

하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)

접근 제어자는 맨 왼쪽에 위치 

접근 제어자 public, protected, (default)//쓰는게 아님 안붙임, private
그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp

static - 클래스의 공통적인

멤버변수, 메서드, 초기화 블럭에서 사용(객체 생성없이 가능)

static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

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

 

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

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

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

 

abstract 추상의, 미완성의

abstract 클래스는 객체를 생성할 수 없고, 추상메서드를 갖고있어 상속으로 완성해줘야한다.

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

 

접근제어자

하나의 대상에 한 개만 사용가능 

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

private

 

 

캡슐화와 접근제어자 

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

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

2. 외부에는 불필요한, 내부적으로만 사요오디는 부분을 감추기 위해서

'백엔드 > Java의 정석' 카테고리의 다른 글

TIL 정리_10  (0) 2022.02.25
TIL 정리_09  (0) 2022.02.24
TIL 정리_07  (0) 2022.02.22
TIL 정리_06  (0) 2022.02.21
TIL 정리_05  (0) 2022.02.21