본문 바로가기
개념

[JAVA의 정석] Chapter07

by cook_code 2024. 9. 8.
반응형

교재 목차

Chapter07. 객체 지향 프로그래밍 2

 

Chapter07. 객체 지향 프로그래밍 2


 

1. 객체 지향 기본 개념 

1-1. 상속(Inheretance)

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

자식 클래스는 부모 클래스의 필드와 메서드를 선택해서 물려받을 수 있다.

class 자식클래스이름 extend 부모클래스이름 { ... }

 

조상 클래스 : 부모 클래스, 상위 클래스, 기반 클래스

자손 클래스 : 자식 클래스, 하위 클래스, 파생된 클래스

1-2. 상속의 장점

중복된 코드를 줄일 수 있고, 유지보수가 편리하며, 통일성이 있고 다형성을 구현할 수 있다.

1-3. 상속의 단점

클래스간 다중상속을 허용하면 클래스간의 관계가 매우 복잡해지며 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다

1-4. 상속의 특징

자식 클래스가 여러 부모로부터 다중 상속을 받는 것은 불가능하다.

즉, 1개의 부모 클래스로부터의 단일 상속만 허용된다.

1-5. Object클래스

Object 클래스는 모든 클래스 중 최상위에 있는 조상 클래스.

자바의 모든 클래스들은 Object클래스의 멤버들을 상속 받기 때문에 Object클래스에 정의된 멤버들을 사용할 수 있다. 주요 메소드로는 toString()과 equals(Object o)등이 있다.

요약

1. 상속 방법 : class 클래스(자식) extends 클래스(부모)

2. 자식 클래스는 부모 클래스로부터 메소드필드를 물려받아 사용한다. 부모 클래스는 자식 클래스에서 정의한 메소드나 필드를 사용하지 못한다.(자식 = 자신 + 부모 / 부모 = 자신)

3. 자식 클래스는 여러 부모 클래스로부터 상속받지 못한다. 즉, 단일상속만 가능하다.

4. 부모 클래스는 여러 자식 클래스에게 상속이 가능하다.

5. 자식 클래스가 더 다양한 기능이 가능하므로 자식 클래스로 인스턴스를 생성하는 것이 효율적이다.

참고

 

2. 오버라이딩(Obverriding)

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

2-1.  오버라이딩의 조건 

    • 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와
      • 이름이 같아야 한다.
      • 매개변수가 같아야 한다.
      • 변환타입이 같아야 한다.
    • 조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때,
      • 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
      • 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
      • 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.

2-2. 오버로딩과 오버라이딩의 차이점 

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

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

 

3. 제어자 (Modifier)

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

3-1.  제어자란?

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

기타 : static, final, abstract, native, transient, synchronized, volatile, strictfp

static - 클래스의, 공통적인

쓰이는 곳 : 멤버변수, 메서드, 초기화 블럭

 

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

쓰이는 곳 : 클래스, 메서드, 멤버변수, 지역변수

abstract - 추상의, 미완성의

쓰이는 곳 : 클래스, 메서드

접근제어자

쓰는 이유

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

쓰이는 곳 : 클래스, 멤버변수, 메서드, 생성자

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

접근 범위가 넓은 순 정렬

public → protected → (default) → private

 

제어자
같은 클래스
같은 패키지
자손 클래스
전 체
public




protected




default




private




3-2. 제어자의 조합 

대상에 따라 사용할 수 있는 제어자 

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

 

주의사항

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

- static은 몸통이 있는 메서드에만 사용할 수 있기 때문이다

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

- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.

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

- abstract 메서드는 자손 클래스가 구현해주어야 하는데 접근 제어자가 private이면, 자손 클래스에서 접근할 수 없기 때문이다.

⑷ 메서드에 private과 final을 같이 사용할 필요는 없다.

- 접근 제어자가 private인 메서드는 오버라이딩 될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다.

 

4. 다형성 (Polymorphism)

4-1.  다형성이란?

조상클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있는 것 

( = 클래스가 상속 관계에 있을때 나타나는 성질)

 

 

💠 자바의 다형성(Polymorphism) 완벽 이해하기

다형성 (Polymorphism) 다형성(多形性) 이란, 그 자체의 의미를 표준 국어사전에서 찾아보면, '같은 종의 생물이면서도 어떤 형태나 형질이 다양하게 나타나는 현상' 이라 정의되어 있다. 이를 프로

inpa.tistory.com

 

자바에는 대표적으로 오버로딩, 오버라이딩, 업캐스팅, 다운캐스팅, 인터페이스, 추상메서드, 추상클래스 등이 모두 다형성에 속한다.

조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다.

반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.

=> 자손타입의 참조변수로 조상타입의 참조변수를 참조하는 것은

존재하지 않는 멤버를 사용하고자 할 가능성이 있으므로 허용하지 않는다.

 

참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 작아야 한다.

자손타입 → 조상타입 (업캐스팅) : 형변환 생략 가능

조상타입 → 자손타입 (다운캐스팅) : 형변환 생략 불가

 

5. 추상클래스 (Abstaract class) 

5-1. 추상클래스란? (=미완의 설계도)

추상클래스 자체로는 클래스의 역할을 하지 못하며, 인스턴스 생성이 불가하다.

하지만 새로운 클래스를 작성하는데 있어 바탕이 되는 조상클래스로서의 의미를 지닌다.

추상클래스는 상속을 통해 자손클래스에 의해서만 완성될 수 있다.

5-2. 추상클래스 형식

abstract class 클래스이름(){ ... }

 

5-3. 추상메서드란?

메서드는 선언부와 구현부(몸통)으로 구성되어 있다.

