관리 메뉴

애독자's 공부방

[혼공자] 5주차 _ 혼자 공부하는 자바(개정판) 본문

Java/혼공학습단 12기

[혼공자] 5주차 _ 혼자 공부하는 자바(개정판)

애독자 2024. 8. 4. 23:19
728x90

혼공단 - 혼공자, 혼자 공부하는 자바(개정판)

 

 

■ 공부한 내용

# 진도 기본 숙제(필수) 추가 숙제(선택)
5주차
(8/5 ~ 8/11)
Chapter 08 ~ 09 클래스를 선언할 때 인터페이스는 어떻게 선언될 수 있는지 정리하기 p.443 (09-1) 확인 문제 3번 풀어보기

 

 

□ Chapter 08 ~ 09

▷ 08-1
 - 인터페이스: 객체의 사용 방법을 정의한 타입이며, 개발 코드와 객체가 서로 통신하는 접점 역할
   . 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출
 - 인터페이스 구성 멤버: 상수 필드와 추상 메소드
   . 상수 필드: 기본적으로 public static final 특성으로, 선언 시 초기값 대입 (필드 이름: 관례적으로 대문자)
   . 추상 메소드: public abstract가 생략되고 메소드 선언부만 존재 (구현 클래스는 반드시 추상 메소드를 재정의)
 - implements: 구현 클래스가 어떤 인터페이스로 사용 가능한지를 기술하기 위해 클래스 선언 시 해당 키워드 사용
   . 인터페이스 사용: 클래스를 선언할 때, 필드, 생성자 또는 메소드의 매개 변수, 생성자 또는 메소드의 로컬 변수로 선언
     → 대입이 된 후에는 재정의된 구현 객체의 메소드 호출 가능
       1) 필드 타입으로 사용될 경우: 필드에 구현 객체를 대입 가능

       2) 상성자의 매개 변수 타입으로 사용될 경우: new 연산자로 객체를 생성할 때 구현 객체를 생성자의 매개값으로 대입 가능

       3) 로컬 변수 타입으로 사용될 경우: 변수에 구현 객체를 대입 가능

       4) 메소드의 매개 변수 타입으로 사용될 경우: 메소드 호출 시 구현 객체를 매개값으로 대입 가능

▷ 08-2
 - 다형성: 구현을 위해 메소드 재정의와 타입 변환이 필요
   . 상속: 같은 종류의 하위 클래스를 생성
   . 인터페이스: 사용 방법이 동일한 클래스를 만드는 기술
 - 자동 타입 변환: 구현 객체가 인터페이스 변수에 대입되는 것
 - 강제 타입 변환: 인터페이스에 대입된 구현 객체를 다시 원래 구현 클래스 타입으로 변환하는 것
   . instanceof: 강제 타입 변환을 하기 전에 변환이 가능한지 조사할 때 사용
     → 인터페이스: 구현 클래스 타입인지 확인 (상속: 자식 클래스 타입인지 확인)
 - 인터페이스 상속: 다중 상속을 허용 (extends 키워드 뒤에 상위 인터페이스 가능)
   ※ 클래스는 다중 상속을 비허용
 
▷ 09-1
 - 중첩 클래스: 클래스 내부에 선언한 클래스
   . 사용 장점: 두 클래스의 멤버들을 서로 쉽게 접근, 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성 감소
 - 멤버 클래스: 클래스의 멤버로서 선언되는 중첩 클래스
   . 바깥 객체의 필요 여부에 따라 인스턴스 멤버 클래스와 정적(static) 멤버 클래스로 구분
 - 로컬 클래스: 생성자 또는 메소드 블록 내부에 선언된 중첩 클래스
 - 중첩 인터페이스: 클래스의 멤버로 선언된 인터페이스
   . 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능
     → 주로 정적 멤버 인터페이스를 많이 사용하며, UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용

▷ 09-2
 - 익명 객체: 이름이 없는 객체로, 생성을 위해서는 어떤 클래스를 상속하거나 인터페이스 구현이 필요
   . 익명 자식 객체: 자식 클래스가 재사용되지 않고 오로지 특정 위치에서 사용되는 경우에 활용

// □ 익명 자식 객체 생성
부모클래스 [필드|변수] = new 부모클래스(매개값, ...) {
    // 필드
    // 메소드
};


   . 익명 구현 객체: 구현 클래스가 재사용되지 않고 오로지 특정 위치에서 사용되는 경우에 활용

// □ 익명 구현 객체 생성
인터페이스 [필드|변수] = new 인터페이스() {
    // 인터페이스에 선언된 추상 메소드의 실체 메소드 선언
    // 필드
    // 메소드
};



샌드 맛있게 잘 먹었습니다! 아이스크림 잘 먹겠습니다! 감사합니다.

 

 

