본문 바로가기
Programming

JAVA 오버로딩 오버라이딩이란 추상클래스 구현이란 인터페이스란 객체지향 기술 종류

by 하하호호 2022. 2. 25.
반응형

 

 

객체지향 기술 종류에는 캡슐화(Encapsulation), 추상화(Abastract) , 상속(Inheritance), 다형성(Polymorphism)이 있다.

 

 

객체지향 프로그래밍 기술 다형성

다형성이란 상속된 여러 하위 객체들이 서로 다른 형태를 가질 수 있도록 하는 성질이다. 대표적으로 오버로딩오버라이딩이 있다. 둘 이상의 클래스에서 동일한 메시지에 대해서 서로 다르게 반응할 수 있는 성질로, 객체지향 프로그램에서 동적인 코드 구현이 가능하다.

 

오버로딩(Overloading) : 동일한 이름의 여러 메소드 중에서 매개변수로 전달되는 인수의 타입과 개수를 식볋래서 적절한 메소드를 호출해 주는 기능이다.

오버라이딩(Overriding) : 상속 받은 메소드의 내부 기능을 새롭게 정의하는 기술이다. 

 

오버라이딩 예제

 

아래 예제에서는 Espresso 클래스의 recipe() 메소드가 이미 구현되어 있지만, Espresso 클래스를 상속받은 Americano 클래스에서 recipe() 메소드를 재정의하여 사용하는 방식이다.

public class InfoProcess {
    public static void main(String[] args){
        Americano am = new Americano();
        am.recipe();
    }
}

// Espresso 클래스
class Espresso{
    int espresso = 20;

    // Espresso 클래스의 recipe() 메소드
    void recipe(){
        System.out.println("에스프레소 "+espresso+"ml");
    }
}


// Espresso 클래스를 상속받는다.

class Americano extends Espresso{
    int water = 80;

    // 상속받은 Espresso 클래스의 recipe() 메소드를 오버라이딩한다.
    void recipe(){
        System.out.println("에스프레소 "+espresso+"ml 물"+water+"ml");
    }
}

결과값

에스프레소 20ml 물80ml

 

 

추상화(Abstract)란?

클래스의 공통된 요소를 추출해서 상위(부모) 클래스로 구현해내는 방법이다. 하위(자식) 클래스 구현을 위한 큰 틀을 제공하기 때문에 상세한 구현은 하위 클래스에서 진행하게 된다. 

 

현실 세계를 자연스럽게 표현할 수 있어서 객체 중심의 안정된 모델링이 가능해진다. 복잡한 문제를 간략화 하는 기법으로 분석의 초점이 명확해 질 수 있다.

 

추상화의 종류로는 3가지가 있다.

기능추상화 : IPO 과정을 추상화한다.

자료추상화 : 데이터와 데이터에 적용될 기능을 함께 추상화한다.

제어 추상화 : 외부 이벤트에 대한 반응을 추상화한다.

 

추상화 클래스에는 abstract 키워드가 붙는다. 메소드의 구현부를 생략해서 표현하게 된다. 추상 클래스를 상속받은 클래스는 반드시 오버라이딩을 해줘야 한다. 

 

추상 클래스 예제

 

Shape 추상클래스를 먼저 만들고, Circle 클래스와 Rectangle 클래스에서 상속받는다. 이후 반드시 추상클래스에서 정의된 메소드를 오버라이딩 해줘야 한다. 

 

메인함수에서 인스턴스를 생성하고 메소드를 실행해보면 정상적으로 오버라이딩 된 메소드 작동여부를 확인할 수 있다.

public class InfoProcess {
    public static void main(String[] args){
        Circle c = new Circle();
        Rectangle r = new Rectangle();

        c.draw();
        r.draw();
    }
        
}

abstract class Shape{
    abstract void draw();
}

class Circle extends Shape{

    @Override
    void draw() {
        System.out.println("원을 그립니다.");
    }
    
}

class Rectangle extends Shape{

    @Override
    void draw() {
        System.out.println("사각형을 그립니다.");
    }
    
}

결과값

원을 그립니다.
사각형을 그립니다.

 

인터페이스(Interface) 란?

자바에서 다중 상속의 문제점을 해결하기 위해 등장한 방법이다. 둘 이상의 상속을 받는 클래스를 다중 상속이라고 한다. 예를 들어 상위 클래스 A와 B가 있다고 하면, 두개의 클래스를 동시에 상속받는 C를 정의하는 기능이 JAVA에서는 지원이 안된다는 것이다.

 

인터페이스는 모든 메소드가 추상 메소드로 구성되어 있는 추상클래스다. 상속 키워드 extends 대신에 implements를 사용한다. 상속을 받지 않기 때문에 다중 상속의 부정적 영향에서 자유롭다. 상속은 기존 클래스의 속성을 확장하는 오버로딩의 개념이지만, 인터페이스는 하나의 클래스로 기능을 제한하거나 다른 기능을 수행하도록 변경하는 다형성의 성질을 가진다.

 

인터페이스 구현은 class 대신에 interface 키워드를 사용하고, implements를 통해 구체적인 기능을 정의한다. 확장된 클래스의 인스턴스를 상위 인터페이스의 타입 객체 변수로 할당하여 기능을 변경하거나 제한을 둔다.

 

인터페이스 예제

 

Coffee, Cookie 인터페이스를 Cafe 객체에서 오버라이딩 해서 메소드를 구현했다. Cafe 객체변수를 인터페이스 객체변수에 할당하면 각각 인터페이스 메소드로 기능이 제한 되는 것을 알 수 있다. 인터페이스를 상속받는 클래스에서도 추상화의 원칙이 적용된다. 반드시 오버라이딩을 해줘야 한다.

public class InfoProcess {
    public static void main(String[] args){
        Cafe c = new Cafe();

        c.drink_coffee();
        c.eat_cookie();
        c.talk();

        // 인터페이스를 상속받은 Cafe 객체를 인터페이스 객체변수에 할당하면 기능이 제한된다.

        Coffee coffee = c;
        coffee.drink_coffee();

        Cookie cookie = c;
        cookie.eat_cookie();
    }
        
}


interface Coffee {
    abstract void drink_coffee();
}
interface Cookie {
    abstract void eat_cookie();
}

class Cafe implements Coffee, Cookie{

    @Override
    public void drink_coffee() {
        // TODO Auto-generated method stub
        System.out.println("커피를 마십니다.");
    }

    @Override
    public void eat_cookie() {
        // TODO Auto-generated method stub
        System.out.println("쿠키를 먹습니다.");
    }

    public void talk(){
        System.out.println("이야기를 나눕니다.");
    }
    
}

결과값

커피를 마십니다.
쿠키를 먹습니다.
이야기를 나눕니다.
커피를 마십니다.
쿠키를 먹습니다.
반응형

댓글