선언부만 작성하고, 구현부는 작성하지 않은 채로 남겨둔 것이 추상메서드이다.

abstract 반환타입 메소드이름();

 

메서드 상단에 어떤 기능을 수행할 목적으로 이 메서드를 만들었는지에 대한 설명을 주석으로 단다.

 

6. 인터페이스 (Interface)

6-1. 인터페이스란? (= 기본설계)

일종의 추상클래스.

추상클래스보다 추상정도가 높아 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 다른 어떠한 요소도 허용되지 않는다.

6-2. 인터페이스 형식

접근제어자 interface 인터페이스이름 {

    public static final 타입 상수이름 = 값;

    ...

    public abstract 메소드이름(매개변수목록);

    ...

}

 

 

 

6-3. 인터페이스 사용 시 제약사항

  • 모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
  • 모든 메서드는 public abstract 이어야 하며, 이를 생략할 수 있다.
  • (단, static메서드와 디폴트 메서드는 예외)

6-4. 인터페이스의 상속

인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러 개의 인터페이스로부터 상속받는 것이 가능하다.

 

interface Animal { public abstract void cry(); }

 

class Cat implements Animal {

    public void cry() {

        System.out.println("냐옹냐옹!");

    }

}

 

class Dog implements Animal {

    public void cry() {

        System.out.println("멍멍!");

    }

}

 

public class Polymorphism03 {

    public static void main(String[] args) {

        Cat c = new Cat();

        Dog d = new Dog();

 

        c.cry();

        d.cry();

    }

}

 

6-5. 인터페이스의 구현

인터페이스도 추상클래스와 같이 그 자체로는 인스턴스를 생성할 수 없으며,

자신에 정의된 추상메서드의 몸통을 만들어주는 클래스를 작성해야한다.

6-.6 인터페이스 상속과 구현을 동시에

class 클래스이름 extend 상위클래스이름 implements 인터페이스이름 { ... }

 

6-7. 인터페이스의 장점

  • 개발시간을 단축시킬 수 있다.
  • 표준화가 가능하다.
  • 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
  • 독립적인 프로그래밍이 가능하다.

6-8. 인터페이스를 이해하기 위해...

  • 클래스를 사용하는 쪽(user) 과 클래스를 제공하는 쪽(provider)이 있다.
  • 메서드를 사용(호출)하는 쪽(user)에서는 사용하려는 메서드(provider)의 선언부만 알면 된다. (내용은 몰라도 된다)

https://velog.io/@ung6860/JAVA%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4Interface%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90-fc81k7rr

 

6-9. 디폴트 메서드와 static 메서드 

 

디폴트 메서드

추상 메서드의 기본적인 구현을 제공하는 메서드로,

추상 메서드가 아니기 때문에 디폴트 메서드가 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.

기존 메서드와 이름 중복 충돌 해결

⑴ 여러 인터페이스의 디폴트 메서드 간의 충돌

  • 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩 해야 한다.

⑵ 디폴트 메서드와 조상 클래스의 메서드 간의 충돌

  • 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

static 메서드

static 메소드는 특정 객체에 속하지 않기 때문에, 인터페이스를 구현하는 클래스의 API의 한 부분이 아님.

따라서 메소드명 앞에 인터페이스 이름을 넣어서 호출해야 한다. 

 

 

7. 내부 클래스(Inner class)

7-1. 내부 클래스란?

 

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

주로 두 클래스 간에 긴밀한 관계가 있는 경우 사용한다.

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

7-2. 내부 클래스의 종류와 특징

1. 정적 클래스(static class)

외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 static 멤버처럼 다뤄진다.

다만 주의할점은 static이라고 해서 new 생성자 초기화를 못하는 건 아니다.

즉, 일반적인 static 필드 변수나 static 메서드와 달리, staic 내부 클래스는 같은 static이지만 메모리 구조나 기능이 전혀 다르다.

2. 인스턴스 클래스(instance class)

외부 클래스의 멤버변수 선언 위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다뤄진다.

주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.

3. 지역 클래스(local class)

외부 클래스의 메서드나 초기화블럭 안에 선언하며, 선언된 메서드 블록 영역 내부에서만 사용될 수 있다.

4. 익명 클래스(anonymous class)

클래스의 선언과 객체의 생성을 동시에 하는 이름없는 클래스이다.

주로 클래스를 일회용으로 사용할때 자주 이용된다.

선언과 객체 생성을 동시에 하며, 하나의 객체만 생성 가능하다.

ex)

1. 프로그램 내에서 일시적으로(단발성으로) 한번만 사용되어야 하는 객체일 경우

-> UI 이벤트처리, 스레드 객체 등 (단발성 이벤트 처리)

2. 재사용성이 없고, 확장성을 활용하는 것이 유지보수에서 더 불리할 때

-> 비즈니스 로직이 정말 재각각이며, 재사용성이 전혀없어 매번 클래스를 생성해야하는 비용이 더 많을때

 

7-3. 내부 클래스의 선언

class Outer {     // 외부 클래스

    ...

    class Inner { // 내부 클래스

        ...

    }

    ...

}

 

7-4. 익명 클래스의 선언

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

또는

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

 

반응형

'개념' 카테고리의 다른 글

[JAVA의 정석] Chapter10  (0) 2024.09.08
[JAVA의 정석] Chapter08 - 09  (0) 2024.09.08
[JAVA의 정석] Chapter06  (2) 2024.09.07
[JAVA의 정석] Chapter04 -05  (5) 2024.09.07
[JAVA의 정석] Chapter01 -03  (6) 2024.09.06