■ 기본 숙제

  - 클래스를 선언할 때 인터페이스는 어떻게 선언 될 수 있는지 정리하기

    1) 클래스와 인터페이스의 관계

      . 클래스: 자동차, 사람 등 실제 세상의 사물이나 개념을 모델링한 것으로, 자동차 클래스에는 바퀴, 엔진 등의 속성과 달리기, 멈추기 등의 행동을 정의

      . 인터페이스:  클래스가 갖춰야 할 기능의 목록으로, 자동차가 달릴 수 있어야 한다거나, 멈출 수 있어야 한다는 규칙과 같은 것

      ※ 클래스는 인터페이스를 구현함으로써, 인터페이스에 정의된 기능들을 반드시 보유. 마치 자동차가 달릴 수 있는 기능을 갖추기 위해 '달릴 수 있는' 인터페이스를 구현하는 것과 같음

    2) 좀 더 쉽게 설명: 인터페이스는 운전 면허증과 유사

      . 인터페이스: 운전자(클래스)가 갖춰야 할 기능(메서드)을 정의

      . 클래스: 운전 면허증을 가진 사람(인터페이스를 구현한 클래스)은 자동차의 운전이 가능

    3) 클래스에서 인터페이스 선언

      . implements 키워드 사용: 클래스가 특정 인터페이스를 구현한다고 선언할 때 implements 사용

      . 인터페이스의 모든 메서드 구현: 클래스는 자신이 구현한 인터페이스에 정의된 모든 메서드를 반드시 구현

    4) 인터페이스 사용 목적

      . 다형성: 다양한 종류의 객체를 동일한 인터페이스를 통해 다룰 수 있음

      . 표준화: 공통된 기능을 정의하여 코드의 일관성을 유지

// 운전면허증 인터페이스(Driveable)
interface Driveable {
    void drive();
    void stop();
}

// 인터페이스거 구현된 클래스(자동차)
class Car implements Driveable {
    public void drive() {
        System.out.println("자동차가 달립니다.");
    }
    public void stop() {
        System.out.println("자동차가 멈춥니다.");
    }
}

// 인터페이스거 구현된 클래스(오토바이)
class Motorcycle implements Drivable {
    public void drive() {
        System.out.println("오토바이가 달립니다.");
    }
    public void stop() {
        System.out.println("오토바이가 멈춥니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        Drivable car = new Car();
        Drivable motorcycle = new Motorcycle();
        // 1종 보통 면허 소지자는 자동차, 오토바이(125cc이하)를 모두 운전할 수 있음
        driveVehicle(car);
        driveVehicle(motorcycle);
    }
    // 운전 메서드
    public static void driveVehicle(Drivable vehicle) {
        vehicle.drive();
    }
}


    5) 인터페이스를 운전면허증에 비유할 수도 있지만, 자동차의 메소드와 더 가깝다고도 생각이 가능

      - 운전면허증에 비유한 이유

        . 규칙과 기능의 정의: 운전면허증은 운전자가 갖춰야 할 규칙과 기능을 정의. 마찬가지로, 인터페이스는 클래스가 갖춰야 할 메서드(기능)을 정의

        . 다양한 객체에 적용: 운전면허증은 자동차, 오토바이 등 다양한 운송수단에 적용. 인터페이스도 다양한 클래스에 구현되어 사용 가능.

        . 추상적인 개념: 운전면허증은 실제 운전 행위를 추상화한 개념. 마찬가지로, 인터페이스는 클래스의 구체적인 구현을 추상화한 개념

    6) 두 비유를 함께 활용

      - 운전면허증: 인터페이스가 클래스에 부여하는 규칙기능의 측면을 강조

      - 자동차의 메소드: 인터페이스가 클래스의 행동을 정의하는 측면을 강조

        →  인터페이스를 운전면허증과 자동차 메드의 결합으로 설명 가능. 즉, 인터페이스는 운전면허증처럼 클래스가 갖춰야 할 기능을 정의하고, 동시에 자동차의 메드처럼 클래스의 행동을 추상화

 

 

■ 추가 숙제(선택)

  - p.443 (09-1) 확인 문제 3번 풀어보기

    . Car 클래스 내부에 Tire와 Engine이 멤버 클래스로 선언되어 있으며, 바깥 클래스인 NestedClassExample에서 멤버 클래스의 객체를 생성하는 코드를 작성하기 (tire와 engine을 채우기)

public class Car {
    class Tire {}          // 일반 내부 클래스
    static class Engine {} // static 내부 클래스
}

 

      ※ 타이어(Tire)와 엔진(Engine)이라는 부품 클래스를 자동차 클래스 안에 넣어서 관리할 수 있는데, 이렇게 다른 클래스 안에 들어가 있는 클래스를 내부 클래스라고 함.

        1) Tire: 인스턴스 멤버 클래스로,  자동차의 인스턴스가 있어야만 타이어를 만들 수 있음. 타이어는 자동차에 속해 있기 때문에 자동차가 있어야만 타이어를 끼울 수 있는 것과 같음.  → 자동차 객체인 myCar를 이용해서 new Tire()로 생성

        2) Engine: 정적 멤버 클래스로, 자동차가 없어도 엔진을 만들 수 있음. 엔진은 자동차에 들어가는 부품이지만, 자동차와 독립적이기 때문에 자동차 없이도 만들어질 수 있다는 의미  → new Car.Engine()으로 바로 엔진 객체를 생성

public class NestedClassExample {
    public static void main(String[] args) {
        Car myCar = new Car();  // 자동차 객체 생성

        // 타이어 객체 생성 (자동차 객체 필요)
        Car.Tire tire = myCar.new Tire();

        // 엔진 객체 생성 (자동차 객체 불필요)
        Car.Engine engine = new Car.Engine();
    }
}

 

 

728x90