Chapter07 객체지향 프로그래밍II(Object-oriented Programming II)

cookienc·2021년 7월 1일
0

Java 기본 개념

목록 보기
6/13
post-thumbnail

1. 상속(inheritance)

1.1 상속의 정의와 장점

상속이란? 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

  • 자손은 조상의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외)
  • 자손의 멤버개수는 조상보다 적을 수 없다.
class Child extends Parent{
	//...
}
  • 조상 클래스 : 부모클래스, 상위클래스, 기반클래스
  • 자손 클래스 : 자식클래스, 하위클래스, 파생된 클래스

1.2 클래스간의 관계 - 포함관계

class Point { // 원점
	int x;
    	int y;
}

class Circle {
	int x; // 원점의 x좌표
    	int y; // 원점의 y좌표
    	int r;
}

class Circle {
	Point c = new Point(); // 포함관계(원점)
    int r;
}

1.3 클래스간의 관계 결정하기

'is ~ a(상속관계)''has ~ a(포함관계)'로 구별한다.

Circle is a Point. : 원은 점이다.
Circle has a Point. : 원은 점을 가지고 있다.

Circle has a Point.가 더 자연스러우므로 포함관계이다.

1.4 단일 상속(single inheritance)

Java에서는 단일 상속만 허용하므로, 상속과 포함관계를 적절히 사용해야 한다.

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

  • Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
  • 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 한다.

따라서 Object클래스에 정의된 멤버들을 사용할 수 있다.



2. 오버라이딩(overriding)

2.1 오버라이딩이란?

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

2.2 오버라이딩의 조건

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

2.3 오버로딩 vs 오버라이딩

  • 오버로딩 : 기존에 없는 새롱누 메서드를 정의(new)
  • 오버라이딩 :상속받은 메서드의 내요을 변경(change, modify)

2.4 super(참조변수)

this와 같음. 조상의 멤버와 자신의 멤버를 구별하는 데 사용.

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

자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수도 있으므로 조상의 멤버들이 먼저 초기화를 시켜야되기 때문에, 생성자의 첫 줄에서 조상클래스의 생성자를 호출해야 한다.

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

조상 클래스의 멤버변수는 조상의 생성자에 의해 초기화되도록 해야 한다.



3. package와 import

3.1 패키지(package)

  • 서로 관련된 클래스와 인터페이스의 묶음.
  • 폴더와 같음
  • 서브패키지를 가질 수 있으며 '.'로 구분.

3.2 패키지의 선언

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

3.3 import문

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

3.4 import문의 선언

<순서>
1. package문
2. import문
3. 클래스 선언

//<선언방법>
import 패키지명.클래스명;
	//또는
import 패키지명.*;

3.5 static import문

static import문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.

import static java.lang.Integer.*;
import static java.lang.Math.random;
import static java.lang.System.out;

out.println(random());


4. 제어자(modifier)

4.1 제어자란?

  • 클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여한다.
  • 하나의 대상에 여러 개의 제어자를 조합해서 사용할 수 있지만, 접근제어자는 단 하나만 사용할 수 있다.

    접근 제어자 - public, protected, default, private
    그 외 - static, final, abstract, native, transient, synchronized, volatile, strictfp

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

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

static이 사용될 수 있는 곳

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

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

final이 사용될 수 있는 곳

4.4 abstarct - 추상의, 미완성의

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

미완성 설계도이므로 인스턴스를 생성할 수 없다.ㅇ

abstract가 사용될 수 있는 곳

4.5 접근 제어자(access modifer)

멤버 또는 클래스에 사용되어, 외부로부터의 접근을 제한한다.

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

  • private : 같은 클래스 내에서만 접근이 가능
  • default : 같은 패키지 내에서만 접근이 가능
  • protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
  • public : 접근 제한이 전혀 없다.

    접근 범위가 넓은 쪽에서 작은 순서대로 나열하면
    public > protected > (default) > private

대상사용가능한 접근 제어자
클래스public, (default)
메서드public, protected, (default), private
멤버변수public, protected, (default), private
지역변수없 음

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

  • 외부로부터 데이터를 보호하기 위해서 -> 캡슐화
  • 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서


5. 다형성(polymorphism)

5.1 다형성

조상 타입 참조 변수로 자손 타입 객체를 다루는 것 -> 반대는 안됨.

5.2 참조변수의 형변환

  • 사용할 수 있는 멤버의 갯수를 조절하는 것
  • 조상 - 자손 관계의 참조변수는 서로 형변환 가능

5.3 instanceof연산자

참조변수의 형변환 가능여부 확인에 사용. 가능하면 true 변환

형변환을 할 때 항상 instanceof로 확인하고 사용해야 한다.

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

멤버변수가 조상 클래스와 자손 클래스에 중복으로 정의된 경우, 조상타입의 참조변수를 사용했을 때는 조상 클래스에 선언된 멤버변수가 사용되고, 자손타입의 참조변수를 사용했을 경우 자손 클래스에 선언된 멤버변수가 사용된다.

5.5 매개변수의 다형성

참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.

