-
[Java] 추상화와 인터페이스IT Study/컴퓨터 기초 2023. 3. 26. 21:10728x90
1. 추상화란?
추상화(abstraction)는 객체지향 프로그래밍의 주요한 개념 중 하나입니다.
사용할 객체의 공통되는 특정(데이터, 기능)을 분리하고 하나의 개념으로 묶어, 이를 다루기 쉽게 만들 수 있습니다.
2. 추상 클래스
추상 클래스(abstract class)는 추상화를 이용한 클래스로, 일반 클래스와 달리 추상 메서드를 포함할 수 있습니다.
여기서 추상 메서드는 구현 내용 없이, 선언만 있는 메서드입니다.
추상 클래스는 추상 메서드를 포함하고 있어, 직접 객체를 생성하여 사용할 수 없습니다.
직접 사용할 수 없기 때문에, 상속을 통해 자식(하위) 클래스에서는 추상 메서드를 반드시 구현하여 사용할 수 있습니다.
2-1. 추상 메서드 선언 방법
abstract 키워드를 붙인다. 선언부만 작성하고 구현부는 작성하지 않는다.
추상 메서드를 가지는 클래스는 추상 클래스가 된다. 추상 클래스도 동일하게 abstract 키워드를 붙인다.
public abstract class Animal { public abstract void sound(); }
2-2. 추상 클래스와 추상 메서드 예시
abstract class Animal { String name; int age; public Animal(String name, int age) { this.name = name; this.age = age; } // 추상 메소드 선언 abstract void sound(); }
abstract 키워드를 붙여 Animal 클래스를 추상 클래스, sound()를 추상 메서드로 선언하였습니다.
공통적으로 동물은 소리를 낸다고 생각하여 추상화 했습니다.
class Dog extends Animal { public Dog(String name, int age) { super(name, age); } // 추상 메소드 구현 void sound() { System.out.println("멍멍"); } } class Cat extends Animal { public Cat(String name, int age) { super(name, age); } // 추상 메소드 구현 void sound() { System.out.println("야옹"); } }
Animal 클래스를 상속 받은 Dog, Cat (자식/하위) 클래스는 추상 메서드인 sound()를 반드시 구현해야 하기 때문에,
해당하는 동물(클래스)의 특성(소리)에 맞추어 *오버라이딩 하였습니다.
*오버라이딩 : 부모 클래스에서 구현된 메서드를 자식 클래스에서 재정의하는 것
public class Main { public static void main(String[] args) { Animal dog = new Dog("멍멍이", 3); Animal cat = new Cat("야옹이", 2); dog.sound(); // 멍멍 cat.sound(); // 야옹 } }
결과적으로 메인 클래스에서는 위와 같이 사용할 수 있습니다.
3. 인터페이스
클래스나 객체가 어떤 메서드를 가지고 있는지 정의한 것으로,
메서드의 이름이나 매개변수, 반환값을 선언하고 구현부는 존재하지 않습니다.
클래스들 사이에서 공통 메서드를 지니고 있어, 다형성을 구현하는 데 중요한 역할을 합니다.
(클래스는 1개 상속 받을 수 있지만, 인터페이스는 여러 개 구현(상속) 가능!)
3-1. 인터페이스의 선언
interface 키워드를 사용하여 선언합니다. 인터페이스 내 멤버 변수와 메서드는 상수와 추상 메서드만을 가집니다.
따라서 인터페이스 내 멤버 변수를 선언할 때는 public static final 키워드를 붙이고, 반드시 초기값을 지정하고
메서드를 선언할 때에는 public abstract 키워드를 붙여 (선언부만 있는) 추상 메서드를 작성해야 합니다.
(public static final과 public abstract 키워드를 생략해도 자동으로 붙게 되지만, 가독성을 위해 명시적으로 붙입시다.)
3-2. 인터페이스 예시
public interface Animal { public void makeSound(); }
abstract 키워드를 붙이지 않아도 makeSound() 메서드에는 abstract 키워드가 붙어, 추상 메서드로 취급할 수 있습니다.
public class Dog implements Animal { public void makeSound() { System.out.println("멍멍"); } } public class Cat implements Animal { public void makeSound() { System.out.println("야옹"); } }
인터페이스는 직접 객체를 생성하여 사용할 수 없기 때문에,
인터페이스를 상속 받아 하위 클래스에서 반드시 구현하여 사용할 수 있습니다. 이 때 사용되는 implements 입니다.
public class Main { public static void main(String[] args) { Animal myPet = new Dog(); myPet.makeSound(); // "멍멍" 출력 myPet = new Cat(); myPet.makeSound(); // "야옹" 출력 } }
결과적으로 메인 클래스에서는 위와 같이 사용할 수 있습니다.
3-2-1. 인터페이스의 메서드 예시
일반적으로 인터페이스에서는 추상 메서드만을 선언할 수 있어, 구현부는 하위(자식) 클래스에서 반드시 구현해야 합니다.
그러나 자바8부터 인터페이스에는 디폴트(default) 메서드와 정적(static) 메서드도 선언할 수 있게 되었습니다.
왜 가능해진거야 ? : 인터페이스의 기능성을 확장하고 유연성을 높이기 위해 !아래는 인터페이스의 추상 메서드, 디폴트 메서드, 정적 메서드의 예시입니다.
interface Animal { void move(); // 추상 메서드 default void eat() { // 디폴트 메서드 System.out.println("The animal is eating."); } static void sleep() { // 정적 메서드 System.out.println("The animal is sleeping."); } }
class Dog implements Animal { public void move() { // 추상 메서드 구현 System.out.println("The dog is running."); } // 디폴트 메서드는 구현하지 않아도 상속 가능 // 정적 메서드는 오버라이딩 불가 }
디폴트(default) 메서드는 선언부와 구현부를 가지고 있어 하위(자식) 클래스에서 오버라이딩 해도, 하지 않아도 괜찮습니다.
따라서 인터페이스에 새로운 메서드를 추가해도,
기존의 인터페이스를 구현(상속)한 클래스들이 그대로 동작할 수 있도록 도와줍니다.
정적(static) 메서드는 인터페이스에 선언되어도 클래스나 객체와 무관하게 호출될 수 있습니다. (그러나 오버라이딩은 불가)
👋🏻 추상화와 인터페이스에 대해 알아보았습니다.
이러한 추상화를 통해 유연하고 확장 가능한 코드를 작성할 수 있습니다.
저도 적극적으로 활용할 수 있도록 더 학습하고 적용하는 연습을 해나가야 할 것 같습니다. 감사합니다 :)
'IT Study > 컴퓨터 기초' 카테고리의 다른 글
[Java] 컬렉션 프레임워크 2 (Set, HashSet 중심으로) (0) 2023.03.28 [Java] 컬렉션 프레임워크 1 (컬렉션 인터페이스) (0) 2023.03.28 [Java] String, StringBuffer, StringBuilder (0) 2023.03.26 [Java] 변수와 메모리 (0) 2023.03.24 [Java] next()와 nextLine() 차이와 사용법 (0) 2023.03.24