[Java] Ch.7 객체지향 프로그래밍2

yoons(이윤서)·2024년 6월 26일

[Java] 자바의 정석

목록 보기
7/14

👉🏻 이 글은 자바의 정석(3판) Chapter7을 공부하며 쓴 글입니다.

📌 상속 (inheritance)

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

	class 자식클래스 extends 부모클래스 {
    	// ...
    }
  • 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
  • 자속 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.

+ 접근제어자가 private 또는 default인 멤버들은 상속되지 않는다기보다 상속은 받지만 자손 클래스로부터의 접근이 제한되는 것이다.

  • 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성되기 때문에 따로 조상 클래스의 인스턴스를 생성하지 않고도 조상 클래스의 멤버들을 사용할 수 있다.
    ➡️ 자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.

  • 단일 상속 (다중 상속 X)

📖 클래스 간의 관계

Ex. Circle 과 Point

	class Circle {
    	int x;
        int y;
        int r;
    }

⬇️ Point 클래스 재사용 (포함관계)

	class Circle {
    	Point p = new Point();
        int r;
    }

한 클래스를 작성하는 데 다른 클래스를 멤버 변수로 선언.
( Ex. Car <- Engine, Door ..... )

⬇️ (상속관계)

	class Circle extends Point{
        int r;
    }

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

Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상 클래스이다.

다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 함으로써 이것을 가능하게 한다.

(다른 클래스로부터 상속을 받지 않는 클래스들도 컴파일하면 extends Object를 자동적으로 추가하여 Object 클래스로부터 상속받게 한다.


📌 오버라이딩 (overriding)

- 오버라이딩이란?

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

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

= 선언부가 일치해야 한다.

  • 예외를 조상 클래스보다 많이 선언할 수 없다.
  • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

📖 오버로딩 vs 오버라이딩

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것. ( new )
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것. ( change, modify )

📖 super

: 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수이다.
조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되어 서로 구별해야 하는 경우에만 super를 사용하는 것이 좋다.

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

: 조상 클래스의 생성자를 호출하는데 사용된다.

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

	class Point {
    	int x, y;
        
        Point(int x, int y) {
        	this.x = x;
            this.y = y;
        }
    }
    class Point3D extends Point {
    	int z;
        
        Point3D(int x, int y, int z) {
        	super(x, y);	// 조상 클래스의 생성자 Point(int x, int y)를 호출.
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }

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


📌 패키지와 import

- 패키지

패키지란, 클래스와 인터페이스의 묶음이다.
클래스가 물리적으로 하나의 클래스파일인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다.
Ex. String클래스 -> java.lang.String클래스 (패키지명을 포함한 이름)

  • 하나의 소스파일에는 첫 번째 문장으로 단 한 번의 패키지 선언을 허용한다.
	package 패키지명;	// 패키지 선언
  • 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
    : 패키지를 선언하지 않으면 자바에서 기본적으로 제공하는 '이름없는 패키지(unnamed package)'에 들어간다.

  • 패키지는 물리적으로 클래스 파일을 포함하는 하나의 '디렉토리'이다.

- import문

import 패키지명.클래스명;
import java.util.Date;
//or
import 패키지명.*;
import java.util.*;

위 둘의 실행 시 성능상의 차이는 전혀 없다.

📌 제어자 (modifier)

크게 접근 제어자와 그 외로 나뉜다.

  1. 접근 제어자 : public, protected, default, private
  2. 그 외 : static, final, abstract, native, transient...

📖 final

: 마지막의, 변경될 수 없는

  • 메서드에 붙을 경우 오버라이딩이 불가능.
  • 변수에 붙을 경우 상수가 된다.

📖 abstract

: 추상의, 미완성의

  • 추상 메서드 : 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상메서드를 선언하는데 사용된다.
  • 추상 클래스 : 추상 메서드를 포함한 클래스
    -> 미완성이므로 인스턴스를 생성할 수 없다.

클래스에 final 과 같이 사용할 수 X
메서드에 static, private 와 같이 사용할 수 X

📖 접근 제어자 (access modifier)

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


📌 다형성

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

참조변수 형변환

자손 타입 -> 조상 타입 : 업캐스팅 (형변환 생략 가능)
자손 타입 <- 조상 타입 : 다운캐스팅 (형변환 생략 불가능)

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

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

📖 instanceof 연산자


📌 추상클래스(abstract class)

📖 추상 메서드


📌 인터페이스(interface)

인터페이스는 일종의 추상 클래스이다. 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화 정도가 높아서 추상클래스와 달리 몸통만 갖춘 일반 메서드나 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만 멤버로 가질 수 있다.

  • 개발시간 단축
  • 표준화 가능
  • 서로 관계없는 클래스들에 관계를 맺어줄 수 있다.
  • 독립적 프로그래밍 가능
interface 인터페이스이름 {
	public static final 타입 상수이름 =;	//final int PI=3; (편의상 생략 가능)
    public abstract 메서드이름(매개변수목록);
}

모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
모든 메서드는 public abstract 이어야 하며, 생략가능하다.

📖 인터페이스 상속

다중 상속 가능
Ex.

interface Fightable extends Moveable, Attackable { }

📖 인터페이스 구현

class 클래스이름 implements 인터페이스이름 {
	//인터페이스에 정의된 추상메서드 구현
}
class Fighter implements Fightable {
	public void move(int x, int y) { /*구현부 생략*/ }
    public void attack(Unit u) { /*구현부 생략*/ }
}
profile
개발공부하는 잠만보

0개의 댓글