본문 바로가기

자바의 정석

07 객체지향 프로그래밍 2 요약

○ 상속(inheritance)

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

 

○ 조상 클래스

: 부모(parent) 클래스, 상위(super) 클래스, 기반(base) 클래스

○ 자손 클래스

: 자식(child) 클래스, 하위(sub) 클래스, 파생된(derived) 클래스

 

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

- 자손 클래스의 멤버 개수는 조상 클래스의 멤버 개수보다 많거나 같음

- 클래스 관계에서 '형제 관계'라는 건 없음

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

- 자바에서는 단일 상속만 허용함

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

 

○ 포함 관계

: 한 클래스의 멤버 변수가 다른 클래스 타입의 참조변수일 때

class Circle{
	Point c = new Point(); // Circle은 Point를 가지고 있다는 포함관계를 맺음
    int r;
}

 


 

○ 오버라이딩(overriding)

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

 

○ 오버라이딩의 조건

1. 조상 클래스의 메서드와 선언부가 일치해야 함

2. 접근 제어자를 조상 클래스의 메서드보다 좁게 설정할 수 없음

3. 조상 클래스의 메서드보다 많은 예외를 선언할 수 없음

(Exception은 모든 예외의 조상이므로, 가장 많은 개수의 예외를 선언하는 것이나 마찬가지임)

4. 인스턴스 메서드를 static으로 또는 그 반대로 변경할 수 없음

 

○ super

: 자손 클래스에서 조상 클래스의 멤버를 참조할 때 사용하는 참조변수

 

○ super()

: 조상 클래스의 생성자

- Object 클래스를 제외한 모든 클래스는 첫줄에 this()나 super()를 호출해야 함. 그렇지 않으면 컴파일러가 자동으로 super()를 첫줄에 삽입해줌

 


○ package

: 클래스의 묶음

- 클래스가 물리적으로 하나의 클래스 파일(.class)인 것처럼, 패키지는 물리적으로 하나의 디렉토리임

- 하나의 소스파일에는 첫 문장에 패키지선언을 단 한 번 할 수 있음

package 패키지명;

- 모든 클래스는 반드시 하나의 패키지에 속해야 함

- 패키지는 '.'를 구분자로 해 계층구조로 구성할 수 이음

 

○ import문

: 사용하고자 하는 클래스의 패키지명을 미리 명시해주는 것

- 컴파일 시에 컴파일러가 모든 클래스이름 앞에 import문에 명시된 패키지명을 붙여줌

- 같은 패키지에서 여러 개의 클래스를 사용할 때,

   import문을 여러 번 선언하는 거나 '패키지명.*'으로 선언하는 거나 프로그램 실행 시 성능상의 차이는 없음

 


○ 제어자(modifier)

: 클래스나 변수, 메서드 선언부에 사용되어 부가적인 의미를 부여하는 역할

접근 제어자 - public, protected, default, private
그 외 - static, final, abstract, native, ...

 

 

○ static - 클래스의, 공통적인

 

제어자 대상 의미
static 멤버변수 - 모든 인스턴스가 공통적인 값을 갖는 클래스변수
- 인스턴스를 생성하지 않고도 사용할 수 있는 클래스변수
- 클래스가 메모리에 로드될 때 생성됨
static 메서드 - 인스턴스를 생성하지 않고도 사용할 수 있는 클래스메서드
- 인스턴스 멤버, 인스턴스 메서드를 사용할 수 없음

 

 

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

제어자 대상 의미
final 클래스 - 다른 클래스의 조상이 될 수 없는 클래스(= 변경될 수 없는, 확장될 수 없는 클래스)
final 메서드 - 오버라이딩으로 재정의될 수 없는 메서드
final 멤버변수 - 값을 변경할 수 없는 상수
final 지역변수 - 값을 변경할 수 없는 상수

 

 

○ abstract - 추상의, 미완성의

제어자 대상 의미
abstract 클래스 - 추상 메서드가 포함된 클래스
abstract 메서드 - 선언부만 있고 구현부는 없는 추상 메서드

 

 

