일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 맛있는디자인스터디12기
- 혼공분석
- 혼공
- 맛있는디자인스터디13기
- 혼공JS
- 스터디완료
- 제이펍
- 스터디
- 3주차후기
- 진짜쓰는일러스트레이터
- 애프터이펙트
- 전면개정2판
- 혼공자
- 맛있는디자인스터디11기
- CS2023
- 챌린지
- 프리미어프로
- 혼공머신
- 6주차후기
- 혼공학습단
- Doit점프투파이썬
- 혼공파
- 후기
- 혼공단
- 생성형AI
- 맛있는디자인
- CC2023
- 회고
- Doit파이썬스터디
- 혼공C
- Today
- Total
애독자's 공부방
[혼공자] 5주차 _ 혼자 공부하는 자바(개정판) 본문
혼공단 - 혼공자, 혼자 공부하는 자바(개정판)
■ 공부한 내용
# | 진도 | 기본 숙제(필수) | 추가 숙제(선택) |
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();
}
}

'Java > 혼공학습단 12기' 카테고리의 다른 글
혼공학습단 12기 활동 회고 : 꾸준히 혼공자 (0) | 2024.08.15 |
---|---|
[혼공자] 6주차 _ 혼자 공부하는 자바(개정판) (0) | 2024.08.11 |
[혼공자] 4주차 _ 혼자 공부하는 자바(개정판) (1) | 2024.07.22 |
[혼공자] 3주차 _ 혼자 공부하는 자바(개정판) (0) | 2024.07.15 |
[혼공자] 2주차 _ 혼자 공부하는 자바(개정판) (0) | 2024.07.08 |