Archives
Recent Posts
«   2024/05   »
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 31
관리 메뉴

개발도생's Blog

[11Days] Study_추상화 본문

개발자의 일기/Study

[11Days] Study_추상화

개발도생 2023. 4. 7. 12:35

객체 지향 프로그래밍에서 중요한 '추상화'에 대해서 공부했다.

 

추상화(Class&Method)

클래스들의 공통적인 요소를 뽑아서 상위 클래스를 만들어내는 것이다. 

 

한 마디로 추상화는 공통적인 속성과 기능을 정의함으로써 코드의 중복을 줄이고,

 

클래스 간 관계를 효과적으로 설정하고, 유지&보수를 용이하게 하는 것이다.

 

추상 클래스(Abstract Class)

추상 클래스는 한 마디로 미완성 설계도이다.

 

하나 이상의 추상 메서드를 포함하는 클래스를 가리켜 추상 클래스(Abstract Method)라고 한다.

 

추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메서드의 집합을 정의할 수 있도록 한다.

 

미완성이기 때문에 이를 기반으로 인스턴스를 생성할 수 없다.

 

오직 상속을 통해 하위 클래스에서만 완성될 수 있다.

 

추상 클래스는 먼저 상속을 통해 자식 클래스를 만들고,

 

만든 자식 클래스에서 추상 클래스의 모든 추상 메서드를 오버라이딩하고 나서야 

 

비로소 자식 클래스의 인스턴스를 생성할 수 있게 된다.

 

추상 메서드(Abstract Method)

자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메서드를 의미한다.

 

자바에서 추상 메서드를 선언하여 사용하는 목적은,

 

추상 메서드가 포함된 클래스를 상속받는 자식 클래스가 반드시 추상 메서드를 구현하도록 하기 위함입니다.

 

모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고,

 

이를 받아 사용하는 쪽에서는 자신에게 필요한 부분만을 재정의하여 사용함으로써

 

생산성이 향상되고 배포 등이 쉬워지기 때문이다.

 

추상 메서드는 선언부만이 존재하며, 구현부는 작성되어 있지 않다.

 

 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것이다.

 

// 추상 클래스
public abstract class Abstract {
    /*
     * 추상 클래스
     *  - 몸체 없는 메서드(추상 메서드)를 포함하는 클래스, abstract 키워드를 사용해서 만든다.
     *  - 미완성된 클래스(추상 클래스)를 만들어서 이를 상속하는 자식 클래스들이 미완성된
     *    부분을 완성할 수 있게 강제시키기 위한 용도로 사용한다.
     *  - 추상 클래스를 상속하는 모든 자식들은 미완성된 부분을 완성해야 하기 때문에 일관성이 높아진다.
     *    (단, 참조 타입으로는 사용할 수 있다.)
     */
	
	// 추상 메서드
	public abstract double getArea();
	
	// 추상 메서드
	public abstract double getRound();
    
    }
// 추상 클래스를 상속 받은 자식 클래스
public class Test extends Abstract{

	@Override
	public double getArea() {
		return 10;
	}

	@Override
	public double getRound() {
		return 15;
	}
}
실행 결과를 보기 위한 Main Class
public class Main {

	public static void main(String[] args) {
		
		Abstract abstract = new Test();
        
        abstract.getArea();
     	abstract.getRound();
        
        // 결과
        // getArea Method : 10.0
        // getRound Method : 15.0
	}
}

 

추상 메서드의 사용 목적은,

추상 메서드를 선언하여 사용하는 목적은 추상 메서드가 포함된 클래스를 상속받는

 

자식 클래스가 반드시 추상 메서드를 구현하도록 하기 위함이다.

 

만약 일반 메서드로 구현한다면 사용자에 따라 해당 메서드를 구현할 수도 있고, 안 할 수도 있다.

 

하지만 추상 메서드가 포함된 추상 클래스를 상속받은 모든 자식 클래스는

 

추상 메서드를 구현해야만 인스턴스를 생성할 수 있으므로, 반드시 구현하게 된다.


인터페이스(Interface)란,

인터페이스 또한 추상 클래스라고 할 수 있다.

 

자바에서는 클래스를 통한 다중 상속은 지원하고 있지 않다.

 

그 이유는 클래스를 이용하여 다중 상속을 할 경우

 

메서드 출처의 모호성 등 여러 가지 문제가 발생할 수 있기 때문이다.

 

하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는

 

인터페이스라는 것을 통해 다중 상속을 지원하고 있다.

 

인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서,

 

다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미한다.

 

자바에서 추상 클래스는 추상 메서드뿐만 아니라 생성자, 필드, 일반 메서드도 포함할 수 있습니다.

 

인터페이스를 선언할 때에는 접근 제어자와 함께 'interface' 키워드를 사용하면 됩니다.

// Interface의 선언
public interface Interface {
    /*
     * 인터페이스
     *  - 추상 클래스의 변형체
     *  - 상수형 필드와 추상 메서드만을 작성할 수 있다.
     *    • 인터페이스에 작성된 모든 메서드는 abstract 키워드를 생략할 수 있다.
     *    • 인터페이스에 작성된 모든 멤버 변수는 'public static final' 구문이 생략되어 있다.
     *  - 메서드의 통일성(일관성)을 부여하기 위해 사용한다.
     *  - 인터페이스를 상속하는 클래스는 implements 키워드를 사용한다.
     *  - 인터페이스는 다중 상속이 가능하다.
     *  - 인터페이스로 객체 생성은 할 수 없지만, 참조 타입으로는 사용할 수 있다.(업 캐스팅, 다운 캐스팅)
     */

	public String getTest();
	
}
// 상속 받은 클래스
public class Test implements Interface { 
// 인터페이스 클래스를 상속은, 'implements' 키워드를 사용해 상속받을 수 있다.

	@Override
	public String getATest() {
		return "인터페이스";
	}
}
public class Main {

	public static void main(String[] args) {
		
        Interface interface = new Test();
        interface.getTest();
        
        // 결과 : 인터페이스
		
	}
}

 

인터페이스의 장점은,

 

1. 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능하다.

 

2. 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축할 수 있다.

 

3. 클래스와 클래스 간의 관계를 인터페이스로 연결하면, 클래스마다 독립적인 프로그래밍이 가능하다.


객체 지향 프로그래밍의 대표 장점 중 상속과 추상화!

 

이제 조금 개념을 알게 된 것 같다.

 

알아야 할 것들이 너무 많지만, 알아가는 재미가 있다.

 

알기만 하는 것이 아닌 추상화를 통한 프로그래밍의 실천까지 가능한 날이 오도록!

 

지금보다 더욱 노력해야겠다.

 

개린이에서 개고수가 되는 그날까지 앞으로 더 공부하자! 

'개발자의 일기 > Study' 카테고리의 다른 글

[12Days] Study_Exception  (0) 2023.04.13
[10Days] Study_Inheritance  (0) 2023.03.28
[9Days] Study_Method  (0) 2023.03.24
[8Days] Study_Static&Constructor  (0) 2023.03.22
[7Days] Study_객체 지향 언어(Java)  (0) 2023.03.18
Comments