○ 접근 제어자(access modifier)

접근 제어자가 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 생성자

private : 같은 클래스 내에서만 접근 가능
default : 같은 패키지 내에서만 접근 가능
protected : 같은 패키지 + 다른 패키지의 자손 클래스에서 접근 가능
public : 접근 제한 없음

 

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

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

2. 외부에는 불필요한 부분을 감추기 위해서

 

○ 캡슐화

: 멤버 변수의 접근제어자를 private로 선언하고,

  멤버 변수에 접근하는 메서드를 public으로 선언해 '간접 접근'하도록 하는 것

- getter : 멤버 변수의 값을 읽는 메서드

- setter : 멤버 변수의 값을 변경하는 메서드

 


 

○  다형성(polymorphism)

: 조상 클래스의 참조 변수로 자손 클래스의 인스턴스를 참조할 수 있게 한 것

 

○  참조변수의 형변환

: 상속관계에 있는 클래스끼리 참조변수의 형변환이 가능함

- 같은 타입의 인스턴스라도 참조변수의 타입에 따라서 사용할 수 있는 멤버의 개수가 달라짐

- 참조하고 있는 인스턴스에는 아무런 영향을 미치지 않음

 

○ instanceof 연산자

: 형변환이 가능한지 검사하는 연산자. 가능하다면 true 아니면 false를 반환함

 

○ 참조변수와 인스턴스의 연결

: 조상 클래스와 자손 클래스에 이름이 중복되는 멤버변수가 있을 경우,

   참조변수 타입에 따라 사용되는 멤버변수가 달라짐

   ( 참조변수가 조상 클래스 타입이면 조상 클래스의 멤버 변수가 사용됨)

 

○ 매개변수의 다형성

: 함수의 매개변수를 조상 클래스의 참조변수로 선언하면,

  그 조상 클래스의 자손타입의 참조변수는 다 매개변수로 받아들일 수 있음

 

class Product{
	int price;
	int bonusPoint;
}

class Tv 		extends Product {}
class Computer 	extends Product {}
class Audio		extends Product {}

// 이 매개변수로 Product, Tv, Computer, Audio의 참조변수가 다 올 수 있음
void Buy(Product P){

}

 

 


 

○ 추상 클래스

: 추상 메서드가 포함된 클래스

- 인스턴스를 생성할 수 없음

abstract class 클래스명{
}

 

○ 추상 메서드

: 선언부만 작성돼있고 구현부가 없는 메서드

- 꼭 필요하지만 자손타입마다 다르게 구현될 것으로 예상되는 경우 사용됨

abstract 리턴타입 메서드이름();

 


○ 인터페이스(interface)

: 추상 메서드의 집합

- 모든 멤버변수가 public static final이어야 함(생략가능)

- 모든 메서드가 public abstract이어야 함(생략가능)

interface 인터페이스이름{
	public static final 타입 상수이름 = 값;
    	public abstract 메서드이름(매개변수목록);
}

 

○ 인터페이스의 상속

: 자바는 단일상속이 원칙이지만,

   인터페이스는 추상 메서드(내용이 없는 메서드)의 집합이라 다중상속을 해도 충돌이 발생하지 않음

   따라서 인터페이스는 다중상속이 가능함

 

○ 인터페이스의 구현

: 인터페이스도 추상클래스처럼 인스턴스를 생성할 수 없음

- 인터페이스에 정의된 추상메서드의 구현부를 작성하는 클래스를 작성해야 함

- 인터페이스에 정의된 추상메서드 중 일부만 구현하는 클래스라면 추상클래스임( 선언부에 abstract 추가해야 함)

class 클래스이름 implements 인터페이스이름{
	// 인터페이스의 추상메서드를 구현해야 함
}

 

○ 인터페이스를 이용한 다형성

: 조상클래스의 참조변수로 자손클래스 인스턴스를 참조하는 것이 가능한 것처럼

  인터페이스 타입의 참조변수로 인터페이스를 구현한 클래스의 인스턴스를 참조하는 것이 가능함

 

