본문 바로가기
IT/JAVA

JAVA - 객체 지향 심화 3) 추상화

by 삐약 개발자 2024. 11. 27.
반응형

 

추상 - 사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는것

추상화란

기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것

이렇게 공통적인 속성과 기능을 모아서 정의해 주면 코드의 중복을 줄일 수 있고, 보다 효과적으로 클래스 간의 관계를 설정할 수 있으며, 유지/보수가 용이해짐

 

자바에서는 주로 추상 클래스 인터페이스 라는 문법 요소를 사용해서 추상화를 구현

두가지로 나누는 이유는? 클래스를 상속받는건 하나이지만 인터페이스는 인크리먼트(구현) 가 가능하기에

 

abstract 제어자

abstract = 미완성

abstract  는 주로 클래스와 메서드를 형용하는 키워드로 사용되는데, 메서드 앞에 붙은 경우를 ‘추상 메서드(abstract method)’, 클래스 앞에 붙은 경우를 ‘추상 클래스(abstract class)’라 각각 부름

abstract class AbstractExample { // 추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스
	abstract void start(); // 메서드 바디가 없는 추상메서드
}

추상메서드가 최소 하나 이상 포함돼 있어야 추상 클래스!

 

추상메서드 사용은 메서드 오버라이딩을 무조건 사용해야함

 

package abstract_example.v1;

public class Main {
    public static void main(String[] args) {
        //정의가 안되어 있기에 에러 발생됨
//        AbstractExample abstractExample = new AbstractExample(); //에러발생
        AbstractExample abstractExample = new AbstractExample() {
            @Override
            void start() {
                System.out.println("시작합니다.");
            }
        };
        AbstractExample abstractExample1 = new AbstractExample() {
            @Override
            void start() {
                System.out.println("11시작합니다.");
            }
        };
        AbstractExample abstractExample2 = new AbstractExample() {
            @Override
            void start() {
                System.out.println("22시작합니다.");
            }
        };

        abstractExample.start();
        abstractExample1.start();
        abstractExample2.start();
    }
}

 

 

추상 클래스

메서드 시그니처만 존재하고 바디가 선언되어있지 않은 추상 메서드를 포함하는 ‘미완성 설계도'임

미완성된 구조를 가지고 있기에 이를 기반으로 객체를 생성하는 것이 불가능함

그렇다면 객체를 생성하지도 못하는데 왜 만드는걸까?

1. 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용

2. 메서드의 내용이 상속을 받는 클래스에 따라 종종 달라지는데 이에 유연하게 변화를 대응할수 있음

 

추상 클래스에서 사용하게 되는것이 오버라이딩!!

이를 통해 추상 클래스로부터 상속받은 추상메서드의 내용을 구현하여 메서드를 완성하고 

완성된 클래스를 기반으로 객체를 생성할수 있음

 

final 키워드

final 키워드는 최종의 마지막의 의미를 가지고 있음

다만 필드, 지역변수, 클래스 앞에 위치할때 각각의 의미가 조금씩 달라짐

위치 의미
클래스 변경 또는 확장 불가능한 클래스, 상속 불가
메서드 오버라이딩 불가
변수 (필드) 값 변경이 불가한 상수

 

 

변수(필드) 앞에 final 키워드가 있다면 초기값이 무조건 있어야 함

public final String name;

오류남

초기값이 없기에 오류가 남!!!!

 

초기값이 없이 변수(팔드) 앞에 위치 final 키워드가 있을시 생성자에서 값을 미리 주면 됨

public class Animal {
    public final double PI;

    public Animal(double pi) {
        this.PI = pi;
    }
}

 

정리하자면 각각의 클래스와 메서드, 변수(필드) 앞에 final 키워드(제어자)가 추가 되면 

해당대상은 더이상 변경이 불가하거나 확장되지 않는 성질을 가지게 됨 

 

인터페이스

CLI - Command-Line Interface
GUI - Graphic User Interface

API - application programming interface

인터페이스란?

서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어주는 부분 또는 그런 접속 장치임

 

추상 클래스를 설계가 모두 끝나지 않은 “미완성 설계도"에 비유할 수 있다면,

인터페이스는 그보다 더 높은 추상성을 가지는 가장 기초적인 “밑그림"에 빗대어 표현할 수 있음

 

인터페이스는 추상 메서드만 가질수 있음

( 자바 8 이후에 default/static 메서드를 인터페이스에 사용할 수 있도록 업데이트 되긴함)

또한 필드는 일반적인 구조로는 안되고 static final 로 만들어야 함

 

인터페이스를 작성하는것은 기본적으로 클래스를 작성하는 것과 유사하지만

class 키워드 대신 interface 키워드를 사용한다는 차이점이 있음.

또한 일반 클래스와는 다르게 내부의

모든 필드public static final 로 정의가 됨

모든 메서드public abstract 로 정의가 됨

다만 모든 인터페이스의 필드와 메서드에는 위의 요소가 기본적으로 내장되어 있기 때문에

명시하지 않아도 생략이 가능!!!

 

-------------------------------------------작성중-------------------------------------------------------

 

인터페이스 -> 클래스 -> 객체 순서로 감

인터페이스에서는 public과 abstarct 두개밖에 못옴!!!!!!!

근데 둘다 생략 가능함 

인터페이스에서 접근제어자는 기본적으로 public 임
추상메서드의 abstract 생략 가능 

 

인터페이스의 기본 구조

public interface InterfaceEx {
    public static final int rock =  1; // 인터페이스 인스턴스 변수 정의
    final int scissors = 2; // public static 생략
    static int paper = 3; // public & final 생략

    public abstract String getPlayingNum();
		void call(); //public abstract 생략
}

 

class 클래스명 implements 인터페이스명 {
		... // 인터페이스에 정의된 모든 추상메서드 구현
}

인터페이스에 정의가 되었던건 전부 구현을 해야 오류가 안남

 

인터페이스는 다중적 구현이 가능

상속( extends ) , 인터페이스 연결  ( implements )

 

추상클래스와 인터페이스 각각 언제 사용하는지?

추상클래스는 상하 관계가 명확할때

인터페이스는??

 

활용예제 해보기 (아래에)

반응형

'IT > JAVA' 카테고리의 다른 글

JAVA - Collection 2) 제네릭  (0) 2024.11.29
JAVA - Collection 1) 열거형  (0) 2024.11.29
JAVA - 객체 지향 심화 2) 캡슐화  (0) 2024.11.27
JAVA - 객체 지향 심화 1) 상속  (0) 2024.11.27
JAVA - 객체지향 심화  (0) 2024.11.27