자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 13일차 - 인터페이스, 인터페이스의 타입 변환과 다형성

개발학생 2025. 6. 16. 18:43
반응형

관련 공부글

2025.06.04 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 8일차 - 객체 지향 프로그래밍(객체의 특징, 객체 간의 관계, 클래스와 인스턴스

 

Java 기초 또 다시 공부하기 8일차 - 객체 지향 프로그래밍(객체의 특징, 객체 간의 관계, 클래스와

1. 객체의 특징객체(Object): 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중, 고유 속성을 가지고 있어 식별 가능한 것-> 속성과 동작[필드(Field)와 메서드(Method)]으로 구성되어 있음현실

keep-programming-study.tistory.com

2025.06.05 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 9일차 - 객체 지향 프로그래밍(필드, 생성자, 메서드)

 

Java 기초 또 다시 공부하기 9일차 - 객체 지향 프로그래밍(필드, 생성자, 메서드)

1. 필드(Field)1) 필드의 개념 및 선언개념: 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 저장선언: 클래스 중관호 {} 블록 내부에 "타입 필드명( = 초기값);"과 같은 형식으로 선언-

keep-programming-study.tistory.com

 

2025.06.11 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 10일차 - 객체 지향 프로그래밍(인스턴스 멤버와 정적 멤버, 패키지와 접근 제한자)

 

Java 기초 또 다시 공부하기 10일차 - 객체 지향 프로그래밍(인스턴스 멤버와 정적 멤버, 패키지와

이전 공부글2025.06.04 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 8일차 - 객체 지향 프로그래밍(객체의 특징, 객체 간의 관계, 클래스와 인스턴스 속성과 동작[필드(Field)

keep-programming-study.tistory.com

2025.06.12 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 11일차 - 상속(상속, 클래스의 타입 변환과 다형성)

 

Java 기초 또 다시 공부하기 11일차 - 상속(상속, 클래스의 타입 변환과 다형성)

1. 상속 1) 상속의 정의이미 잘 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에, 중복되는 코드를 줄여줌-> 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오므

keep-programming-study.tistory.com

 

2025.06.13 - [자바(JAVA)/미니 프로젝트 & 기초 공부] - Java 기초 또 다시 공부하기 12일차 - 상속(추상 클래스와 추상 메서드)

 

Java 기초 또 다시 공부하기 12일차 - 상속(추상 클래스와 추상 메서드)

1. 추상 클래스의 정의클래스들의 공통적인 필드와 메서드를 추출해서 선언하는 클래스객체를 직접 생성 가능한 실체 클래스와 상속 관계를 가지고 있음 -> 추상 클래스가 부모, 실체 클래스가

keep-programming-study.tistory.com

 

1. 인터페이스(Interface)

  • 개발 코드와 객체가 서로 통신하는 접점 역할
    -> 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위함
  • 개발 코드가 인터페이스의 메서드를 호출하면, 인터페이스는 객체의 메서드를 호출
    => 개발 코드는 객체 내부 구조를 알 필요가 없고, 인터페이스의 메서드만 알고 있으면 됨
  • 여러 객체들과 사용이 가능하므로, 사용 객체에 따라 실행 내용과 리턴값 다양화

인터페이스 개념 도식화

 

1) 인터페이스 선언

  • .java 형태의 소스 파일로 작성되고 컴파일러(javac)를 통해 .class 형태로 컴파일됨(물리적 형태는 클래스와 동일)
  • [public] interface 인터페이스명 { ... }과 같이 선언
  • 인터페이스명은 클래스명을 작성하는 방법과 동일
    : 영어 대소문자를 구별하며, 첫 문자는 대문자로 하고 나머지는 소문자로 작성

(1) 상수 필드(constant field) 선언

  • 인터페이스에는 실행 시 데이터를 저장할 수 있는 인스턴스 or 정적 필드 선언 불가
    -> 상수 필드는 선언이 가능하지만, 인터페이스에 고정된 값으로 실행 시 데이터를 바꿀 수 없음
  • 인터페이스에서 선언된 필드는 모두 public static final의 특징을 가짐
    -> 타입 상수이름 = 값;만 입력해도 컴파일 과정에서 상수 필드로 인식됨
  • 상수 필드에서 상수 이름은 대문자로 작성하되, 서로 다른 단어로 구성되어 있을 경우 언더바(_)로 연결하는 것이 관례

(2) 추상 메서드 선언

  • 추상 메서드: 리턴 타입/메서드 이름/매개 변수만 기술하고 중괄호{}를 붙이지 않는 메서드
  • 인터페이스를 통해 호출된 메서드는 최종적으로 객체에서 실행
    -> 인터페이스의 메서드를 실행 블록이 필요 없는 추상 메서드로 선언
  • public abstract를 생략해도 컴파일 과정에서 추상 메서드로 인식됨

추상 메서드 컴파일 과정 도식화

2) 인터페이스 구현

  • 인터페이스의 구현(implement) 객체
    인터페이스에서 정의된 추상 메서드와 동일한 메서드 이름/매개 타입/리턴 타입을 가진 실제 메서드를 갖고 있어야 함
    -> 이 객체를 생성하는 클래스를 구현 클래스라고 함
  • 인터페이스의 구현 객체가 인터페이스 변수에 대입됨 

인터페이스의 구현 객체 개념 도식화

(1) 구현 클래스

  • 인터페이스 타입으로 사용할 수 있음을 알려주기 위해, 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름 명시
  • 인터페이스에 선언된 추상 메서드의 실체 메서드를 선언
public class 구현클래스명 implements 인터페이스명 {
  // 인터페이스에 선언된 추상 메서드의 실체 메서드 선언
}
  • 이클립스에서 실습
// Animal.java
package interfaces;

// 인터페이스 정의
public interface Animal {
  void makeSound();
}
// Dog.java
package interfaces;

//구현 클래스 1
public class Dog implements Animal {
  @Override
  public void makeSound() {
    System.out.println("멍멍!");
  }
}
// Cat.java
package interfaces;

//구현 클래스 2
public class Cat implements Animal {
  @Override
  public void makeSound() {
   System.out.println("야옹~");
  }
}
// Main.java
package interfaces;

public class Main {
  public static void main(String[] args) {
    Animal dog = new Dog();
    Animal cat = new Cat();

    dog.makeSound(); // 출력: 멍멍!
    cat.makeSound(); // 출력: 야옹~
  }
}

이클립스에서 각 .java 파일을 만들고, Main.java 파일을 Java Application으로 run한 결과

(2) 다중 인터페이스 구현 클래스

  • 다수의 인터페이스 타입으로 사용 가능

다중 인터페이스 구현 클래스 도식화

  • 이클립스에서 실습
// Flyable.java
package interfaces;

//인터페이스 정의1
public interface Flyable {
  void fly();
}
// Swimmable.java
package interfaces;

// 인터페이스 정의2
public interface Swimmable {
  void swim();
}
// Duck.java
package interfaces;

//다중 인터페이스 구현 클래스
public class Duck implements Flyable, Swimmable {
  @Override
  public void fly() {
    System.out.println("오리 날아요~");
  }

  @Override
  public void swim() {
    System.out.println("오리 헤엄쳐요~");
  }
}
// DoubleInterface.java
package interfaces;

public class DoubleInterface {
  public static void main(String[] args) {
    Duck duck = new Duck();
    duck.fly();  // 출력: 오리 날아요~
    duck.swim(); // 출력: 오리 헤엄쳐요~
  }
}

이클립스에서 각 .java 파일을 만들고, DoubleInterface.java 파일을 Java Application으로 run한 결과

2. 인터페이스의 타입 변환과 다형성

  • 인터페이스의 다형성:
    인터페이스를 사용하여 메서드를 호출하도록 코딩했을 때, 구현 객체를 손쉽고 빠르게 교체하여 프로그램 실행 결과를 다양화

1) 자동 타입 변환

  • 인터페이스의 자동 타입 변환(promotion): 구현 객체가 인터페이스 타입으로 변환되는 것
    -> 프로그램 실행 도중 자동 타입 변환
  • 인터페이스 구현 클래스를 상속하여 자식 클래스를 만들었다면, 자식 객체 역시 인터페이스 타입으로 자동 타입 변환 가능