// 클래스 Fighter가 Fightable 인터페이스를 구현했을 때 다음 문장들이 가능함
Fightable f = (Fightable)new Fighter();
Fightable f = new Figher();

- 메서드의 매개변수 타입이 인터페이스

  = 매개변수 자리에 인터페이스를 구현하는 모든 클래스의 인스턴스가 올 수 있음

- 메서드의 반환타입이 인터페이스

  = 메서드가 그 인터페이스를 구현한 클래스의 인스턴스를 반환함

 

○ 인터페이스의 장점

1. 개발시간 단축

2. 표준화 가능

3. 서로 관계없는 클래스들이 같은 인터페이스를 구현함으로써 관계를 맺어줄 수 있음

4. 독립적인 프로그래밍이 가능함

 

○ 디폴트메서드

: 인터페이스에 새로운 추상메서드를 하나 추가하면,

   그 인터페이스를 구현하는 모든 클래스에 새로운 추상메서드를 구현해줘야 함

   → 불편함 해결을 위해 등장한 게 디폴트메서드(몸통이 있는 메서드)

 

- 새로 추가된 디폴트메서드는 몸통이 있어서, 기존의 메서드와 이름이 동일해 충돌하는 경우가 발생할 수 있음

  → 인터페이스를 구현한 클래스에서 디폴트메서드를 오버라이딩함

  → 조상 클래스의 메서드가 상속되고 디폴트메서드는 무시됨

 

interface MyInterface{
	void method();
    	default void newMethod(){}
}

 


○ 내부 클래스(inner class)

: 클래스 내에 선언되는 클래스

 

○ 내부 클래스의 장점

1. 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있음

2. 코드의 복잡성을 줄일 수 있음(캡슐화)

 

내부 클래스 특징
인스턴스 클래스(instance class) - 외부 클래스의 인스턴스멤버처럼 다루어짐
스태틱 클래스(static class) - 외부 클래스의 static멤버처럼 다루어짐
지역 클래스(local class) - 선언된 영역 내에서만 사용될 수 있음
익명 클래스(anonymous class) - 클래스의 선언과 객체의 생성이 동시에 이루어지는 이름없는 일회용 클래스

 

○  내부 클래스의 제어자와 접근성

- 원래 클래스의 접근 제어자는 public, default만 가능한데

   내부 클래스는 public, protected, default, private 모두 가능함

 

- static 내부 클래스만 static 멤버를 정의할 수 있음

   → static멤버는 객체 생성없이 사용할 수 있어야 하는데, 인스턴스 내부 클래스에 static 멤버가 있으면 모순 발생

- 외부 클래스의 지역변수는 final이 붙은 상수만 접근 가능

( 가끔 메서드 내부에 선언된 내부 지역 클래스의 객체가 메서드가 종료된 이후에도 남아있을 수 있음.

그러나 외부 클래스의 지역변수는 메서드가 종료되면 소멸됨.

이때 내부 지역 클래스의 객체에서 소멸된 '외부 클래스의 지역변수'를 참조하고 있었다면 문제가 발생할 수 있음

따라서 외부 클래스의 지역변수와 별개로 관리되는 'static이 붙은 상수'만 접근할 수 있게 하는 것임)

- 내부 클래스에서 외부 클래스의 private 멤버에 접근 가능

 

○ 익명 클래스(anonymous class)

: 클래스 선언과 객체의 생성을 동시에 하는 일회용 클래스

- 조상클래스나 인터페이스의 이름을 사용해서 정의함

new 조상클래스이름(){
	// 멤버 선언
}

new 구현인터페이스이름(){

}
class InnerEx6{
	Object iv = new Object(){ void method(){} };
    static Object cv = new Object(){ void method(){} };
    
    void myMethod(){
    	Object lv = new Object(){ void method(){} };
    }
}

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

06 객체지향 프로그래밍 1 요약  (0) 2022.06.19
02 변수 variable  (0) 2022.05.05
01 자바를 시작하기 전에  (0) 2022.05.04