Notice
Recent Posts
Recent Comments
«   2026/04   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Spring & Java

인터페이스 - 표준화의 시작 본문

JAVA 객체지향 이해하기

인터페이스 - 표준화의 시작

dev.hyuck 2025. 12. 10. 16:35

● 메서드 - 모듈화의 시작

● 클래스와 객체

● JVM 메모리 영역

● 래퍼클래스 (기본형 참조형)

● static - 클래스가 공유

● final - 변하지 않는 값

● 인터페이스 - 표준화의 시작

● 객체지향 PART 1 -  캡술 (접근제어자)

● 객체지향 PART 2 -  상속

● 객체지향 PART 3 - 추상화

● 객체지향 PART 4 - 다형성

 

인터페이스 - 표준화의 시작

 

학습 키워드 점검

인터페이스 - 클래스 설계 표준

구현체 - 인터페이스를 구현한 클래스

 

인터페이스란 ?

인터페이스가 무엇인지 알아봅시다.

● 인터페이스는 설계 표준 입니다.

● 클래스가 따라야할 최소한의 공통 규칙을 정의하는 역할을 합니다.

 

인터페이스를 사용하는 이유

인터페이스를 사용해야하는 이유를 알아 봅시다.

● 모든 설계에 표준이 있는 이유와 똑같습니다.

개발자마다 서로 다른 방식으로 메서드를 만든다면 일관성이 깨질 수 있습니다.

인터페이스를 활용해서 최소한의 규격을 정의합니다.

일관성을 유지하면서 클래스가 고유한 특색을 확장할 수 있도록 돕습니다.

 

[ ! ] 자동차를 예시로 인터페이스가 왜 필요한지 알아봅시다.

● LuxuryCar 와 speedCar 모두 자동차를 구현하고 있습니다.

● LuxuryCar를 이용하는 경우 move() 메서드로 주행할 수 있지만

● speedCar를 이용하는 경우 dirve() 메서드를 이용해 주행해야 합니다.

● 같은 자동차인데 다른 기능 (메서드)로 주행을 해야할까요?

class LuxuryCar {
    void move() {
        System.out.println("멋지게 이동합니다.");
    }
    
    void stop() {
		    System.out.println("멋지게 정지합니다.");
    }
}

class SpeedCar {
    void drive() {
        System.out.println("빠르게 주행을 합니다.");
    }
}


public class Main {
    public static void main(String[] args) {
        LuxuryCar car1 = new LuxuryCar();
        SpeedCar car2 = new SpeedCar();

				// ❌ 일관되지 않은 주행 명령어
        car1.move();  
        car1.stop();
        // ❌ 일관되지 않은 주행 명령어 + 멈출수 없음
        car2.drive(); 
    }
}

 

인터페이스 적용

인터페이스를 잘 활용한 경우

● 인터페이스는 모든 클래스가 지켜야할 최소한의 규칙을 정의합니다.

● 클래스에서 implements 키워드로 인터페이스를 활용할 수 있습니다.

● 인터페이스를 구현한 클래스를 구현체 라고 합니다.

interface Car {
    void drive();
    void stop();
}

class LuxuryCar implements Car {

		@Override
    void drive() { // ✅ 인터페이스 규칙 준수
        System.out.println("멋지게 이동합니다."); // 구현 내용은 자유롭습니다.
    }
    
    @Override
    void stop() { // ✅ 인터페이스 규칙 준수
		    System.out.println("멋지게 정지합니다."); // 구현 내용은 자유롭습니다.
	  }
	  
	  void charge() { // 🎉 CarA 만의 기능을 확장 가능합니다.
			  System.out.println("차량을 충전합니다");
	  }
}
class SpeedCar implements Car {
		
		@Override
    void drive() { // ✅ 인터페이스 규칙 준수
        System.out.println("빠르게 이동합니다."); // 구현 내용은 자유롭습니다.
    }
    
    @Override
    void stop() { // ✅ 인터페이스 규칙 준수
		    System.out.println("빠르게 정지합니다."); // 구현 내용은 자유롭습니다.
    }
    
    void autoParking() { // 🎉 CarB 만의 기능을 확장 가능합니다.
		    System.out.println("자동 주차 기능을 실행합니다.");
    }
}
public class Main {
    public static void main(String[] args) {
        LuxuryCar car1 = new LuxuryCar();
        SpeedCar car2 = new SpeedCar();

				// ✅ 각 차량의 공통 기능
        car1.drive();
        car1.stop();
        car2.drive();
        car2.stop();
        
        // ✅각 차량의 고유 기능
        car1.charge();
        car2.autoParking();
    }
}

 

인터페이스의 다양한 기능

인터페이스를 응용하는 방법이 두 가지 있습니다.

1. 인터페이스 다중구현

2. 인터페이스 다중상속

 

인터페이스 다중구현 (multy - implementation )

인터페이스 다중 구현을 알아봅시다.

● implements 키워드로 다수의 인터페이스를 구현할 수 있습니다.

● 한 개의 클래스가 여러 인터페이스 ( Animal, Flyable )를 구현한 경우 다중구현 이라고 합니다.

 

// 🚀 "동물의 기본 기능" 인터페이스
interface Animal {
    void eat();
}

// ✈ "나는 기능" 인터페이스
interface Flyable {
    void fly();
}

// ✅ 다중 구현 
class Bird implements Animal, Flyable {
    public void eat() {
        System.out.println("새가 먹이를 먹습니다.");
    }

    public void fly() {
        System.out.println("새가 하늘을 납니다.");
    }

    // 추가적으로 land() 메서드도 가능하지만 필수는 아님
    public void land() {
        System.out.println("새가 착륙합니다.");
    }
}


// 실행 코드
public class Main {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.eat();  // "새가 먹이를 먹습니다."
        bird.fly();  // "새가 하늘을 납니다."
        bird.land(); // "새가 착륙합니다."
    }
}

 

인터페이스 다중상속 ( multi - inherutance )

인터페이스 다중상속을 알아봅시다.

● extends 키워드로 상속을 구현할 수 있습니다.

// 1. 기본 인터페이스: 동물의 기본 기능
interface Animal {
    void eat();
}

// 2. 추가 인터페이스: 나는 기능
interface Flyable {
    void fly();
}

// 3. ✅ 다중 상속새로운 인터페이스: 동물 + 나는 기능
interface FlyableAnimal extends Animal, Flyable {
    void land();  // 추가 기능
}

// 4. 새 클래스 (FlyableAnimal을 구현)
class Bird implements FlyableAnimal {

    public void eat() {
        System.out.println("새가 먹이를 먹습니다.");
    }

    public void fly() {
        System.out.println("새가 하늘을 납니다.");
    }

    public void land() {
        System.out.println("새가 착륙합니다.");
    }
}


// 5. 실행 코드
public class Main {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.eat();  // "새가 먹이를 먹습니다."
        bird.fly();  // "새가 하늘을 납니다."
        bird.land(); // "새가 착륙합니다."
    }
}

 

인터페이스에 변수를 선언하는 경우

변수 선언시 형식에 관게 없이 자동으로 상수로 선언됩니다.

● publc static final로 선언 됩니다.

● static으로 선언되기 때문에 구현체 없이도 활용 가능합니다.

● 인터페이스는 표준의 역할이므로 변수선언은 최소화 하는 것이 좋습니다.

public interface Config {
    int POPULATION = 100; // public static final 로 선언됩니다.
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Config.POPULATION);
    }
}