혼공학습단 12기는 7/01일부터 8/18일까지 진행하는 스터디 활동입니다.
★ 이번주 공부할 내용
# | 진도 | 기본 숙제(필수) | 추가 숙제(선택) |
5주차 (8/5 ~ 8/11) |
Chapter 08 ~ 09 | 클래스를 선언할 때 인터페이스는 어떻게 선언될 수 있는지 정리하기 | p.421 09-1 확인 문제 3번 풀어보기 |
🙋♂️Q&A: 신용권 저자님의 네이버 카페
💻유튜브 강의: 👉전체 강의 목록
혼자 공부하는 자바(개정판)
『혼자 공부하는 자바』가 더욱 풍성한 내용을 담아 돌아왔습니다! 개정판은 기존의 자바 8 & 11 버전은 물론, 최신 버전인 자바 21까지 다룹니다. 자바 21 버전의 강화된 언어 기능을 담은 총 260개
www.youtube.com
이번주 공부할 내용은
· Chapter08 인터페이스
· Chapter09 중첩 클래스와 중첩 인터페이스
파트입니다.
■ 기본 숙제
자바는 다중 상속을 허용하지 않는다고 했는데, 자바는 이 문제를 인터페이스를 통해서 해결합니다.
이를 다중 상속이 아니라 다중 구현이라고도 표현합니다.
이전에 클래스를 선언할 때는 클래스 내부에 멤버 변수(필드), 생성자, 메소드가 있었습니다.
그에 반해 인터페이스는 상수 필드와 추상 메소드만을 구성 멤버로 가집니다.
인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없습니다.
인터페이스에 선언된 필드는 모두 public static final의 특성을 갖습니다.
인터페이스 메서드는 모두 public, abstact이고, 인터페이스는 다중 구현(다중 상속)을 지원합니다.
인터페이스에서 멤버 변수는 public, static, final이 모두 포함되었다고 간주됩니다.
final은 변수의 값을 한 번 설정하면 수정할 수 없다는 뜻입니다.
추상 메서드에서는 추상이라는 의미에 abstract 키워드 필요
추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 합니다.
인터페이스를 순수 추상 클래스라고도 한다고 합니다.
순수 추상 클래스 : 모든 메서드가 추상 메서드인 추상 클래스
순수 추상 클래스를 상속받은 클래스(자식)는 부모의 기능을 모두 오버라이딩해야 합니다.
순수 추상 클래스는 다음과 같은 특징을 가집니다.
- 인스턴스를 생성할 수 없습니다.
- 상속 시 자식은 모든 메서드를 오버라이딩 해야 한다.
- 주로 다형성을 위해 사용됩니다.
인터페이스를 상속받을 때는 extends 대신에 implements라는 구현이라는 키워드를 사용해야 합니다.
인터페이스를 사용할 때 public abstract 대신 public interface 앞 키워드 생략 가능합니다.
"Cannot reduce the visibility of the inferited method"
단, public 키워드 생략 시 컴파일 에러 발생
인터페이스는 모든 메서드가 추상 메서드이기 때문에 컴파일 타임에 에러를 발생시켜
문법적으로 개발자가 실수할 수 있는 문제들을 미리 막을 수 있습니다.
인터페이스를 사용하는 이유는 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위해서입니다.
개발 코드 측면에서 코드 변경 없이 실행 내용과 리턴값을 다양화할 수 있습니다.
인터페이스는 다형성이라는 특성을 통해 여러 객체로 쉽게 변경이 가능해집니다.
인터페이스가 있고 이 인터페이스를 구현한 객체가 있다고 가정해 보겠습니다.
우리는 상황에 따라 인터페이스에 맞는 객체를 갈아 끼울 수 있습니다. TV 리모컨에 있는 건전지함은 AA사이즈(인터페이스) 규격인 건전지라면 어떤 건전지라도 바꿔 끼울 수 있습니다.
■ 추가 숙제
p.421 09-1 확인 문제 3번 풀어보기

#3. 중첩클래스 예시 문제입니다. 중첩 클래스로 정의된 클래스를 어떻게 선언하는지 알아야 합니다.
· Car.java 클래스
public class Car {
class Tire();
static class Engine();
}
중첩 클래스로 정의된 Car의 Tire클래스는 Car라는 객체가 myCar라는 변수로 선언되어 있어 Tire객체를 생성할 수 있고, 정적으로 선언된 Engine클래스는 static이기에 Car클래스 객체 없이 호출이 가능합니다.
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();
}
}
처음에 코드를 따라 쳐보면서 굳이 왜 사용할까? 코드로만 봐서는 이해가 잘 가지 않았습니다. 책에 예시를 계속 생각하다 보니 당연한 소리인데도 클래스와는 달라서 어색했던 거 같습니다. 새로운 개념을 공부하는 게 항상 쉽지 않은 거 같습니다. 이번 인터페이스 파트는 오래 기억될 것 같습니다. ㅎㅎ;;어떤 분야든 일단 이해가 안 되면 여러 번 봐야 되지만 힘들게 얻은 지식은 쉽지 잊히지 않아서 더 오래 기억되는 거 같습니다.