<다형성의 장점>
1. 다형적 매개변수
2. 하나의 배열로 여러 종류 객체 다루기

5.6 여러 종류의 객체를 배열로 다루기

Product p1 = new Tv();
Product p2 = new Computer();
Product p3 = new Audio();
// 위와 아래는 동일
Product p[] = new Product[3];
p[0] = new Tv();
p[1] = new Computer();
p[2] = new Audio();


6.추상클래스(abstact class)

6.1 추상클래스란?

미완성 설계도. 미완성 메서드를 갖고 있는 클래스

  • 추상 클래스의 인스턴스 생성 불가
  • 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
abstract class 클래스이름 {
	abstract void play(int pos); //{  }
	}

6.2 추상 메서드(abstract method)

  • 미완성 메서드. 구현부(몸통, {})가 없는 메서드
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 쓰임

6.3 추상클래스의 작성

여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 만든다.



7. 인터페이스(interface)

7.1 인터페이스란?

  • 추상 메서드의 집합, 상수도 추가될 수 있음
  • 구현된 것이 전혀 없는 설계도(모든 멤버가 public)

인터페이스 <-> 추상클래스

  • 인터페이스는 추상메서드와 상수로만 이루어짐
  • 추상클래스는 추상메서드와, 생성자, iv등으로 이루어짐

7.2 인터페이스의 작성

  • public abstract 생략가능
  • 상수는 public static final 생략가능
  • 제어자는 모두 생략할 수 있고, 하나씩 생략도 가능하다.

7.3 인터페이스의 상속

  • 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상x)
  • 다중 상속 가능(추상메서드의 충돌은 문제 없음)

7.4 인터페이스의 구현

  • 인터페이스에 정의된 추상 메서드를 상속을 통해서 완성하는 것
  • 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 한다.
class 클래스이름 implements 인터페이스이름 {
	// 인터페이스에 정의된 추상메서드를 모두 구현해야한다.
}

7.5 인터페이스를 이용한 다중상속

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

class Fighter extends Unit implements Fightable {
	public void move(int x, int y) { /* */ 
	public void attack(Fightable f) { /*내용생략*/ }
}

Unit u = new Fighter(); // 가능
Fightable f = new Fighter(); // 가능

매개변수의 타입이 인터페이스면 그 인터페이스를 구현한 클래스의 인스턴스만 사용할 수 있다.

인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

7.7 인터페이스의 장점

  • 두 대상(객체) 간의 '연결, 대화, 소통'을 돕는 '중간 역할'을 한다.
    1. 개발시간 단축.
    2. 표준화가 가능.
    3. 서로 관계없는 클래스들에게 관계를 맺어 줌.
    4. 독립적인 프로그래밍 가능.
    5. 선언과 구현을 분리시킬 수 있게 한다.(변경에 유리한 설계가 가능)

7.8 디폴트 메서드와 static 메서드

  • 디폴트 메서드는 인스턴스 메서드(인터페이스 원칙 위반, 조상클래스에 새로운 메서드를 추가한 것과 동일해짐) -> 충돌 문제가 생김
  • <해결 규칙>
  1. 여러 인터페이스의 디폴트 메서드 간의 충돌
    -> 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야 한다.
  2. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
    -> 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

8. 내부 클래스(inner class)

8.1 내부 클래스란?

클래스 내부에 선언된 클래스

<내부 클래스의 장점>

  • 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
  • 코드의 복잡성을 줄일 수 있다(캡슐화).

8.2 내부 클래스의 종류와 특징

내부 클래스의 선언 위치에 따라서 종류가 바뀐다.

내부 클래스특 징
인스턴스 클래스외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 인스턴스멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스멤버들과 관련된 작업에 사용될 목적으로 선언된다.
스태틱 클래스외부 클래스의 멤버변수 선언위치에 선언하며, 외부 클래스의 static멤버처럼 다루어진다. 주로 외부 클래스의 static멤버, 특히 static메서드에서 사용될 목적으로 선언된다.
지역 클래스외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다.
익명 클래스클래스의 선언과 객체의 생성을 동시헤 하는 이름없는 클래스(일회용)

8.3 내부 클래스의 선언

class Outer {
	class InstanceInner {} // 인스턴스 클래스
   	static class StaticInner {} // 스태틱 클래스
    
    void myMethod() {
    	class LocalInner{} // 지역 클래스
    }
}

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

  • 스태틱 내부 클래스만이 static멤버를 정의 할 수 있다.
  • 내부 클래스에서 외부 클래스의 static멤버를 참조할 수 있다.
  • 외부 클래스의 지역변수는 내부클래스에서 상수만 참조가능하다.

8.5 익명 클래스(anonymous class)

  • 이름이 없는 클래스로써, 클래스의 선언과 객체의 생성을 동시에 한다.
  • 단 한번만 사용될 수 있고 오직 하나의 객체만을 생성할 수 있다.
  • 단 하나의 클래스를 상속받거나 단 하나의 인터페이스마을 구현할 수 있다.
new 조상클래스이름() {
	// 멤버 선언
}
/////////or///////////

new 구현인터페이스이름() {
	// 멤버 선언
}

0개의 댓글