인터페이스 변수명 = 구현객체;  // 구현객체가 인터페이스로 자동 타입 변환

2) 강제 타입 변환

  • 인터페이스의 강제 타입 변환(casting)
    :
    구현 클래스에 선언된 필드와 메서드를 사용해야 할 때,
      이 방식으로 구현 클래스 타입으로 변환한 다음 구현 클래스의 필드와 메서드 사용
  • 어떤 구현 객체가 변환되어 있는지 알 수 없는 상태에서 무작정 강제 타입 변환을 할 경우, ClassCastException 발생
    -> 객체 타입을 확인하려면 다음과 같이 instanceof 연산자 사용(boolean 반환): 인터페이스변수명 instanceof 구현클래스
구현클래스 변수명 = (구현클래스) 인터페이스변수명;  // 인터페이스변수가 구현클래스 타입으로 자동 변환

3) 인터페이스 필드의 다형성(이클립스 실습 예시)

  • 인터페이스에서 필드의 다형성: 인터페이스 타입의 변수에 다양한 구현체를 넣고 호출
  • 이클립스 실습 예시
// Vehicle.java
package interfaces;

//인터페이스 정의
public interface Vehicle {
  void move();
}
// Car.java
package interfaces;

public class Car implements Vehicle {
  @Override
  public void move() {
      System.out.println("자동차가 도로를 달립니다.");
  }
}
// Boat.java
package interfaces;

