본문 바로가기

IT 개발/JAVA

[Java 기초] Java 상속, 추상화, 인터페이스: 이해하고 사용하기

Java 프로그래밍에서 상속, 추상화, 인터페이스는 객체 지향 프로그래밍의 핵심 요소입니다. 이러한 개념을 이해하고 잘 활용하면 코드의 재사용성과 확장성을 높여 효율적인 프로그램을 작성할 수 있습니다. 이 글에서는 Java의 상속, 추상화, 인터페이스 개념 및 사용법에 대해 설명하고 예시를 들어 알아보겠습니다.

 

1. 상속

상속이란 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 사용하는 것입니다. 상속을 통해서 코드의 중복을 최소화하고, 유지 보수를 효율적으로 할 수 있습니다.

 

1.1. 상속 사용법

Java에서는 extends 키워드를 사용하여 상속을 구현할 수 있습니다.

class Animal {
  void makeSound() {
    System.out.println("동물이 소리를 냅니다.");
  }
}

class Dog extends Animal {
  // 상속받은 makeSound 메서드 사용 가능
}

public class App {
  public static void main(String[] args) {
    Dog dog = new Dog();
    dog.makeSound(); // "동물이 소리를 냅니다." 출력
  }
}

 

위 예시에서 Dog 클래스는 Animal 클래스를 상속받습니다. 따라서 Dog 클래스는 상속받은 makeSound() 메서드를 사용할 수 있습니다.

 

 

1.2. 메서드 오버라이딩

서브클래스에서 슈퍼클래스의 특정 메서드를 재정의하여 다른 동작을 구현할 수 있습니다. 이를 메서드 오버라이딩이라고 합니다.

class Animal {
  void makeSound() {
    System.out.println("동물이 소리를 냅니다.");
  }
}

class Dog extends Animal {
  @Override //오버라이딩
  void makeSound() {
    System.out.println("멍멍!!");
  }
}

public class App {
  public static void main(String[] args) {
    Dog dog = new Dog();
    dog.makeSound(); // "멍멍!!" 출력
  }
}

 

2. 추상화

추상화는 중요한 부분만 남기고 불필요한 정보를 생략하거나 숨기는 과정입니다. 클래스 추상화는 abstract 키워드를 사용하여 추상 클래스를 생성합니다.

 

2.1. 추상 클래스 사용법

추상 클래스는 여러 메서드 중 하나 이상이 정의되지 않고 선언만 되어있습니다. 추상 메서드에는 abstract 키워드를 사용하며, 구현이 없는 상태로 선언됩니다.

abstract class Animal {
  abstract void makeSound();
}

class Dog extends Animal {
  @Override
  void makeSound() {
    System.out.println("멍멍!!");
  }
}

 

 

2.2. 추상 클래스의 제약

추상 클래스는 인스턴스를 생성할 수 없습니다. 그러나 추상 클래스의 참조 변수를 선언하고 서브 클래스의 객체를 참조할 수 있습니다.

Animal dog = new Dog(); // 추상 클래스 참조 변수로 서브 클래스 객체 참조 가능
dog.makeSound(); // "멍멍!!" 출력

 

3. 인터페이스

인터페이스는 메서드의 원형과 상수만 정의하고 구현을 갖지 않는 독립된 요소입니다. 클래스가 인터페이스를 구현하면 인터페이스에 정의된 메서드를 모두 구현해야 합니다.

 

3.1. 인터페이스 사용법

Java에서 인터페이스는 interface 키워드를 사용하여 생성할 수 있습니다. 클래스가 인터페이스를 구현하려면 implements 키워드를 사용합니다.

interface Speakable {
  void speak();
}

class Dog implements Speakable {
  @Override
  public void speak() {
    System.out.println("멍멍!!");
  }
}

 

3.2. 인터페이스의 특징 

- 인터페이스는 여러 개의 인터페이스를 동시에 구현할 수 있습니다.

- 인터페이스는 다중 상속의 문제를 해결하고 확장성을 높입니다.

interface Speakable {
  void speak();
}

interface Runnable {
  void run();
}

class Dog implements Speakable, Runnable {
  @Override
  public void speak() {
    System.out.println("멍멍!!");
  }

  @Override
  public void run() {
    System.out.println("강아지가 달립니다.");
  }
}

 

 

Java의 상속, 추상화, 인터페이스를 활용하면 코드의 중복을 최소화하고 객체 간의 관계를 효율적으로 구현할 수 있습니다. 이 글에서 소개한 개념과 예시를 참고하여 Java 프로그래밍 능력을 더욱 향상하길 바랍니다.