public class Boat implements Vehicle {
  @Override
  public void move() {
      System.out.println("보트가 물 위를 떠다닙니다.");
  }
}
// TransportService.java
package interfaces;

public class TransportService {
  // 인터페이스 타입의 필드
  private Vehicle vehicle;

  // 생성자 또는 메서드로 주입
  public TransportService(Vehicle vehicle) {
      this.vehicle = vehicle;
  }

  public void startTransport() {
      vehicle.move();  // 다형적으로 실제 구현에 따라 동작
  }
}
// ServicePrint.java
package interfaces;

public class ServicePrint {
  public static void main(String[] args) {
    TransportService carService = new TransportService(new Car());
    TransportService boatService = new TransportService(new Boat());

    carService.startTransport();   // 출력: 자동차가 도로를 달립니다.
    boatService.startTransport(); // 출력: 보트가 물 위를 떠다닙니다.
  }
}

이클립스에서 각 .java 파일을 만들고, ServicePrint.java 파일을 Java Application으로 run한 결과

4) 인터페이스 매개 변수의 다형성

  • 인터페이스에서 매개 변수의 다형성: 어떤 구현체가 제공되느냐에 따라 메서드 실행 결과가 다양해지는 것
  • 이클립스 실습 예시
    : 본문의 1. 인터페이스(Interface) - 2) 인터페이스 구현 - (2) 다중 인터페이스 구현 클래스와 같으므로 생략

5) 인터페이스 상속

  • 인터페이스도 다른 인터페이스를 상속 가능하며, 클래스와는 달리 다중 상속 허용
public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2, ... { ... }
  • 구현 클래스로부터 객체를 생성한 후, 하위 및 상위 인터페이스 타입으로 변환 가능
하위인터페이스 변수명 = new 구현클래스(...);
상위인터페이스1 변수명 = new 구현클래스(...);
상위인터페이스2 변수명 = new 구현클래스(...);

 

 

반응형